<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

CertificateRequestMessageBuilder

using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Crmf; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Math; using Org.BouncyCastle.X509; using System; using System.Collections.Generic; namespace Org.BouncyCastle.Crmf { public class CertificateRequestMessageBuilder { private readonly List<IControl> m_controls = new List<IControl>(); private readonly X509ExtensionsGenerator m_extGenerator = new X509ExtensionsGenerator(); private readonly CertTemplateBuilder m_templateBuilder = new CertTemplateBuilder(); private readonly BigInteger m_certReqID; private ISignatureFactory m_popSigner; private PKMacBuilder m_pkMacBuilder; private char[] m_password; private GeneralName m_sender; private int m_popoType = 2; private PopoPrivKey m_popoPrivKey; private Asn1Null m_popRaVerified; private PKMacValue m_agreeMac; private AttributeTypeAndValue[] m_regInfo; public CertificateRequestMessageBuilder(BigInteger certReqId) { m_certReqID = certReqId; } public CertificateRequestMessageBuilder SetRegInfo(AttributeTypeAndValue[] regInfo) { m_regInfo = regInfo; return this; } public CertificateRequestMessageBuilder SetPublicKey(AsymmetricKeyParameter publicKey) { return SetSubjectPublicKeyInfo(SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey)); } [Obsolete("Use 'SetSubjectPublicKeyInfo' instead")] public CertificateRequestMessageBuilder SetPublicKey(SubjectPublicKeyInfo publicKeyInfo) { return SetSubjectPublicKeyInfo(publicKeyInfo); } public CertificateRequestMessageBuilder SetSubjectPublicKeyInfo(SubjectPublicKeyInfo spki) { if (spki != null) m_templateBuilder.SetSubjectPublicKeyInfo(spki); return this; } public CertificateRequestMessageBuilder SetIssuer(X509Name issuer) { if (issuer != null) m_templateBuilder.SetIssuer(issuer); return this; } public CertificateRequestMessageBuilder SetSubject(X509Name subject) { if (subject != null) m_templateBuilder.SetSubject(subject); return this; } public CertificateRequestMessageBuilder SetSerialNumber(BigInteger serialNumber) { if (serialNumber != null) m_templateBuilder.SetSerialNumber(new DerInteger(serialNumber)); return this; } public CertificateRequestMessageBuilder SetSerialNumber(DerInteger serialNumber) { if (serialNumber != null) m_templateBuilder.SetSerialNumber(serialNumber); return this; } public CertificateRequestMessageBuilder SetValidity(OptionalValidity validity) { m_templateBuilder.SetValidity(validity); return this; } public CertificateRequestMessageBuilder SetValidity(DateTime? notBefore, DateTime? notAfter) { m_templateBuilder.SetValidity(notBefore, notAfter); return this; } public CertificateRequestMessageBuilder AddExtension(DerObjectIdentifier oid, bool critical, Asn1Encodable value) { m_extGenerator.AddExtension(oid, critical, value); return this; } public CertificateRequestMessageBuilder AddExtension(DerObjectIdentifier oid, bool critical, byte[] value) { m_extGenerator.AddExtension(oid, critical, value); return this; } public CertificateRequestMessageBuilder AddControl(IControl control) { m_controls.Add(control); return this; } public CertificateRequestMessageBuilder SetProofOfPossessionSignKeySigner(ISignatureFactory popoSignatureFactory) { if (m_popoPrivKey != null || m_popRaVerified != null || m_agreeMac != null) throw new InvalidOperationException("only one proof of possession is allowed."); m_popSigner = popoSignatureFactory; return this; } public CertificateRequestMessageBuilder SetProofOfPossessionSubsequentMessage(SubsequentMessage msg) { if (m_popoPrivKey != null || m_popRaVerified != null || m_agreeMac != null) throw new InvalidOperationException("only one proof of possession is allowed."); m_popoType = 2; m_popoPrivKey = new PopoPrivKey(msg); return this; } public CertificateRequestMessageBuilder SetProofOfPossessionSubsequentMessage(int type, SubsequentMessage msg) { if (m_popoPrivKey != null || m_popRaVerified != null || m_agreeMac != null) throw new InvalidOperationException("only one proof of possession is allowed."); if (type != 2 && type != 3) throw new ArgumentException("type must be ProofOfPossession.TYPE_KEY_ENCIPHERMENT or ProofOfPossession.TYPE_KEY_AGREEMENT"); m_popoType = type; m_popoPrivKey = new PopoPrivKey(msg); return this; } public CertificateRequestMessageBuilder SetProofOfPossessionAgreeMac(PKMacValue macValue) { if (m_popSigner != null || m_popRaVerified != null || m_popoPrivKey != null) throw new InvalidOperationException("only one proof of possession allowed"); m_agreeMac = macValue; return this; } public CertificateRequestMessageBuilder SetProofOfPossessionRaVerified() { if (m_popSigner != null || m_popoPrivKey != null) throw new InvalidOperationException("only one proof of possession allowed"); m_popRaVerified = DerNull.Instance; return this; } [Obsolete("Use 'SetAuthInfoPKMacBuilder' instead")] public CertificateRequestMessageBuilder SetAuthInfoPKMAC(PKMacBuilder pkmacFactory, char[] password) { return SetAuthInfoPKMacBuilder(pkmacFactory, password); } public CertificateRequestMessageBuilder SetAuthInfoPKMacBuilder(PKMacBuilder pkmacFactory, char[] password) { m_pkMacBuilder = pkmacFactory; m_password = password; return this; } public CertificateRequestMessageBuilder SetAuthInfoPKMacBuilder(PKMacBuilder pkmacFactory, ReadOnlySpan<char> password) { m_pkMacBuilder = pkmacFactory; m_password = password.ToArray(); return this; } public CertificateRequestMessageBuilder SetAuthInfoSender(X509Name sender) { return SetAuthInfoSender(new GeneralName(sender)); } public CertificateRequestMessageBuilder SetAuthInfoSender(GeneralName sender) { m_sender = sender; return this; } public CertificateRequestMessage Build() { Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(3); asn1EncodableVector.Add(new DerInteger(m_certReqID)); if (!m_extGenerator.IsEmpty) m_templateBuilder.SetExtensions(m_extGenerator.Generate()); asn1EncodableVector.Add(m_templateBuilder.Build()); if (m_controls.Count > 0) { Asn1EncodableVector asn1EncodableVector2 = new Asn1EncodableVector(m_controls.Count); foreach (IControl control in m_controls) { asn1EncodableVector2.Add(new AttributeTypeAndValue(control.Type, control.Value)); } asn1EncodableVector.Add(new DerSequence(asn1EncodableVector2)); } CertRequest instance = CertRequest.GetInstance(new DerSequence(asn1EncodableVector)); ProofOfPossession popo; if (m_popSigner == null) popo = ((m_popoPrivKey != null) ? new ProofOfPossession(m_popoType, m_popoPrivKey) : ((m_agreeMac != null) ? new ProofOfPossession(3, new PopoPrivKey(m_agreeMac)) : ((m_popRaVerified == null) ? new ProofOfPossession() : new ProofOfPossession()))); else { CertTemplate certTemplate = instance.CertTemplate; ProofOfPossessionSigningKeyBuilder proofOfPossessionSigningKeyBuilder; if (certTemplate.Subject == null || certTemplate.PublicKey == null) { proofOfPossessionSigningKeyBuilder = new ProofOfPossessionSigningKeyBuilder(instance.CertTemplate.PublicKey); if (m_sender != null) proofOfPossessionSigningKeyBuilder.SetSender(m_sender); else proofOfPossessionSigningKeyBuilder.SetPublicKeyMac(m_pkMacBuilder, m_password); } else proofOfPossessionSigningKeyBuilder = new ProofOfPossessionSigningKeyBuilder(instance); popo = new ProofOfPossession(proofOfPossessionSigningKeyBuilder.Build(m_popSigner)); } return new CertificateRequestMessage(new CertReqMsg(instance, popo, m_regInfo)); } } }