package org.bouncycastle.math.ec.tools; import java.io.PrintStream; import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; import java.util.Enumeration; 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.ECCurve; import org.bouncycastle.math.ec.ECFieldElement; import org.bouncycastle.util.Integers; /* loaded from: classes6.dex */ public class TraceOptimizer { private static final BigInteger ONE = BigInteger.valueOf(1); private static final SecureRandom R = new SecureRandom(); public static void printNonZeroTraceBits(X9ECParameters x9ECParameters) { if (!ECAlgorithms.isF2mCurve(x9ECParameters.getCurve())) { throw new IllegalArgumentException("Trace only defined over characteristic-2 fields"); } implPrintNonZeroTraceBits(x9ECParameters); } public static void main(String[] strArr) { TreeSet treeSet = new TreeSet(enumToList(ECNamedCurveTable.getNames())); treeSet.addAll(enumToList(CustomNamedCurves.getNames())); for (String str : treeSet) { X9ECParameters byName = CustomNamedCurves.getByName(str); if (byName == null) { byName = ECNamedCurveTable.getByName(str); } if (byName != null && ECAlgorithms.isF2mCurve(byName.getCurve())) { PrintStream printStream = System.out; StringBuilder sb = new StringBuilder(); sb.append(str); sb.append(":"); printStream.print(sb.toString()); implPrintNonZeroTraceBits(byName); } } } public static void implPrintNonZeroTraceBits(X9ECParameters x9ECParameters) { ECCurve curve = x9ECParameters.getCurve(); int fieldSize = curve.getFieldSize(); ArrayList arrayList = new ArrayList(); for (int i = 0; i < fieldSize; i++) { if (calculateTrace(curve.fromBigInteger(ONE.shiftLeft(i))) != 0) { arrayList.add(Integers.valueOf(i)); System.out.print(" ".concat(String.valueOf(i))); } } System.out.println(); for (int i2 = 0; i2 < 1000; i2++) { BigInteger bigInteger = new BigInteger(fieldSize, R); int calculateTrace = calculateTrace(curve.fromBigInteger(bigInteger)); int i3 = 0; for (int i4 = 0; i4 < arrayList.size(); i4++) { if (bigInteger.testBit(((Integer) arrayList.get(i4)).intValue())) { i3 ^= 1; } } if (calculateTrace != i3) { throw new IllegalStateException("Optimized-trace sanity check failed"); } } } private static ArrayList enumToList(Enumeration enumeration) { ArrayList arrayList = new ArrayList(); while (enumeration.hasMoreElements()) { arrayList.add(enumeration.nextElement()); } return arrayList; } private static int calculateTrace(ECFieldElement eCFieldElement) { int fieldSize = eCFieldElement.getFieldSize(); ECFieldElement eCFieldElement2 = eCFieldElement; for (int i = 1; i < fieldSize; i++) { eCFieldElement2 = eCFieldElement2.square(); eCFieldElement = eCFieldElement.add(eCFieldElement2); } BigInteger bigInteger = eCFieldElement.toBigInteger(); if (bigInteger.bitLength() <= 1) { return bigInteger.intValue(); } throw new IllegalStateException(); } }