package org.bouncycastle.math.ec; import java.math.BigInteger; import org.bouncycastle.math.ec.endo.GLVEndomorphism; 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); } }