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);
}
}
}