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.DefaultCMSSignatureAlgorithmNameGenerator;
10import org.bouncycastle.cms.SignerInformationVerifier;
11import org.bouncycastle.operator.ContentVerifierProvider;
12import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder;
13import org.bouncycastle.operator.DigestCalculatorProvider;
14import org.bouncycastle.operator.OperatorCreationException;
15import org.bouncycastle.operator.jcajce.JcaContentVerifierProviderBuilder;
16import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
17
18public class JcaSimpleSignerInfoVerifierBuilder
19{
20    private Helper helper = new Helper();
21
22    public JcaSimpleSignerInfoVerifierBuilder setProvider(Provider provider)
23    {
24        this.helper = new ProviderHelper(provider);
25
26        return this;
27    }
28
29    public JcaSimpleSignerInfoVerifierBuilder setProvider(String providerName)
30    {
31        this.helper = new NamedHelper(providerName);
32
33        return this;
34    }
35
36    public SignerInformationVerifier build(X509CertificateHolder certHolder)
37        throws OperatorCreationException, CertificateException
38    {
39        return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certHolder), helper.createDigestCalculatorProvider());
40    }
41
42    public SignerInformationVerifier build(X509Certificate certificate)
43        throws OperatorCreationException
44    {
45        return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certificate), helper.createDigestCalculatorProvider());
46    }
47
48    public SignerInformationVerifier build(PublicKey pubKey)
49        throws OperatorCreationException
50    {
51        return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(pubKey), helper.createDigestCalculatorProvider());
52    }
53
54    private class Helper
55    {
56        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
57            throws OperatorCreationException
58        {
59            return new JcaContentVerifierProviderBuilder().build(publicKey);
60        }
61
62        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
63            throws OperatorCreationException
64        {
65            return new JcaContentVerifierProviderBuilder().build(certificate);
66        }
67
68        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
69            throws OperatorCreationException, CertificateException
70        {
71            return new JcaContentVerifierProviderBuilder().build(certHolder);
72        }
73
74        DigestCalculatorProvider createDigestCalculatorProvider()
75            throws OperatorCreationException
76        {
77            return new JcaDigestCalculatorProviderBuilder().build();
78        }
79    }
80
81    private class NamedHelper
82        extends Helper
83    {
84        private final String providerName;
85
86        public NamedHelper(String providerName)
87        {
88            this.providerName = providerName;
89        }
90
91        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
92            throws OperatorCreationException
93        {
94            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(publicKey);
95        }
96
97        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
98            throws OperatorCreationException
99        {
100            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(certificate);
101        }
102
103        DigestCalculatorProvider createDigestCalculatorProvider()
104            throws OperatorCreationException
105        {
106            return new JcaDigestCalculatorProviderBuilder().setProvider(providerName).build();
107        }
108
109        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
110            throws OperatorCreationException, CertificateException
111        {
112            return new JcaContentVerifierProviderBuilder().setProvider(providerName).build(certHolder);
113        }
114    }
115
116    private class ProviderHelper
117        extends Helper
118    {
119        private final Provider provider;
120
121        public ProviderHelper(Provider provider)
122        {
123            this.provider = provider;
124        }
125
126        ContentVerifierProvider createContentVerifierProvider(PublicKey publicKey)
127            throws OperatorCreationException
128        {
129            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(publicKey);
130        }
131
132        ContentVerifierProvider createContentVerifierProvider(X509Certificate certificate)
133            throws OperatorCreationException
134        {
135            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(certificate);
136        }
137
138        DigestCalculatorProvider createDigestCalculatorProvider()
139            throws OperatorCreationException
140        {
141            return new JcaDigestCalculatorProviderBuilder().setProvider(provider).build();
142        }
143
144        ContentVerifierProvider createContentVerifierProvider(X509CertificateHolder certHolder)
145            throws OperatorCreationException, CertificateException
146        {
147            return new JcaContentVerifierProviderBuilder().setProvider(provider).build(certHolder);
148        }
149    }
150}
151