Skip to content

Commit dcfff3d

Browse files
committed
added set for DigestInfoCalculatorProvider - relates to github #2156
1 parent 475d5ed commit dcfff3d

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

mail/src/main/java/org/bouncycastle/mail/smime/validator/SignedMailValidator.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,18 @@ else if (message.isMimeType("application/pkcs7-mime") || message.isMimeType("app
217217
throw new SignedMailValidatorException(msg, e);
218218
}
219219

220-
// validate signatues
220+
// validate signatures
221221
validateSignatures(param);
222222
}
223223

224224
protected void validateSignatures(PKIXParameters pkixParam)
225+
{
226+
JcaSimpleSignerInfoVerifierBuilder signerInfoVerifierBuilder = new JcaSimpleSignerInfoVerifierBuilder()
227+
.setProvider("BC");
228+
validateSignatures(signerInfoVerifierBuilder, pkixParam);
229+
}
230+
231+
protected void validateSignatures(JcaSimpleSignerInfoVerifierBuilder signerInfoVerifierBuilder, PKIXParameters pkixParam)
225232
{
226233
PKIXParameters usedParameters = (PKIXParameters)pkixParam.clone();
227234

@@ -261,8 +268,21 @@ protected void validateSignatures(PKIXParameters pkixParam)
261268
continue;
262269
}
263270

264-
// check signature
265-
final boolean validSignature = isValidSignature(signerCert, signer, errors);
271+
boolean validSignature;
272+
try
273+
{
274+
SignerInformationVerifier verifier = signerInfoVerifierBuilder
275+
.build(signerCert.getPublicKey());
276+
277+
// check signature
278+
validSignature = isValidSignature(verifier, signer, errors);
279+
}
280+
catch (Exception e)
281+
{
282+
validSignature = false;
283+
ErrorBundle msg = createErrorBundle("SignedMailValidator.exceptionVerifyingSignature", e);
284+
errors.add(msg);
285+
}
266286

267287
// check signer certificate (mail address, key usage, etc)
268288
checkSignerCert(signerCert, errors, notifications);
@@ -936,15 +956,11 @@ private static X509Certificate getProvidedCert(Set trustAnchors, List certStores
936956
return findFirstCert(certStores, selector, null);
937957
}
938958

939-
private static boolean isValidSignature(X509Certificate cert, SignerInformation signer, List errors)
959+
private static boolean isValidSignature(SignerInformationVerifier verifier, SignerInformation signer, List errors)
940960
{
941961
boolean validSignature = false;
942962
try
943963
{
944-
SignerInformationVerifier verifier = new JcaSimpleSignerInfoVerifierBuilder()
945-
.setProvider("BC")
946-
.build(cert.getPublicKey());
947-
948964
validSignature = signer.verify(verifier);
949965
if (!validSignature)
950966
{

pkix/src/main/java/org/bouncycastle/cms/jcajce/JcaSimpleSignerInfoVerifierBuilder.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
public class JcaSimpleSignerInfoVerifierBuilder
1919
{
2020
private Helper helper = new Helper();
21+
private DigestCalculatorProvider digestCalculatorProvider = null;
2122

2223
public JcaSimpleSignerInfoVerifierBuilder setProvider(Provider provider)
2324
{
@@ -33,22 +34,42 @@ public JcaSimpleSignerInfoVerifierBuilder setProvider(String providerName)
3334
return this;
3435
}
3536

37+
public JcaSimpleSignerInfoVerifierBuilder setDigestCalculatorProvider(DigestCalculatorProvider digestCalculatorProvider)
38+
{
39+
this.digestCalculatorProvider = digestCalculatorProvider;
40+
41+
return this;
42+
}
43+
3644
public SignerInformationVerifier build(X509CertificateHolder certHolder)
3745
throws OperatorCreationException, CertificateException
3846
{
39-
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certHolder), helper.createDigestCalculatorProvider());
47+
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certHolder), getDigestCalculatorProvider());
4048
}
4149

4250
public SignerInformationVerifier build(X509Certificate certificate)
4351
throws OperatorCreationException
4452
{
45-
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certificate), helper.createDigestCalculatorProvider());
53+
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(certificate), getDigestCalculatorProvider());
4654
}
4755

4856
public SignerInformationVerifier build(PublicKey pubKey)
4957
throws OperatorCreationException
5058
{
51-
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(pubKey), helper.createDigestCalculatorProvider());
59+
return new SignerInformationVerifier(new DefaultCMSSignatureAlgorithmNameGenerator(), new DefaultSignatureAlgorithmIdentifierFinder(), helper.createContentVerifierProvider(pubKey), getDigestCalculatorProvider());
60+
}
61+
62+
private DigestCalculatorProvider getDigestCalculatorProvider()
63+
throws OperatorCreationException
64+
{
65+
if (digestCalculatorProvider != null)
66+
{
67+
return digestCalculatorProvider;
68+
}
69+
else
70+
{
71+
return helper.createDigestCalculatorProvider();
72+
}
5273
}
5374

5475
private static class Helper

0 commit comments

Comments
 (0)