• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.bouncycastle.asn1.x509;
2 
3 import java.io.IOException;
4 import java.util.Hashtable;
5 import java.util.Vector;
6 
7 import org.bouncycastle.asn1.ASN1Encodable;
8 import org.bouncycastle.asn1.ASN1Encoding;
9 import org.bouncycastle.asn1.ASN1ObjectIdentifier;
10 import org.bouncycastle.asn1.DEROctetString;
11 
12 /**
13  * Generator for X.509 extensions
14  */
15 public class ExtensionsGenerator
16 {
17     private Hashtable extensions = new Hashtable();
18     private Vector extOrdering = new Vector();
19 
20     /**
21      * Reset the generator
22      */
reset()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      */
addExtension( ASN1ObjectIdentifier oid, boolean critical, ASN1Encodable value)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      */
addExtension( ASN1ObjectIdentifier oid, boolean critical, byte[] value)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      * Add a given extension.
70      *
71      * @param extension the full extension value.
72      */
addExtension( Extension extension)73     public void addExtension(
74         Extension extension)
75     {
76         if (extensions.containsKey(extension.getExtnId()))
77         {
78             throw new IllegalArgumentException("extension " + extension.getExtnId() + " already added");
79         }
80 
81         extOrdering.addElement(extension.getExtnId());
82         extensions.put(extension.getExtnId(), extension);
83     }
84 
85     /**
86      * Return true if there are no extension present in this generator.
87      *
88      * @return true if empty, false otherwise
89      */
isEmpty()90     public boolean isEmpty()
91     {
92         return extOrdering.isEmpty();
93     }
94 
95     /**
96      * Generate an Extensions object based on the current state of the generator.
97      *
98      * @return  an X09Extensions object.
99      */
generate()100     public Extensions generate()
101     {
102         Extension[] exts = new Extension[extOrdering.size()];
103 
104         for (int i = 0; i != extOrdering.size(); i++)
105         {
106             exts[i] = (Extension)extensions.get(extOrdering.elementAt(i));
107         }
108 
109         return new Extensions(exts);
110     }
111 }
112