bouncycastle.math.ec.WTauNafMultiplier Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of woodlouse Show documentation
Show all versions of woodlouse Show documentation
Lightweight crypto toolkit for Android and Java 6+
The newest version!
package bouncycastle.math.ec;
import java.math.BigInteger;
/**
* Class implementing the WTNAF (Window
* τ
-adic Non-Adjacent Form) algorithm.
*/
class WTauNafMultiplier implements ECMultiplier
{
/**
* Multiplies a {@link bouncycastle.math.ec.ECPoint.F2m ECPoint.F2m}
* by k
using the reduced τ
-adic NAF (RTNAF)
* method.
* @param p The ECPoint.F2m to multiply.
* @param k The integer by which to multiply k
.
* @return p
multiplied by k
.
*/
public ECPoint multiply(ECPoint point, BigInteger k, PreCompInfo preCompInfo)
{
if (!(point instanceof ECPoint.F2m))
{
throw new IllegalArgumentException("Only ECPoint.F2m can be " +
"used in WTauNafMultiplier");
}
ECPoint.F2m p = (ECPoint.F2m)point;
ECCurve.F2m curve = (ECCurve.F2m) p.getCurve();
int m = curve.getM();
byte a = curve.getA().toBigInteger().byteValue();
byte mu = curve.getMu();
BigInteger[] s = curve.getSi();
ZTauElement rho = Tnaf.partModReduction(k, m, a, s, mu, (byte)10);
return multiplyWTnaf(p, rho, preCompInfo, a, mu);
}
/**
* Multiplies a {@link bouncycastle.math.ec.ECPoint.F2m ECPoint.F2m}
* by an element λ
of Z[τ]
using
* the τ
-adic NAF (TNAF) method.
* @param p The ECPoint.F2m to multiply.
* @param lambda The element λ
of
* Z[τ]
of which to compute the
* [τ]
-adic NAF.
* @return p
multiplied by λ
.
*/
private ECPoint.F2m multiplyWTnaf(ECPoint.F2m p, ZTauElement lambda,
PreCompInfo preCompInfo, byte a, byte mu)
{
ZTauElement[] alpha;
if (a == 0)
{
alpha = Tnaf.alpha0;
}
else
{
// a == 1
alpha = Tnaf.alpha1;
}
BigInteger tw = Tnaf.getTw(mu, Tnaf.WIDTH);
byte[]u = Tnaf.tauAdicWNaf(mu, lambda, Tnaf.WIDTH,
BigInteger.valueOf(Tnaf.POW_2_WIDTH), tw, alpha);
return multiplyFromWTnaf(p, u, preCompInfo);
}
/**
* Multiplies a {@link bouncycastle.math.ec.ECPoint.F2m ECPoint.F2m}
* by an element λ
of Z[τ]
* using the window τ
-adic NAF (TNAF) method, given the
* WTNAF of λ
.
* @param p The ECPoint.F2m to multiply.
* @param u The the WTNAF of λ
..
* @return λ * p
*/
private static ECPoint.F2m multiplyFromWTnaf(ECPoint.F2m p, byte[] u,
PreCompInfo preCompInfo)
{
ECCurve.F2m curve = (ECCurve.F2m)p.getCurve();
byte a = curve.getA().toBigInteger().byteValue();
ECPoint.F2m[] pu;
if ((preCompInfo == null) || !(preCompInfo instanceof WTauNafPreCompInfo))
{
pu = Tnaf.getPreComp(p, a);
p.setPreCompInfo(new WTauNafPreCompInfo(pu));
}
else
{
pu = ((WTauNafPreCompInfo)preCompInfo).getPreComp();
}
// q = infinity
ECPoint.F2m q = (ECPoint.F2m) p.getCurve().getInfinity();
for (int i = u.length - 1; i >= 0; i--)
{
q = Tnaf.tau(q);
if (u[i] != 0)
{
if (u[i] > 0)
{
q = q.addSimple(pu[u[i]]);
}
else
{
// u[i] < 0
q = q.subtractSimple(pu[-u[i]]);
}
}
}
return q;
}
}