123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- using System;
- using Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
- using Best.HTTP.SecureProtocol.Org.BouncyCastle.Security;
- using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities;
- namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.Signers
- {
- public class GenericSigner
- : ISigner
- {
- private readonly IAsymmetricBlockCipher engine;
- private readonly IDigest digest;
- private bool forSigning;
- public GenericSigner(
- IAsymmetricBlockCipher engine,
- IDigest digest)
- {
- this.engine = engine;
- this.digest = digest;
- }
- public virtual string AlgorithmName
- {
- get { return "Generic(" + engine.AlgorithmName + "/" + digest.AlgorithmName + ")"; }
- }
- /**
- * initialise the signer for signing or verification.
- *
- * @param forSigning
- * true if for signing, false otherwise
- * @param parameters
- * necessary parameters.
- */
- public virtual void Init(bool forSigning, ICipherParameters parameters)
- {
- this.forSigning = forSigning;
- AsymmetricKeyParameter k;
- if (parameters is ParametersWithRandom)
- {
- k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
- }
- else
- {
- k = (AsymmetricKeyParameter)parameters;
- }
- if (forSigning && !k.IsPrivate)
- throw new InvalidKeyException("Signing requires private key.");
- if (!forSigning && k.IsPrivate)
- throw new InvalidKeyException("Verification requires public key.");
- Reset();
- engine.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);
- }
- #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || UNITY_2021_2_OR_NEWER
- public virtual void BlockUpdate(ReadOnlySpan<byte> input)
- {
- digest.BlockUpdate(input);
- }
- #endif
- public virtual byte[] GenerateSignature()
- {
- if (!forSigning)
- throw new InvalidOperationException("GenericSigner not initialised for signature generation.");
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
- return engine.ProcessBlock(hash, 0, hash.Length);
- }
- public virtual bool VerifySignature(byte[] signature)
- {
- if (forSigning)
- throw new InvalidOperationException("GenericSigner not initialised for verification");
- byte[] hash = new byte[digest.GetDigestSize()];
- digest.DoFinal(hash, 0);
- try
- {
- byte[] sig = engine.ProcessBlock(signature, 0, signature.Length);
- // Extend with leading zeroes to match the digest size, if necessary.
- if (sig.Length < hash.Length)
- {
- byte[] tmp = new byte[hash.Length];
- Array.Copy(sig, 0, tmp, tmp.Length - sig.Length, sig.Length);
- sig = tmp;
- }
- return Arrays.ConstantTimeAreEqual(sig, hash);
- }
- catch (Exception)
- {
- return false;
- }
- }
- public virtual void Reset()
- {
- digest.Reset();
- }
- }
- }
- #pragma warning restore
- #endif
|