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