diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2014-03-03 11:53:10 +0400 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2014-03-03 11:53:10 +0400 |
commit | 0d4373f8e7dcb57b6bb820eb35267e05cac2cc8c (patch) | |
tree | 88a79f5fa97527cbcc226f045f138252ac88f192 /core/src/main/java/org | |
parent | 936a648b70a4012aaed08fb019838ffdfdb7ac84 (diff) |
Refactor reduction methods and change scope of PExt fields
Diffstat (limited to 'core/src/main/java/org')
7 files changed, 92 insertions, 103 deletions
diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Field.java index dcb8e0fb..e310529d 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Field.java @@ -6,9 +6,9 @@ public class SecP192K1Field { // 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1 static final int[] P = new int[]{ 0xFFFFEE37, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - private static final int P5 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x013C4FD1, 0x00002392, 0x00000001, 0x00000000, 0x00000000, + static final int[] PExt = new int[]{ 0x013C4FD1, 0x00002392, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0xFFFFDC6E, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + private static final int P5 = 0xFFFFFFFF; private static final int PExt11 = 0xFFFFFFFF; private static final long PInv = 0x00000001000011C9L; private static final int PInv33 = 0x11C9; @@ -85,8 +85,8 @@ public class SecP192K1Field public static void reduce(int[] xx, int[] z) { - long c = Nat192.mul33Add(PInv33, xx, 6, xx, 0, z, 0); - c = Nat192.mul33DWordAdd(PInv33, c, z, 0); + long cc = Nat192.mul33Add(PInv33, xx, 6, xx, 0, z, 0); + int c = Nat192.mul33DWordAdd(PInv33, cc, z, 0); // assert c == 0L || c == 1L; @@ -98,11 +98,8 @@ public class SecP192K1Field public static void reduce32(int x, int[] z) { - int c = Nat192.mul33WordAdd(PInv33, x, z, 0); - - // assert c == 0L || c == 1L; - - if (c != 0 || (z[5] == P5 && Nat192.gte(z, P))) + if ((x != 0 && Nat192.mul33WordAdd(PInv33, x, z, 0) != 0) + || (z[5] == P5 && Nat192.gte(z, P))) { Nat192.addDWord(PInv, z, 0); } diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Field.java index b7e11471..7f026009 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Field.java @@ -8,9 +8,9 @@ public class SecP192R1Field // 2^192 - 2^64 - 1 static final int[] P = new int[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - private static final int P5 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001, + static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000001, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + private static final int P5 = 0xFFFFFFFF; private static final int PExt11 = 0xFFFFFFFF; public static void add(int[] x, int[] y, int[] z) @@ -119,22 +119,13 @@ public class SecP192R1Field z[5] = (int)cc; cc >>= 32; - int c = (int)cc; - while (c > 0) - { - c += Nat192.sub(z, P, z); - } - - if (z[5] == P5 && Nat192.gte(z, P)) - { - Nat192.sub(z, P, z); - } + reduce32((int)cc, z); } public static void reduce32(int x, int[] z) { - int c = Nat192.addWord(x, z, 0) + Nat192.addWord(x, z, 2); - if (c != 0 || (z[5] == P5 && Nat192.gte(z, P))) + if ((x != 0 && (Nat192.addWord(x, z, 0) + Nat192.addWord(x, z, 2) != 0)) + || (z[5] == P5 && Nat192.gte(z, P))) { Nat192.sub(z, P, z); } diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Field.java index 70895d51..4dc9e121 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Field.java @@ -7,9 +7,9 @@ public class SecP224K1Field // 2^224 - 2^32 - 2^12 - 2^11 - 2^9 - 2^7 - 2^4 - 2 - 1 static final int[] P = new int[]{ 0xFFFFE56D, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - private static final int P6 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x02C23069, 0x00003526, 0x00000001, 0x00000000, 0x00000000, + static final int[] PExt = new int[]{ 0x02C23069, 0x00003526, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFCADA, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + private static final int P6 = 0xFFFFFFFF; private static final int PExt13 = 0xFFFFFFFF; private static final long PInv = 0x0000000100001A93L; private static final int PInv33 = 0x1A93; @@ -86,8 +86,8 @@ public class SecP224K1Field public static void reduce(int[] xx, int[] z) { - long c = Nat224.mul33Add(PInv33, xx, 7, xx, 0, z, 0); - c = Nat224.mul33DWordAdd(PInv33, c, z, 0); + long cc = Nat224.mul33Add(PInv33, xx, 7, xx, 0, z, 0); + int c = Nat224.mul33DWordAdd(PInv33, cc, z, 0); // assert c == 0L || c == 1L; @@ -99,11 +99,8 @@ public class SecP224K1Field public static void reduce32(int x, int[] z) { - int c = Nat224.mul33WordAdd(PInv33, x, z, 0); - - // assert c == 0L || c == 1L; - - if (c != 0 || (z[6] == P6 && Nat224.gte(z, P))) + if ((x != 0 && Nat224.mul33WordAdd(PInv33, x, z, 0) != 0) + || (z[6] == P6 && Nat224.gte(z, P))) { Nat224.addDWord(PInv, z, 0); } diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Field.java index 72a1dc52..ef851d8f 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Field.java @@ -8,9 +8,9 @@ public class SecP224R1Field // 2^224 - 2^96 + 1 static final int[] P = new int[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - private static final int P6 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, + static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + private static final int P6 = 0xFFFFFFFF; private static final int PExt13 = 0xFFFFFFFF; public static void add(int[] x, int[] y, int[] z) @@ -116,7 +116,7 @@ public class SecP224R1Field cc >>= 32; int c = (int)cc; - if (c > 0) + if (c >= 0) { reduce32(c, z); } @@ -131,8 +131,8 @@ public class SecP224R1Field public static void reduce32(int x, int[] z) { - int c = Nat224.subWord(x, z, 0) + Nat224.addWord(x, z, 3); - if (c != 0 || (z[6] == P6 && Nat224.gte(z, P))) + if ((x != 0 && (Nat224.subWord(x, z, 0) + Nat224.addWord(x, z, 3) != 0)) + || (z[6] == P6 && Nat224.gte(z, P))) { Nat224.sub(z, P, z); } diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Field.java index 4f16c5c6..b4c47fbe 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Field.java @@ -8,7 +8,7 @@ public class SecP256K1Field static final int[] P = new int[]{ 0xFFFFFC2F, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; private static final int P7 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x000E90A1, 0x000007A2, 0x00000001, 0x00000000, 0x00000000, + static final int[] PExt = new int[]{ 0x000E90A1, 0x000007A2, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFF85E, 0xFFFFFFFD, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; private static final int PExt15 = 0xFFFFFFFF; @@ -87,8 +87,8 @@ public class SecP256K1Field public static void reduce(int[] xx, int[] z) { - long c = Nat256.mul33Add(PInv33, xx, 8, xx, 0, z, 0); - c = Nat256.mul33DWordAdd(PInv33, c, z, 0); + long cc = Nat256.mul33Add(PInv33, xx, 8, xx, 0, z, 0); + int c = Nat256.mul33DWordAdd(PInv33, cc, z, 0); // assert c == 0L || c == 1L; @@ -100,11 +100,8 @@ public class SecP256K1Field public static void reduce32(int x, int[] z) { - int c = Nat256.mul33WordAdd(PInv33, x, z, 0); - - // assert c == 0L || c == 1L; - - if (c != 0 || (z[7] == P7 && Nat256.gte(z, P))) + if ((x != 0 && Nat256.mul33WordAdd(PInv33, x, z, 0) != 0) + || (z[7] == P7 && Nat256.gte(z, P))) { Nat256.addDWord(PInv, z, 0); } diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java index d3baceda..8315935c 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java @@ -9,12 +9,12 @@ public class SecP256R1Field // 2^256 - 2^224 + 2^192 + 2^96 - 1 static final int[] P = new int[]{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF }; + static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, + 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0x00000001, 0xFFFFFFFE, + 0x00000002, 0xFFFFFFFE }; private static final int[] _2P = new int[]{ 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000001, 0x00000000, 0x00000000, 0x00000002, 0xFFFFFFFE, 0x00000001 }; private static final int P7 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFE, 0xFFFFFFFF, - 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0x00000001, 0xFFFFFFFE, - 0x00000002, 0xFFFFFFFE }; public static void add(int[] x, int[] y, int[] z) { @@ -126,7 +126,7 @@ public class SecP256R1Field cc >>= 32; int c = (int)cc; - if (c > 0) + if (c >= 0) { reduce32(c, z); } @@ -145,33 +145,39 @@ public class SecP256R1Field public static void reduce32(int x, int[] z) { - long xx08 = x & M; - long cc = 0; - cc += (z[0] & M) + xx08; - z[0] = (int)cc; - cc >>= 32; - cc += (z[1] & M); - z[1] = (int)cc; - cc >>= 32; - cc += (z[2] & M); - z[2] = (int)cc; - cc >>= 32; - cc += (z[3] & M) - xx08; - z[3] = (int)cc; - cc >>= 32; - cc += (z[4] & M); - z[4] = (int)cc; - cc >>= 32; - cc += (z[5] & M); - z[5] = (int)cc; - cc >>= 32; - cc += (z[6] & M) - xx08; - z[6] = (int)cc; - cc >>= 32; - cc += (z[7] & M) + xx08; - z[7] = (int)cc; - cc >>= 32; + + if (x != 0) + { + long xx08 = x & M; + + cc += (z[0] & M) + xx08; + z[0] = (int)cc; + cc >>= 32; + cc += (z[1] & M); + z[1] = (int)cc; + cc >>= 32; + cc += (z[2] & M); + z[2] = (int)cc; + cc >>= 32; + cc += (z[3] & M) - xx08; + z[3] = (int)cc; + cc >>= 32; + cc += (z[4] & M); + z[4] = (int)cc; + cc >>= 32; + cc += (z[5] & M); + z[5] = (int)cc; + cc >>= 32; + cc += (z[6] & M) - xx08; + z[6] = (int)cc; + cc >>= 32; + cc += (z[7] & M) + xx08; + z[7] = (int)cc; + cc >>= 32; + +// assert cc == 0 || cc == 1; + } if (cc != 0 || (z[7] == P7 && Nat256.gte(z, P))) { diff --git a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Field.java b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Field.java index d7d0d50e..b4df7ec0 100644 --- a/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Field.java +++ b/core/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Field.java @@ -11,10 +11,10 @@ public class SecP384R1Field // 2^384 - 2^128 - 2^96 + 2^32 - 1 static final int[] P = new int[]{ 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - private static final int P11 = 0xFFFFFFFF; - private static final int[] PExt = new int[]{ 0x00000001, 0xFFFFFFFE, 0x00000000, 0x00000002, 0x00000000, 0xFFFFFFFE, + static final int[] PExt = new int[]{ 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 static final int P11 = 0xFFFFFFFF; private static final int PExt23 = 0xFFFFFFFF; public static void add(int[] x, int[] y, int[] z) @@ -132,7 +132,7 @@ public class SecP384R1Field cc >>= 32; int c = (int)cc; - if (c > 0) + if (c >= 0) { reduce32(c, z); } @@ -147,34 +147,35 @@ public class SecP384R1Field public static void reduce32(int x, int[] z) { - long xx12 = x & M; - long cc = 0; - cc += (z[0] & M) + xx12; - z[0] = (int)cc; - cc >>= 32; - cc += (z[1] & M) - xx12; - z[1] = (int)cc; - cc >>= 32; - cc += (z[2] & M); - z[2] = (int)cc; - cc >>= 32; - cc += (z[3] & M) + xx12; - z[3] = (int)cc; - cc >>= 32; - cc += (z[4] & M) + xx12; - z[4] = (int)cc; - cc >>= 32; - -// assert cc >= 0; + + if (x != 0) + { + long xx12 = x & M; + + cc += (z[0] & M) + xx12; + z[0] = (int)cc; + cc >>= 32; + cc += (z[1] & M) - xx12; + z[1] = (int)cc; + cc >>= 32; + cc += (z[2] & M); + z[2] = (int)cc; + cc >>= 32; + cc += (z[3] & M) + xx12; + z[3] = (int)cc; + cc >>= 32; + cc += (z[4] & M) + xx12; + z[4] = (int)cc; + cc >>= 32; + +// 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))) { - int c = Nat.addWord(12, (int)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); } } |