1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46:
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54:
55: public class GeneralNames
56: {
57:
58:
59:
60:
61: public static final int OTHER_NAME = 0;
62: public static final int RFC822_NAME = 1;
63: public static final int DNS_NAME = 2;
64: public static final int X400_ADDRESS = 3;
65: public static final int DIRECTORY_NAME = 4;
66: public static final int EDI_PARTY_NAME = 5;
67: public static final int URI = 6;
68: public static final int IP_ADDRESS = 7;
69: public static final int REGISTERED_ID = 8;
70:
71: private List names;
72:
73:
74:
75:
76: public GeneralNames(final byte[] encoded) throws IOException
77: {
78: names = new LinkedList();
79: DERReader der = new DERReader(encoded);
80: DERValue nameList = der.read();
81: if (!nameList.isConstructed())
82: throw new IOException("malformed GeneralNames");
83: int len = 0;
84: while (len < nameList.getLength())
85: {
86: DERValue name = der.read();
87: List namePair = new ArrayList(2);
88: if (name.getTagClass() != DER.APPLICATION)
89: throw new IOException("malformed GeneralName");
90: namePair.add(new Integer(name.getTag()));
91: DERValue val = null;
92: switch (name.getTag())
93: {
94: case RFC822_NAME:
95: case DNS_NAME:
96: case X400_ADDRESS:
97: case URI:
98: namePair.add(new String((byte[]) name.getValue()));
99: break;
100:
101: case OTHER_NAME:
102: case EDI_PARTY_NAME:
103: namePair.add(name.getValue());
104: break;
105:
106: case DIRECTORY_NAME:
107: byte[] b = name.getEncoded();
108: b[0] = (byte) (DER.CONSTRUCTED|DER.SEQUENCE);
109: namePair.add(new X500DistinguishedName(b).toString());
110: break;
111:
112: case IP_ADDRESS:
113: namePair.add(InetAddress.getByAddress((byte[]) name.getValue())
114: .getHostAddress());
115: break;
116:
117: case REGISTERED_ID:
118: byte[] bb = name.getEncoded();
119: bb[0] = (byte) DER.OBJECT_IDENTIFIER;
120: namePair.add(new OID(bb).toString());
121: break;
122:
123: default:
124: throw new IOException("unknown tag " + name.getTag());
125: }
126: names.add(namePair);
127: len += name.getEncodedLength();
128: }
129: }
130:
131:
132:
133:
134: public List getNames()
135: {
136: List l = new ArrayList(names.size());
137: for (Iterator it = names.iterator(); it.hasNext(); )
138: {
139: List ll = (List) it.next();
140: List pair = new ArrayList(2);
141: pair.add(ll.get(0));
142: if (ll.get(1) instanceof byte[])
143: pair.add(((byte[]) ll.get(1)).clone());
144: else
145: pair.add(ll.get(1));
146: l.add(Collections.unmodifiableList(pair));
147: }
148: return Collections.unmodifiableList(l);
149: }
150:
151: public String toString()
152: {
153: return GeneralNames.class.getName() + " [ " + names + " ]";
154: }
155: }