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