14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.util; 2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.ByteArrayOutputStream; 4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException; 5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.ObjectInputStream; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.io.ObjectOutputStream; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Enumeration; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Hashtable; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.util.Vector; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable; 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1InputStream; 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1OutputStream; 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier; 16c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class PKCS12BagAttributeCarrierImpl 18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom implements PKCS12BagAttributeCarrier 19c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{ 20db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom private Hashtable pkcs12Attributes; 21db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom private Vector pkcs12Ordering; 22db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom 23db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom PKCS12BagAttributeCarrierImpl(Hashtable attributes, Vector ordering) 24db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom { 25db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom this.pkcs12Attributes = attributes; 26db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom this.pkcs12Ordering = ordering; 27db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom } 28c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 29c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public PKCS12BagAttributeCarrierImpl() 30c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 31db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom this(new Hashtable(), new Vector()); 32c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 33c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 34c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public void setBagAttribute( 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid, 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Encodable attribute) 37c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 38db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom if (pkcs12Attributes.containsKey(oid)) 39db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom { // preserve original ordering 40db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom pkcs12Attributes.put(oid, attribute); 41db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom } 42db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom else 43db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom { 44db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom pkcs12Attributes.put(oid, attribute); 45db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom pkcs12Ordering.addElement(oid); 46db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom } 47c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 48c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Encodable getBagAttribute( 5070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom ASN1ObjectIdentifier oid) 51c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (ASN1Encodable)pkcs12Attributes.get(oid); 53c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 54c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 55c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public Enumeration getBagAttributeKeys() 56c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 57db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom return pkcs12Ordering.elements(); 58c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 59c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 60c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom int size() 61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 62db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom return pkcs12Ordering.size(); 63db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom } 64db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom 65db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom Hashtable getAttributes() 66db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom { 67db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom return pkcs12Attributes; 68c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 69c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 70db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom Vector getOrdering() 71db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom { 72db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom return pkcs12Ordering; 73db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom } 74c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 75c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public void writeObject(ObjectOutputStream out) 76c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom throws IOException 77c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 78db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom if (pkcs12Ordering.size() == 0) 79c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 80c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom out.writeObject(new Hashtable()); 81c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom out.writeObject(new Vector()); 82c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 83c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom else 84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 85c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 86c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom ASN1OutputStream aOut = new ASN1OutputStream(bOut); 87c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 88c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom Enumeration e = this.getBagAttributeKeys(); 89c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 90c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom while (e.hasMoreElements()) 91c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 92d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)e.nextElement(); 93c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 94c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom aOut.writeObject(oid); 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom aOut.writeObject((ASN1Encodable)pkcs12Attributes.get(oid)); 96c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom out.writeObject(bOut.toByteArray()); 99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 100c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 101c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 102c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom public void readObject(ObjectInputStream in) 103c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom throws IOException, ClassNotFoundException 104c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 105c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom Object obj = in.readObject(); 106c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 107c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom if (obj instanceof Hashtable) 108c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 109db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom this.pkcs12Attributes = (Hashtable)obj; 110db9f6e2562dff550a3c62aeb7c96e72fc40d1a06Brian Carlstrom this.pkcs12Ordering = (Vector)in.readObject(); 111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 112c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom else 113c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 114c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom ASN1InputStream aIn = new ASN1InputStream((byte[])obj); 115c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1ObjectIdentifier oid; 117c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom while ((oid = (ASN1ObjectIdentifier)aIn.readObject()) != null) 119c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom { 120c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom this.setBagAttribute(oid, aIn.readObject()); 121c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 122c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 123c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom } 124c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom} 125