aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java')
-rw-r--r--libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java172
1 files changed, 172 insertions, 0 deletions
diff --git a/libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java b/libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java
new file mode 100644
index 000000000..b1fb643da
--- /dev/null
+++ b/libraries/spongycastle/core/src/test/java/org/spongycastle/math/ec/test/ECPointPerformanceTest.java
@@ -0,0 +1,172 @@
+package org.spongycastle.math.ec.test;
+
+import java.math.BigInteger;
+import java.security.SecureRandom;
+
+import junit.framework.TestCase;
+
+import org.spongycastle.asn1.x9.ECNamedCurveTable;
+import org.spongycastle.asn1.x9.X9ECParameters;
+import org.spongycastle.math.ec.ECCurve;
+import org.spongycastle.math.ec.ECPoint;
+
+/**
+ * Compares the performance of the the window NAF point multiplication against
+ * conventional point multiplication.
+ */
+public class ECPointPerformanceTest extends TestCase
+{
+ public static final int PRE_ROUNDS = 10;
+ public static final int NUM_ROUNDS = 100;
+
+ private static String[] COORD_NAMES = new String[]{ "AFFINE", "HOMOGENEOUS", "JACOBIAN", "JACOBIAN-CHUDNOVSKY",
+ "JACOBIAN-MODIFIED", "LAMBDA-AFFINE", "LAMBDA-PROJECTIVE", "SKEWED" };
+
+ private void randMult(final String curveName) throws Exception
+ {
+ X9ECParameters spec = ECNamedCurveTable.getByName(curveName);
+ ECCurve C = spec.getCurve();
+ ECPoint G = (ECPoint) spec.getG();
+ BigInteger n = spec.getN();
+
+ SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
+ random.setSeed(System.currentTimeMillis());
+
+ System.out.println(curveName);
+
+ int[] coords = ECCurve.getAllCoordinateSystems();
+ for (int i = 0; i < coords.length; ++i)
+ {
+ int coord = coords[i];
+ if (C.supportsCoordinateSystem(coord))
+ {
+ ECCurve c = C;
+ ECPoint g = G;
+ if (c.getCoordinateSystem() != coord)
+ {
+ c = C.configure().setCoordinateSystem(coord).create();
+ g = c.importPoint(G);
+ }
+
+ double avgDuration = randMult(random, c, g, n);
+ String coordName = COORD_NAMES[coord];
+ StringBuffer sb = new StringBuffer();
+ sb.append(" ");
+ sb.append(coordName);
+ for (int j = coordName.length(); j < 30; ++j)
+ {
+ sb.append(' ');
+ }
+ sb.append(": ");
+ sb.append(avgDuration);
+ sb.append("ms");
+ System.out.println(sb.toString());
+ }
+ }
+
+ System.out.println();
+ }
+
+ private double randMult(SecureRandom random, ECCurve c, ECPoint g, BigInteger n) throws Exception
+ {
+ BigInteger[] ks = new BigInteger[16];
+ for (int i = 0; i < ks.length; ++i)
+ {
+ ks[i] = new BigInteger(n.bitLength() - 1, random);
+ }
+
+ int ki = 0;
+ ECPoint p = g;
+ for (int i = 1; i <= PRE_ROUNDS; i++)
+ {
+ BigInteger k = ks[ki];
+ p = g.multiply(k);
+ if (++ki == ks.length)
+ {
+ ki = 0;
+ g = p;
+ }
+ }
+ long startTime = System.currentTimeMillis();
+ for (int i = 1; i <= NUM_ROUNDS; i++)
+ {
+ BigInteger k = ks[ki];
+ p = g.multiply(k);
+ if (++ki == ks.length)
+ {
+ ki = 0;
+ g = p;
+ }
+ }
+ long endTime = System.currentTimeMillis();
+
+ return (double) (endTime - startTime) / NUM_ROUNDS;
+ }
+
+ public void testMultiply() throws Exception
+ {
+// Enumeration e = SECNamedCurves.getNames();
+// while (e.hasMoreElements())
+// {
+// String name = (String)e.nextElement();
+// randMult(name);
+// }
+
+
+ randMult("sect113r1");
+ randMult("sect113r2");
+ randMult("sect131r1");
+ randMult("sect131r2");
+ randMult("sect163k1");
+ randMult("sect163r1");
+ randMult("sect163r2");
+ randMult("sect193r1");
+ randMult("sect193r2");
+ randMult("sect233k1");
+ randMult("sect233r1");
+ randMult("sect239k1");
+ randMult("sect283k1");
+ randMult("sect283r1");
+ randMult("sect409k1");
+ randMult("sect409r1");
+ randMult("sect571k1");
+ randMult("sect571r1");
+
+ randMult("secp112r1");
+ randMult("secp112r2");
+ randMult("secp128r1");
+ randMult("secp128r2");
+ randMult("secp160k1");
+ randMult("secp160r1");
+ randMult("secp160r2");
+ randMult("secp192k1");
+ randMult("secp192r1");
+ randMult("secp224k1");
+ randMult("secp224r1");
+ randMult("secp256k1");
+ randMult("secp256r1");
+ randMult("secp384r1");
+ randMult("secp521r1");
+
+ randMult("brainpoolp160r1");
+ randMult("brainpoolp160t1");
+ randMult("brainpoolp192r1");
+ randMult("brainpoolp192t1");
+ randMult("brainpoolp224r1");
+ randMult("brainpoolp224t1");
+ randMult("brainpoolp256r1");
+ randMult("brainpoolp256t1");
+ randMult("brainpoolp320r1");
+ randMult("brainpoolp320t1");
+ randMult("brainpoolp384r1");
+ randMult("brainpoolp384t1");
+ randMult("brainpoolp512r1");
+ randMult("brainpoolp512t1");
+ }
+
+ // public static void main(String argv[]) throws Exception
+ // {
+ // ECMultiplyPerformanceTest test = new ECMultiplyPerformanceTest();
+ // test.testMultiply();
+ // }
+}