116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1.x500;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Enumeration;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Choice;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encodable;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Object;
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Primitive;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Sequence;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1TaggedObject;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERSequence;
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.x500.style.BCStyle;
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro/**
16bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro * The X.500 Name object.
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * <pre>
1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     Name ::= CHOICE {
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *                       RDNSequence }
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     RelativeDistinguishedName ::= SET SIZE (1..MAX) OF AttributeTypeAndValue
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *     AttributeTypeAndValue ::= SEQUENCE {
2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *                                   type  OBJECT IDENTIFIER,
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *                                   value ANY }
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * </pre>
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class X500Name
3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    extends ASN1Object
3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    implements ASN1Choice
3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static X500NameStyle    defaultStyle = BCStyle.INSTANCE;
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private boolean                 isHashCodeCalculated;
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private int                     hashCodeValue;
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private X500NameStyle style;
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private RDN[] rdns;
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
42bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    /**
43bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * @deprecated use the getInstance() method that takes a style.
44bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     */
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X500Name(X500NameStyle style, X500Name name)
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.rdns = name.rdns;
4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.style = style;
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Return a X500Name based on the passed in tagged object.
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param obj tag object holding name.
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param explicit true if explicitly tagged false otherwise.
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return the X500Name
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X500Name getInstance(
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1TaggedObject obj,
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean          explicit)
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // must be true as choice item
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return getInstance(ASN1Sequence.getInstance(obj, true));
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X500Name getInstance(
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Object  obj)
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj instanceof X500Name)
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return (X500Name)obj;
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else if (obj != null)
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new X500Name(ASN1Sequence.getInstance(obj));
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X500Name getInstance(
8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X500NameStyle style,
8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Object        obj)
8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj instanceof X500Name)
8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
87bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            return new X500Name(style, (X500Name)obj);
8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        else if (obj != null)
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new X500Name(style, ASN1Sequence.getInstance(obj));
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Constructor from ASN1Sequence
9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the principal will be a list of constructed sets, each containing an (OID, String) pair.
10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private X500Name(
10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Sequence  seq)
10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(defaultStyle, seq);
10616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private X500Name(
10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X500NameStyle style,
11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Sequence  seq)
11116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
11216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.style = style;
11316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.rdns = new RDN[seq.size()];
11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int index = 0;
11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (Enumeration e = seq.getObjects(); e.hasMoreElements();)
11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            rdns[index++] = RDN.getInstance(e.nextElement());
12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X500Name(
12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] rDNs)
12516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(defaultStyle, rDNs);
12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X500Name(
13016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X500NameStyle style,
13116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[]         rDNs)
13216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
13316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.rdns = rDNs;
13416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.style = style;
13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X500Name(
13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String dirName)
13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(defaultStyle, dirName);
14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public X500Name(
14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        X500NameStyle style,
14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        String        dirName)
14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this(style.fromString(dirName));
14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.style = style;
15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return an array of RDNs in structure order.
15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return an array of RDN objects.
15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public RDN[] getRDNs()
15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] tmp = new RDN[this.rdns.length];
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        System.arraycopy(rdns, 0, tmp, 0, tmp.length);
16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return tmp;
16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return an array of OIDs contained in the attribute type of each RDN in structure order.
16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return an array, possibly zero length, of ASN1ObjectIdentifiers objects.
17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1ObjectIdentifier[] getAttributeTypes()
17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int   count = 0;
17416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != rdns.length; i++)
17616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
17716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            RDN rdn = rdns[i];
17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            count += rdn.size();
18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1ObjectIdentifier[] res = new ASN1ObjectIdentifier[count];
18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        count = 0;
18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != rdns.length; i++)
18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            RDN rdn = rdns[i];
18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (rdn.isMultiValued())
19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                AttributeTypeAndValue[] attr = rdn.getTypesAndValues();
19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                for (int j = 0; j != attr.length; j++)
19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    res[count++] = attr[j].getType();
19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else if (rdn.size() != 0)
19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
20016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                res[count++] = rdn.getFirst().getType();
20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return res;
20516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
20816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * return an array of RDNs containing the attribute type given by OID in structure order.
20916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
21016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param attributeType the type OID we are looking for.
21116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return an array, possibly zero length, of RDN objects.
21216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
21316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public RDN[] getRDNs(ASN1ObjectIdentifier attributeType)
21416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
21516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] res = new RDN[rdns.length];
21616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int   count = 0;
21716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (int i = 0; i != rdns.length; i++)
21916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
22016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            RDN rdn = rdns[i];
22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            if (rdn.isMultiValued())
22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                AttributeTypeAndValue[] attr = rdn.getTypesAndValues();
22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                for (int j = 0; j != attr.length; j++)
22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    if (attr[j].getType().equals(attributeType))
22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    {
22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        res[count++] = rdn;
23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        break;
23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    }
23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
23316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            else
23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                if (rdn.getFirst().getType().equals(attributeType))
23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                {
23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                    res[count++] = rdn;
23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                }
24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
24116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        RDN[] tmp = new RDN[count];
24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        System.arraycopy(res, 0, tmp, 0, tmp.length);
24616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return tmp;
24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
24916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive toASN1Primitive()
25116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
25216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new DERSequence(rdns);
25316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
25416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public int hashCode()
25616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
25716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (isHashCodeCalculated)
25816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
25916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return hashCodeValue;
26016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
26116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
26216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        isHashCodeCalculated = true;
26316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
26416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        hashCodeValue = style.calculateHashCode(this);
26516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
26616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return hashCodeValue;
26716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
26816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
26916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
27016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * test for equality - note: case is ignored.
27116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
27216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public boolean equals(Object obj)
27316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
27416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj == this)
27516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
27616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
27716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
27816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
27916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (!(obj instanceof X500Name || obj instanceof ASN1Sequence))
28016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
28116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
28216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
28316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
28416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Primitive derO = ((ASN1Encodable)obj).toASN1Primitive();
28516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
28616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (this.toASN1Primitive().equals(derO))
28716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
28816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return true;
28916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
29016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
29116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
29216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
29316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return style.areEqual(this, new X500Name(ASN1Sequence.getInstance(((ASN1Encodable)obj).toASN1Primitive())));
29416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
29516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (Exception e)
29616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
29716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return false;
29816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
29916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
30016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
30116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String toString()
30216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
30316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return style.toString(this);
30416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
30516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
30616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
30716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Set the default style for X500Name construction.
30816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
30916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @param style  an X500NameStyle
31016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
31116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static void setDefaultStyle(X500NameStyle style)
31216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
31316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (style == null)
31416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
31516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new NullPointerException("cannot set style to null");
31616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
31716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
31816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        defaultStyle = style;
31916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
32016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
32116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
32216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Return the current default style.
32316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
32416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * @return default style for X500Name construction.
32516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
32616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static X500NameStyle getDefaultStyle()
32716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
32816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return defaultStyle;
32916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
33016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
331