diff options
author | Adam Vartanian <flooey@google.com> | 2019-02-14 14:42:19 +0000 |
---|---|---|
committer | Adam Vartanian <flooey@google.com> | 2019-02-18 10:18:52 +0000 |
commit | 27254450f01adef5f4bb25a648d42eeacc14c438 (patch) | |
tree | 90eb8fa6c24a44780cc4c4be2d50555f955d29f4 /bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec | |
parent | bdfb209e7c1139588c82722a809c46667775a314 (diff) | |
parent | 1b335c5efbcf241b55345622fe9978047c3fdf9e (diff) | |
download | bouncycastle-27254450f01adef5f4bb25a648d42eeacc14c438.tar.gz |
Update Bouncy Castle to 1.61
Test: cts -m CtsLibcoreTestCases
Test: cts -m CtsLibcoreWycheproofBCTestCases
Change-Id: Ifcd182a8537439b945aedf80741bd51cbce37e49
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec')
17 files changed, 387 insertions, 11 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Curve.java index b46cba6a..f160ab31 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1Curve.java @@ -5,7 +5,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECConstants; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat192; import org.bouncycastle.util.encoders.Hex; public class SecP192K1Curve extends ECCurve.AbstractFp @@ -76,4 +78,49 @@ public class SecP192K1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 6; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat192.copy(((SecP192K1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat192.copy(((SecP192K1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat192.create(), y = Nat192.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP192K1FieldElement(x), new SecP192K1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1FieldElement.java index 642c44cd..39e62afa 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192K1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat192; import org.bouncycastle.util.Arrays; -public class SecP192K1FieldElement extends ECFieldElement +public class SecP192K1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP192K1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Curve.java index be67100a..a43a5966 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1Curve.java @@ -4,7 +4,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat192; import org.bouncycastle.util.encoders.Hex; public class SecP192R1Curve extends ECCurve.AbstractFp @@ -77,4 +79,49 @@ public class SecP192R1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 6; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat192.copy(((SecP192R1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat192.copy(((SecP192R1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat192.create(), y = Nat192.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP192R1FieldElement(x), new SecP192R1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1FieldElement.java index 68c8080d..15fdcd63 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP192R1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat192; import org.bouncycastle.util.Arrays; -public class SecP192R1FieldElement extends ECFieldElement +public class SecP192R1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP192R1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Curve.java index ad733da6..6b28be79 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1Curve.java @@ -5,7 +5,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECConstants; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat224; import org.bouncycastle.util.encoders.Hex; public class SecP224K1Curve extends ECCurve.AbstractFp @@ -75,4 +77,49 @@ public class SecP224K1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 7; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat224.copy(((SecP224K1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat224.copy(((SecP224K1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat224.create(), y = Nat224.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP224K1FieldElement(x), new SecP224K1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1FieldElement.java index 8285a4e9..2093a061 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224K1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat224; import org.bouncycastle.util.Arrays; -public class SecP224K1FieldElement extends ECFieldElement +public class SecP224K1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP224K1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Curve.java index c8443299..febb323c 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1Curve.java @@ -4,7 +4,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat224; import org.bouncycastle.util.encoders.Hex; public class SecP224R1Curve extends ECCurve.AbstractFp @@ -77,4 +79,49 @@ public class SecP224R1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 7; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat224.copy(((SecP224R1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat224.copy(((SecP224R1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat224.create(), y = Nat224.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP224R1FieldElement(x), new SecP224R1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1FieldElement.java index 4a28f3d0..ed2334a7 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP224R1FieldElement.java @@ -8,7 +8,7 @@ import org.bouncycastle.math.raw.Nat; import org.bouncycastle.math.raw.Nat224; import org.bouncycastle.util.Arrays; -public class SecP224R1FieldElement extends ECFieldElement +public class SecP224R1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP224R1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Curve.java index 9b885764..6235381e 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1Curve.java @@ -5,7 +5,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECConstants; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat256; import org.bouncycastle.util.encoders.Hex; public class SecP256K1Curve extends ECCurve.AbstractFp @@ -75,4 +77,49 @@ public class SecP256K1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 8; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat256.copy(((SecP256K1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat256.copy(((SecP256K1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat256.create(), y = Nat256.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP256K1FieldElement(x), new SecP256K1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1FieldElement.java index 467b17f5..30bca2e3 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256K1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat256; import org.bouncycastle.util.Arrays; -public class SecP256K1FieldElement extends ECFieldElement +public class SecP256K1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP256K1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java index 5ff6a38d..7d7b51d5 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java @@ -4,7 +4,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat256; import org.bouncycastle.util.encoders.Hex; public class SecP256R1Curve extends ECCurve.AbstractFp @@ -77,4 +79,49 @@ public class SecP256R1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 8; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat256.copy(((SecP256R1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat256.copy(((SecP256R1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat256.create(), y = Nat256.create(); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP256R1FieldElement(x), new SecP256R1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java index 1e04f4b9..cea1af78 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Field.java @@ -16,7 +16,7 @@ public class SecP256R1Field 0xFFFFFFFF, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0xFFFFFFFE, 0x00000001, 0x00000001, 0xFFFFFFFE, 0x00000002, 0xFFFFFFFE }; private static final int P7 = 0xFFFFFFFF; - private static final int PExt15 = 0xFFFFFFFF; + private static final int PExt15s1 = 0xFFFFFFFE >>> 1; public static void add(int[] x, int[] y, int[] z) { @@ -30,7 +30,7 @@ public class SecP256R1Field public static void addExt(int[] xx, int[] yy, int[] zz) { int c = Nat.add(16, xx, yy, zz); - if (c != 0 || (zz[15] == PExt15 && Nat.gte(16, zz, PExt))) + if (c != 0 || ((zz[15] >>> 1) >= PExt15s1 && Nat.gte(16, zz, PExt))) { Nat.subFrom(16, PExt, zz); } @@ -78,7 +78,7 @@ public class SecP256R1Field public static void multiplyAddToExt(int[] x, int[] y, int[] zz) { int c = Nat256.mulAddTo(x, y, zz); - if (c != 0 || (zz[15] == PExt15 && Nat.gte(16, zz, PExt))) + if (c != 0 || ((zz[15] >>> 1) >= PExt15s1 && Nat.gte(16, zz, PExt))) { Nat.subFrom(16, PExt, zz); } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1FieldElement.java index be250d10..6be46f24 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat256; import org.bouncycastle.util.Arrays; -public class SecP256R1FieldElement extends ECFieldElement +public class SecP256R1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP256R1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Curve.java index 27cbcdb2..7a5603d2 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1Curve.java @@ -4,7 +4,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat; import org.bouncycastle.util.encoders.Hex; public class SecP384R1Curve extends ECCurve.AbstractFp @@ -77,4 +79,49 @@ public class SecP384R1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 12; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat.copy(FE_INTS, ((SecP384R1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat.copy(FE_INTS, ((SecP384R1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat.create(FE_INTS), y = Nat.create(FE_INTS); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP384R1FieldElement(x), new SecP384R1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1FieldElement.java index 24e585d8..3116b443 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP384R1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat; import org.bouncycastle.util.Arrays; -public class SecP384R1FieldElement extends ECFieldElement +public class SecP384R1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP384R1Curve.q; diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1Curve.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1Curve.java index 16691b10..267defcf 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1Curve.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1Curve.java @@ -4,7 +4,9 @@ import java.math.BigInteger; import org.bouncycastle.math.ec.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; +import org.bouncycastle.math.ec.ECLookupTable; import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.math.raw.Nat; import org.bouncycastle.util.encoders.Hex; public class SecP521R1Curve extends ECCurve.AbstractFp @@ -77,4 +79,49 @@ public class SecP521R1Curve extends ECCurve.AbstractFp { return infinity; } + + public ECLookupTable createCacheSafeLookupTable(ECPoint[] points, int off, final int len) + { + final int FE_INTS = 17; + + final int[] table = new int[len * FE_INTS * 2]; + { + int pos = 0; + for (int i = 0; i < len; ++i) + { + ECPoint p = points[off + i]; + Nat.copy(FE_INTS, ((SecP521R1FieldElement)p.getRawXCoord()).x, 0, table, pos); pos += FE_INTS; + Nat.copy(FE_INTS, ((SecP521R1FieldElement)p.getRawYCoord()).x, 0, table, pos); pos += FE_INTS; + } + } + + return new ECLookupTable() + { + public int getSize() + { + return len; + } + + public ECPoint lookup(int index) + { + int[] x = Nat.create(FE_INTS), y = Nat.create(FE_INTS); + int pos = 0; + + for (int i = 0; i < len; ++i) + { + int MASK = ((i ^ index) - 1) >> 31; + + for (int j = 0; j < FE_INTS; ++j) + { + x[j] ^= table[pos + j] & MASK; + y[j] ^= table[pos + FE_INTS + j] & MASK; + } + + pos += (FE_INTS * 2); + } + + return createRawPoint(new SecP521R1FieldElement(x), new SecP521R1FieldElement(y), false); + } + }; + } } diff --git a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1FieldElement.java b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1FieldElement.java index ce9b6392..5cf30fc0 100644 --- a/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1FieldElement.java +++ b/bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP521R1FieldElement.java @@ -7,7 +7,7 @@ import org.bouncycastle.math.raw.Mod; import org.bouncycastle.math.raw.Nat; import org.bouncycastle.util.Arrays; -public class SecP521R1FieldElement extends ECFieldElement +public class SecP521R1FieldElement extends ECFieldElement.AbstractFp { public static final BigInteger Q = SecP521R1Curve.q; |