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

SignedPublicKeyAndChallenge

For parsing the SignedPublicKeyAndChallenge created by the KEYGEN tag included by Mozilla based browsers.
using Org.BouncyCastle.Asn1.X509; using System; namespace Org.BouncyCastle.Asn1.Mozilla { public class SignedPublicKeyAndChallenge : Asn1Encodable { private readonly PublicKeyAndChallenge m_publicKeyAndChallenge; private readonly AlgorithmIdentifier m_signatureAlgorithm; private readonly DerBitString m_signature; public PublicKeyAndChallenge PublicKeyAndChallenge => m_publicKeyAndChallenge; public DerBitString Signature => m_signature; public AlgorithmIdentifier SignatureAlgorithm => m_signatureAlgorithm; public static SignedPublicKeyAndChallenge GetInstance(object obj) { if (obj == null) return null; SignedPublicKeyAndChallenge signedPublicKeyAndChallenge = obj as SignedPublicKeyAndChallenge; if (signedPublicKeyAndChallenge != null) return signedPublicKeyAndChallenge; return new SignedPublicKeyAndChallenge(Asn1Sequence.GetInstance(obj)); } public static SignedPublicKeyAndChallenge GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new SignedPublicKeyAndChallenge(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); } public static SignedPublicKeyAndChallenge GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) { return new SignedPublicKeyAndChallenge(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); } public SignedPublicKeyAndChallenge(PublicKeyAndChallenge publicKeyAndChallenge, AlgorithmIdentifier signatureAlgorithm, DerBitString signature) { if (publicKeyAndChallenge == null) throw new ArgumentNullException("publicKeyAndChallenge"); m_publicKeyAndChallenge = publicKeyAndChallenge; if (signatureAlgorithm == null) throw new ArgumentNullException("signatureAlgorithm"); m_signatureAlgorithm = signatureAlgorithm; if (signature == null) throw new ArgumentNullException("signature"); m_signature = signature; } private SignedPublicKeyAndChallenge(Asn1Sequence seq) { if (seq == null) throw new ArgumentNullException("seq"); if (seq.Count != 3) throw new ArgumentException($"""{seq.Count}", "seq"); m_publicKeyAndChallenge = PublicKeyAndChallenge.GetInstance(seq[0]); m_signatureAlgorithm = AlgorithmIdentifier.GetInstance(seq[1]); m_signature = DerBitString.GetInstance(seq[2]); } public override Asn1Object ToAsn1Object() { return new DerSequence(m_publicKeyAndChallenge, m_signatureAlgorithm, m_signature); } } }