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