116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1.x509;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Enumeration;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Hashtable;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Vector;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encodable;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1EncodableVector;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encoding;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Object;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Primitive;
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Sequence;
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Set;
1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1String;
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1TaggedObject;
1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERSequence;
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERSet;
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERUniversalString;
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x500.X500Name;
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.Strings;
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.encoders.Hex;
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro/**
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * <pre>
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     AttributeTypeAndValue ::= SEQUENCE {
3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *                                   type  OBJECT IDENTIFIER,
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *                                   value ANY }
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * </pre>
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @deprecated use org.bouncycastle.asn1.x500.X500Name.
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class X509Name
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    extends ASN1Object
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * country code - StringType(SIZE(2))
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier C = new ASN1ObjectIdentifier("2.5.4.6");
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * organization - StringType(SIZE(1..64))
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier O = new ASN1ObjectIdentifier("2.5.4.10");
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * organizational unit name - StringType(SIZE(1..64))
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier OU = new ASN1ObjectIdentifier("2.5.4.11");
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Title
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier T = new ASN1ObjectIdentifier("2.5.4.12");
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * common name - StringType(SIZE(1..64))
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier CN = new ASN1ObjectIdentifier("2.5.4.3");
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * device serial number name - StringType(SIZE(1..64))
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier SN = new ASN1ObjectIdentifier("2.5.4.5");
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * street - StringType(SIZE(1..64))
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier STREET = new ASN1ObjectIdentifier("2.5.4.9");
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * device serial number name - StringType(SIZE(1..64))
8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier SERIALNUMBER = SN;
8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * locality name - StringType(SIZE(1..64))
8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier L = new ASN1ObjectIdentifier("2.5.4.7");
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * state, or province name - StringType(SIZE(1..64))
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier ST = new ASN1ObjectIdentifier("2.5.4.8");
9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Naming attributes of type X520name
9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier SURNAME = new ASN1ObjectIdentifier("2.5.4.4");
10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier GIVENNAME = new ASN1ObjectIdentifier("2.5.4.42");
10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier INITIALS = new ASN1ObjectIdentifier("2.5.4.43");
10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier GENERATION = new ASN1ObjectIdentifier("2.5.4.44");
10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier UNIQUE_IDENTIFIER = new ASN1ObjectIdentifier("2.5.4.45");
10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
10616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * businessCategory - DirectoryString(SIZE(1..128)
10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier BUSINESS_CATEGORY = new ASN1ObjectIdentifier(
10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "2.5.4.15");
11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
11216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * postalCode - DirectoryString(SIZE(1..40)
11316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier POSTAL_CODE = new ASN1ObjectIdentifier(
11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "2.5.4.17");
11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * dnQualifier - DirectoryString(SIZE(1..64)
11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier DN_QUALIFIER = new ASN1ObjectIdentifier(
12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "2.5.4.46");
12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 Pseudonym - DirectoryString(SIZE(1..64)
12516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier PSEUDONYM = new ASN1ObjectIdentifier(
12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "2.5.4.65");
12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
13116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 DateOfBirth - GeneralizedTime - YYYYMMDD000000Z
13216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
13316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier DATE_OF_BIRTH = new ASN1ObjectIdentifier(
13416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "1.3.6.1.5.5.7.9.1");
13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 PlaceOfBirth - DirectoryString(SIZE(1..128)
13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier PLACE_OF_BIRTH = new ASN1ObjectIdentifier(
14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "1.3.6.1.5.5.7.9.2");
14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 Gender - PrintableString (SIZE(1)) -- "M", "F", "m" or "f"
14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier GENDER = new ASN1ObjectIdentifier(
14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "1.3.6.1.5.5.7.9.3");
14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 CountryOfCitizenship - PrintableString (SIZE (2)) -- ISO 3166
15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * codes only
15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier COUNTRY_OF_CITIZENSHIP = new ASN1ObjectIdentifier(
15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "1.3.6.1.5.5.7.9.4");
15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 CountryOfResidence - PrintableString (SIZE (2)) -- ISO 3166
15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * codes only
15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier COUNTRY_OF_RESIDENCE = new ASN1ObjectIdentifier(
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    "1.3.6.1.5.5.7.9.5");
16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * ISIS-MTT NameAtBirth - DirectoryString(SIZE(1..64)
16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier NAME_AT_BIRTH =  new ASN1ObjectIdentifier("1.3.36.8.3.14");
16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 3039 PostalAddress - SEQUENCE SIZE (1..6) OF
17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * DirectoryString(SIZE(1..30))
17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier POSTAL_ADDRESS = new ASN1ObjectIdentifier("2.5.4.16");
17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
17516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC 2256 dmdName
17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier DMD_NAME = new ASN1ObjectIdentifier("2.5.4.54");
17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * id-at-telephoneNumber
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier TELEPHONE_NUMBER = X509ObjectIdentifiers.id_at_telephoneNumber;
18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * id-at-name
18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier NAME = X509ObjectIdentifiers.id_at_name;
18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Email address (RSA PKCS#9 extension) - IA5String.
19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.
19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use a X500NameStyle
19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier EmailAddress = PKCSObjectIdentifiers.pkcs_9_at_emailAddress;
19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * more from PKCS#9
19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier UnstructuredName = PKCSObjectIdentifiers.pkcs_9_at_unstructuredName;
20016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier UnstructuredAddress = PKCSObjectIdentifiers.pkcs_9_at_unstructuredAddress;
20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * email address in Verisign certificates
20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
20516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier E = EmailAddress;
20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /*
20816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * others...
20916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
21016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier DC = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.25");
21116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
21316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * LDAP User id.
21416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
21516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final ASN1ObjectIdentifier UID = new ASN1ObjectIdentifier("0.9.2342.19200300.100.1.1");
21616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
21816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * determines whether or not strings should be processed and printed
21916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * from back to front.
22016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static boolean DefaultReverse = false;
22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * default look up table translating OID values into their common symbols following
22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the convention in RFC 2253 with a few extras
22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable DefaultSymbols = new Hashtable();
22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating OID values into their common symbols following the convention in RFC 2253
23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
23316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable RFC2253Symbols = new Hashtable();
23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating OID values into their common symbols following the convention in RFC 1779
23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable RFC1779Symbols = new Hashtable();
24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating common symbols into their OIDS.
24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable DefaultLookUp = new Hashtable();
24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
24716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating OID values into their common symbols
24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use DefaultSymbols
24916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
25016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable OIDLookUp = DefaultSymbols;
25116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
25316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * look up table translating string values into their OIDS -
25416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use DefaultLookUp
25516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
25616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static final Hashtable SymbolLookUp = DefaultLookUp;
25716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
258c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // BEGIN android-changed
259c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    private static final Boolean TRUE = Boolean.TRUE;
260c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    private static final Boolean FALSE = Boolean.FALSE;
261c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // END android-changed
26216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
26316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static
26416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
26516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(C, "C");
26616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(O, "O");
26716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(T, "T");
26816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(OU, "OU");
26916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(CN, "CN");
27016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(L, "L");
27116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(ST, "ST");
27216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(SN, "SERIALNUMBER");
27316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(EmailAddress, "E");
27416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(DC, "DC");
27516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(UID, "UID");
27616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(STREET, "STREET");
27716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(SURNAME, "SURNAME");
27816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(GIVENNAME, "GIVENNAME");
27916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(INITIALS, "INITIALS");
28016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(GENERATION, "GENERATION");
28116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(UnstructuredAddress, "unstructuredAddress");
28216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(UnstructuredName, "unstructuredName");
28316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(UNIQUE_IDENTIFIER, "UniqueIdentifier");
28416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(DN_QUALIFIER, "DN");
28516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(PSEUDONYM, "Pseudonym");
28616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(POSTAL_ADDRESS, "PostalAddress");
28716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(NAME_AT_BIRTH, "NameAtBirth");
28816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(COUNTRY_OF_CITIZENSHIP, "CountryOfCitizenship");
28916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(COUNTRY_OF_RESIDENCE, "CountryOfResidence");
29016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(GENDER, "Gender");
29116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(PLACE_OF_BIRTH, "PlaceOfBirth");
29216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(DATE_OF_BIRTH, "DateOfBirth");
29316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(POSTAL_CODE, "PostalCode");
29416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(BUSINESS_CATEGORY, "BusinessCategory");
29516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(TELEPHONE_NUMBER, "TelephoneNumber");
29616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultSymbols.put(NAME, "Name");
29716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
29816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(C, "C");
29916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(O, "O");
30016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(OU, "OU");
30116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(CN, "CN");
30216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(L, "L");
30316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(ST, "ST");
30416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(STREET, "STREET");
30516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(DC, "DC");
30616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC2253Symbols.put(UID, "UID");
30716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
30816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(C, "C");
30916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(O, "O");
31016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(OU, "OU");
31116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(CN, "CN");
31216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(L, "L");
31316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(ST, "ST");
31416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RFC1779Symbols.put(STREET, "STREET");
31516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
31616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("c", C);
31716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("o", O);
31816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("t", T);
31916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("ou", OU);
32016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("cn", CN);
32116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("l", L);
32216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("st", ST);
32316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("sn", SN);
32416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("serialnumber", SN);
32516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("street", STREET);
32616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("emailaddress", E);
32716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("dc", DC);
32816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("e", E);
32916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("uid", UID);
33016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("surname", SURNAME);
33116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("givenname", GIVENNAME);
33216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("initials", INITIALS);
33316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("generation", GENERATION);
33416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("unstructuredaddress", UnstructuredAddress);
33516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("unstructuredname", UnstructuredName);
33616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("uniqueidentifier", UNIQUE_IDENTIFIER);
33716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("dn", DN_QUALIFIER);
33816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("pseudonym", PSEUDONYM);
33916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("postaladdress", POSTAL_ADDRESS);
34016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("nameofbirth", NAME_AT_BIRTH);
34116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("countryofcitizenship", COUNTRY_OF_CITIZENSHIP);
34216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("countryofresidence", COUNTRY_OF_RESIDENCE);
34316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("gender", GENDER);
34416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("placeofbirth", PLACE_OF_BIRTH);
34516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("dateofbirth", DATE_OF_BIRTH);
34616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("postalcode", POSTAL_CODE);
34716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("businesscategory", BUSINESS_CATEGORY);
34816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("telephonenumber", TELEPHONE_NUMBER);
34916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        DefaultLookUp.put("name", NAME);
35016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
35116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
35216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private X509NameEntryConverter  converter = null;
35316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private Vector                  ordering = new Vector();
35416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private Vector                  values = new Vector();
35516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private Vector                  added = new Vector();
35616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
35716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private ASN1Sequence            seq;
35816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
35916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private boolean                 isHashCodeCalculated;
36016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private int                     hashCodeValue;
36116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
36216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
36316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Return a X509Name based on the passed in tagged object.
36416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
36516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param obj tag object holding name.
36616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param explicit true if explicitly tagged false otherwise.
36716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return the X509Name
36816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
36916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X509Name getInstance(
37016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1TaggedObject obj,
37116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean          explicit)
37216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
37316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return getInstance(ASN1Sequence.getInstance(obj, explicit));
37416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
37516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
37616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X509Name getInstance(
37716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Object  obj)
37816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
37916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj == null || obj instanceof X509Name)
38016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
38116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return (X509Name)obj;
38216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
38316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else if (obj instanceof X500Name)
38416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
38516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new X509Name(ASN1Sequence.getInstance(((X500Name)obj).toASN1Primitive()));
38616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
38716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else if (obj != null)
38816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
38916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new X509Name(ASN1Sequence.getInstance(obj));
39016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
39116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
39216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
39316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
39416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
39516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected X509Name()
39616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
39716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // constructure use by new X500 Name class
39816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
39916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
40016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Constructor from ASN1Sequence
40116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
40216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the principal will be a list of constructed sets, each containing an (OID, String) pair.
40316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name.getInstance()
40416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
40516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
40616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Sequence  seq)
40716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
40816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.seq = seq;
40916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
41016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Enumeration e = seq.getObjects();
41116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
41216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        while (e.hasMoreElements())
41316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
41416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1Set         set = ASN1Set.getInstance(((ASN1Encodable)e.nextElement()).toASN1Primitive());
41516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
41616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = 0; i < set.size(); i++)
41716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
41816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   ASN1Sequence s = ASN1Sequence.getInstance(set.getObjectAt(i).toASN1Primitive());
41916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
42016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   if (s.size() != 2)
42116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   {
42216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       throw new IllegalArgumentException("badly sized pair");
42316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   }
42416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
42516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   ordering.addElement(ASN1ObjectIdentifier.getInstance(s.getObjectAt(0)));
42616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
42716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   ASN1Encodable value = s.getObjectAt(1);
42816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   if (value instanceof ASN1String && !(value instanceof DERUniversalString))
42916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   {
43016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       String v = ((ASN1String)value).getString();
43116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       if (v.length() > 0 && v.charAt(0) == '#')
43216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       {
43316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                           values.addElement("\\" + v);
43416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       }
43516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       else
43616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       {
43716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                           values.addElement(v);
43816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       }
43916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   }
44016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   else
44116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   {
44216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       try
44316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       {
44416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                           values.addElement("#" + bytesToString(Hex.encode(value.toASN1Primitive().getEncoded(ASN1Encoding.DER))));
44516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       }
44616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       catch (IOException e1)
44716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       {
44816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                           throw new IllegalArgumentException("cannot encode value");
44916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                       }
45016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                   }
451c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                   // BEGIN android-changed
452c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                   added.addElement(Boolean.valueOf(i != 0));
453c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                   // END android-changed
45416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
45516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
45616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
45716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
45816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
45916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * constructor from a table of attributes.
46016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
46116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * it's is assumed the table contains OID/String pairs, and the contents
46216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * of the table are copied into an internal table as part of the
46316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * construction process.
46416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
46516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <b>Note:</b> if the name you are trying to generate should be
46616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * following a specific ordering, you should use the constructor
46716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * with the ordering specified below.
46816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use an ordered constructor! The hashtable ordering is rarely correct
46916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
47016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
47116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable  attributes)
47216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
47316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(null, attributes);
47416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
47516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
47616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
47716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Constructor from a table of attributes with ordering.
47816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
47916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * it's is assumed the table contains OID/String pairs, and the contents
48016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * of the table are copied into an internal table as part of the
48116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * construction process. The ordering vector should contain the OIDs
48216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * in the order they are meant to be encoded or printed in toString.
48316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
48416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
48516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector      ordering,
48616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable   attributes)
48716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
48816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(ordering, attributes, new X509DefaultEntryConverter());
48916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
49016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
49116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
49216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Constructor from a table of attributes with ordering.
49316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
49416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * it's is assumed the table contains OID/String pairs, and the contents
49516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * of the table are copied into an internal table as part of the
49616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * construction process. The ordering vector should contain the OIDs
49716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * in the order they are meant to be encoded or printed in toString.
49816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
49916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * The passed in converter will be used to convert the strings into their
50016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * ASN.1 counterparts.
50116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
50216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
50316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
50416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector                   ordering,
50516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable                attributes,
50616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameEntryConverter   converter)
50716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
50816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.converter = converter;
50916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
51016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (ordering != null)
51116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
51216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = 0; i != ordering.size(); i++)
51316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
51416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.ordering.addElement(ordering.elementAt(i));
51516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.added.addElement(FALSE);
51616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
51716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
51816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else
51916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
52016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Enumeration     e = attributes.keys();
52116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
52216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            while (e.hasMoreElements())
52316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
52416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.ordering.addElement(e.nextElement());
52516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.added.addElement(FALSE);
52616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
52716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
52816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
52916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != this.ordering.size(); i++)
53016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
53116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1ObjectIdentifier     oid = (ASN1ObjectIdentifier)this.ordering.elementAt(i);
53216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
53316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (attributes.get(oid) == null)
53416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
53516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name");
53616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
53716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
53816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.values.addElement(attributes.get(oid)); // copy the hash table
53916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
54016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
54116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
54216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
54316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes two vectors one of the oids and the other of the values.
54416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
54516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
54616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
54716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector  oids,
54816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector  values)
54916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
55016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(oids, values, new X509DefaultEntryConverter());
55116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
55216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
55316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
55416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes two vectors one of the oids and the other of the values.
55516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <p>
55616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * The passed in converter will be used to convert the strings into their
55716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * ASN.1 counterparts.
55816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
55916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
56016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
56116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector                  oids,
56216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector                  values,
56316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameEntryConverter  converter)
56416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
56516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.converter = converter;
56616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
56716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (oids.size() != values.size())
56816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
56916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new IllegalArgumentException("oids vector must be same length as values.");
57016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
57116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
57216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i < oids.size(); i++)
57316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
57416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.ordering.addElement(oids.elementAt(i));
57516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.values.addElement(values.elementAt(i));
57616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.added.addElement(FALSE);
57716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
57816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
57916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
58016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//    private Boolean isEncoded(String s)
58116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//    {
58216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//        if (s.charAt(0) == '#')
58316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//        {
58416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//            return TRUE;
58516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//        }
58616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//
58716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//        return FALSE;
58816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro//    }
58916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
59016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
59116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
59216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes.
59316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
59416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
59516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
59616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String  dirName)
59716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
59816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(DefaultReverse, DefaultLookUp, dirName);
59916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
60016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
60116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
60216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
60316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes with each
60416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * string value being converted to its associated ASN.1 type using the passed
60516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * in converter.
60616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
60716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
60816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
60916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String                  dirName,
61016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameEntryConverter  converter)
61116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
61216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(DefaultReverse, DefaultLookUp, dirName, converter);
61316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
61416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
61516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
61616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
61716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes. If reverse
61816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * is true, create the encoded version of the sequence starting from the
61916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * last element in the string.
62016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
62116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
62216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
62316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean reverse,
62416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String  dirName)
62516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
62616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(reverse, DefaultLookUp, dirName);
62716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
62816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
62916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
63016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
63116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes with each
63216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * string value being converted to its associated ASN.1 type using the passed
63316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * in converter. If reverse is true the ASN.1 sequence representing the DN will
63416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * be built by starting at the end of the string, rather than the start.
63516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
63616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
63716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
63816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean                 reverse,
63916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String                  dirName,
64016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameEntryConverter  converter)
64116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
64216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(reverse, DefaultLookUp, dirName, converter);
64316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
64416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
64516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
64616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
64716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes. lookUp
64816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * should provide a table of lookups, indexed by lowercase only strings and
64916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * yielding a ASN1ObjectIdentifier, other than that OID. and numeric oids
65016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * will be processed automatically.
65116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <br>
65216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * If reverse is true, create the encoded version of the sequence
65316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * starting from the last element in the string.
65416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param reverse true if we should start scanning from the end (RFC 2553).
65516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param lookUp table of names and their oids.
65616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param dirName the X.500 string to be parsed.
65716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @deprecated use X500Name, X500NameBuilder
65816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
65916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
66016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean     reverse,
66116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable   lookUp,
66216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String      dirName)
66316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
66416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(reverse, lookUp, dirName, new X509DefaultEntryConverter());
66516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
66616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
66716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private ASN1ObjectIdentifier decodeOID(
66816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String      name,
66916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable   lookUp)
67016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
67116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        name = name.trim();
67216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (Strings.toUpperCase(name).startsWith("OID."))
67316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
67416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new ASN1ObjectIdentifier(name.substring(4));
67516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
67616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else if (name.charAt(0) >= '0' && name.charAt(0) <= '9')
67716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
67816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new ASN1ObjectIdentifier(name);
67916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
68016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
68116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier)lookUp.get(Strings.toLowerCase(name));
68216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (oid == null)
68316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
68416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name");
68516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
68616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
68716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return oid;
68816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
68916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
69016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private String unescape(String elt)
69116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
69216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (elt.length() == 0 || (elt.indexOf('\\') < 0 && elt.indexOf('"') < 0))
69316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
69416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return elt.trim();
69516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
69616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
69716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        char[] elts = elt.toCharArray();
69816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean escaped = false;
69916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean quoted = false;
70016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer buf = new StringBuffer(elt.length());
70116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int start = 0;
70216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
70316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // if it's an escaped hash string and not an actual encoding in string form
70416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // we need to leave it escaped.
70516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (elts[0] == '\\')
70616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
70716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (elts[1] == '#')
70816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
70916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                start = 2;
71016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.append("\\#");
71116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
71216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
71316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
71416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean nonWhiteSpaceEncountered = false;
71516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int     lastEscaped = 0;
71616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
71716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = start; i != elts.length; i++)
71816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
71916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            char c = elts[i];
72016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
72116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (c != ' ')
72216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
72316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                nonWhiteSpaceEncountered = true;
72416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
72516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
72616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (c == '"')
72716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
72816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (!escaped)
72916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
73016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    quoted = !quoted;
73116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
73216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
73316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
73416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    buf.append(c);
73516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
73616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                escaped = false;
73716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
73816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else if (c == '\\' && !(escaped || quoted))
73916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
74016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                escaped = true;
74116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                lastEscaped = buf.length();
74216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
74316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
74416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
74516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (c == ' ' && !escaped && !nonWhiteSpaceEncountered)
74616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
74716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    continue;
74816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
74916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.append(c);
75016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                escaped = false;
75116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
75216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
75316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
75416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (buf.length() > 0)
75516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
75616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            while (buf.charAt(buf.length() - 1) == ' ' && lastEscaped != (buf.length() - 1))
75716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
75816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.setLength(buf.length() - 1);
75916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
76016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
76116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
76216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return buf.toString();
76316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
76416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
76516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
76616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
76716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * some such, converting it into an ordered set of name attributes. lookUp
76816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * should provide a table of lookups, indexed by lowercase only strings and
76916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * yielding a ASN1ObjectIdentifier, other than that OID. and numeric oids
77016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * will be processed automatically. The passed in converter is used to convert the
77116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * string values to the right of each equals sign to their ASN.1 counterparts.
77216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <br>
77316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param reverse true if we should start scanning from the end, false otherwise.
77416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param lookUp table of names and oids.
77516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param dirName the string dirName
77616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param converter the converter to convert string values into their ASN.1 equivalents
77716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
77816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X509Name(
77916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean                 reverse,
78016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable               lookUp,
78116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String                  dirName,
78216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameEntryConverter  converter)
78316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
78416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.converter = converter;
78516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameTokenizer   nTok = new X509NameTokenizer(dirName);
78616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
78716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        while (nTok.hasMoreTokens())
78816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
78916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            String  token = nTok.nextToken();
79016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
79116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (token.indexOf('+') > 0)
79216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
79316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                X509NameTokenizer   pTok = new X509NameTokenizer(token, '+');
79416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
79516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                addEntry(lookUp, pTok.nextToken(), FALSE);
79616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
79716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                while (pTok.hasMoreTokens())
79816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
79916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    addEntry(lookUp, pTok.nextToken(), TRUE);
80016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
80116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
80216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
80316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
80416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                addEntry(lookUp, token, FALSE);
80516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
80616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
80716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
80816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (reverse)
80916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
81016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Vector  o = new Vector();
81116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Vector  v = new Vector();
81216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            Vector  a = new Vector();
81316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
81416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            int count = 1;
81516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
81616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = 0; i < this.ordering.size(); i++)
81716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
81816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (((Boolean)this.added.elementAt(i)).booleanValue())
81916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
82016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    o.insertElementAt(this.ordering.elementAt(i), count);
82116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    v.insertElementAt(this.values.elementAt(i), count);
82216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    a.insertElementAt(this.added.elementAt(i), count);
82316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    count++;
82416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
82516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
82616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
82716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    o.insertElementAt(this.ordering.elementAt(i), 0);
82816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    v.insertElementAt(this.values.elementAt(i), 0);
82916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    a.insertElementAt(this.added.elementAt(i), 0);
83016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    count = 1;
83116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
83216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
83316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
83416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.ordering = o;
83516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.values = v;
83616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            this.added = a;
83716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
83816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
83916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
84016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private void addEntry(Hashtable lookUp, String token, Boolean isAdded)
84116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
84216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509NameTokenizer vTok;
84316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String name;
84416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String value;ASN1ObjectIdentifier oid;
84516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        vTok = new X509NameTokenizer(token, '=');
84616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
84716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        name = vTok.nextToken();
84816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
84916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!vTok.hasMoreTokens())
85016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
85116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro           throw new IllegalArgumentException("badly formatted directory string");
85216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
85316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
85416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        value = vTok.nextToken();
85516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
85616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        oid = decodeOID(name, lookUp);
85716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
85816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.ordering.addElement(oid);
85916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.values.addElement(unescape(value));
86016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.added.addElement(isAdded);
86116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
86216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
86316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
86416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return a vector of the oids in the name, in the order they were found.
86516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
86616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public Vector getOIDs()
86716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
86816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector  v = new Vector();
86916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
87016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != ordering.size(); i++)
87116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
87216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.addElement(ordering.elementAt(i));
87316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
87416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
87516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return v;
87616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
87716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
87816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
87916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return a vector of the values found in the name, in the order they
88016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * were found.
88116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
88216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public Vector getValues()
88316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
88416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector  v = new Vector();
88516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
88616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != values.size(); i++)
88716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
88816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.addElement(values.elementAt(i));
88916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
89016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
89116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return v;
89216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
89316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
89416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
89516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return a vector of the values found in the name, in the order they
89616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * were found, with the DN label corresponding to passed in oid.
89716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
89816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public Vector getValues(
89916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1ObjectIdentifier oid)
90016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
90116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector  v = new Vector();
90216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
90316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != values.size(); i++)
90416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
90516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (ordering.elementAt(i).equals(oid))
90616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
90716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                String val = (String)values.elementAt(i);
90816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
90916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (val.length() > 2 && val.charAt(0) == '\\' && val.charAt(1) == '#')
91016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
91116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    v.addElement(val.substring(1));
91216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
91316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
91416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
91516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    v.addElement(val);
91616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
91716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
91816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
91916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
92016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return v;
92116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
92216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
92316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive toASN1Primitive()
92416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
92516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (seq == null)
92616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
92716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1EncodableVector  vec = new ASN1EncodableVector();
92816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1EncodableVector  sVec = new ASN1EncodableVector();
92916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1ObjectIdentifier  lstOid = null;
93016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
93116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = 0; i != ordering.size(); i++)
93216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
93316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                ASN1EncodableVector     v = new ASN1EncodableVector();
93416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                ASN1ObjectIdentifier     oid = (ASN1ObjectIdentifier)ordering.elementAt(i);
93516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
93616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                v.add(oid);
93716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
93816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                String  str = (String)values.elementAt(i);
93916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
94016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                v.add(converter.getConvertedValue(oid, str));
94116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
94216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (lstOid == null
94316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    || ((Boolean)this.added.elementAt(i)).booleanValue())
94416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
94516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    sVec.add(new DERSequence(v));
94616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
94716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
94816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
94916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    vec.add(new DERSet(sVec));
95016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    sVec = new ASN1EncodableVector();
95116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
95216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    sVec.add(new DERSequence(v));
95316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
95416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
95516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                lstOid = oid;
95616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
95716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
95816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            vec.add(new DERSet(sVec));
95916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
96016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            seq = new DERSequence(vec);
96116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
96216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
96316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return seq;
96416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
96516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
96616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
96716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param inOrder if true the order of both X509 names must be the same,
96816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * as well as the values associated with each element.
96916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
97016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public boolean equals(Object obj, boolean inOrder)
97116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
97216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!inOrder)
97316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
97416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return this.equals(obj);
97516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
97616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
97716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj == this)
97816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
97916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
98016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
98116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
98216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!(obj instanceof X509Name || obj instanceof ASN1Sequence))
98316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
98416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
98516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
98616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
98716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive();
98816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
98916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (this.toASN1Primitive().equals(derO))
99016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
99116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
99216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
99316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
99416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509Name other;
99516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
99616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
99716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
99816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            other = X509Name.getInstance(obj);
99916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
100016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IllegalArgumentException e)
100116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
100216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
100316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
100416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
100516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int      orderingSize = ordering.size();
100616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
100716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (orderingSize != other.ordering.size())
100816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
100916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
101016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
101116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
101216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i < orderingSize; i++)
101316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
101416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1ObjectIdentifier  oid = (ASN1ObjectIdentifier)ordering.elementAt(i);
101516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1ObjectIdentifier  oOid = (ASN1ObjectIdentifier)other.ordering.elementAt(i);
101616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
101716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (oid.equals(oOid))
101816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
101916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                String value = (String)values.elementAt(i);
102016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                String oValue = (String)other.values.elementAt(i);
102116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
102216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (!equivalentStrings(value, oValue))
102316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
102416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    return false;
102516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
102616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
102716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
102816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
102916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return false;
103016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
103116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
103216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
103316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return true;
103416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
103516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
103616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public int hashCode()
103716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
103816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (isHashCodeCalculated)
103916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
104016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return hashCodeValue;
104116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
104216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
104316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        isHashCodeCalculated = true;
104416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
104516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // this needs to be order independent, like equals
104616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != ordering.size(); i += 1)
104716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
104816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            String value = (String)values.elementAt(i);
104916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
105016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            value = canonicalize(value);
105116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            value = stripInternalSpaces(value);
105216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
105316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            hashCodeValue ^= ordering.elementAt(i).hashCode();
105416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            hashCodeValue ^= value.hashCode();
105516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
105616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
105716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return hashCodeValue;
105816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
105916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
106016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
106116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * test for equality - note: case is ignored.
106216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
106316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public boolean equals(Object obj)
106416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
106516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj == this)
106616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
106716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
106816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
106916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
107016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!(obj instanceof X509Name || obj instanceof ASN1Sequence))
107116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
107216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
107316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
107416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
107516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive();
107616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
107716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (this.toASN1Primitive().equals(derO))
107816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
107916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
108016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
108116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
108216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X509Name other;
108316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
108416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
108516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
108616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            other = X509Name.getInstance(obj);
108716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
108816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IllegalArgumentException e)
108916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
109016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
109116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
109216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
109316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int      orderingSize = ordering.size();
109416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
109516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (orderingSize != other.ordering.size())
109616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
109716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
109816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
109916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
110016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean[] indexes = new boolean[orderingSize];
110116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int       start, end, delta;
110216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
110316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (ordering.elementAt(0).equals(other.ordering.elementAt(0)))   // guess forward
110416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
110516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            start = 0;
110616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            end = orderingSize;
110716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            delta = 1;
110816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
110916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else  // guess reversed - most common problem
111016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
111116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            start = orderingSize - 1;
111216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            end = -1;
111316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            delta = -1;
111416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
111516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
111616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = start; i != end; i += delta)
111716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
111816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            boolean              found = false;
111916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1ObjectIdentifier  oid = (ASN1ObjectIdentifier)ordering.elementAt(i);
112016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            String               value = (String)values.elementAt(i);
112116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
112216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int j = 0; j < orderingSize; j++)
112316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
112416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (indexes[j])
112516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
112616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    continue;
112716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
112816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
112916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                ASN1ObjectIdentifier oOid = (ASN1ObjectIdentifier)other.ordering.elementAt(j);
113016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
113116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (oid.equals(oOid))
113216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
113316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    String oValue = (String)other.values.elementAt(j);
113416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
113516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    if (equivalentStrings(value, oValue))
113616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    {
113716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        indexes[j] = true;
113816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        found      = true;
113916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        break;
114016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    }
114116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
114216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
114316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
114416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (!found)
114516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
114616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return false;
114716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
114816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
114916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
115016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return true;
115116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
115216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
115316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private boolean equivalentStrings(String s1, String s2)
115416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
115516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String value = canonicalize(s1);
115616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String oValue = canonicalize(s2);
115716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
115816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!value.equals(oValue))
115916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
116016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            value = stripInternalSpaces(value);
116116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            oValue = stripInternalSpaces(oValue);
116216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
116316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (!value.equals(oValue))
116416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
116516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                return false;
116616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
116716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
116816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
116916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return true;
117016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
117116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
117216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private String canonicalize(String s)
117316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
117416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String value = Strings.toLowerCase(s.trim());
117516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
117616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (value.length() > 0 && value.charAt(0) == '#')
117716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
117816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1Primitive obj = decodeObject(value);
117916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
118016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (obj instanceof ASN1String)
118116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
118216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                value = Strings.toLowerCase(((ASN1String)obj).getString().trim());
118316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
118416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
118516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
118616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return value;
118716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
118816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
118916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private ASN1Primitive decodeObject(String oValue)
119016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
119116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
119216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
119316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return ASN1Primitive.fromByteArray(Hex.decode(oValue.substring(1)));
119416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
119516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IOException e)
119616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
119716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new IllegalStateException("unknown encoding in name: " + e);
119816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
119916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
120016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
120116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private String stripInternalSpaces(
120216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String str)
120316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
120416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer res = new StringBuffer();
120516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
120616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (str.length() != 0)
120716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
120816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            char    c1 = str.charAt(0);
120916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
121016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            res.append(c1);
121116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
121216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int k = 1; k < str.length(); k++)
121316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
121416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                char    c2 = str.charAt(k);
121516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (!(c1 == ' ' && c2 == ' '))
121616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
121716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    res.append(c2);
121816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
121916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                c1 = c2;
122016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
122116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
122216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
122316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return res.toString();
122416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
122516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
122616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private void appendValue(
122716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer        buf,
122816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable           oidSymbols,
122916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1ObjectIdentifier oid,
123016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String              value)
123116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
123216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String  sym = (String)oidSymbols.get(oid);
123316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
123416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (sym != null)
123516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
123616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            buf.append(sym);
123716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
123816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else
123916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
124016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            buf.append(oid.getId());
124116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
124216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
124316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        buf.append('=');
124416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
124580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        int start = buf.length();
124616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        buf.append(value);
124780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        int end = buf.length();
124816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
124916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (value.length() >= 2 && value.charAt(0) == '\\' && value.charAt(1) == '#')
125016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
125180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            start += 2;
125216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
125316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
125480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        while (start < end && buf.charAt(start) == ' ')
125516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
125616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            buf.insert(start, "\\");
125716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            start += 2;
125880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            ++end;
125916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
126016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
126180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        while (--end > start && buf.charAt(end) == ' ')
126280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
126380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            buf.insert(end, '\\');
126480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
126516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
126680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        while (start <= end)
126716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
126880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            switch (buf.charAt(start))
126980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            {
127080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case ',':
127180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '"':
127280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '\\':
127380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '+':
127480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '=':
127580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '<':
127680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case '>':
127780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            case ';':
127880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                buf.insert(start, "\\");
127980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                start += 2;
128080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                ++end;
128180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                break;
128280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            default:
128380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                ++start;
128480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                break;
128580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            }
128616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
128716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
128816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
128916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
129016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * convert the structure to a string - if reverse is true the
129116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * oids and values are listed out starting with the last element
129216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * in the sequence (ala RFC 2253), otherwise the string will begin
129316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * with the first element of the structure. If no string definition
129416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * for the oid is found in oidSymbols the string value of the oid is
129516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * added. Two standard symbol tables are provided DefaultSymbols, and
129616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * RFC2253Symbols as part of this class.
129716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
129816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param reverse if true start at the end of the sequence and work back.
129916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param oidSymbols look up table strings for oids.
130016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
130116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String toString(
130216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean     reverse,
130316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Hashtable   oidSymbols)
130416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
130516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer            buf = new StringBuffer();
130616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Vector                  components = new Vector();
130716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean                 first = true;
130816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
130916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        StringBuffer ava = null;
131016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
131116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i < ordering.size(); i++)
131216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
131316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (((Boolean)added.elementAt(i)).booleanValue())
131416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
131516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                ava.append('+');
131616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                appendValue(ava, oidSymbols,
131716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    (ASN1ObjectIdentifier)ordering.elementAt(i),
131816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    (String)values.elementAt(i));
131916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
132016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
132116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
132216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                ava = new StringBuffer();
132316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                appendValue(ava, oidSymbols,
132416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    (ASN1ObjectIdentifier)ordering.elementAt(i),
132516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    (String)values.elementAt(i));
132616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                components.addElement(ava);
132716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
132816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
132916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
133016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (reverse)
133116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
133216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = components.size() - 1; i >= 0; i--)
133316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
133416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (first)
133516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
133616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    first = false;
133716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
133816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
133916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
134016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    buf.append(',');
134116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
134216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
134316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.append(components.elementAt(i).toString());
134416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
134516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
134616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else
134716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
134816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (int i = 0; i < components.size(); i++)
134916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
135016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (first)
135116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
135216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    first = false;
135316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
135416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                else
135516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
135616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    buf.append(',');
135716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
135816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
135916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                buf.append(components.elementAt(i).toString());
136016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
136116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
136216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
136316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return buf.toString();
136416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
136516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
136616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private String bytesToString(
136716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[] data)
136816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
136916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        char[]  cs = new char[data.length];
137016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
137116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != cs.length; i++)
137216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
137316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            cs[i] = (char)(data[i] & 0xff);
137416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
137516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
137616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new String(cs);
137716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
137816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
137916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String toString()
138016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
138116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return toString(DefaultReverse, DefaultSymbols);
138216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
138316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
1384