1package org.bouncycastle.cms;
2
3import java.math.BigInteger;
4
5import org.bouncycastle.asn1.x500.X500Name;
6import org.bouncycastle.cert.selector.X509CertificateHolderSelector;
7import org.bouncycastle.util.Selector;
8
9/**
10 * a basic index for a signer.
11 */
12public class SignerId
13    implements Selector
14{
15    private X509CertificateHolderSelector baseSelector;
16
17    private SignerId(X509CertificateHolderSelector baseSelector)
18    {
19        this.baseSelector = baseSelector;
20    }
21
22    /**
23     * Construct a signer ID with the value of a public key's subjectKeyId.
24     *
25     * @param subjectKeyId a subjectKeyId
26     */
27    public SignerId(byte[] subjectKeyId)
28    {
29        this(null, null, subjectKeyId);
30    }
31
32    /**
33     * Construct a signer ID based on the issuer and serial number of the signer's associated
34     * certificate.
35     *
36     * @param issuer the issuer of the signer's associated certificate.
37     * @param serialNumber the serial number of the signer's associated certificate.
38     */
39    public SignerId(X500Name issuer, BigInteger serialNumber)
40    {
41        this(issuer, serialNumber, null);
42    }
43
44    /**
45     * Construct a signer ID based on the issuer and serial number of the signer's associated
46     * certificate.
47     *
48     * @param issuer the issuer of the signer's associated certificate.
49     * @param serialNumber the serial number of the signer's associated certificate.
50     * @param subjectKeyId the subject key identifier to use to match the signers associated certificate.
51     */
52    public SignerId(X500Name issuer, BigInteger serialNumber, byte[] subjectKeyId)
53    {
54        this(new X509CertificateHolderSelector(issuer, serialNumber, subjectKeyId));
55    }
56
57    public X500Name getIssuer()
58    {
59        return baseSelector.getIssuer();
60    }
61
62    public BigInteger getSerialNumber()
63    {
64        return baseSelector.getSerialNumber();
65    }
66
67    public byte[] getSubjectKeyIdentifier()
68    {
69        return baseSelector.getSubjectKeyIdentifier();
70    }
71
72    public int hashCode()
73    {
74        return baseSelector.hashCode();
75    }
76
77    public boolean equals(
78        Object  o)
79    {
80        if (!(o instanceof SignerId))
81        {
82            return false;
83        }
84
85        SignerId id = (SignerId)o;
86
87        return this.baseSelector.equals(id.baseSelector);
88    }
89
90    public boolean match(Object obj)
91    {
92        if (obj instanceof SignerInformation)
93        {
94            return ((SignerInformation)obj).getSID().equals(this);
95        }
96
97        return baseSelector.match(obj);
98    }
99
100    public Object clone()
101    {
102        return new SignerId(this.baseSelector);
103    }
104}
105