1package org.bouncycastle.cms.jcajce;
2
3import java.security.Provider;
4import java.security.PublicKey;
5import java.security.cert.CertificateException;
6import java.security.cert.X509Certificate;
7
8import org.bouncycastle.cert.X509CertificateHolder;
9import org.bouncycastle.cms.CMSSignatureAlgorithmNameGenerator;
10import org.bouncycastle.cms.DefaultCMSSignatureAlgorithmNameGenerator;
11import org.bouncycastle.cms.SignerInformationVerifier;
12import org.bouncycastle.operator.ContentVerifierProvider;
13import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder;
14import org.bouncycastle.operator.DigestCalculatorProvider;
15import org.bouncycastle.operator.OperatorCreationException;
16import org.bouncycastle.operator.SignatureAlgorithmIdentifierFinder;
17import org.bouncycastle.operator.jcajce.JcaContentVerifierProviderBuilder;
18import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
19
20public class JcaSignerInfoVerifierBuilder
21{
22    private Helper helper = new Helper();
23    private DigestCalculatorProvider digestProvider;
24    private CMSSignatureAlgorithmNameGenerator sigAlgNameGen = new DefaultCMSSignatureAlgorithmNameGenerator();
25    private SignatureAlgorithmIdentifierFinder sigAlgIDFinder = new DefaultSignatureAlgorithmIdentifierFinder();
26
27    public JcaSignerInfoVerifierBuilder(DigestCalculatorProvider digestProvider)
28    {
29        this.digestProvider = digestProvider;
30    }
31
32    public JcaSignerInfoVerifierBuilder setProvider(Provider provider)
33    {
34        this.helper = new ProviderHelper(provider);
35
36        return this;
37    }
38
39    public JcaSignerInfoVerifierBuilder setProvider(String providerName)
40    {
41        this.helper = new NamedHelper(providerName);
42
43        return this;
44    }
45
46    /**
47     * Override the default signature algorithm name generator.
48     *
49     * @param sigAlgNameGen the algorithm name generator to use.
50     * @return the current builder.
51     */
52    public JcaSignerInfoVerifierBuilder setSignatureAlgorithmNameGenerator(CMSSignatureAlgorithmNameGenerator sigAlgNameGen)
53    {
54        this.sigAlgNameGen = sigAlgNameGen;
55
56        return this;
57    }
58
59    public JcaSignerInfoVerifierBuilder setSignatureAlgorithmFinder(SignatureAlgorithmIdentifierFinder sigAlgIDFinder)
60    {
61        this.sigAlgIDFinder = sigAlgIDFinder;
62
63        return this;
64    }
65
66    public SignerInformationVerifier build(X509CertificateHolder certHolder)
67        throws OperatorCreationException, CertificateException
68    {
69        return new SignerInformationVerifier(sigAlgNameGen, sigAlgIDFinder, helper.createContentVerifierProvider(certHolder), digestProvider);
70    }
71
72    public SignerInformationVerifier build(X509Certificate certificate)
73        throws OperatorCreationException
74    {
75        return new SignerInformationVerifier(sigAlgNameGen, sigAlgIDFinder, helper.createContentVerifierProvider(certificate), digestProvider);
76    }
77
78    public SignerInformationVerifier build(PublicKey pubKey)
79        throws OperatorCreationException
80    {
81        return new SignerInformationVerifier(sigAlgNameGen, sigAlgIDFinder, helper.createContentVerifierProvider(pubKey), digestProvider);
82    }
83
84    private class Helper
85    {
86        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
87            throws OperatorCreationException
88        {
89            return new JcaContentVerifierProviderBuilder().build(publicKey);
90        }
91
92        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
93            throws OperatorCreationException
94        {
95            return new JcaContentVerifierProviderBuilder().build(certificate);
96        }
97
98        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
99            throws OperatorCreationException, CertificateException
100        {
101            return new JcaContentVerifierProviderBuilder().build(certHolder);
102        }
103
104        DigestCalculatorProvider createDigestCalculatorProvider()
105            throws OperatorCreationException
106        {
107            return new JcaDigestCalculatorProviderBuilder().build();
108        }
109    }
110
111    private class NamedHelper
112        extends Helper
113    {
114        private final String providerName;
115
116        public NamedHelper(String providerName)
117        {
118            this.providerName = providerName;
119        }
120
121        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
122            throws OperatorCreationException
123        {
124            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(publicKey);
125        }
126
127        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
128            throws OperatorCreationException
129        {
130            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(certificate);
131        }
132
133        DigestCalculatorProvider createDigestCalculatorProvider()
134            throws OperatorCreationException
135        {
136            return new JcaDigestCalculatorProviderBuilder().setProvider(providerName).build();
137        }
138
139        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
140            throws OperatorCreationException, CertificateException
141        {
142            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(certHolder);
143        }
144    }
145
146    private class ProviderHelper
147        extends Helper
148    {
149        private final Provider provider;
150
151        public ProviderHelper(Provider provider)
152        {
153            this.provider = provider;
154        }
155
156        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
157            throws OperatorCreationException
158        {
159            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(publicKey);
160        }
161
162        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
163            throws OperatorCreationException
164        {
165            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(certificate);
166        }
167
168        DigestCalculatorProvider createDigestCalculatorProvider()
169            throws OperatorCreationException
170        {
171            return new JcaDigestCalculatorProviderBuilder().setProvider(provider).build();
172        }
173
174        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
175            throws OperatorCreationException, CertificateException
176        {
177            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(certHolder);
178        }
179    }
180}
181