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

GenericSigner

public class GenericSigner : ISigner
using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; using System.Runtime.CompilerServices; namespace Org.BouncyCastle.Crypto.Signers { public class GenericSigner : ISigner { private readonly IAsymmetricBlockCipher m_engine; private readonly IDigest m_digest; private bool m_forSigning; public virtual string AlgorithmName { get { DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(10, 2); defaultInterpolatedStringHandler.AppendLiteral("Generic("); defaultInterpolatedStringHandler.AppendFormatted(m_engine.AlgorithmName); defaultInterpolatedStringHandler.AppendLiteral("/"); defaultInterpolatedStringHandler.AppendFormatted(m_digest.AlgorithmName); defaultInterpolatedStringHandler.AppendLiteral(")"); return defaultInterpolatedStringHandler.ToStringAndClear(); } } public GenericSigner(IAsymmetricBlockCipher engine, IDigest digest) { m_engine = engine; m_digest = digest; } public virtual void Init(bool forSigning, ICipherParameters parameters) { m_forSigning = forSigning; AsymmetricKeyParameter asymmetricKeyParameter = (AsymmetricKeyParameter)ParameterUtilities.IgnoreRandom(parameters); if (forSigning && !asymmetricKeyParameter.IsPrivate) throw new InvalidKeyException("Signing requires private key."); if (!forSigning && asymmetricKeyParameter.IsPrivate) throw new InvalidKeyException("Verification requires public key."); Reset(); m_engine.Init(forSigning, parameters); } public virtual void Update(byte input) { m_digest.Update(input); } public virtual void BlockUpdate(byte[] input, int inOff, int inLen) { m_digest.BlockUpdate(input, inOff, inLen); } public virtual void BlockUpdate(ReadOnlySpan<byte> input) { m_digest.BlockUpdate(input); } public virtual int GetMaxSignatureSize() { return m_engine.GetOutputBlockSize(); } public virtual byte[] GenerateSignature() { if (!m_forSigning) throw new InvalidOperationException("GenericSigner not initialised for signature generation."); byte[] array = DigestUtilities.DoFinal(m_digest); return m_engine.ProcessBlock(array, 0, array.Length); } public virtual bool VerifySignature(byte[] signature) { if (!m_forSigning) { byte[] array = DigestUtilities.DoFinal(m_digest); try { byte[] array2 = m_engine.ProcessBlock(signature, 0, signature.Length); if (array2.Length < array.Length) { byte[] array3 = new byte[array.Length]; Array.Copy(array2, 0, array3, array3.Length - array2.Length, array2.Length); array2 = array3; } return Arrays.FixedTimeEquals(array2, array); } catch { return false; } } throw new InvalidOperationException("GenericSigner not initialised for verification"); } public virtual void Reset() { m_digest.Reset(); } } }