001package org.apache.commons.ssl.org.bouncycastle.asn1.x500.style; 002 003import java.util.Hashtable; 004 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1GeneralizedTime; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DERIA5String; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERPrintableString; 010import org.apache.commons.ssl.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; 011import org.apache.commons.ssl.org.bouncycastle.asn1.x500.RDN; 012import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name; 013import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500NameStyle; 014import org.apache.commons.ssl.org.bouncycastle.asn1.x509.X509ObjectIdentifiers; 015 016public class BCStyle 017 extends AbstractX500NameStyle 018{ 019 /** 020 * country code - StringType(SIZE(2)) 021 */ 022 public static final ASN1ObjectIdentifier C = new ASN1ObjectIdentifier("2.5.4.6"); 023 024 /** 025 * organization - StringType(SIZE(1..64)) 026 */ 027 public static final ASN1ObjectIdentifier O = new ASN1ObjectIdentifier("2.5.4.10"); 028 029 /** 030 * organizational unit name - StringType(SIZE(1..64)) 031 */ 032 public static final ASN1ObjectIdentifier OU = new ASN1ObjectIdentifier("2.5.4.11"); 033 034 /** 035 * Title 036 */ 037 public static final ASN1ObjectIdentifier T = new ASN1ObjectIdentifier("2.5.4.12"); 038 039 /** 040 * common name - StringType(SIZE(1..64)) 041 */ 042 public static final ASN1ObjectIdentifier CN = new ASN1ObjectIdentifier("2.5.4.3"); 043 044 /** 045 * device serial number name - StringType(SIZE(1..64)) 046 */ 047 public static final ASN1ObjectIdentifier SN = new ASN1ObjectIdentifier("2.5.4.5"); 048 049 /** 050 * street - StringType(SIZE(1..64)) 051 */ 052 public static final ASN1ObjectIdentifier STREET = new ASN1ObjectIdentifier("2.5.4.9"); 053 054 /** 055 * device serial number name - StringType(SIZE(1..64)) 056 */ 057 public static final ASN1ObjectIdentifier SERIALNUMBER = SN; 058 059 /** 060 * locality name - StringType(SIZE(1..64)) 061 */ 062 public static final ASN1ObjectIdentifier L = new ASN1ObjectIdentifier("2.5.4.7"); 063 064 /** 065 * state, or province name - StringType(SIZE(1..64)) 066 */ 067 public static final ASN1ObjectIdentifier ST = new ASN1ObjectIdentifier("2.5.4.8"); 068 069 /** 070 * Naming attributes of type X520name 071 */ 072 public static final ASN1ObjectIdentifier SURNAME = new ASN1ObjectIdentifier("2.5.4.4"); 073 public static final ASN1ObjectIdentifier GIVENNAME = new ASN1ObjectIdentifier("2.5.4.42"); 074 public static final ASN1ObjectIdentifier INITIALS = new ASN1ObjectIdentifier("2.5.4.43"); 075 public static final ASN1ObjectIdentifier GENERATION = new ASN1ObjectIdentifier("2.5.4.44"); 076 public static final ASN1ObjectIdentifier UNIQUE_IDENTIFIER = new ASN1ObjectIdentifier("2.5.4.45"); 077 078 /** 079 * businessCategory - DirectoryString(SIZE(1..128) 080 */ 081 public static final ASN1ObjectIdentifier BUSINESS_CATEGORY = new ASN1ObjectIdentifier( 082 "2.5.4.15"); 083 084 /** 085 * postalCode - DirectoryString(SIZE(1..40) 086 */ 087 public static final ASN1ObjectIdentifier POSTAL_CODE = new ASN1ObjectIdentifier( 088 "2.5.4.17"); 089 090 /** 091 * dnQualifier - DirectoryString(SIZE(1..64) 092 */ 093 public static final ASN1ObjectIdentifier DN_QUALIFIER = new ASN1ObjectIdentifier( 094 "2.5.4.46"); 095 096 /** 097 * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64) 098 */ 099 public static final ASN1ObjectIdentifier PSEUDONYM = new ASN1ObjectIdentifier( 100 "2.5.4.65"); 101 102 103 /** 104 * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z 105 */ 106 public static final ASN1ObjectIdentifier DATE_OF_BIRTH = new ASN1ObjectIdentifier( 107 "1.3.6.1.5.5.7.9.1"); 108 109 /** 110 * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128) 111 */ 112 public static final ASN1ObjectIdentifier PLACE_OF_BIRTH = new ASN1ObjectIdentifier( 113 "1.3.6.1.5.5.7.9.2"); 114 115 /** 116 * RFC 3039 Gender - PrintableString (SIZE(1)) -- "M", "F", "m" or "f" 117 */ 118 public static final ASN1ObjectIdentifier GENDER = new ASN1ObjectIdentifier( 119 "1.3.6.1.5.5.7.9.3"); 120 121 /** 122 * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166 123 * codes only 124 */ 125 public static final ASN1ObjectIdentifier COUNTRY_OF_CITIZENSHIP = new ASN1ObjectIdentifier( 126 "1.3.6.1.5.5.7.9.4"); 127 128 /** 129 * RFC 3039 CountryOfResidence - PrintableString (SIZE (2)) -- ISO 3166 130 * codes only 131 */ 132 public static final ASN1ObjectIdentifier COUNTRY_OF_RESIDENCE = new ASN1ObjectIdentifier( 133 "1.3.6.1.5.5.7.9.5"); 134 135 136 /** 137 * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64) 138 */ 139 public static final ASN1ObjectIdentifier NAME_AT_BIRTH = new ASN1ObjectIdentifier("1.3.36.8.3.14"); 140 141 /** 142 * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF 143 * DirectoryString(SIZE(1..30)) 144 */ 145 public static final ASN1ObjectIdentifier POSTAL_ADDRESS = new ASN1ObjectIdentifier("2.5.4.16"); 146 147 /** 148 * RFC 2256 dmdName 149 */ 150 public static final ASN1ObjectIdentifier DMD_NAME = new ASN1ObjectIdentifier("2.5.4.54"); 151 152 /** 153 * id-at-telephoneNumber 154 */ 155 public static final ASN1ObjectIdentifier TELEPHONE_NUMBER = X509ObjectIdentifiers.id_at_telephoneNumber; 156 157 /** 158 * id-at-name 159 */ 160 public static final ASN1ObjectIdentifier NAME = X509ObjectIdentifiers.id_at_name; 161 162 /** 163 * Email address (RSA PKCS#9 extension) - IA5String. 164 * <p>Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here. 165 */ 166 public static final ASN1ObjectIdentifier EmailAddress = PKCSObjectIdentifiers.pkcs_9_at_emailAddress; 167 168 /** 169 * more from PKCS#9 170 */ 171 public static final ASN1ObjectIdentifier UnstructuredName = PKCSObjectIdentifiers.pkcs_9_at_unstructuredName; 172 public static final ASN1ObjectIdentifier UnstructuredAddress = PKCSObjectIdentifiers.pkcs_9_at_unstructuredAddress; 173 174 /** 175 * email address in Verisign certificates 176 */ 177 public static final ASN1ObjectIdentifier E = EmailAddress; 178 179 /* 180 * others... 181 */ 182 public static final ASN1ObjectIdentifier DC = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25"); 183 184 /** 185 * LDAP User id. 186 */ 187 public static final ASN1ObjectIdentifier UID = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1"); 188 189 /** 190 * default look up table translating OID values into their common symbols following 191 * the convention in RFC 2253 with a few extras 192 */ 193 private static final Hashtable DefaultSymbols = new Hashtable(); 194 195 /** 196 * look up table translating common symbols into their OIDS. 197 */ 198 private static final Hashtable DefaultLookUp = new Hashtable(); 199 200 static 201 { 202 DefaultSymbols.put(C, "C"); 203 DefaultSymbols.put(O, "O"); 204 DefaultSymbols.put(T, "T"); 205 DefaultSymbols.put(OU, "OU"); 206 DefaultSymbols.put(CN, "CN"); 207 DefaultSymbols.put(L, "L"); 208 DefaultSymbols.put(ST, "ST"); 209 DefaultSymbols.put(SN, "SERIALNUMBER"); 210 DefaultSymbols.put(EmailAddress, "E"); 211 DefaultSymbols.put(DC, "DC"); 212 DefaultSymbols.put(UID, "UID"); 213 DefaultSymbols.put(STREET, "STREET"); 214 DefaultSymbols.put(SURNAME, "SURNAME"); 215 DefaultSymbols.put(GIVENNAME, "GIVENNAME"); 216 DefaultSymbols.put(INITIALS, "INITIALS"); 217 DefaultSymbols.put(GENERATION, "GENERATION"); 218 DefaultSymbols.put(UnstructuredAddress, "unstructuredAddress"); 219 DefaultSymbols.put(UnstructuredName, "unstructuredName"); 220 DefaultSymbols.put(UNIQUE_IDENTIFIER, "UniqueIdentifier"); 221 DefaultSymbols.put(DN_QUALIFIER, "DN"); 222 DefaultSymbols.put(PSEUDONYM, "Pseudonym"); 223 DefaultSymbols.put(POSTAL_ADDRESS, "PostalAddress"); 224 DefaultSymbols.put(NAME_AT_BIRTH, "NameAtBirth"); 225 DefaultSymbols.put(COUNTRY_OF_CITIZENSHIP, "CountryOfCitizenship"); 226 DefaultSymbols.put(COUNTRY_OF_RESIDENCE, "CountryOfResidence"); 227 DefaultSymbols.put(GENDER, "Gender"); 228 DefaultSymbols.put(PLACE_OF_BIRTH, "PlaceOfBirth"); 229 DefaultSymbols.put(DATE_OF_BIRTH, "DateOfBirth"); 230 DefaultSymbols.put(POSTAL_CODE, "PostalCode"); 231 DefaultSymbols.put(BUSINESS_CATEGORY, "BusinessCategory"); 232 DefaultSymbols.put(TELEPHONE_NUMBER, "TelephoneNumber"); 233 DefaultSymbols.put(NAME, "Name"); 234 235 DefaultLookUp.put("c", C); 236 DefaultLookUp.put("o", O); 237 DefaultLookUp.put("t", T); 238 DefaultLookUp.put("ou", OU); 239 DefaultLookUp.put("cn", CN); 240 DefaultLookUp.put("l", L); 241 DefaultLookUp.put("st", ST); 242 DefaultLookUp.put("sn", SN); 243 DefaultLookUp.put("serialnumber", SN); 244 DefaultLookUp.put("street", STREET); 245 DefaultLookUp.put("emailaddress", E); 246 DefaultLookUp.put("dc", DC); 247 DefaultLookUp.put("e", E); 248 DefaultLookUp.put("uid", UID); 249 DefaultLookUp.put("surname", SURNAME); 250 DefaultLookUp.put("givenname", GIVENNAME); 251 DefaultLookUp.put("initials", INITIALS); 252 DefaultLookUp.put("generation", GENERATION); 253 DefaultLookUp.put("unstructuredaddress", UnstructuredAddress); 254 DefaultLookUp.put("unstructuredname", UnstructuredName); 255 DefaultLookUp.put("uniqueidentifier", UNIQUE_IDENTIFIER); 256 DefaultLookUp.put("dn", DN_QUALIFIER); 257 DefaultLookUp.put("pseudonym", PSEUDONYM); 258 DefaultLookUp.put("postaladdress", POSTAL_ADDRESS); 259 DefaultLookUp.put("nameofbirth", NAME_AT_BIRTH); 260 DefaultLookUp.put("countryofcitizenship", COUNTRY_OF_CITIZENSHIP); 261 DefaultLookUp.put("countryofresidence", COUNTRY_OF_RESIDENCE); 262 DefaultLookUp.put("gender", GENDER); 263 DefaultLookUp.put("placeofbirth", PLACE_OF_BIRTH); 264 DefaultLookUp.put("dateofbirth", DATE_OF_BIRTH); 265 DefaultLookUp.put("postalcode", POSTAL_CODE); 266 DefaultLookUp.put("businesscategory", BUSINESS_CATEGORY); 267 DefaultLookUp.put("telephonenumber", TELEPHONE_NUMBER); 268 DefaultLookUp.put("name", NAME); 269 } 270 271 /** 272 * Singleton instance. 273 */ 274 public static final X500NameStyle INSTANCE = new BCStyle(); 275 276 protected final Hashtable defaultLookUp; 277 protected final Hashtable defaultSymbols; 278 279 protected BCStyle() 280 { 281 defaultSymbols = copyHashTable(DefaultSymbols); 282 defaultLookUp = copyHashTable(DefaultLookUp); 283 } 284 285 protected ASN1Encodable encodeStringValue(ASN1ObjectIdentifier oid, 286 String value) { 287 if (oid.equals(EmailAddress) || oid.equals(DC)) 288 { 289 return new DERIA5String(value); 290 } 291 else if (oid.equals(DATE_OF_BIRTH)) // accept time string as well as # (for compatibility) 292 { 293 return new ASN1GeneralizedTime(value); 294 } 295 else if (oid.equals(C) || oid.equals(SN) || oid.equals(DN_QUALIFIER) 296 || oid.equals(TELEPHONE_NUMBER)) 297 { 298 return new DERPrintableString(value); 299 } 300 301 return super.encodeStringValue(oid, value); 302 } 303 304 public String oidToDisplayName(ASN1ObjectIdentifier oid) 305 { 306 return (String)DefaultSymbols.get(oid); 307 } 308 309 public String[] oidToAttrNames(ASN1ObjectIdentifier oid) 310 { 311 return IETFUtils.findAttrNamesForOID(oid, defaultLookUp); 312 } 313 314 public ASN1ObjectIdentifier attrNameToOID(String attrName) 315 { 316 return IETFUtils.decodeAttrName(attrName, defaultLookUp); 317 } 318 319 public RDN[] fromString(String dirName) 320 { 321 return IETFUtils.rDNsFromString(dirName, this); 322 } 323 324 public String toString(X500Name name) 325 { 326 StringBuffer buf = new StringBuffer(); 327 boolean first = true; 328 329 RDN[] rdns = name.getRDNs(); 330 331 for (int i = 0; i < rdns.length; i++) 332 { 333 if (first) 334 { 335 first = false; 336 } 337 else 338 { 339 buf.append(','); 340 } 341 342 IETFUtils.appendRDN(buf, rdns[i], defaultSymbols); 343 } 344 345 return buf.toString(); 346 } 347 348 349}