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

DsaDigestSigner

public class DsaDigestSigner : ISigner
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; using Org.BouncyCastle.Security; using System; namespace Org.BouncyCastle.Crypto.Signers { public class DsaDigestSigner : ISigner { private readonly IDsa dsa; private readonly IDigest digest; private readonly IDsaEncoding encoding; private bool forSigning; public virtual string AlgorithmName => digest.AlgorithmName + "with" + dsa.AlgorithmName; public DsaDigestSigner(IDsa dsa, IDigest digest) : this(dsa, digest, StandardDsaEncoding.Instance) { } public DsaDigestSigner(IDsa dsa, IDigest digest, IDsaEncoding encoding) { this.dsa = dsa; this.digest = digest; this.encoding = encoding; } public virtual void Init(bool forSigning, ICipherParameters parameters) { this.forSigning = forSigning; ParametersWithRandom parametersWithRandom = parameters as ParametersWithRandom; AsymmetricKeyParameter asymmetricKeyParameter = (parametersWithRandom == null) ? ((AsymmetricKeyParameter)parameters) : ((AsymmetricKeyParameter)parametersWithRandom.Parameters); if (forSigning && !asymmetricKeyParameter.IsPrivate) throw new InvalidKeyException("Signing Requires Private Key."); if (!forSigning && asymmetricKeyParameter.IsPrivate) throw new InvalidKeyException("Verification Requires Public Key."); Reset(); dsa.Init(forSigning, parameters); } public virtual void Update(byte input) { digest.Update(input); } public virtual void BlockUpdate(byte[] input, int inOff, int inLen) { digest.BlockUpdate(input, inOff, inLen); } public virtual void BlockUpdate(ReadOnlySpan<byte> input) { digest.BlockUpdate(input); } public virtual int GetMaxSignatureSize() { return encoding.GetMaxEncodingSize(GetOrder()); } public virtual byte[] GenerateSignature() { if (forSigning) { byte[] array = new byte[digest.GetDigestSize()]; digest.DoFinal(array, 0); BigInteger[] array2 = dsa.GenerateSignature(array); try { return encoding.Encode(GetOrder(), array2[0], array2[1]); } catch (Exception) { throw new InvalidOperationException("unable to encode signature"); } } throw new InvalidOperationException("DsaDigestSigner not initialized for signature generation."); } public virtual bool VerifySignature(byte[] signature) { if (!forSigning) { byte[] array = new byte[digest.GetDigestSize()]; digest.DoFinal(array, 0); try { BigInteger[] array2 = encoding.Decode(GetOrder(), signature); return dsa.VerifySignature(array, array2[0], array2[1]); } catch (Exception) { return false; } } throw new InvalidOperationException("DsaDigestSigner not initialized for verification"); } public virtual void Reset() { digest.Reset(); } protected virtual BigInteger GetOrder() { return dsa.Order; } } }