1package org.bouncycastle.cert;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import org.bouncycastle.asn1.ASN1Encodable;
7import org.bouncycastle.asn1.x500.X500Name;
8import org.bouncycastle.asn1.x509.AttCertIssuer;
9import org.bouncycastle.asn1.x509.GeneralName;
10import org.bouncycastle.asn1.x509.GeneralNames;
11import org.bouncycastle.asn1.x509.V2Form;
12import org.bouncycastle.util.Selector;
13
14/**
15 * Carrying class for an attribute certificate issuer.
16 */
17public class AttributeCertificateIssuer
18    implements Selector
19{
20    final ASN1Encodable form;
21
22    /**
23     * Set the issuer directly with the ASN.1 structure.
24     *
25     * @param issuer The issuer
26     */
27    public AttributeCertificateIssuer(AttCertIssuer issuer)
28    {
29        form = issuer.getIssuer();
30    }
31
32    public AttributeCertificateIssuer(X500Name principal)
33    {
34        form = new V2Form(new GeneralNames(new GeneralName(principal)));
35    }
36
37    public X500Name[] getNames()
38    {
39        GeneralNames name;
40
41        if (form instanceof V2Form)
42        {
43            name = ((V2Form)form).getIssuerName();
44        }
45        else
46        {
47            name = (GeneralNames)form;
48        }
49
50        GeneralName[] names = name.getNames();
51
52        List l = new ArrayList(names.length);
53
54        for (int i = 0; i != names.length; i++)
55        {
56            if (names[i].getTagNo() == GeneralName.directoryName)
57            {
58                l.add(X500Name.getInstance(names[i].getName()));
59            }
60        }
61
62        return (X500Name[])l.toArray(new X500Name[l.size()]);
63    }
64
65    private boolean matchesDN(X500Name subject, GeneralNames targets)
66    {
67        GeneralName[] names = targets.getNames();
68
69        for (int i = 0; i != names.length; i++)
70        {
71            GeneralName gn = names[i];
72
73            if (gn.getTagNo() == GeneralName.directoryName)
74            {
75                if (X500Name.getInstance(gn.getName()).equals(subject))
76                {
77                    return true;
78                }
79            }
80        }
81
82        return false;
83    }
84
85    public Object clone()
86    {
87        return new AttributeCertificateIssuer(AttCertIssuer.getInstance(form));
88    }
89
90    public boolean equals(Object obj)
91    {
92        if (obj == this)
93        {
94            return true;
95        }
96
97        if (!(obj instanceof AttributeCertificateIssuer))
98        {
99            return false;
100        }
101
102        AttributeCertificateIssuer other = (AttributeCertificateIssuer)obj;
103
104        return this.form.equals(other.form);
105    }
106
107    public int hashCode()
108    {
109        return this.form.hashCode();
110    }
111
112    public boolean match(Object obj)
113    {
114        if (!(obj instanceof X509CertificateHolder))
115        {
116            return false;
117        }
118
119        X509CertificateHolder x509Cert = (X509CertificateHolder)obj;
120
121        if (form instanceof V2Form)
122        {
123            V2Form issuer = (V2Form)form;
124            if (issuer.getBaseCertificateID() != null)
125            {
126                return issuer.getBaseCertificateID().getSerial().getValue().equals(x509Cert.getSerialNumber())
127                    && matchesDN(x509Cert.getIssuer(), issuer.getBaseCertificateID().getIssuer());
128            }
129
130            GeneralNames name = issuer.getIssuerName();
131            if (matchesDN(x509Cert.getSubject(), name))
132            {
133                return true;
134            }
135        }
136        else
137        {
138            GeneralNames name = (GeneralNames)form;
139            if (matchesDN(x509Cert.getSubject(), name))
140            {
141                return true;
142            }
143        }
144
145        return false;
146    }
147}
148