package org.bouncycastle.cms.jcajce;

import java.security.PrivateKey;
import java.security.Provider;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;

import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import org.bouncycastle.cms.CMSAttributeTableGenerator;
import org.bouncycastle.cms.DefaultSignedAttributeTableGenerator;
import org.bouncycastle.cms.SignerInfoGenerator;
import org.bouncycastle.cms.SignerInfoGeneratorBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.DigestCalculatorProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;

Use this class if you are using a provider that has all the facilities you need.

For example:

     CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
     ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(signKP.getPrivate());
     gen.addSignerInfoGenerator(
               new JcaSignerInfoGeneratorBuilder(
                    new JcaDigestCalculatorProviderBuilder().setProvider("BC").build())
                    .build(sha1Signer, signCert));
becomes:
     CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
     gen.addSignerInfoGenerator(
               new JcaSimpleSignerInfoGeneratorBuilder()
                    .setProvider("BC")
                    .build("SHA1withRSA", signKP.getPrivate(), signCert));
/** * Use this class if you are using a provider that has all the facilities you * need. * <p> * For example: * <pre> * CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); * ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(signKP.getPrivate()); * * gen.addSignerInfoGenerator( * new JcaSignerInfoGeneratorBuilder( * new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()) * .build(sha1Signer, signCert)); * </pre> * becomes: * <pre> * CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); * * gen.addSignerInfoGenerator( * new JcaSimpleSignerInfoGeneratorBuilder() * .setProvider("BC") * .build("SHA1withRSA", signKP.getPrivate(), signCert)); * </pre> */
public class JcaSimpleSignerInfoGeneratorBuilder { private Helper helper; private boolean hasNoSignedAttributes; private CMSAttributeTableGenerator signedGen; private CMSAttributeTableGenerator unsignedGen; public JcaSimpleSignerInfoGeneratorBuilder() throws OperatorCreationException { this.helper = new Helper(); } public JcaSimpleSignerInfoGeneratorBuilder setProvider(String providerName) throws OperatorCreationException { this.helper = new NamedHelper(providerName); return this; } public JcaSimpleSignerInfoGeneratorBuilder setProvider(Provider provider) throws OperatorCreationException { this.helper = new ProviderHelper(provider); return this; }
If the passed in flag is true, the signer signature will be based on the data, not a collection of signed attributes, and no signed attributes will be included.
Returns:the builder object
/** * If the passed in flag is true, the signer signature will be based on the data, not * a collection of signed attributes, and no signed attributes will be included. * * @return the builder object */
public JcaSimpleSignerInfoGeneratorBuilder setDirectSignature(boolean hasNoSignedAttributes) { this.hasNoSignedAttributes = hasNoSignedAttributes; return this; } public JcaSimpleSignerInfoGeneratorBuilder setSignedAttributeGenerator(CMSAttributeTableGenerator signedGen) { this.signedGen = signedGen; return this; }
set up a DefaultSignedAttributeTableGenerator primed with the passed in AttributeTable.
Params:
  • attrTable – table of attributes for priming generator
Returns:this.
/** * set up a DefaultSignedAttributeTableGenerator primed with the passed in AttributeTable. * * @param attrTable table of attributes for priming generator * @return this. */
public JcaSimpleSignerInfoGeneratorBuilder setSignedAttributeGenerator(AttributeTable attrTable) { this.signedGen = new DefaultSignedAttributeTableGenerator(attrTable); return this; } public JcaSimpleSignerInfoGeneratorBuilder setUnsignedAttributeGenerator(CMSAttributeTableGenerator unsignedGen) { this.unsignedGen = unsignedGen; return this; } public SignerInfoGenerator build(String algorithmName, PrivateKey privateKey, X509CertificateHolder certificate) throws OperatorCreationException { ContentSigner contentSigner = helper.createContentSigner(algorithmName, privateKey); return configureAndBuild().build(contentSigner, certificate); } public SignerInfoGenerator build(String algorithmName, PrivateKey privateKey, X509Certificate certificate) throws OperatorCreationException, CertificateEncodingException { ContentSigner contentSigner = helper.createContentSigner(algorithmName, privateKey); return configureAndBuild().build(contentSigner, new JcaX509CertificateHolder(certificate)); } public SignerInfoGenerator build(String algorithmName, PrivateKey privateKey, byte[] keyIdentifier) throws OperatorCreationException { ContentSigner contentSigner = helper.createContentSigner(algorithmName, privateKey); return configureAndBuild().build(contentSigner, keyIdentifier); } private SignerInfoGeneratorBuilder configureAndBuild() throws OperatorCreationException { SignerInfoGeneratorBuilder infoGeneratorBuilder = new SignerInfoGeneratorBuilder(helper.createDigestCalculatorProvider()); infoGeneratorBuilder.setDirectSignature(hasNoSignedAttributes); infoGeneratorBuilder.setSignedAttributeGenerator(signedGen); infoGeneratorBuilder.setUnsignedAttributeGenerator(unsignedGen); return infoGeneratorBuilder; } private class Helper { ContentSigner createContentSigner(String algorithm, PrivateKey privateKey) throws OperatorCreationException { return new JcaContentSignerBuilder(algorithm).build(privateKey); } DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException { return new JcaDigestCalculatorProviderBuilder().build(); } } private class NamedHelper extends Helper { private final String providerName; public NamedHelper(String providerName) { this.providerName = providerName; } ContentSigner createContentSigner(String algorithm, PrivateKey privateKey) throws OperatorCreationException { return new JcaContentSignerBuilder(algorithm).setProvider(providerName).build(privateKey); } DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException { return new JcaDigestCalculatorProviderBuilder().setProvider(providerName).build(); } } private class ProviderHelper extends Helper { private final Provider provider; public ProviderHelper(Provider provider) { this.provider = provider; } ContentSigner createContentSigner(String algorithm, PrivateKey privateKey) throws OperatorCreationException { return new JcaContentSignerBuilder(algorithm).setProvider(provider).build(privateKey); } DigestCalculatorProvider createDigestCalculatorProvider() throws OperatorCreationException { return new JcaDigestCalculatorProviderBuilder().setProvider(provider).build(); } } }