summary refs log tree commit diff
path: root/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2020-09-04 23:57:27 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2020-09-04 23:57:27 +0700
commit86a4479929bd5f3fa5ce2cabfe6a4ebb53944df4 (patch)
tree2610425aacd90c6153402495afa3ea84077c741c /crypto/src/math/ec/custom/sec/SecP224K1Field.cs
parentRemove unnecessary locking (diff)
downloadBouncyCastle.NET-ed25519-86a4479929bd5f3fa5ce2cabfe6a4ebb53944df4.tar.xz
'safegcd' modular inversion
Diffstat (limited to 'crypto/src/math/ec/custom/sec/SecP224K1Field.cs')
-rw-r--r--crypto/src/math/ec/custom/sec/SecP224K1Field.cs62
1 files changed, 1 insertions, 61 deletions
diff --git a/crypto/src/math/ec/custom/sec/SecP224K1Field.cs b/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
index d20ac63f3..5d4237708 100644
--- a/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
+++ b/crypto/src/math/ec/custom/sec/SecP224K1Field.cs
@@ -76,67 +76,7 @@ namespace Org.BouncyCastle.Math.EC.Custom.Sec
 
         public static void Inv(uint[] x, uint[] z)
         {
-            /*
-             * Raise this element to the exponent 2^224 - 2^32 - 2^12 - 2^11 - 2^9 - 2^7 - 2^4 - 5
-             *
-             * Breaking up the exponent's binary representation into "repunits", we get:
-             * { 191 1s } { 1 0s } { 19 1s } "0010101101011"
-             *
-             * Therefore we need an addition chain containing 1, 2, 19, 191 (the lengths of the repunits)
-             * We use: [1], [2], 4, 5, 9, 10, [19], 38, 76, 152, 190 [191]
-             */
-
-            if (0 != IsZero(x))
-                throw new ArgumentException("cannot be 0", "x");
-
-            uint[] x1 = x;
-            uint[] x2 = Nat224.Create();
-            Square(x1, x2);
-            Multiply(x2, x1, x2);
-            uint[] x4 = Nat224.Create();
-            SquareN(x2, 2, x4);
-            Multiply(x4, x2, x4);
-            uint[] x5 = Nat224.Create();
-            Square(x4, x5);
-            Multiply(x5, x1, x5);
-            uint[] x9 = x5;
-            SquareN(x5, 4, x9);
-            Multiply(x9, x4, x9);
-            uint[] x10 = x4;
-            Square(x9, x10);
-            Multiply(x10, x1, x10);
-            uint[] x19 = x10;
-            SquareN(x10, 9, x19);
-            Multiply(x19, x9, x19);
-            uint[] x38 = x9;
-            SquareN(x19, 19, x38);
-            Multiply(x38, x19, x38);
-            uint[] x76 = Nat224.Create();
-            SquareN(x38, 38, x76);
-            Multiply(x76, x38, x76);
-            uint[] x152 = Nat224.Create();
-            SquareN(x76, 76, x152);
-            Multiply(x152, x76, x152);
-            uint[] x190 = x76;
-            SquareN(x152, 38, x190);
-            Multiply(x190, x38, x190);
-            uint[] x191 = x38;
-            Square(x190, x191);
-            Multiply(x191, x1, x191);
-
-            uint[] t = x191;
-            SquareN(t, 20, t);
-            Multiply(t, x19, t);
-            SquareN(t, 3, t);
-            Multiply(t, x1, t);
-            SquareN(t, 2, t);
-            Multiply(t, x1, t);
-            SquareN(t, 3, t);
-            Multiply(t, x2, t);
-            SquareN(t, 2, t);
-            Multiply(t, x1, t);
-            SquareN(t, 3, t);
-            Multiply(t, x2, z);
+            Mod.CheckedModOddInverse(P, x, z);
         }
 
         public static int IsZero(uint[] x)