ExtensionsGenerator.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1.x509;
2
3import java.io.IOException;
4import java.util.Hashtable;
5import java.util.Vector;
6
7import org.bouncycastle.asn1.ASN1Encodable;
8import org.bouncycastle.asn1.ASN1Encoding;
9import org.bouncycastle.asn1.ASN1ObjectIdentifier;
10import org.bouncycastle.asn1.DEROctetString;
11
12/**
13 * Generator for X.509 extensions
14 */
15public class ExtensionsGenerator
16{
17    private Hashtable extensions = new Hashtable();
18    private Vector extOrdering = new Vector();
19
20    /**
21     * Reset the generator
22     */
23    public void reset()
24    {
25        extensions = new Hashtable();
26        extOrdering = new Vector();
27    }
28
29    /**
30     * Add an extension with the given oid and the passed in value to be included
31     * in the OCTET STRING associated with the extension.
32     *
33     * @param oid  OID for the extension.
34     * @param critical  true if critical, false otherwise.
35     * @param value the ASN.1 object to be included in the extension.
36     */
37    public void addExtension(
38        ASN1ObjectIdentifier oid,
39        boolean              critical,
40        ASN1Encodable        value)
41        throws IOException
42    {
43        this.addExtension(oid, critical, value.toASN1Primitive().getEncoded(ASN1Encoding.DER));
44    }
45
46    /**
47     * Add an extension with the given oid and the passed in byte array to be wrapped in the
48     * OCTET STRING associated with the extension.
49     *
50     * @param oid OID for the extension.
51     * @param critical true if critical, false otherwise.
52     * @param value the byte array to be wrapped.
53     */
54    public void addExtension(
55        ASN1ObjectIdentifier oid,
56        boolean             critical,
57        byte[]              value)
58    {
59        if (extensions.containsKey(oid))
60        {
61            throw new IllegalArgumentException("extension " + oid + " already added");
62        }
63
64        extOrdering.addElement(oid);
65        extensions.put(oid, new Extension(oid, critical, new DEROctetString(value)));
66    }
67
68    /**
69     * Return true if there are no extension present in this generator.
70     *
71     * @return true if empty, false otherwise
72     */
73    public boolean isEmpty()
74    {
75        return extOrdering.isEmpty();
76    }
77
78    /**
79     * Generate an Extensions object based on the current state of the generator.
80     *
81     * @return  an X09Extensions object.
82     */
83    public Extensions generate()
84    {
85        Extension[] exts = new Extension[extOrdering.size()];
86
87        for (int i = 0; i != extOrdering.size(); i++)
88        {
89            exts[i] = (Extension)extensions.get(extOrdering.elementAt(i));
90        }
91
92        return new Extensions(exts);
93    }
94}
95