diff options
-rw-r--r-- | crypto/test/src/math/ec/test/ECPointPerformanceTest.cs | 162 |
1 files changed, 109 insertions, 53 deletions
diff --git a/crypto/test/src/math/ec/test/ECPointPerformanceTest.cs b/crypto/test/src/math/ec/test/ECPointPerformanceTest.cs index e71ee653a..380004d96 100644 --- a/crypto/test/src/math/ec/test/ECPointPerformanceTest.cs +++ b/crypto/test/src/math/ec/test/ECPointPerformanceTest.cs @@ -1,73 +1,129 @@ using System; +using System.Collections; +using System.Text; using NUnit.Framework; +using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Sec; using Org.BouncyCastle.Asn1.X9; +using Org.BouncyCastle.Crypto.EC; using Org.BouncyCastle.Math; using Org.BouncyCastle.Math.EC; using Org.BouncyCastle.Security; +using Org.BouncyCastle.Utilities; +using Org.BouncyCastle.Utilities.Collections; using Org.BouncyCastle.Utilities.Date; namespace Org.BouncyCastle.Math.EC.Tests { - /** - * Compares the performance of the the window NAF point multiplication against - * conventional point multiplication. - */ - [TestFixture, Explicit] - public class ECPointPerformanceTest - { - public const int NUM_ROUNDS = 100; + /** + * Compares the performance of the the window NAF point multiplication against + * conventional point multiplication. + */ + [TestFixture, Explicit] + public class ECPointPerformanceTest + { + public const int PRE_ROUNDS = 10; + public const int NUM_ROUNDS = 100; - private void randMult(string curveName) - { - X9ECParameters spec = SecNamedCurves.GetByName(curveName); + private void RandMult(string curveName) + { + X9ECParameters spec = ECNamedCurveTable.GetByName(curveName); + if (spec != null) + { + RandMult(curveName, spec); + } - BigInteger n = spec.N; - ECPoint g = (ECPoint) spec.G; - SecureRandom random = new SecureRandom(); //SecureRandom.getInstance("SHA1PRNG", "SUN"); - BigInteger k = new BigInteger(n.BitLength - 1, random); + spec = CustomNamedCurves.GetByName(curveName); + if (spec != null) + { + RandMult(curveName + " (custom)", spec); + } + } - ECPoint qMultiply = null; - long startTime = DateTimeUtilities.CurrentUnixMs(); - for (int i = 0; i < NUM_ROUNDS; i++) - { - qMultiply = g.Multiply(k); - } - long endTime = DateTimeUtilities.CurrentUnixMs(); + private void RandMult(string label, X9ECParameters spec) + { + ECPoint G = (ECPoint)spec.G; + BigInteger n = spec.N; + SecureRandom random = new SecureRandom(); + random.SetSeed(DateTimeUtilities.CurrentUnixMs()); - double avgDuration = (double) (endTime - startTime) / NUM_ROUNDS; - Console.WriteLine(curveName); - Console.Write("Millis : "); - Console.WriteLine(avgDuration); - Console.WriteLine(); - } + Console.WriteLine(label); - [Test] - public void TestMultiply() - { - randMult("sect163k1"); - randMult("sect163r2"); - randMult("sect233k1"); - randMult("sect233r1"); - randMult("sect283k1"); - randMult("sect283r1"); - randMult("sect409k1"); - randMult("sect409r1"); - randMult("sect571k1"); - randMult("sect571r1"); - randMult("secp224k1"); - randMult("secp224r1"); - randMult("secp256k1"); - randMult("secp256r1"); - randMult("secp521r1"); - } + double avgDuration = RandMult(random, G, n); + string coordName = "AFFINE"; + StringBuilder sb = new StringBuilder(); + sb.Append(" "); + sb.Append(coordName); + for (int j = coordName.Length; j < 30; ++j) + { + sb.Append(' '); + } + sb.Append(": "); + sb.Append(avgDuration); + sb.Append("ms"); + Console.WriteLine(sb.ToString()); + } - // public static void Main(string argv[]) - // { - // ECMultiplyPerformanceTest test = new ECMultiplyPerformanceTest(); - // Test.testMultiply(); - // } - } + private double RandMult(SecureRandom random, ECPoint g, BigInteger n) + { + BigInteger[] ks = new BigInteger[128]; + 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 = DateTimeUtilities.CurrentUnixMs(); + 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 = DateTimeUtilities.CurrentUnixMs(); + + return (double)(endTime - startTime) / NUM_ROUNDS; + } + + [Test] + public void TestMultiply() + { + ArrayList nameList = new ArrayList(); + CollectionUtilities.AddRange(nameList, ECNamedCurveTable.Names); + string[] names = (string[])nameList.ToArray(typeof(string)); + Array.Sort(names); + ISet oids = new HashSet(); + foreach (string name in names) + { + DerObjectIdentifier oid = ECNamedCurveTable.GetOid(name); + if (!oids.Contains(oid)) + { + oids.Add(oid); + RandMult(name); + } + } + } + + public static void Main(string[] args) + { + new ECPointPerformanceTest().TestMultiply(); + } + } } |