package org.bouncycastle.math.ec.tools; import java.math.BigInteger; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; import org.bouncycastle.asn1.x9.ECNamedCurveTable; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.math.ec.ECAlgorithms; import org.bouncycastle.math.ec.ECFieldElement; public class F2mSqrtOptimizer { public static void main(String[] args) { SortedSet names = new TreeSet(enumToList(ECNamedCurveTable.getNames())); names.addAll(enumToList(CustomNamedCurves.getNames())); Iterator it = names.iterator(); while (it.hasNext()) { String name = (String)it.next(); X9ECParameters x9 = CustomNamedCurves.getByName(name); if (x9 == null) { x9 = ECNamedCurveTable.getByName(name); } if (x9 != null && ECAlgorithms.isF2mCurve(x9.getCurve())) { System.out.print(name + ":"); implPrintRootZ(x9); } } } public static void printRootZ(X9ECParameters x9) { if (!ECAlgorithms.isF2mCurve(x9.getCurve())) { throw new IllegalArgumentException("Sqrt optimization only defined over characteristic-2 fields"); } implPrintRootZ(x9); } private static void implPrintRootZ(X9ECParameters x9) { ECFieldElement z = x9.getCurve().fromBigInteger(BigInteger.valueOf(2)); ECFieldElement rootZ = z.sqrt(); System.out.println(rootZ.toBigInteger().toString(16).toUpperCase()); if (!rootZ.square().equals(z)) { throw new IllegalStateException("Optimized-sqrt sanity check failed"); } } private static ArrayList enumToList(Enumeration en) { ArrayList rv = new ArrayList(); while (en.hasMoreElements()) { rv.add(en.nextElement()); } return rv; } }