summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Hook <dgh@bouncycastle.org>2017-05-16 00:36:34 +1000
committerDavid Hook <dgh@bouncycastle.org>2017-05-16 00:36:34 +1000
commitfefed20bec7e07456cd50a710cc11fff18cf46c1 (patch)
tree4faca389cacee73d5e34d593ac1fd9795c9431de
parentFix a bunch of RFC references in comments (diff)
downloadBouncyCastle.NET-ed25519-fefed20bec7e07456cd50a710cc11fff18cf46c1.tar.xz
Added validation of integer/enumerated encoding.
-rw-r--r--crypto/src/asn1/DerEnumerated.cs13
-rw-r--r--crypto/src/asn1/DerInteger.cs13
-rw-r--r--crypto/test/src/tsp/test/ParseTest.cs3
3 files changed, 26 insertions, 3 deletions
diff --git a/crypto/src/asn1/DerEnumerated.cs b/crypto/src/asn1/DerEnumerated.cs
index 476b7fa9a..db27065bb 100644
--- a/crypto/src/asn1/DerEnumerated.cs
+++ b/crypto/src/asn1/DerEnumerated.cs
@@ -64,7 +64,18 @@ namespace Org.BouncyCastle.Asn1
         public DerEnumerated(
             byte[]   bytes)
         {
-            this.bytes = bytes;
+            if (bytes.Length > 1)
+            {
+                if (bytes[0] == 0 && (bytes[1] & 0x80) == 0)
+                {
+                    throw new ArgumentException("malformed enumerated");
+                }
+                if (bytes[0] == (byte)0xff && (bytes[1] & 0x80) != 0)
+                {
+                    throw new ArgumentException("malformed enumerated");
+                }
+            }
+            this.bytes = Arrays.Clone(bytes);
         }
 
         public BigInteger Value
diff --git a/crypto/src/asn1/DerInteger.cs b/crypto/src/asn1/DerInteger.cs
index 3610de588..5b240d281 100644
--- a/crypto/src/asn1/DerInteger.cs
+++ b/crypto/src/asn1/DerInteger.cs
@@ -70,7 +70,18 @@ namespace Org.BouncyCastle.Asn1
 		public DerInteger(
             byte[] bytes)
         {
-            this.bytes = bytes;
+            if (bytes.Length > 1)
+            {
+                if (bytes[0] == 0 && (bytes[1] & 0x80) == 0)
+                {
+                    throw new ArgumentException("malformed integer");
+                }
+                if (bytes[0] == (byte)0xff && (bytes[1] & 0x80) != 0)
+                {
+                    throw new ArgumentException("malformed integer");
+                }
+            }
+            this.bytes = Arrays.Clone(bytes);
         }
 
 		public BigInteger Value
diff --git a/crypto/test/src/tsp/test/ParseTest.cs b/crypto/test/src/tsp/test/ParseTest.cs
index ec9ba72f6..e9489a278 100644
--- a/crypto/test/src/tsp/test/ParseTest.cs
+++ b/crypto/test/src/tsp/test/ParseTest.cs
@@ -360,7 +360,8 @@ namespace Org.BouncyCastle.Tsp.Tests
 		[Test]
 		public void TestGeneralizedTime()
 		{
-			generalizedTimeParse(generalizedTime);
+            // TODO: response is invalid - malformed integer
+			// generalizedTimeParse(generalizedTime);
 		}
 
 		[Test]