From 1a5155fd96a6c5c04c11c29f39e94a29290bfe83 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Wed, 7 Aug 2019 04:20:37 -0400 Subject: Split public key benchmarks into integers and elliptic curves --- bench.h | 48 ++++++++++++++++++++++++++++++++++++++++++------ bench1.cpp | 9 +++++++++ bench3.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 93 insertions(+), 20 deletions(-) diff --git a/bench.h b/bench.h index 34c446ef..31a0d69a 100644 --- a/bench.h +++ b/bench.h @@ -16,14 +16,48 @@ NAMESPACE_BEGIN(Test) // More granular control over benchmarks enum TestClass { - UnkeyedRNG=(1<<0),UnkeyedHash=(1<<1),UnkeyedOther=(1<<2), - SharedKeyMAC=(1<<3),SharedKeyStream=(1<<4),SharedKeyBlock=(1<<5),SharedKeyOther=(1<<6), - PublicKeyAgreement=(1<<7),PublicKeyEncryption=(1<<8),PublicKeySignature=(1<<9),PublicKeyOther=(1<<10), + /// \brief Random number generators + UnkeyedRNG=(1<<0), + /// \brief Message digests + UnkeyedHash=(1<<1), + /// \brief Other unkeyed algorithms + UnkeyedOther=(1<<2), + + /// \brief Message authentication codes + SharedKeyMAC=(1<<3), + /// \brief Stream ciphers + SharedKeyStream=(1<<4), + /// \brief Block ciphers ciphers + SharedKeyBlock=(1<<5), + /// \brief Other shared key algorithms + SharedKeyOther=(1<<6), + + /// \brief Key agreement algorithms over integers + PublicKeyAgreement=(1<<7), + /// \brief Encryption algorithms over integers + PublicKeyEncryption=(1<<8), + /// \brief Signature algorithms over integers + PublicKeySignature=(1<<9), + /// \brief Other public key algorithms over integers + PublicKeyOther=(1<<10), + + /// \brief Key agreement algorithms over EC + PublicKeyAgreementEC=(1<<11), + /// \brief Encryption algorithms over EC + PublicKeyEncryptionEC=(1<<12), + /// \brief Signature algorithms over EC + PublicKeySignatureEC=(1<<13), + /// \brief Other public key algorithms over EC + PublicKeyOtherEC=(1<<14), + Unkeyed=UnkeyedRNG|UnkeyedHash|UnkeyedOther, SharedKey=SharedKeyMAC|SharedKeyStream|SharedKeyBlock|SharedKeyOther, PublicKey=PublicKeyAgreement|PublicKeyEncryption|PublicKeySignature|PublicKeyOther, - All=Unkeyed|SharedKey|PublicKey, - TestFirst=(0), TestLast=(1<<11) + PublicKeyEC=PublicKeyAgreementEC|PublicKeyEncryptionEC|PublicKeySignatureEC|PublicKeyOtherEC, + + All=Unkeyed|SharedKey|PublicKey|PublicKeyEC, + + TestFirst=(0), TestLast=(1<<15) }; extern const double CLOCK_TICKS_PER_SECOND; @@ -45,8 +79,10 @@ void Benchmark(Test::TestClass suites, double t, double hertz); void Benchmark1(double t, double hertz); // Shared key systems void Benchmark2(double t, double hertz); -// Public key systems +// Public key systems over integers void Benchmark3(double t, double hertz); +// Public key systems over elliptic curves +void Benchmark4(double t, double hertz); // These are defined in bench1.cpp extern void OutputResultKeying(double iterations, double timeTaken); diff --git a/bench1.cpp b/bench1.cpp index 04a2e799..eec8f4ad 100644 --- a/bench1.cpp +++ b/bench1.cpp @@ -351,6 +351,8 @@ void BenchmarkWithCommand(int argc, const char* const argv[]) if (command == "b") // All benchmarks Benchmark(Test::All, runningTime, cpuFreq); + else if (command == "b4") // Public key algorithms over EC + Test::Benchmark(Test::PublicKeyEC, runningTime, cpuFreq); else if (command == "b3") // Public key algorithms Test::Benchmark(Test::PublicKey, runningTime, cpuFreq); else if (command == "b2") // Shared key algorithms @@ -392,6 +394,13 @@ void Benchmark(Test::TestClass suites, double t, double hertz) Benchmark3(t, hertz); } + // Public key algorithms over EC + if (suites & Test::PublicKeyEC) + { + std::cout << "\n
"; + Benchmark4(t, hertz); + } + g_testEnd = ::time(NULLPTR); std::ostringstream oss; diff --git a/bench3.cpp b/bench3.cpp index 00c62eab..ded4fa5a 100644 --- a/bench3.cpp +++ b/bench3.cpp @@ -365,21 +365,29 @@ void Benchmark3(double t, double hertz) BenchMarkKeyAgreement("TestData/lucd1024.dat", "LUCDIF 1024", t); BenchMarkKeyAgreement("TestData/mqv1024.dat", "MQV 1024", t); BenchMarkKeyAgreement("TestData/mqv2048.dat", "MQV 2048", t); + } -#if 0 - BenchMarkKeyAgreement("TestData/hmqv160.dat", "HMQV P-160", t); - BenchMarkKeyAgreement("TestData/hmqv256.dat", "HMQV P-256", t); - BenchMarkKeyAgreement("TestData/hmqv384.dat", "HMQV P-384", t); - BenchMarkKeyAgreement("TestData/hmqv512.dat", "HMQV P-512", t); + std::cout << "\n" << std::endl; +} - BenchMarkKeyAgreement("TestData/fhmqv160.dat", "FHMQV P-160", t); - BenchMarkKeyAgreement("TestData/fhmqv256.dat", "FHMQV P-256", t); - BenchMarkKeyAgreement("TestData/fhmqv384.dat", "FHMQV P-384", t); - BenchMarkKeyAgreement("TestData/fhmqv512.dat", "FHMQV P-512", t); -#endif - } +void Benchmark4(double t, double hertz) +{ + g_allocatedTime = t; + g_hertz = hertz; - std::cout << "\n"; + const char *mco; + if (g_hertz > 1.0f) + mco = "Megacycles/Operation"; + else + mco = ""; + + std::cout << "\n"; + std::cout << "\n"; + std::cout << "\n"; + std::cout << "\n"; { ed25519::Signer sign(Test::GlobalRNG()); ed25519::Verifier verify(sign); @@ -391,7 +399,27 @@ void Benchmark3(double t, double hertz) BenchMarkAgreement("x25519", agree, t); } - std::cout << "\n"; +#if 0 + std::cout << "\n"; + { + BenchMarkKeyAgreement("TestData/mqv160.dat", "MQV P-160", t); + BenchMarkKeyAgreement("TestData/mqv256.dat", "MQV P-256", t); + BenchMarkKeyAgreement("TestData/mqv384.dat", "MQV P-384", t); + BenchMarkKeyAgreement("TestData/mqv512.dat", "MQV P-521", t); + + BenchMarkKeyAgreement("TestData/hmqv160.dat", "HMQV P-160", t); + BenchMarkKeyAgreement("TestData/hmqv256.dat", "HMQV P-256", t); + BenchMarkKeyAgreement("TestData/hmqv384.dat", "HMQV P-384", t); + BenchMarkKeyAgreement("TestData/hmqv512.dat", "HMQV P-521", t); + + BenchMarkKeyAgreement("TestData/fhmqv160.dat", "FHMQV P-160", t); + BenchMarkKeyAgreement("TestData/fhmqv256.dat", "FHMQV P-256", t); + BenchMarkKeyAgreement("TestData/fhmqv384.dat", "FHMQV P-384", t); + BenchMarkKeyAgreement("TestData/fhmqv512.dat", "FHMQV P-521", t); + } +#endif + + std::cout << "\n"; { ECIES::Decryptor cpriv(Test::GlobalRNG(), ASN1::secp256k1()); ECIES::Encryptor cpub(cpriv); @@ -418,7 +446,7 @@ void Benchmark3(double t, double hertz) BenchMarkAgreement("ECMQVC over GF(p) 256", ecmqvc, t); } - std::cout << "\n"; + std::cout << "\n"; { ECIES::Decryptor cpriv(Test::GlobalRNG(), ASN1::sect233r1()); ECIES::Encryptor cpub(cpriv); -- cgit v1.2.1
OperationMilliseconds/Operation" << mco; + + std::cout << "\n