1c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompackage org.bouncycastle.asn1.x509;
2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException;
4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.util.Hashtable;
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.util.Vector;
6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
13c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom/**
14c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * Generator for X.509 extensions
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * @deprecated use org.bouncycastle.asn1.x509.ExtensionsGenerator
16c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom */
17c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompublic class X509ExtensionsGenerator
18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{
19c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private Hashtable extensions = new Hashtable();
20c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private Vector extOrdering = new Vector();
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    /**
23c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * Reset the generator
24c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     */
25c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public void reset()
26c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
27c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        extensions = new Hashtable();
28c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        extOrdering = new Vector();
29c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
30c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
31c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    /**
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @deprecated use ASN1ObjectIdentifier
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void addExtension(
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DERObjectIdentifier oid,
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean             critical,
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable       value)
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        addExtension(new ASN1ObjectIdentifier(oid.getId()), critical, value);
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @deprecated use ASN1ObjectIdentifier
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void addExtension(
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DERObjectIdentifier oid,
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean             critical,
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        byte[]              value)
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        addExtension(new ASN1ObjectIdentifier(oid.getId()), critical, value);
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
54c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * Add an extension with the given oid and the passed in value to be included
55c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * in the OCTET STRING associated with the extension.
56c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     *
57c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param oid  OID for the extension.
58c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param critical  true if critical, false otherwise.
59c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param value the ASN.1 object to be included in the extension.
60c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     */
61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public void addExtension(
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier oid,
63c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        boolean             critical,
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Encodable       value)
65c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
66c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        try
67c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            this.addExtension(oid, critical, value.toASN1Primitive().getEncoded(ASN1Encoding.DER));
69c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
70c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        catch (IOException e)
71c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
72c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            throw new IllegalArgumentException("error encoding value: " + e);
73c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
74c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
75c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
76c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    /**
77c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * Add an extension with the given oid and the passed in byte array to be wrapped in the
78c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * OCTET STRING associated with the extension.
79c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     *
80c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param oid OID for the extension.
81c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param critical true if critical, false otherwise.
82c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @param value the byte array to be wrapped.
83c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     */
84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public void addExtension(
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier oid,
86c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        boolean             critical,
87c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        byte[]              value)
88c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
89c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (extensions.containsKey(oid))
90c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
91c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            throw new IllegalArgumentException("extension " + oid + " already added");
92c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
93c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
94c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        extOrdering.addElement(oid);
95c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        extensions.put(oid, new X509Extension(critical, new DEROctetString(value)));
96c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
97c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
98c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    /**
99c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * Return true if there are no extension present in this generator.
100c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     *
101c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @return true if empty, false otherwise
102c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     */
103c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public boolean isEmpty()
104c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
105c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return extOrdering.isEmpty();
106c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
107c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
108c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    /**
109c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * Generate an X509Extensions object based on the current state of the generator.
110c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     *
111c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     * @return  an X09Extensions object.
112c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom     */
113c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public X509Extensions generate()
114c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
115c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return new X509Extensions(extOrdering, extensions);
116c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
117c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom}
118