Skip to content

Commit c349210

Browse files
committed
added certHolder field to copy constructor - fix for github #1941
1 parent c44344e commit c349210

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed

pkix/src/main/java/org/bouncycastle/cms/SignerInfoGenerator.java

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ public SignerInfoGenerator(
7878
this.digestAlgorithm = original.digestAlgorithm;
7979
this.digester = original.digester;
8080
this.sigEncAlgFinder = original.sigEncAlgFinder;
81+
this.certHolder = original.certHolder;
8182
this.sAttrGen = sAttrGen;
8283
this.unsAttrGen = unsAttrGen;
8384
}

pkix/src/test/java/org/bouncycastle/cms/test/NewSignedDataTest.java

+48
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.ByteArrayInputStream;
44
import java.io.IOException;
5+
import java.io.OutputStream;
56
import java.security.KeyFactory;
67
import java.security.KeyPair;
78
import java.security.MessageDigest;
@@ -48,12 +49,16 @@
4849
import org.bouncycastle.asn1.cms.SignedData;
4950
import org.bouncycastle.asn1.cms.SignerInfo;
5051
import org.bouncycastle.asn1.edec.EdECObjectIdentifiers;
52+
import org.bouncycastle.asn1.ess.ESSCertIDv2;
53+
import org.bouncycastle.asn1.ess.SigningCertificateV2;
5154
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
5255
import org.bouncycastle.asn1.ocsp.OCSPResponse;
5356
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
5457
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
5558
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
59+
import org.bouncycastle.asn1.x500.X500Name;
5660
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
61+
import org.bouncycastle.asn1.x509.IssuerSerial;
5762
import org.bouncycastle.asn1.x9.X9ObjectIdentifiers;
5863
import org.bouncycastle.cert.X509AttributeCertificateHolder;
5964
import org.bouncycastle.cert.X509CertificateHolder;
@@ -76,6 +81,7 @@
7681
import org.bouncycastle.cms.DefaultCMSSignatureAlgorithmNameGenerator;
7782
import org.bouncycastle.cms.DefaultSignedAttributeTableGenerator;
7883
import org.bouncycastle.cms.SignerId;
84+
import org.bouncycastle.cms.SignerInfoGenerator;
7985
import org.bouncycastle.cms.SignerInfoGeneratorBuilder;
8086
import org.bouncycastle.cms.SignerInformation;
8187
import org.bouncycastle.cms.SignerInformationStore;
@@ -92,6 +98,7 @@
9298
import org.bouncycastle.operator.ContentSigner;
9399
import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder;
94100
import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder;
101+
import org.bouncycastle.operator.DigestCalculator;
95102
import org.bouncycastle.operator.DigestCalculatorProvider;
96103
import org.bouncycastle.operator.OperatorCreationException;
97104
import org.bouncycastle.operator.bc.BcContentSignerBuilder;
@@ -3203,6 +3210,47 @@ public void testMixed()
32033210
}
32043211
}
32053212

3213+
public void testSignerInfoGenCopyConstructor()
3214+
throws Exception
3215+
{
3216+
ContentSigner sha256Signer = new JcaContentSignerBuilder("SHA256withRSA").setProvider(BC).build(_origKP.getPrivate());
3217+
SignerInfoGenerator signerInfoGen = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider(BC).build()).build(sha256Signer, _origCert);
3218+
3219+
DigestCalculator digCalc = new SHA256DigestCalculator();
3220+
3221+
OutputStream dOut = digCalc.getOutputStream();
3222+
3223+
dOut.write(_origCert.getEncoded());
3224+
3225+
dOut.close();
3226+
3227+
byte[] certHash256 = digCalc.getDigest();
3228+
final ESSCertIDv2 essCertIDv2 = new ESSCertIDv2(certHash256, new IssuerSerial(X500Name.getInstance(_origCert.getIssuerX500Principal().getEncoded()), _origCert.getSerialNumber()));
3229+
3230+
CMSAttributeTableGenerator signedAttrGen = new CMSAttributeTableGenerator()
3231+
{
3232+
public AttributeTable getAttributes(Map parameters)
3233+
throws CMSAttributeTableGenerationException
3234+
{
3235+
AttributeTable table = signerInfoGen.getSignedAttributeTableGenerator().getAttributes(parameters);
3236+
3237+
if (table.get(PKCSObjectIdentifiers.id_aa_signingCertificateV2) == null)
3238+
{
3239+
return table.add(PKCSObjectIdentifiers.id_aa_signingCertificateV2,
3240+
new SigningCertificateV2(essCertIDv2));
3241+
}
3242+
3243+
return table;
3244+
}
3245+
};
3246+
SignerInfoGenerator newSignerInfoGen = new SignerInfoGenerator(signerInfoGen, signedAttrGen, signerInfoGen.getUnsignedAttributeTableGenerator());
3247+
3248+
assertTrue(signerInfoGen.hasAssociatedCertificate());
3249+
assertTrue(newSignerInfoGen.hasAssociatedCertificate());
3250+
assertTrue(signerInfoGen.getUnsignedAttributeTableGenerator() == newSignerInfoGen.getUnsignedAttributeTableGenerator());
3251+
assertTrue(newSignerInfoGen.getSignedAttributeTableGenerator() == signedAttrGen);
3252+
}
3253+
32063254
public void testMSPKCS7()
32073255
throws Exception
32083256
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.bouncycastle.cms.test;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.OutputStream;
5+
6+
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
7+
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
8+
import org.bouncycastle.crypto.Digest;
9+
import org.bouncycastle.crypto.digests.SHA256Digest;
10+
import org.bouncycastle.operator.DigestCalculator;
11+
12+
13+
class SHA256DigestCalculator
14+
implements DigestCalculator
15+
{
16+
private ByteArrayOutputStream bOut = new ByteArrayOutputStream();
17+
18+
public AlgorithmIdentifier getAlgorithmIdentifier()
19+
{
20+
return new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256);
21+
}
22+
23+
public OutputStream getOutputStream()
24+
{
25+
return bOut;
26+
}
27+
28+
public byte[] getDigest()
29+
{
30+
byte[] bytes = bOut.toByteArray();
31+
32+
bOut.reset();
33+
34+
Digest sha256 = SHA256Digest.newInstance();
35+
36+
sha256.update(bytes, 0, bytes.length);
37+
38+
byte[] digest = new byte[sha256.getDigestSize()];
39+
40+
sha256.doFinal(digest, 0);
41+
42+
return digest;
43+
}
44+
}

0 commit comments

Comments
 (0)