summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2014-09-28 18:55:57 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2014-09-28 18:55:57 +0700
commitec23584a31ca9e2d879b76641036b96e46e8e446 (patch)
treeeefca15b5e499e13f3ca848a593ba7fc23ed10a4
parentEarly code-point assignment for draft-ietf-tls-session-hash (diff)
downloadBouncyCastle.NET-ed25519-ec23584a31ca9e2d879b76641036b96e46e8e446.tar.xz
Port of GenericSIgner fix from Java
-rw-r--r--crypto/src/crypto/signers/GenericSigner.cs229
1 files changed, 115 insertions, 114 deletions
diff --git a/crypto/src/crypto/signers/GenericSigner.cs b/crypto/src/crypto/signers/GenericSigner.cs
index 1a53eee2b..5035b454d 100644
--- a/crypto/src/crypto/signers/GenericSigner.cs
+++ b/crypto/src/crypto/signers/GenericSigner.cs
@@ -6,124 +6,125 @@ using Org.BouncyCastle.Utilities;
 
 namespace 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 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 void Init(
-			bool				forSigning,
-			ICipherParameters	parameters)
-		{
-			this.forSigning = forSigning;
-			AsymmetricKeyParameter k;
-
-			if (parameters is ParametersWithRandom)
-			{
-				k = (AsymmetricKeyParameter)((ParametersWithRandom)parameters).Parameters;
-			}
-			else
-			{
-				k = (AsymmetricKeyParameter)parameters;
-			}
+    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 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 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)
+            if (!forSigning && k.IsPrivate)
                 throw new InvalidKeyException("Verification requires public key.");
 
-			Reset();
-
-			engine.Init(forSigning, parameters);
-		}
-
-		/**
-		* update the internal digest with the byte b
-		*/
-		public void Update(
-			byte input)
-		{
-			digest.Update(input);
-		}
-
-		/**
-		* update the internal digest with the byte array in
-		*/
-		public void BlockUpdate(
-			byte[]	input,
-			int		inOff,
-			int		length)
-		{
-			digest.BlockUpdate(input, inOff, length);
-		}
-
-		/**
-		* Generate a signature for the message we've been loaded with using the key
-		* we were initialised with.
-		*/
-		public 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);
-		}
-
-		/**
-		* return true if the internal state represents the signature described in
-		* the passed in array.
-		*/
-		public 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);
-
-				return Arrays.ConstantTimeAreEqual(sig, hash);
-			}
-			catch (Exception)
-			{
-				return false;
-			}
-		}
-
-		public void Reset()
-		{
-			digest.Reset();
-		}
-	}
+            Reset();
+
+            engine.Init(forSigning, parameters);
+        }
+
+        /**
+        * update the internal digest with the byte b
+        */
+        public void Update(byte input)
+        {
+            digest.Update(input);
+        }
+
+        /**
+        * update the internal digest with the byte array in
+        */
+        public void BlockUpdate(byte[] input, int inOff, int length)
+        {
+            digest.BlockUpdate(input, inOff, length);
+        }
+
+        /**
+        * Generate a signature for the message we've been loaded with using the key
+        * we were initialised with.
+        */
+        public 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);
+        }
+
+        /**
+        * return true if the internal state represents the signature described in
+        * the passed in array.
+        */
+        public 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 void Reset()
+        {
+            digest.Reset();
+        }
+    }
 }