//package org.bouncycastle.math.ec.test;
//
//import java.math.BigInteger;
//import java.util.Random;
//
//import junit.framework.TestCase;
//
//import org.bouncycastle.asn1.sec.SECNamedCurves;
//import org.bouncycastle.asn1.x9.X9ECParameters;
//import org.bouncycastle.math.ec.ECCurve;
//import org.bouncycastle.math.ec.ECPoint;
//import org.bouncycastle.math.ec.FpNafMultiplier;
//import org.bouncycastle.math.ec.ReferenceMultiplier;
//import org.bouncycastle.math.ec.WNafMultiplier;
//import org.bouncycastle.math.ec.WTauNafMultiplier;
//
//public class TnafTest extends TestCase
//{
// private Random m_rand = new Random();
//
// private String ecPointToString(ECPoint p) {
// StringBuffer sb = new StringBuffer("x = ");
// sb.append(p.getX().toBigInteger().toString());
// sb.append("; y = ");
// sb.append(p.getY().toBigInteger().toString());
// return sb.toString();
// }
//
// private ECPoint repeatedMultiply(ECPoint p, BigInteger k)
// {
// ECPoint result = p.multiply(k);
// for (int i = 1; i < 10; ++i)
// {
// ECPoint check = p.multiply(k);
// assertEquals(result, check);
// }
// return result;
// }
//
// private void implTestMultiplyTnaf(String curveName) {
// X9ECParameters x9ECParameters = SECNamedCurves.getByName(curveName);
//
// ECCurve.F2m curve = (ECCurve.F2m)x9ECParameters.getCurve();
// BigInteger n = curve.getN();
//
// // The generator is multiplied by random b to get random q
// BigInteger b = new BigInteger(n.bitLength(), m_rand);
// ECPoint g = x9ECParameters.getG();
// ECPoint.F2m p = (ECPoint.F2m)g.multiply(b);
//
// BigInteger k = new BigInteger(n.bitLength(), m_rand);
// long now1 = System.currentTimeMillis();
// p.setECMultiplier(new WTauNafMultiplier());
// ECPoint refRWTnaf = repeatedMultiply(p, k);
// long now2 = System.currentTimeMillis();
// p.setECMultiplier(new WNafMultiplier());
// ECPoint refWnaf = repeatedMultiply(p, k);
// long now3 = System.currentTimeMillis();
// p.setECMultiplier(new FpNafMultiplier());
// ECPoint refFpNaf = repeatedMultiply(p, k);
// long now4 = System.currentTimeMillis();
// p.setECMultiplier(new ReferenceMultiplier());
// ECPoint reference = repeatedMultiply(p, k);
// long now5 = System.currentTimeMillis();
//
// assertEquals("WTNAF multiplication is incorrect", refRWTnaf, reference);
// assertEquals("FPNAF multiplication is incorrect", refFpNaf, reference);
// assertEquals("WNAF multiplication is incorrect", refWnaf, reference);
//
// System.out.println(curveName + ": Multiply WTNAF took millis: " + (now2 - now1));
// System.out.println(curveName + ": Multiply WNAF took millis: " + (now3 - now2));
// System.out.println(curveName + ": Multiply FPNAF took millis: " + (now4 - now3));
// System.out.println(curveName + ": Multiply REFE took millis: " + (now5 - now4));
//
//// System.out.println(curveName + ": refRWTnaf = " + ecPointToString(refRWTnaf));
//// System.out.println(curveName + ": refWnaf = " + ecPointToString(refWnaf));
//// System.out.println(curveName + ": refFpNaf = " + ecPointToString(refFpNaf));
//// System.out.println(curveName + ": reference = " + ecPointToString(reference) + "\n");
// System.out.println();
// }
//
// public void testMultiplyTnaf() {
// System.out.println("\n\n\n***** Start test multiplications on F2m (Koblitz) *****");
// implTestMultiplyTnaf("sect163k1");
// implTestMultiplyTnaf("sect233k1");
// implTestMultiplyTnaf("sect239k1");
// implTestMultiplyTnaf("sect283k1");
// implTestMultiplyTnaf("sect409k1");
// implTestMultiplyTnaf("sect571k1");
// }
//
// private void implTestMultiplyWnaf(String curveName) {
// X9ECParameters x9ECParameters = SECNamedCurves.getByName(curveName);
//
// BigInteger r = x9ECParameters.getN();
//
// // The generator is multiplied by random b to get random q
// BigInteger b = new BigInteger(r.bitLength(), m_rand);
// ECPoint g = x9ECParameters.getG();
// ECPoint p = g.multiply(b);
//
// BigInteger k = new BigInteger(r.bitLength(), m_rand);
// long now1 = System.currentTimeMillis();
// p.setECMultiplier(new WNafMultiplier());
// ECPoint refWnaf = repeatedMultiply(p, k);
// long now2 = System.currentTimeMillis();
// p.setECMultiplier(new FpNafMultiplier());
// ECPoint refFpNaf = repeatedMultiply(p, k);
// long now3 = System.currentTimeMillis();
// p.setECMultiplier(new ReferenceMultiplier());
// ECPoint reference = repeatedMultiply(p, k);
// long now4 = System.currentTimeMillis();
//
// assertEquals("WNAF multiplication is incorrect", refWnaf, reference);
// assertEquals("FPNAF multiplication is incorrect", refFpNaf, reference);
//
// System.out.println(curveName + ": Multiply WNAF took millis: " + (now2 - now1));
// System.out.println(curveName + ": Multiply FPNAF took millis: " + (now3 - now2));
// System.out.println(curveName + ": Multiply REFE took millis: " + (now4 - now3));
//
//// System.out.println(curveName + ": refWnaf = " + ecPointToString(refWnaf));
//// System.out.println(curveName + ": refFpNaf = " + ecPointToString(refFpNaf));
//// System.out.println(curveName + ": reference = " + ecPointToString(reference));
// System.out.println();
// }
//
// public void testMultiplyWnaf() {
// System.out.println("\n\n\n***** Start test multiplications on F2m *****");
// implTestMultiplyWnaf("sect113r1");
// implTestMultiplyWnaf("sect113r2");
// implTestMultiplyWnaf("sect131r1");
// implTestMultiplyWnaf("sect131r2");
// implTestMultiplyWnaf("sect163r1");
// implTestMultiplyWnaf("sect163r2");
// implTestMultiplyWnaf("sect193r1");
// implTestMultiplyWnaf("sect193r2");
// implTestMultiplyWnaf("sect233r1");
// implTestMultiplyWnaf("sect283r1");
// implTestMultiplyWnaf("sect409r1");
// implTestMultiplyWnaf("sect571r1");
//
// System.out.println("\n\n\n***** Start test multiplications on Fp *****");
// implTestMultiplyWnaf("secp112r1");
// implTestMultiplyWnaf("secp128r1");
// implTestMultiplyWnaf("secp160r1");
// implTestMultiplyWnaf("secp192r1");
// implTestMultiplyWnaf("secp224r1");
// implTestMultiplyWnaf("secp256r1");
// implTestMultiplyWnaf("secp384r1");
// implTestMultiplyWnaf("secp521r1");
// }
//}