summary refs log tree commit diff
path: root/crypto/src/math/ec/custom/sec/SecP384R1Field.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2014-03-03 14:53:32 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2014-03-03 14:53:32 +0700
commit208038d681e1ee46d33079e9221e10fe4a6aa25c (patch)
tree9ea820b68d29437204b044b8939afe6e4fd79046 /crypto/src/math/ec/custom/sec/SecP384R1Field.cs
parentAdd/rename MulAddTo variations (diff)
downloadBouncyCastle.NET-ed25519-208038d681e1ee46d33079e9221e10fe4a6aa25c.tar.xz
Refactor reduction methods and change scope of PExt fields
Diffstat (limited to 'crypto/src/math/ec/custom/sec/SecP384R1Field.cs')
-rw-r--r--crypto/src/math/ec/custom/sec/SecP384R1Field.cs55
1 files changed, 28 insertions, 27 deletions
diff --git a/crypto/src/math/ec/custom/sec/SecP384R1Field.cs b/crypto/src/math/ec/custom/sec/SecP384R1Field.cs
index 8f9094b5b..91c5dd81d 100644
--- a/crypto/src/math/ec/custom/sec/SecP384R1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP384R1Field.cs
@@ -8,10 +8,10 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
             // 2^384 - 2^128 - 2^96 + 2^32 - 1
         internal static readonly uint[] P = new uint[]{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF,
             0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-        private const uint P11 = 0xFFFFFFFF;
-        private static readonly uint[] PExt = new uint[]{ 0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000002, 0x00000000, 0xFFFFFFFE,
+        internal static readonly uint[] PExt = new uint[]{ 0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000002, 0x00000000, 0xFFFFFFFE,
             0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x00000001, 0x00000000,
             0xFFFFFFFE, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
+        private const uint P11 = 0xFFFFFFFF;
         private const uint PExt23 = 0xFFFFFFFF;
 
         public static void Add(uint[] x, uint[] y, uint[] z)
@@ -129,7 +129,7 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
             cc >>= 32;
 
             int c = (int)cc;
-            if (c > 0)
+            if (c >= 0)
             {
                 Reduce32((uint)c, z);
             }
@@ -144,34 +144,35 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
 
         public static void Reduce32(uint x, uint[] z)
         {
-            long xx12 = x;
-
             long cc = 0;
-            cc += (long)z[0] + xx12;
-            z[0] = (uint)cc;
-            cc >>= 32;
-            cc += (long)z[1] - xx12;
-            z[1] = (uint)cc;
-            cc >>= 32;
-            cc += (long)z[2];
-            z[2] = (uint)cc;
-            cc >>= 32;
-            cc += (long)z[3] + xx12;
-            z[3] = (uint)cc;
-            cc >>= 32;
-            cc += (long)z[4] + xx12;
-            z[4] = (uint)cc;
-            cc >>= 32;
 
-            Debug.Assert(cc >= 0);
+            if (x != 0)
+            {
+                long xx12 = x;
+
+                cc += (long)z[0] + xx12;
+                z[0] = (uint)cc;
+                cc >>= 32;
+                cc += (long)z[1] - xx12;
+                z[1] = (uint)cc;
+                cc >>= 32;
+                cc += (long)z[2];
+                z[2] = (uint)cc;
+                cc >>= 32;
+                cc += (long)z[3] + xx12;
+                z[3] = (uint)cc;
+                cc >>= 32;
+                cc += (long)z[4] + xx12;
+                z[4] = (uint)cc;
+                cc >>= 32;
+
+                Debug.Assert(cc == 0 || cc == 1);
+            }
 
-            if (cc > 0)
+            if ((cc != 0 && Nat.Inc(12, z, 5) != 0)
+                || (z[11] == P11 && Nat.Gte(12, z, P)))
             {
-                uint c = Nat.AddWord(12, (uint)cc, z, 5);
-                if (c != 0 || (z[11] == P11 && Nat.Gte(12, z, P)))
-                {
-                    Nat.Sub(12, z, P, z);
-                }
+                Nat.Sub(12, z, P, z);
             }
         }