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