From 4f256c2f1bc119b208f9d35d847bf4c5b8072a5e Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Wed, 12 Mar 2014 18:28:37 +0700 Subject: Add GLVMultiplier and supporting interfaces --- .../org/bouncycastle/math/ec/ECEndomorphism.java | 8 +++++ .../org/bouncycastle/math/ec/GLVEndomorphism.java | 8 +++++ .../org/bouncycastle/math/ec/GLVMultiplier.java | 40 ++++++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 core/src/main/java/org/bouncycastle/math/ec/ECEndomorphism.java create mode 100644 core/src/main/java/org/bouncycastle/math/ec/GLVEndomorphism.java create mode 100644 core/src/main/java/org/bouncycastle/math/ec/GLVMultiplier.java (limited to 'core/src/main/java/org') diff --git a/core/src/main/java/org/bouncycastle/math/ec/ECEndomorphism.java b/core/src/main/java/org/bouncycastle/math/ec/ECEndomorphism.java new file mode 100644 index 00000000..110bd2ab --- /dev/null +++ b/core/src/main/java/org/bouncycastle/math/ec/ECEndomorphism.java @@ -0,0 +1,8 @@ +package org.bouncycastle.math.ec; + +public interface ECEndomorphism +{ + ECPointMap getPointMap(); + + boolean hasEfficientPointMap(); +} diff --git a/core/src/main/java/org/bouncycastle/math/ec/GLVEndomorphism.java b/core/src/main/java/org/bouncycastle/math/ec/GLVEndomorphism.java new file mode 100644 index 00000000..bf576908 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/math/ec/GLVEndomorphism.java @@ -0,0 +1,8 @@ +package org.bouncycastle.math.ec; + +import java.math.BigInteger; + +public interface GLVEndomorphism extends ECEndomorphism +{ + BigInteger[] decomposeScalar(BigInteger k); +} diff --git a/core/src/main/java/org/bouncycastle/math/ec/GLVMultiplier.java b/core/src/main/java/org/bouncycastle/math/ec/GLVMultiplier.java new file mode 100644 index 00000000..4a6b2343 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/math/ec/GLVMultiplier.java @@ -0,0 +1,40 @@ +package org.bouncycastle.math.ec; + +import java.math.BigInteger; + +public class GLVMultiplier extends AbstractECMultiplier +{ + protected final ECCurve curve; + protected final GLVEndomorphism glvEndomorphism; + + public GLVMultiplier(ECCurve curve, GLVEndomorphism glvEndomorphism) + { + if (curve == null || curve.getOrder() == null) + { + throw new IllegalArgumentException("Need curve with known group order"); + } + + this.curve = curve; + this.glvEndomorphism = glvEndomorphism; + } + + protected ECPoint multiplyPositive(ECPoint p, BigInteger k) + { + if (!curve.equals(p.getCurve())) + { + throw new IllegalStateException(); + } + + BigInteger n = p.getCurve().getOrder(); + BigInteger[] ab = glvEndomorphism.decomposeScalar(k.mod(n)); + BigInteger a = ab[0], b = ab[1]; + + ECPointMap pointMap = glvEndomorphism.getPointMap(); + if (glvEndomorphism.hasEfficientPointMap()) + { + return ECAlgorithms.implShamirsTrickWNaf(p, a, pointMap, b); + } + + return ECAlgorithms.implShamirsTrickWNaf(p, a, pointMap.map(p), b); + } +} -- cgit v1.2.3