diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/math/ec/custom/sec/SecP256R1Curve.java | 47 |
1 files changed, 47 insertions, 0 deletions
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); + } + }; + } } |