ExtendedKeyUsage.java revision e1142c149e244797ce73b0e7fad40816e447a817
1package org.bouncycastle.asn1.x509;
2
3import java.util.Enumeration;
4import java.util.Hashtable;
5import java.util.Vector;
6
7import org.bouncycastle.asn1.ASN1Encodable;
8import org.bouncycastle.asn1.ASN1EncodableVector;
9import org.bouncycastle.asn1.ASN1Object;
10import org.bouncycastle.asn1.ASN1ObjectIdentifier;
11import org.bouncycastle.asn1.ASN1Primitive;
12import org.bouncycastle.asn1.ASN1Sequence;
13import org.bouncycastle.asn1.ASN1TaggedObject;
14import org.bouncycastle.asn1.DERSequence;
15
16/**
17 * The extendedKeyUsage object.
18 * <pre>
19 *      extendedKeyUsage ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
20 * </pre>
21 */
22public class ExtendedKeyUsage
23    extends ASN1Object
24{
25    Hashtable     usageTable = new Hashtable();
26    ASN1Sequence  seq;
27
28    public static ExtendedKeyUsage getInstance(
29        ASN1TaggedObject obj,
30        boolean          explicit)
31    {
32        return getInstance(ASN1Sequence.getInstance(obj, explicit));
33    }
34
35    public static ExtendedKeyUsage getInstance(
36        Object obj)
37    {
38        if (obj instanceof ExtendedKeyUsage)
39        {
40            return (ExtendedKeyUsage)obj;
41        }
42        else if (obj != null)
43        {
44            return new ExtendedKeyUsage(ASN1Sequence.getInstance(obj));
45        }
46
47        return null;
48    }
49
50    public static ExtendedKeyUsage fromExtensions(Extensions extensions)
51    {
52        return ExtendedKeyUsage.getInstance(extensions.getExtensionParsedValue(Extension.extendedKeyUsage));
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    private ExtendedKeyUsage(
64        ASN1Sequence  seq)
65    {
66        this.seq = seq;
67
68        Enumeration e = seq.getObjects();
69
70        while (e.hasMoreElements())
71        {
72            ASN1Encodable o = (ASN1Encodable)e.nextElement();
73            if (!(o.toASN1Primitive() instanceof ASN1ObjectIdentifier))
74            {
75                throw new IllegalArgumentException("Only ASN1ObjectIdentifiers allowed in ExtendedKeyUsage.");
76            }
77            this.usageTable.put(o, o);
78        }
79    }
80
81    public ExtendedKeyUsage(
82        KeyPurposeId[]  usages)
83    {
84        ASN1EncodableVector v = new ASN1EncodableVector();
85
86        for (int i = 0; i != usages.length; i++)
87        {
88            v.add(usages[i]);
89            this.usageTable.put(usages[i], usages[i]);
90        }
91
92        this.seq = new DERSequence(v);
93    }
94
95    /**
96     * @deprecated use KeyPurposeId[] constructor.
97     */
98    public ExtendedKeyUsage(
99        Vector usages)
100    {
101        ASN1EncodableVector v = new ASN1EncodableVector();
102        Enumeration         e = usages.elements();
103
104        while (e.hasMoreElements())
105        {
106            ASN1Primitive  o = (ASN1Primitive)e.nextElement();
107
108            v.add(o);
109            this.usageTable.put(o, o);
110        }
111
112        this.seq = new DERSequence(v);
113    }
114
115    public boolean hasKeyPurposeId(
116        KeyPurposeId keyPurposeId)
117    {
118        return (usageTable.get(keyPurposeId) != null);
119    }
120
121    /**
122     * Returns all extended key usages.
123     * The returned vector contains DERObjectIdentifiers.
124     * @return An array with all key purposes.
125     */
126    public KeyPurposeId[] getUsages()
127    {
128        KeyPurposeId[] temp = new KeyPurposeId[seq.size()];
129
130        int i = 0;
131        for (Enumeration it = seq.getObjects(); it.hasMoreElements();)
132        {
133            temp[i++] = KeyPurposeId.getInstance(it.nextElement());
134        }
135        return temp;
136    }
137
138    public int size()
139    {
140        return usageTable.size();
141    }
142
143    public ASN1Primitive toASN1Primitive()
144    {
145        return seq;
146    }
147}
148