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