summary refs log tree commit diff
path: root/crypto/src/asn1/x9
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2018-07-10 23:21:16 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2018-07-10 23:21:16 +0700
commitaca10f3c38a70188b4caa29b1ca32b2dd04e16bc (patch)
treeefb31e973b61e1c32e49f1b9d7a6bc7f4067dcf9 /crypto/src/asn1/x9
parentMake members private (diff)
downloadBouncyCastle.NET-ed25519-aca10f3c38a70188b4caa29b1ca32b2dd04e16bc.tar.xz
EC-related updates from bc-java
Diffstat (limited to 'crypto/src/asn1/x9')
-rw-r--r--crypto/src/asn1/x9/X962NamedCurves.cs6
-rw-r--r--crypto/src/asn1/x9/X9Curve.cs76
-rw-r--r--crypto/src/asn1/x9/X9ECParameters.cs27
-rw-r--r--crypto/src/asn1/x9/X9FieldElement.cs2
4 files changed, 60 insertions, 51 deletions
diff --git a/crypto/src/asn1/x9/X962NamedCurves.cs b/crypto/src/asn1/x9/X962NamedCurves.cs
index 14f7f818a..1609774f1 100644
--- a/crypto/src/asn1/x9/X962NamedCurves.cs
+++ b/crypto/src/asn1/x9/X962NamedCurves.cs
@@ -31,7 +31,7 @@ namespace Org.BouncyCastle.Asn1.X9
                 BigInteger h = BigInteger.One;
 
                 ECCurve cFp192v1 = new FpCurve(
-                    new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
+                    new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", 16),
                     new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
                     new BigInteger("64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16),
                     n, h);
@@ -58,7 +58,7 @@ namespace Org.BouncyCastle.Asn1.X9
                 BigInteger h = BigInteger.One;
 
                 ECCurve cFp192v2 = new FpCurve(
-                    new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
+                    new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", 16),
                     new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
                     new BigInteger("cc22d6dfb95c6b25e49c0d6364a4e5980c393aa21668d953", 16),
                     n, h);
@@ -85,7 +85,7 @@ namespace Org.BouncyCastle.Asn1.X9
                 BigInteger h = BigInteger.One;
 
                 ECCurve cFp192v3 = new FpCurve(
-                    new BigInteger("6277101735386680763835789423207666416083908700390324961279"),
+                    new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", 16),
                     new BigInteger("fffffffffffffffffffffffffffffffefffffffffffffffc", 16),
                     new BigInteger("22123dc2395a05caa7423daeccc94760a7d462256bd56916", 16),
                     n, h);
diff --git a/crypto/src/asn1/x9/X9Curve.cs b/crypto/src/asn1/x9/X9Curve.cs
index f05a946c2..eab94def8 100644
--- a/crypto/src/asn1/x9/X9Curve.cs
+++ b/crypto/src/asn1/x9/X9Curve.cs
@@ -47,9 +47,19 @@ namespace Org.BouncyCastle.Asn1.X9
             }
         }
 
+        [Obsolete("Use constructor including order/cofactor")]
         public X9Curve(
             X9FieldID		fieldID,
             Asn1Sequence	seq)
+            : this(fieldID, null, null, seq)
+        {
+        }
+
+        public X9Curve(
+            X9FieldID		fieldID,
+            BigInteger      order,
+            BigInteger      cofactor,
+            Asn1Sequence	seq)
         {
             if (fieldID == null)
                 throw new ArgumentNullException("fieldID");
@@ -60,47 +70,47 @@ namespace Org.BouncyCastle.Asn1.X9
 
             if (fieldIdentifier.Equals(X9ObjectIdentifiers.PrimeField))
             {
-                BigInteger q = ((DerInteger) fieldID.Parameters).Value;
-                X9FieldElement x9A = new X9FieldElement(q, (Asn1OctetString) seq[0]);
-                X9FieldElement x9B = new X9FieldElement(q, (Asn1OctetString) seq[1]);
-                curve = new FpCurve(q, x9A.Value.ToBigInteger(), x9B.Value.ToBigInteger());
+                BigInteger p = ((DerInteger)fieldID.Parameters).Value;
+                BigInteger A = new BigInteger(1, Asn1OctetString.GetInstance(seq[0]).GetOctets());
+                BigInteger B = new BigInteger(1, Asn1OctetString.GetInstance(seq[1]).GetOctets());
+                curve = new FpCurve(p, A, B, order, cofactor);
             }
-            else
+            else if (fieldIdentifier.Equals(X9ObjectIdentifiers.CharacteristicTwoField)) 
             {
-                if (fieldIdentifier.Equals(X9ObjectIdentifiers.CharacteristicTwoField)) 
+                // Characteristic two field
+                DerSequence parameters = (DerSequence)fieldID.Parameters;
+                int m = ((DerInteger)parameters[0]).Value.IntValue;
+                DerObjectIdentifier representation
+                    = (DerObjectIdentifier)parameters[1];
+
+                int k1 = 0;
+                int k2 = 0;
+                int k3 = 0;
+                if (representation.Equals(X9ObjectIdentifiers.TPBasis)) 
                 {
-                    // Characteristic two field
-                    DerSequence parameters = (DerSequence)fieldID.Parameters;
-                    int m = ((DerInteger)parameters[0]).Value.IntValue;
-                    DerObjectIdentifier representation
-                        = (DerObjectIdentifier)parameters[1];
-
-                    int k1 = 0;
-                    int k2 = 0;
-                    int k3 = 0;
-                    if (representation.Equals(X9ObjectIdentifiers.TPBasis)) 
-                    {
-                        // Trinomial basis representation
-                        k1 = ((DerInteger)parameters[2]).Value.IntValue;
-                    }
-                    else 
-                    {
-                        // Pentanomial basis representation
-                        DerSequence pentanomial = (DerSequence) parameters[2];
-                        k1 = ((DerInteger) pentanomial[0]).Value.IntValue;
-                        k2 = ((DerInteger) pentanomial[1]).Value.IntValue;
-                        k3 = ((DerInteger) pentanomial[2]).Value.IntValue;
-                    }
-                    X9FieldElement x9A = new X9FieldElement(m, k1, k2, k3, (Asn1OctetString)seq[0]);
-                    X9FieldElement x9B = new X9FieldElement(m, k1, k2, k3, (Asn1OctetString)seq[1]);
-                    // TODO Is it possible to get the order (n) and cofactor(h) too?
-                    curve = new F2mCurve(m, k1, k2, k3, x9A.Value.ToBigInteger(), x9B.Value.ToBigInteger());
+                    // Trinomial basis representation
+                    k1 = ((DerInteger)parameters[2]).Value.IntValue;
                 }
+                else 
+                {
+                    // Pentanomial basis representation
+                    DerSequence pentanomial = (DerSequence) parameters[2];
+                    k1 = ((DerInteger) pentanomial[0]).Value.IntValue;
+                    k2 = ((DerInteger) pentanomial[1]).Value.IntValue;
+                    k3 = ((DerInteger) pentanomial[2]).Value.IntValue;
+                }
+                BigInteger A = new BigInteger(1, Asn1OctetString.GetInstance(seq[0]).GetOctets());
+                BigInteger B = new BigInteger(1, Asn1OctetString.GetInstance(seq[1]).GetOctets());
+                curve = new F2mCurve(m, k1, k2, k3, A, B, order, cofactor);
+            }
+            else
+            {
+                throw new ArgumentException("This type of ECCurve is not implemented");
             }
 
             if (seq.Count == 3)
             {
-                seed = ((DerBitString) seq[2]).GetBytes();
+                seed = ((DerBitString)seq[2]).GetBytes();
             }
         }
 
diff --git a/crypto/src/asn1/x9/X9ECParameters.cs b/crypto/src/asn1/x9/X9ECParameters.cs
index 0fa343768..e1b29ca13 100644
--- a/crypto/src/asn1/x9/X9ECParameters.cs
+++ b/crypto/src/asn1/x9/X9ECParameters.cs
@@ -23,29 +23,32 @@ namespace Org.BouncyCastle.Asn1.X9
 		public static X9ECParameters GetInstance(Object obj)
 		{
 			if (obj is X9ECParameters)
-			{
 				return (X9ECParameters)obj;
-			}
 
-			if (obj != null)
-			{
+            if (obj != null)
 				return new X9ECParameters(Asn1Sequence.GetInstance(obj));
-			}
 
-			return null;
+            return null;
 		}
 
         public X9ECParameters(
             Asn1Sequence seq)
         {
             if (!(seq[0] is DerInteger)
-               || !((DerInteger) seq[0]).Value.Equals(BigInteger.One))
+                || !((DerInteger)seq[0]).Value.Equals(BigInteger.One))
             {
                 throw new ArgumentException("bad version in X9ECParameters");
             }
 
+            this.n = ((DerInteger)seq[4]).Value;
+
+            if (seq.Count == 6)
+            {
+                this.h = ((DerInteger)seq[5]).Value;
+            }
+
             X9Curve x9c = new X9Curve(
-                X9FieldID.GetInstance(seq[1]),
+                X9FieldID.GetInstance(seq[1]), n, h,
                 Asn1Sequence.GetInstance(seq[2]));
 
             this.curve = x9c.Curve;
@@ -53,20 +56,14 @@ namespace Org.BouncyCastle.Asn1.X9
 
             if (p is X9ECPoint)
             {
-                this.g = ((X9ECPoint)p);
+                this.g = (X9ECPoint)p;
             }
             else
             {
                 this.g = new X9ECPoint(curve, (Asn1OctetString)p);
             }
 
-            this.n = ((DerInteger)seq[4]).Value;
             this.seed = x9c.GetSeed();
-
-            if (seq.Count == 6)
-            {
-                this.h = ((DerInteger)seq[5]).Value;
-            }
         }
 
         public X9ECParameters(
diff --git a/crypto/src/asn1/x9/X9FieldElement.cs b/crypto/src/asn1/x9/X9FieldElement.cs
index 94bd96b24..222b4cfc8 100644
--- a/crypto/src/asn1/x9/X9FieldElement.cs
+++ b/crypto/src/asn1/x9/X9FieldElement.cs
@@ -19,6 +19,7 @@ namespace Org.BouncyCastle.Asn1.X9
             this.f = f;
         }
 
+        [Obsolete("Will be removed")]
         public X9FieldElement(
             BigInteger		p,
             Asn1OctetString	s)
@@ -26,6 +27,7 @@ namespace Org.BouncyCastle.Asn1.X9
         {
         }
 
+        [Obsolete("Will be removed")]
         public X9FieldElement(
             int				m,
             int				k1,