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