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