1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.asn1.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Enumeration;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Hashtable;
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Vector;
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector;
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Set;
11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERObjectIdentifier;
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERSet;
13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class AttributeTable
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private Hashtable attributes = new Hashtable();
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable(
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Hashtable  attrs)
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        attributes = copyTable(attrs);
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable(
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector v)
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        for (int i = 0; i != v.size(); i++)
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Attribute   a = Attribute.getInstance(v.get(i));
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            addAttribute(a.getAttrType(), a);
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable(
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set    s)
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        for (int i = 0; i != s.size(); i++)
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Attribute   a = Attribute.getInstance(s.getObjectAt(i));
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            addAttribute(a.getAttrType(), a);
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable(
4770c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        Attribute    attr)
4870c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    {
4970c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom        addAttribute(attr.getAttrType(), attr);
5070c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    }
5170c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom
5270c8287138e69a98c2f950036f9f703ee37228c8Brian Carlstrom    public AttributeTable(
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Attributes    attrs)
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this(ASN1Set.getInstance(attrs.toASN1Primitive()));
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private void addAttribute(
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier oid,
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Attribute           a)
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object value = attributes.get(oid);
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (value == null)
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            attributes.put(oid, a);
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Vector v;
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (value instanceof Attribute)
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v = new Vector();
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.addElement(value);
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.addElement(a);
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v = (Vector)value;
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.addElement(a);
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            attributes.put(oid, v);
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @deprecated use ASN1ObjectIdentifier
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public Attribute get(DERObjectIdentifier oid)
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return get(new ASN1ObjectIdentifier(oid.getId()));
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return the first attribute matching the OBJECT IDENTIFIER oid.
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param oid type of attribute required.
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return first attribute found of type oid.
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public Attribute get(
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier oid)
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object value = attributes.get(oid);
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (value instanceof Vector)
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return (Attribute)((Vector)value).elementAt(0);
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return (Attribute)value;
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     /**
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @deprecated use ASN1ObjectIdentifier
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1EncodableVector getAll(DERObjectIdentifier oid)
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return getAll(new ASN1ObjectIdentifier(oid.getId()));
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return all the attributes matching the OBJECT IDENTIFIER oid. The vector will be
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * empty if there are no attributes of the required type present.
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param oid type of attribute required.
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return a vector of all the attributes found of type oid.
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1EncodableVector getAll(
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier oid)
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object value = attributes.get(oid);
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (value instanceof Vector)
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Enumeration e = ((Vector)value).elements();
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            while (e.hasMoreElements())
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add((Attribute)e.nextElement());
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else if (value != null)
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            v.add((Attribute)value);
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return v;
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public int size()
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        int size = 0;
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        for (Enumeration en = attributes.elements(); en.hasMoreElements();)
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Object o = en.nextElement();
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (o instanceof Vector)
165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                size += ((Vector)o).size();
167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                size++;
171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return size;
175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public Hashtable toHashtable()
178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return copyTable(attributes);
180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1EncodableVector toASN1EncodableVector()
183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
184e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector  v = new ASN1EncodableVector();
185e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Enumeration          e = attributes.elements();
186e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
187e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        while (e.hasMoreElements())
188e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
189e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Object value = e.nextElement();
190e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
191e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (value instanceof Vector)
192e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
193e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Enumeration en = ((Vector)value).elements();
194e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
195e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                while (en.hasMoreElements())
196e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
197e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    v.add(Attribute.getInstance(en.nextElement()));
198e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
199e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
200e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
201e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
202e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add(Attribute.getInstance(value));
203e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
204e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
205e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
206e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return v;
207e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
208e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
209e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public Attributes toASN1Structure()
210e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
211e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new Attributes(this.toASN1EncodableVector());
212e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
213e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
214e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private Hashtable copyTable(
215e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Hashtable in)
216e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
217e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Hashtable   out = new Hashtable();
218e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Enumeration e = in.keys();
219e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
220e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        while (e.hasMoreElements())
221e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
222e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Object key = e.nextElement();
223e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
224e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            out.put(key, in.get(key));
225e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
226e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
227e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return out;
228e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
229e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
230e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
231e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return a new table with the passed in attribute added.
232e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
233e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param attrType
234e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param attrValue
235e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return
236e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
237e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable add(ASN1ObjectIdentifier attrType, ASN1Encodable attrValue)
238e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
239e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AttributeTable newTable = new AttributeTable(attributes);
240e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
241e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        newTable.addAttribute(attrType, new Attribute(attrType, new DERSet(attrValue)));
242e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
243e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return newTable;
244e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
245e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
246e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AttributeTable remove(ASN1ObjectIdentifier attrType)
247e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
248e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AttributeTable newTable = new AttributeTable(attributes);
249e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
250e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        newTable.attributes.remove(attrType);
251e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
252e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return newTable;
253e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
254e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
255