14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1.x509; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.IOException; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Hashtable; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Vector; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DEROctetString; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/** 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Generator for X.509 extensions 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class ExtensionsGenerator 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private Hashtable extensions = new Hashtable(); 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private Vector extOrdering = new Vector(); 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Reset the generator 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public void reset() 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extensions = new Hashtable(); 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extOrdering = new Vector(); 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Add an extension with the given oid and the passed in value to be included 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * in the OCTET STRING associated with the extension. 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param oid OID for the extension. 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param critical true if critical, false otherwise. 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param value the ASN.1 object to be included in the extension. 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public void addExtension( 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid, 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean critical, 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Encodable value) 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throws IOException 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.addExtension(oid, critical, value.toASN1Primitive().getEncoded(ASN1Encoding.DER)); 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Add an extension with the given oid and the passed in byte array to be wrapped in the 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * OCTET STRING associated with the extension. 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param oid OID for the extension. 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param critical true if critical, false otherwise. 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @param value the byte array to be wrapped. 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public void addExtension( 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid, 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean critical, 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom byte[] value) 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (extensions.containsKey(oid)) 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom throw new IllegalArgumentException("extension " + oid + " already added"); 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extOrdering.addElement(oid); 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extensions.put(oid, new Extension(oid, critical, new DEROctetString(value))); 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Return true if there are no extension present in this generator. 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @return true if empty, false otherwise 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public boolean isEmpty() 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return extOrdering.isEmpty(); 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom /** 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Generate an Extensions object based on the current state of the generator. 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @return an X09Extensions object. 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public Extensions generate() 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Extension[] exts = new Extension[extOrdering.size()]; 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom for (int i = 0; i != extOrdering.size(); i++) 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom exts[i] = (Extension)extensions.get(extOrdering.elementAt(i)); 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new Extensions(exts); 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 95