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

SignedPublicKeyAndChallenge

public sealed class SignedPublicKeyAndChallenge
using Org.BouncyCastle.Asn1.Mozilla; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Operators; using Org.BouncyCastle.Security; using Org.BouncyCastle.X509; using System; namespace Org.BouncyCastle.Mozilla { public sealed class SignedPublicKeyAndChallenge { private readonly Org.BouncyCastle.Asn1.Mozilla.SignedPublicKeyAndChallenge m_spkac; public SignedPublicKeyAndChallenge(byte[] encoding) : this(Org.BouncyCastle.Asn1.Mozilla.SignedPublicKeyAndChallenge.GetInstance(encoding)) { } public SignedPublicKeyAndChallenge(Org.BouncyCastle.Asn1.Mozilla.SignedPublicKeyAndChallenge spkac) { if (spkac == null) throw new ArgumentNullException("spkac"); m_spkac = spkac; } public AsymmetricKeyParameter GetPublicKey() { return PublicKeyFactory.CreateKey(m_spkac.PublicKeyAndChallenge.Spki); } public bool IsSignatureValid(AsymmetricKeyParameter publicKey) { return CheckSignatureValid(new Asn1VerifierFactory(m_spkac.SignatureAlgorithm, publicKey)); } public bool IsSignatureValid(IVerifierFactoryProvider verifierProvider) { return CheckSignatureValid(verifierProvider.CreateVerifierFactory(m_spkac.SignatureAlgorithm)); } public Org.BouncyCastle.Asn1.Mozilla.SignedPublicKeyAndChallenge ToAsn1Structure() { return m_spkac; } public void Verify(AsymmetricKeyParameter publicKey) { CheckSignature(new Asn1VerifierFactory(m_spkac.SignatureAlgorithm, publicKey)); } public void Verify(IVerifierFactoryProvider verifierProvider) { CheckSignature(verifierProvider.CreateVerifierFactory(m_spkac.SignatureAlgorithm)); } private void CheckSignature(IVerifierFactory verifier) { if (!CheckSignatureValid(verifier)) throw new InvalidKeyException("Public key presented not for SPKAC signature"); } private bool CheckSignatureValid(IVerifierFactory verifier) { return Org.BouncyCastle.X509.X509Utilities.VerifySignature(verifier, m_spkac.PublicKeyAndChallenge, m_spkac.Signature); } } }