1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Sequence;
6import org.bouncycastle.asn1.ASN1TaggedObject;
7import org.bouncycastle.asn1.DERObject;
8import org.bouncycastle.asn1.DERObjectIdentifier;
9import org.bouncycastle.asn1.DERSequence;
10
11import java.util.Enumeration;
12import java.util.Hashtable;
13import java.util.Vector;
14
15/**
16 * The extendedKeyUsage object.
17 * <pre>
18 *      extendedKeyUsage ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
19 * </pre>
20 */
21public class ExtendedKeyUsage
22    extends ASN1Encodable
23{
24    Hashtable     usageTable = new Hashtable();
25    ASN1Sequence  seq;
26
27    public static ExtendedKeyUsage getInstance(
28        ASN1TaggedObject obj,
29        boolean          explicit)
30    {
31        return getInstance(ASN1Sequence.getInstance(obj, explicit));
32    }
33
34    public static ExtendedKeyUsage getInstance(
35        Object obj)
36    {
37        if (obj instanceof ExtendedKeyUsage)
38        {
39            return (ExtendedKeyUsage)obj;
40        }
41
42        if(obj instanceof ASN1Sequence)
43        {
44            return new ExtendedKeyUsage((ASN1Sequence)obj);
45        }
46
47        if (obj instanceof X509Extension)
48        {
49            return getInstance(X509Extension.convertValueToObject((X509Extension)obj));
50        }
51
52        throw new IllegalArgumentException("Invalid ExtendedKeyUsage: " + obj.getClass().getName());
53    }
54
55    public ExtendedKeyUsage(
56        KeyPurposeId  usage)
57    {
58        this.seq = new DERSequence(usage);
59
60        this.usageTable.put(usage, usage);
61    }
62
63    public ExtendedKeyUsage(
64        ASN1Sequence  seq)
65    {
66        this.seq = seq;
67
68        Enumeration e = seq.getObjects();
69
70        while (e.hasMoreElements())
71        {
72            Object  o = e.nextElement();
73            if (!(o instanceof DERObjectIdentifier))
74            {
75                throw new IllegalArgumentException("Only DERObjectIdentifiers allowed in ExtendedKeyUsage.");
76            }
77            this.usageTable.put(o, o);
78        }
79    }
80
81    public ExtendedKeyUsage(
82        Vector  usages)
83    {
84        ASN1EncodableVector v = new ASN1EncodableVector();
85        Enumeration         e = usages.elements();
86
87        while (e.hasMoreElements())
88        {
89            DERObject  o = (DERObject)e.nextElement();
90
91            v.add(o);
92            this.usageTable.put(o, o);
93        }
94
95        this.seq = new DERSequence(v);
96    }
97
98    public boolean hasKeyPurposeId(
99        KeyPurposeId keyPurposeId)
100    {
101        return (usageTable.get(keyPurposeId) != null);
102    }
103
104    /**
105     * Returns all extended key usages.
106     * The returned vector contains DERObjectIdentifiers.
107     * @return A vector with all key purposes.
108     */
109    public Vector getUsages()
110    {
111        Vector temp = new Vector();
112        for (Enumeration it = usageTable.elements(); it.hasMoreElements();)
113        {
114            temp.addElement(it.nextElement());
115        }
116        return temp;
117    }
118
119    public int size()
120    {
121        return usageTable.size();
122    }
123
124    public DERObject toASN1Object()
125    {
126        return seq;
127    }
128}
129