16e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompackage org.bouncycastle.asn1.x500.style;
26e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
36e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.io.IOException;
45db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Rootimport java.util.Enumeration;
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.Hashtable;
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
8e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstromimport org.bouncycastle.asn1.ASN1GeneralizedTime;
96e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERIA5String;
116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERPrintableString;
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERUTF8String;
136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x500.AttributeTypeAndValue;
156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x500.RDN;
166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x500.X500NameStyle;
186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x509.X509ObjectIdentifiers;
196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompublic class BCStyle
216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    implements X500NameStyle
226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{
236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * country code - StringType(SIZE(2))
256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier C = new ASN1ObjectIdentifier("2.5.4.6");
276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * organization - StringType(SIZE(1..64))
306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier O = new ASN1ObjectIdentifier("2.5.4.10");
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * organizational unit name - StringType(SIZE(1..64))
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier OU = new ASN1ObjectIdentifier("2.5.4.11");
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Title
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier T = new ASN1ObjectIdentifier("2.5.4.12");
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * common name - StringType(SIZE(1..64))
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier CN = new ASN1ObjectIdentifier("2.5.4.3");
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * device serial number name - StringType(SIZE(1..64))
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier SN = new ASN1ObjectIdentifier("2.5.4.5");
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * street - StringType(SIZE(1..64))
556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier STREET = new ASN1ObjectIdentifier("2.5.4.9");
576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * device serial number name - StringType(SIZE(1..64))
606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier SERIALNUMBER = SN;
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * locality name - StringType(SIZE(1..64))
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier L = new ASN1ObjectIdentifier("2.5.4.7");
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * state, or province name - StringType(SIZE(1..64))
706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier ST = new ASN1ObjectIdentifier("2.5.4.8");
726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Naming attributes of type X520name
756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier SURNAME = new ASN1ObjectIdentifier("2.5.4.4");
776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier GIVENNAME = new ASN1ObjectIdentifier("2.5.4.42");
786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier INITIALS = new ASN1ObjectIdentifier("2.5.4.43");
796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier GENERATION = new ASN1ObjectIdentifier("2.5.4.44");
806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier UNIQUE_IDENTIFIER = new ASN1ObjectIdentifier("2.5.4.45");
816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * businessCategory - DirectoryString(SIZE(1..128)
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier BUSINESS_CATEGORY = new ASN1ObjectIdentifier(
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "2.5.4.15");
876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * postalCode - DirectoryString(SIZE(1..40)
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier POSTAL_CODE = new ASN1ObjectIdentifier(
926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "2.5.4.17");
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * dnQualifier - DirectoryString(SIZE(1..64)
966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier DN_QUALIFIER = new ASN1ObjectIdentifier(
986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "2.5.4.46");
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64)
1026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier PSEUDONYM = new ASN1ObjectIdentifier(
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "2.5.4.65");
1056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z
1096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier DATE_OF_BIRTH = new ASN1ObjectIdentifier(
1116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "1.3.6.1.5.5.7.9.1");
1126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128)
1156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier PLACE_OF_BIRTH = new ASN1ObjectIdentifier(
1176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "1.3.6.1.5.5.7.9.2");
1186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 Gender - PrintableString (SIZE(1)) -- "M", "F", "m" or "f"
1216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier GENDER = new ASN1ObjectIdentifier(
1236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "1.3.6.1.5.5.7.9.3");
1246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166
1276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * codes only
1286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier COUNTRY_OF_CITIZENSHIP = new ASN1ObjectIdentifier(
1306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "1.3.6.1.5.5.7.9.4");
1316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 CountryOfResidence - PrintableString (SIZE (2)) -- ISO 3166
1346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * codes only
1356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier COUNTRY_OF_RESIDENCE = new ASN1ObjectIdentifier(
1376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        "1.3.6.1.5.5.7.9.5");
1386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64)
1426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier NAME_AT_BIRTH = new ASN1ObjectIdentifier("1.3.36.8.3.14");
1446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF
1476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * DirectoryString(SIZE(1..30))
1486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier POSTAL_ADDRESS = new ASN1ObjectIdentifier("2.5.4.16");
1506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * RFC 2256 dmdName
1536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier DMD_NAME = new ASN1ObjectIdentifier("2.5.4.54");
1556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * id-at-telephoneNumber
1586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier TELEPHONE_NUMBER = X509ObjectIdentifiers.id_at_telephoneNumber;
1606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * id-at-name
1636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier NAME = X509ObjectIdentifiers.id_at_name;
1656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Email address (RSA PKCS#9 extension) - IA5String.
1686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * <p>Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.
1696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier EmailAddress = PKCSObjectIdentifiers.pkcs_9_at_emailAddress;
1716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * more from PKCS#9
1746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier UnstructuredName = PKCSObjectIdentifiers.pkcs_9_at_unstructuredName;
1766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier UnstructuredAddress = PKCSObjectIdentifiers.pkcs_9_at_unstructuredAddress;
1776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * email address in Verisign certificates
1806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier E = EmailAddress;
1826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /*
1846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    * others...
1856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    */
1866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier DC = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25");
1876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * LDAP User id.
1906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static final ASN1ObjectIdentifier UID = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1");
1926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * default look up table translating OID values into their common symbols following
1956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * the convention in RFC 2253 with a few extras
1966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private static final Hashtable DefaultSymbols = new Hashtable();
1986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
2006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * look up table translating common symbols into their OIDS.
2016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
2026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private static final Hashtable DefaultLookUp = new Hashtable();
2036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    static
2056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(C, "C");
2076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(O, "O");
2086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(T, "T");
2096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(OU, "OU");
2106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(CN, "CN");
2116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(L, "L");
2126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(ST, "ST");
2136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(SN, "SERIALNUMBER");
2146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(EmailAddress, "E");
2156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(DC, "DC");
2166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(UID, "UID");
2176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(STREET, "STREET");
2186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(SURNAME, "SURNAME");
2196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(GIVENNAME, "GIVENNAME");
2206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(INITIALS, "INITIALS");
2216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(GENERATION, "GENERATION");
2226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(UnstructuredAddress, "unstructuredAddress");
2236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(UnstructuredName, "unstructuredName");
2246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(UNIQUE_IDENTIFIER, "UniqueIdentifier");
2256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(DN_QUALIFIER, "DN");
2266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(PSEUDONYM, "Pseudonym");
2276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(POSTAL_ADDRESS, "PostalAddress");
2286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(NAME_AT_BIRTH, "NameAtBirth");
2296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(COUNTRY_OF_CITIZENSHIP, "CountryOfCitizenship");
2306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(COUNTRY_OF_RESIDENCE, "CountryOfResidence");
2316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(GENDER, "Gender");
2326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(PLACE_OF_BIRTH, "PlaceOfBirth");
2336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(DATE_OF_BIRTH, "DateOfBirth");
2346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(POSTAL_CODE, "PostalCode");
2356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(BUSINESS_CATEGORY, "BusinessCategory");
2366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(TELEPHONE_NUMBER, "TelephoneNumber");
2376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultSymbols.put(NAME, "Name");
2386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("c", C);
2406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("o", O);
2416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("t", T);
2426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("ou", OU);
2436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("cn", CN);
2446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("l", L);
2456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("st", ST);
2466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("sn", SN);
2476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("serialnumber", SN);
2486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("street", STREET);
2496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("emailaddress", E);
2506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("dc", DC);
2516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("e", E);
2526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("uid", UID);
2536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("surname", SURNAME);
2546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("givenname", GIVENNAME);
2556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("initials", INITIALS);
2566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("generation", GENERATION);
2576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("unstructuredaddress", UnstructuredAddress);
2586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("unstructuredname", UnstructuredName);
2596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("uniqueidentifier", UNIQUE_IDENTIFIER);
2606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("dn", DN_QUALIFIER);
2616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("pseudonym", PSEUDONYM);
2626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("postaladdress", POSTAL_ADDRESS);
2636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("nameofbirth", NAME_AT_BIRTH);
2646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("countryofcitizenship", COUNTRY_OF_CITIZENSHIP);
2656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("countryofresidence", COUNTRY_OF_RESIDENCE);
2666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("gender", GENDER);
2676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("placeofbirth", PLACE_OF_BIRTH);
2686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("dateofbirth", DATE_OF_BIRTH);
2696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("postalcode", POSTAL_CODE);
2706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("businesscategory", BUSINESS_CATEGORY);
2716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("telephonenumber", TELEPHONE_NUMBER);
2726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        DefaultLookUp.put("name", NAME);
2736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    /**
2765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     * Singleton instance.
2775db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root     */
2785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    public static final X500NameStyle INSTANCE = new BCStyle();
2795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
2805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    protected final Hashtable defaultLookUp;
2815db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    protected final Hashtable defaultSymbols;
2825db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
2836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    protected BCStyle()
2846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2855db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        defaultSymbols = copyHashTable(DefaultSymbols);
2865db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        defaultLookUp = copyHashTable(DefaultLookUp);
2876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public ASN1Encodable stringToValue(ASN1ObjectIdentifier oid, String value)
2906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (value.length() != 0 && value.charAt(0) == '#')
2926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            try
2946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return IETFUtils.valueFromHexString(value, 1);
2966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
2976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            catch (IOException e)
2986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new RuntimeException("can't recode value for oid " + oid.getId());
3006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else
3036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (value.length() != 0 && value.charAt(0) == '\\')
3056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                value = value.substring(1);
3076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (oid.equals(EmailAddress) || oid.equals(DC))
3096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new DERIA5String(value);
3116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else if (oid.equals(DATE_OF_BIRTH))  // accept time string as well as # (for compatibility)
3136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
314e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom                return new ASN1GeneralizedTime(value);
3156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else if (oid.equals(C) || oid.equals(SN) || oid.equals(DN_QUALIFIER)
3176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                || oid.equals(TELEPHONE_NUMBER))
3186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return new DERPrintableString(value);
3206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return new DERUTF8String(value);
3246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
326a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public String oidToDisplayName(ASN1ObjectIdentifier oid)
327a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
328a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        return (String)DefaultSymbols.get(oid);
329a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
330a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
331a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public String[] oidToAttrNames(ASN1ObjectIdentifier oid)
332a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
3335db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return IETFUtils.findAttrNamesForOID(oid, defaultLookUp);
334a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
335a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
3366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public ASN1ObjectIdentifier attrNameToOID(String attrName)
3376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
3385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return IETFUtils.decodeAttrName(attrName, defaultLookUp);
3396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public boolean areEqual(X500Name name1, X500Name name2)
3426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
3436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] rdns1 = name1.getRDNs();
3446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] rdns2 = name2.getRDNs();
3456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (rdns1.length != rdns2.length)
3476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return false;
3496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean reverse = false;
3526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (rdns1[0].getFirst() != null && rdns2[0].getFirst() != null)
3546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            reverse = !rdns1[0].getFirst().getType().equals(rdns2[0].getFirst().getType());  // guess forward
3566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i != rdns1.length; i++)
3596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (!foundMatch(reverse, rdns1[i], rdns2))
3616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                return false;
3636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return true;
3676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private boolean foundMatch(boolean reverse, RDN rdn, RDN[] possRDNs)
3706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
3716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (reverse)
3726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            for (int i = possRDNs.length - 1; i >= 0; i--)
3746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i]))
3766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
3776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    possRDNs[i] = null;
3786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return true;
3796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
3806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else
3836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            for (int i = 0; i != possRDNs.length; i++)
3856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
3866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                if (possRDNs[i] != null && rdnAreEqual(rdn, possRDNs[i]))
3876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
3886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    possRDNs[i] = null;
3896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    return true;
3906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
3916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
3926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return false;
3956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    protected boolean rdnAreEqual(RDN rdn1, RDN rdn2)
3986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
399e1142c149e244797ce73b0e7fad40816e447a817Brian Carlstrom        return IETFUtils.rDNAreEqual(rdn1, rdn2);
4006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
4016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public RDN[] fromString(String dirName)
4036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
4046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return IETFUtils.rDNsFromString(dirName, this);
4056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
4066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public int calculateHashCode(X500Name name)
4086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
4096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int hashCodeValue = 0;
4106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] rdns = name.getRDNs();
4116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        // this needs to be order independent, like equals
4136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i != rdns.length; i++)
4146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
4156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (rdns[i].isMultiValued())
4166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
4176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                AttributeTypeAndValue[] atv = rdns[i].getTypesAndValues();
4186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                for (int j = 0; j != atv.length; j++)
4206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
4216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    hashCodeValue ^= atv[j].getType().hashCode();
4226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    hashCodeValue ^= calcHashCode(atv[j].getValue());
4236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
4246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
4256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
4266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
4276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                hashCodeValue ^= rdns[i].getFirst().getType().hashCode();
4286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                hashCodeValue ^= calcHashCode(rdns[i].getFirst().getValue());
4296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
4306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
4316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return hashCodeValue;
4336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
4346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private int calcHashCode(ASN1Encodable enc)
4366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
4376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        String value = IETFUtils.valueToString(enc);
4386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        value = IETFUtils.canonicalize(value);
4406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return value.hashCode();
4426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
4436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public String toString(X500Name name)
4456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
4466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        StringBuffer buf = new StringBuffer();
4476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean first = true;
4486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] rdns = name.getRDNs();
4506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i < rdns.length; i++)
4526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
4536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (first)
4546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
4556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                first = false;
4566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
4576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
4586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
4596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                buf.append(',');
4606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
4616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4625db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            IETFUtils.appendRDN(buf, rdns[i], defaultSymbols);
4636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
4646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
4656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return buf.toString();
4666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
4675db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
4685db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    private static Hashtable copyHashTable(Hashtable paramsMap)
4695db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    {
4705db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Hashtable newTable = new Hashtable();
4715db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
4725db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        Enumeration keys = paramsMap.keys();
4735db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        while (keys.hasMoreElements())
4745db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        {
4755db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            Object key = keys.nextElement();
4765db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root            newTable.put(key, paramsMap.get(key));
4775db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        }
4785db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root
4795db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root        return newTable;
4805db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root    }
4816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom}
482