<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0" />

SignerInfoGeneratorBuilder

using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.X509; namespace Org.BouncyCastle.Cms { public class SignerInfoGeneratorBuilder { private bool m_directSignature; private CmsAttributeTableGenerator m_signedGen; private CmsAttributeTableGenerator m_unsignedGen; public SignerInfoGeneratorBuilder SetDirectSignature(bool hasNoSignedAttributes) { m_directSignature = hasNoSignedAttributes; return this; } public SignerInfoGeneratorBuilder WithSignedAttributeGenerator(CmsAttributeTableGenerator signedGen) { m_signedGen = signedGen; return this; } public SignerInfoGeneratorBuilder WithUnsignedAttributeGenerator(CmsAttributeTableGenerator unsignedGen) { m_unsignedGen = unsignedGen; return this; } public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate) { SignerIdentifier signerIdentifier = CmsUtilities.GetSignerIdentifier(certificate); return CreateGenerator(contentSigner, signerIdentifier, certificate); } public SignerInfoGenerator Build(ISignatureFactory signerFactory, byte[] subjectKeyIdentifier) { SignerIdentifier signerIdentifier = CmsUtilities.GetSignerIdentifier(subjectKeyIdentifier); return CreateGenerator(signerFactory, signerIdentifier, null); } private SignerInfoGenerator CreateGenerator(ISignatureFactory signatureFactory, SignerIdentifier sigID, X509Certificate certificate) { CmsAttributeTableGenerator cmsAttributeTableGenerator = m_signedGen; CmsAttributeTableGenerator unsignedGen = m_unsignedGen; if (m_directSignature) { cmsAttributeTableGenerator = null; unsignedGen = null; } else if (cmsAttributeTableGenerator == null) { cmsAttributeTableGenerator = new DefaultSignedAttributeTableGenerator(); } return new SignerInfoGenerator(sigID, signatureFactory, cmsAttributeTableGenerator, unsignedGen, certificate); } } }