16e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompackage org.bouncycastle.asn1.x500;
26e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
36e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.Enumeration;
46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Choice;
66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject;
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERSequence;
136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x500.style.BCStyle;
146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom/**
166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * <pre>
176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *     Name ::= CHOICE {
186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *                       RDNSequence }
196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *
206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *
226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *     RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *
246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *     AttributeTypeAndValue ::= SEQUENCE {
256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *                                   type  OBJECT IDENTIFIER,
266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom *                                   value ANY }
276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom * </pre>
286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom */
296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompublic class X500Name
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    implements ASN1Choice
326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{
336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private static X500NameStyle    defaultStyle = BCStyle.INSTANCE;
346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private boolean                 isHashCodeCalculated;
366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private int                     hashCodeValue;
376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private X500NameStyle style;
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private RDN[] rdns;
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500Name(X500NameStyle style, X500Name name)
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.rdns = name.rdns;
446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.style = style;
456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * Return a X500Name based on the passed in tagged object.
496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @param obj tag object holding name.
516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @param explicit true if explicitly tagged false otherwise.
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return the X500Name
536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static X500Name getInstance(
556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1TaggedObject obj,
566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean          explicit)
576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        // must be true as choice item
596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return getInstance(ASN1Sequence.getInstance(obj, true));
606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static X500Name getInstance(
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        Object  obj)
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (obj instanceof X500Name)
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return (X500Name)obj;
686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (obj != null)
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new X500Name(ASN1Sequence.getInstance(obj));
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static X500Name getInstance(
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        X500NameStyle style,
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Object        obj)
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof X500Name)
826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return getInstance(style, ((X500Name)obj).toASN1Primitive());
846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else if (obj != null)
866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new X500Name(style, ASN1Sequence.getInstance(obj));
886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return null;
916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Constructor from ASN1Sequence
956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * the principal will be a list of constructed sets, each containing an (OID, String) pair.
976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private X500Name(
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1Sequence  seq)
1006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this(defaultStyle, seq);
1026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private X500Name(
1056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        X500NameStyle style,
1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1Sequence  seq)
1076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.style = style;
1096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.rdns = new RDN[seq.size()];
1106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int index = 0;
1126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (Enumeration e = seq.getObjects(); e.hasMoreElements();)
1146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
1156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            rdns[index++] = RDN.getInstance(e.nextElement());
1166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
1176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500Name(
1206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] rDNs)
1216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this(defaultStyle, rDNs);
1236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500Name(
1266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        X500NameStyle style,
1276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[]         rDNs)
1286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.rdns = rDNs;
1306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.style = style;
1316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500Name(
1346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        String dirName)
1356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this(defaultStyle, dirName);
1376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public X500Name(
1406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        X500NameStyle style,
1416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        String        dirName)
1426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this(style.fromString(dirName));
1446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        this.style = style;
1466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * return an array of RDNs in structure order.
1506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
1516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @return an array of RDN objects.
1526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
1536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public RDN[] getRDNs()
1546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
1556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] tmp = new RDN[this.rdns.length];
1566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        System.arraycopy(rdns, 0, tmp, 0, tmp.length);
1586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return tmp;
1606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * return an array of OIDs contained in the attribute type of each RDN in structure order.
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     *
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @return an array, possibly zero length, of ASN1ObjectIdentifiers objects.
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1ObjectIdentifier[] getAttributeTypes()
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int   count = 0;
1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        for (int i = 0; i != rdns.length; i++)
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            RDN rdn = rdns[i];
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            count += rdn.size();
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1ObjectIdentifier[] res = new ASN1ObjectIdentifier[count];
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        count = 0;
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        for (int i = 0; i != rdns.length; i++)
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            RDN rdn = rdns[i];
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            if (rdn.isMultiValued())
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                AttributeTypeAndValue[] attr = rdn.getTypesAndValues();
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                for (int j = 0; j != attr.length; j++)
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                {
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    res[count++] = attr[j].getType();
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                }
1934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            else if (rdn.size() != 0)
1954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                res[count++] = rdn.getFirst().getType();
1974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return res;
2014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
2024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
2034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    /**
2046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * return an array of RDNs containing the attribute type given by OID in structure order.
2056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
2064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * @param attributeType the type OID we are looking for.
2076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @return an array, possibly zero length, of RDN objects.
2086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
2094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public RDN[] getRDNs(ASN1ObjectIdentifier attributeType)
2106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] res = new RDN[rdns.length];
2126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int   count = 0;
2136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        for (int i = 0; i != rdns.length; i++)
2156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            RDN rdn = rdns[i];
2176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (rdn.isMultiValued())
2196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                AttributeTypeAndValue[] attr = rdn.getTypesAndValues();
2216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                for (int j = 0; j != attr.length; j++)
2226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
2234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                    if (attr[j].getType().equals(attributeType))
2246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    {
2256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                        res[count++] = rdn;
2266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                        break;
2276e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    }
2286e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
2296e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
2306e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
2316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
2324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                if (rdn.getFirst().getType().equals(attributeType))
2336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                {
2346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                    res[count++] = rdn;
2356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                }
2366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
2376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        RDN[] tmp = new RDN[count];
2406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        System.arraycopy(res, 0, tmp, 0, tmp.length);
2426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return tmp;
2446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
2476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return new DERSequence(rdns);
2496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public int hashCode()
2526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (isHashCodeCalculated)
2546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return hashCodeValue;
2566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        isHashCodeCalculated = true;
2596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        hashCodeValue = style.calculateHashCode(this);
2616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return hashCodeValue;
2636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
2666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * test for equality - note: case is ignored.
2676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
2686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public boolean equals(Object obj)
2696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (obj == this)
2716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return true;
2736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (!(obj instanceof X500Name || obj instanceof ASN1Sequence))
2766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return false;
2786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive();
2816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (this.toASN1Primitive().equals(derO))
2836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return true;
2856e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2876e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        try
2886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return style.areEqual(this, new X500Name(ASN1Sequence.getInstance(((ASN1Encodable)obj).toASN1Primitive())));
2906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        catch (Exception e)
2926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
2936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return false;
2946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
2956e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
2966e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
2976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public String toString()
2986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
2996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return style.toString(this);
3006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
3036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Set the default style for X500Name construction.
3046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
3056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @param style  an X500NameStyle
3066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
3076e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static void setDefaultStyle(X500NameStyle style)
3086e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
3096e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        if (style == null)
3106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        {
3116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            throw new NullPointerException("cannot set style to null");
3126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        }
3136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        defaultStyle = style;
3156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
3176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
3186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * Return the current default style.
3196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     *
3206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @return default style for X500Name construction.
3216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
3226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public static X500NameStyle getDefaultStyle()
3236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
3246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return defaultStyle;
3256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
3266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom}
327