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