summary refs log tree commit diff
path: root/crypto/test
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2017-06-09 19:11:59 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2017-06-09 19:11:59 +0700
commit56d5b48ee27c091a00e6aee4e6fa196634dea32b (patch)
tree988c94f8237c92fb60175d620286506b38f81820 /crypto/test
parentAdd validation to RSA public key constructor (diff)
downloadBouncyCastle.NET-ed25519-56d5b48ee27c091a00e6aee4e6fa196634dea32b.tar.xz
Port of latest encodings work from Java
Diffstat (limited to 'crypto/test')
-rw-r--r--crypto/test/src/crypto/test/OAEPTest.cs43
-rw-r--r--crypto/test/src/crypto/test/RSABlindedTest.cs8
-rw-r--r--crypto/test/src/crypto/test/RsaTest.cs93
3 files changed, 117 insertions, 27 deletions
diff --git a/crypto/test/src/crypto/test/OAEPTest.cs b/crypto/test/src/crypto/test/OAEPTest.cs
index ee48a183d..bc1dd9292 100644
--- a/crypto/test/src/crypto/test/OAEPTest.cs
+++ b/crypto/test/src/crypto/test/OAEPTest.cs
@@ -5,7 +5,7 @@ using NUnit.Framework;
 using Org.BouncyCastle.Asn1;
 using Org.BouncyCastle.Asn1.Pkcs;
 using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Digests;
 using Org.BouncyCastle.Crypto.Encodings;
 using Org.BouncyCastle.Crypto.Engines;
 using Org.BouncyCastle.Crypto.Parameters;
@@ -779,6 +779,47 @@ namespace Org.BouncyCastle.Crypto.Tests
             OaepVecTest(1027, 4, pubParam, privParam, seed_1027_4, input_1027_4, output_1027_4);
             OaepVecTest(1027, 5, pubParam, privParam, seed_1027_5, input_1027_5, output_1027_5);
             OaepVecTest(1027, 6, pubParam, privParam, seed_1027_6, input_1027_6, output_1027_6);
+
+            //
+            // OAEP - public encrypt, private decrypt  differring hashes
+            //
+            IAsymmetricBlockCipher cipher = new OaepEncoding(new RsaEngine(), new Sha256Digest(), new Sha1Digest(), new byte[10]);
+
+            cipher.Init(true, new ParametersWithRandom(pubParam, new SecureRandom()));
+
+            byte[] input = new byte[10];
+
+            byte[] output = cipher.ProcessBlock(input, 0, input.Length);
+
+            cipher.Init(false, privParam);
+
+            output = cipher.ProcessBlock(output, 0, output.Length);
+
+            for (int i = 0; i != input.Length; i++)
+            {
+                if (output[i] != input[i])
+                {
+                    Fail("mixed digest failed decoding");
+                }
+            }
+
+            cipher = new OaepEncoding(new RsaEngine(), new Sha1Digest(), new Sha256Digest(), new byte[10]);
+
+            cipher.Init(true, new ParametersWithRandom(pubParam, new SecureRandom()));
+
+            output = cipher.ProcessBlock(input, 0, input.Length);
+
+            cipher.Init(false, privParam);
+
+            output = cipher.ProcessBlock(output, 0, output.Length);
+
+            for (int i = 0; i != input.Length; i++)
+            {
+                if (output[i] != input[i])
+                {
+                    Fail("mixed digest failed decoding");
+                }
+            }
         }
 
         public static void Main(
diff --git a/crypto/test/src/crypto/test/RSABlindedTest.cs b/crypto/test/src/crypto/test/RSABlindedTest.cs
index 80d6e8e49..75b9f3a07 100644
--- a/crypto/test/src/crypto/test/RSABlindedTest.cs
+++ b/crypto/test/src/crypto/test/RSABlindedTest.cs
@@ -103,22 +103,22 @@ namespace Org.BouncyCastle.Crypto.Tests
 
 		private void doTestTruncatedPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, truncatedDataBlock, "block truncated");
+			checkForPkcs1Exception(pubParameters, privParameters, truncatedDataBlock, "block incorrect");
 		}
 
 		private void doTestDudPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, dudBlock, "unknown block type");
+			checkForPkcs1Exception(pubParameters, privParameters, dudBlock, "block incorrect");
 		}
 
 		private void doTestWrongPaddingPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, incorrectPadding, "block padding incorrect");
+			checkForPkcs1Exception(pubParameters, privParameters, incorrectPadding, "block incorrect");
 		}
 
 		private void doTestMissingDataPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, missingDataBlock, "no data in block");
+			checkForPkcs1Exception(pubParameters, privParameters, missingDataBlock, "block incorrect");
 		}
 
 		private void checkForPkcs1Exception(RsaKeyParameters pubParameters, RsaKeyParameters privParameters, byte[] inputData, string expectedMessage)
diff --git a/crypto/test/src/crypto/test/RsaTest.cs b/crypto/test/src/crypto/test/RsaTest.cs
index e3fc18d02..e9f30cae9 100644
--- a/crypto/test/src/crypto/test/RsaTest.cs
+++ b/crypto/test/src/crypto/test/RsaTest.cs
@@ -54,10 +54,11 @@ namespace Org.BouncyCastle.Crypto.Tests
 			eng.Init(true, privParameters);
 
 			byte[] data = null;
+            byte[] overSized = null;
 
-			try
-			{
-				data = eng.ProcessBlock(oversizedSig, 0, oversizedSig.Length);
+            try
+            {
+				overSized = data = eng.ProcessBlock(oversizedSig, 0, oversizedSig.Length);
 			}
 			catch (Exception e)
 			{
@@ -70,7 +71,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
 			try
 			{
-				data = eng.ProcessBlock(data, 0, data.Length);
+				data = eng.ProcessBlock(overSized, 0, overSized.Length);
 
 				Fail("oversized signature block not recognised");
 			}
@@ -82,9 +83,22 @@ namespace Org.BouncyCastle.Crypto.Tests
 				}
 			}
 
+            eng = new Pkcs1Encoding(new RsaEngine(), Hex.Decode("feedbeeffeedbeeffeedbeef"));
+            eng.Init(false, new ParametersWithRandom(privParameters, new SecureRandom()));
+
+            try
+            {
+                data = eng.ProcessBlock(overSized, 0, overSized.Length);
+                IsTrue("not fallback", Arrays.AreEqual(Hex.Decode("feedbeeffeedbeeffeedbeef"), data));
+            }
+            catch (InvalidCipherTextException e)
+            {
+                Fail("RSA: failed - exception " + e.ToString(), e);
+            }
 
-			// Create the encoding with StrictLengthEnabled=false (done thru environment in Java version)
-			Pkcs1Encoding.StrictLengthEnabled = false;
+
+            // Create the encoding with StrictLengthEnabled=false (done thru environment in Java version)
+            Pkcs1Encoding.StrictLengthEnabled = false;
 
 			eng = new Pkcs1Encoding(new RsaEngine());
 
@@ -92,7 +106,7 @@ namespace Org.BouncyCastle.Crypto.Tests
 
 			try
 			{
-				data = eng.ProcessBlock(data, 0, data.Length);
+				data = eng.ProcessBlock(overSized, 0, overSized.Length);
 			}
 			catch (InvalidCipherTextException e)
 			{
@@ -104,22 +118,22 @@ namespace Org.BouncyCastle.Crypto.Tests
 
 		private void doTestTruncatedPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, truncatedDataBlock, "block truncated");
+			checkForPkcs1Exception(pubParameters, privParameters, truncatedDataBlock, "block incorrect");
 		}
 
 		private void doTestDudPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, dudBlock, "unknown block type");
+			checkForPkcs1Exception(pubParameters, privParameters, dudBlock, "block incorrect");
 		}
 
 		private void doTestWrongPaddingPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, incorrectPadding, "block padding incorrect");
+			checkForPkcs1Exception(pubParameters, privParameters, incorrectPadding, "block incorrect");
 		}
 
 		private void doTestMissingDataPkcs1Block(RsaKeyParameters pubParameters, RsaKeyParameters privParameters)
 		{
-			checkForPkcs1Exception(pubParameters, privParameters, missingDataBlock, "no data in block");
+			checkForPkcs1Exception(pubParameters, privParameters, missingDataBlock, "block incorrect");
 		}
 
 		private void checkForPkcs1Exception(RsaKeyParameters pubParameters, RsaKeyParameters privParameters, byte[] inputData, string expectedMessage)
@@ -431,30 +445,65 @@ namespace Org.BouncyCastle.Crypto.Tests
 
 			eng.Init(false, privParameters);
 
-			try
-			{
-				data = eng.ProcessBlock(data, 0, data.Length);
+            byte[] plainData = null;
+            try
+            {
+				plainData = eng.ProcessBlock(data, 0, data.Length);
 			}
 			catch (Exception e)
 			{
 				Fail("failed - exception " + e.ToString());
 			}
 
-			if (!input.Equals(Hex.ToHexString(data)))
-			{
-				Fail("failed PKCS1 public/private Test");
+            if (!input.Equals(Hex.ToHexString(plainData)))
+            {
+                Fail("failed PKCS1 public/private Test");
 			}
 
-			//
-			// PKCS1 - private encrypt, public decrypt
-			//
-			eng = new Pkcs1Encoding(((Pkcs1Encoding)eng).GetUnderlyingCipher());
+            Pkcs1Encoding fEng = new Pkcs1Encoding(new RsaEngine(), input.Length / 2);
+            fEng.Init(false, new ParametersWithRandom(privParameters, new SecureRandom()));
+            try
+            {
+                plainData = fEng.ProcessBlock(data, 0, data.Length);
+            }
+            catch (Exception e)
+            {
+                Fail("failed - exception " + e.ToString(), e);
+            }
+
+            if (!input.Equals(Hex.ToHexString(plainData)))
+            {
+                Fail("failed PKCS1 public/private fixed Test");
+            }
+
+            fEng = new Pkcs1Encoding(new RsaEngine(), input.Length);
+            fEng.Init(false, new ParametersWithRandom(privParameters, new SecureRandom()));
+            try
+            {
+                data = fEng.ProcessBlock(data, 0, data.Length);
+            }
+            catch (Exception e)
+            {
+                Fail("failed - exception " + e.ToString(), e);
+            }
+
+            if (input.Equals(Hex.ToHexString(data)))
+            {
+                Fail("failed to recognise incorrect plaint text length");
+            }
+
+            data = plainData;
+
+            //
+            // PKCS1 - private encrypt, public decrypt
+            //
+            eng = new Pkcs1Encoding(((Pkcs1Encoding)eng).GetUnderlyingCipher());
 
 			eng.Init(true, privParameters);
 
 			try
 			{
-				data = eng.ProcessBlock(data, 0, data.Length);
+				data = eng.ProcessBlock(plainData, 0, plainData.Length);
 			}
 			catch (Exception e)
 			{