diff options
Diffstat (limited to 'tool/speed.cc')
-rw-r--r-- | tool/speed.cc | 86 |
1 files changed, 82 insertions, 4 deletions
diff --git a/tool/speed.cc b/tool/speed.cc index db7c5fa7..a8eb8bfa 100644 --- a/tool/speed.cc +++ b/tool/speed.cc @@ -24,14 +24,15 @@ #include <openssl/curve25519.h> #include <openssl/digest.h> #include <openssl/err.h> -#include <openssl/obj.h> +#include <openssl/newhope.h> +#include <openssl/nid.h> #include <openssl/rand.h> #include <openssl/rsa.h> #if defined(OPENSSL_WINDOWS) -#pragma warning(push, 3) +OPENSSL_MSVC_PRAGMA(warning(push, 3)) #include <windows.h> -#pragma warning(pop) +OPENSSL_MSVC_PRAGMA(warning(pop)) #elif defined(OPENSSL_APPLE) #include <sys/time.h> #endif @@ -467,6 +468,81 @@ static bool Speed25519(const std::string &selected) { return true; } +static bool SpeedSPAKE2(const std::string &selected) { + if (!selected.empty() && selected.find("SPAKE2") == std::string::npos) { + return true; + } + + TimeResults results; + + static const uint8_t kAliceName[] = {'A'}; + static const uint8_t kBobName[] = {'B'}; + static const uint8_t kPassword[] = "password"; + ScopedSPAKE2_CTX alice(SPAKE2_CTX_new(spake2_role_alice, kAliceName, + sizeof(kAliceName), kBobName, + sizeof(kBobName))); + uint8_t alice_msg[SPAKE2_MAX_MSG_SIZE]; + size_t alice_msg_len; + + if (!SPAKE2_generate_msg(alice.get(), alice_msg, &alice_msg_len, + sizeof(alice_msg), + kPassword, sizeof(kPassword))) { + fprintf(stderr, "SPAKE2_generate_msg failed.\n"); + return false; + } + + if (!TimeFunction(&results, [&alice_msg, alice_msg_len]() -> bool { + ScopedSPAKE2_CTX bob(SPAKE2_CTX_new(spake2_role_bob, kBobName, + sizeof(kBobName), kAliceName, + sizeof(kAliceName))); + uint8_t bob_msg[SPAKE2_MAX_MSG_SIZE], bob_key[64]; + size_t bob_msg_len, bob_key_len; + if (!SPAKE2_generate_msg(bob.get(), bob_msg, &bob_msg_len, + sizeof(bob_msg), kPassword, + sizeof(kPassword)) || + !SPAKE2_process_msg(bob.get(), bob_key, &bob_key_len, + sizeof(bob_key), alice_msg, alice_msg_len)) { + return false; + } + + return true; + })) { + fprintf(stderr, "SPAKE2 failed.\n"); + } + + results.Print("SPAKE2 over Ed25519"); + + return true; +} + +static bool SpeedNewHope(const std::string &selected) { + if (!selected.empty() && selected.find("newhope") == std::string::npos) { + return true; + } + + TimeResults results; + NEWHOPE_POLY *sk = NEWHOPE_POLY_new(); + uint8_t acceptmsg[NEWHOPE_ACCEPTMSG_LENGTH]; + RAND_bytes(acceptmsg, sizeof(acceptmsg)); + + if (!TimeFunction(&results, [sk, &acceptmsg]() -> bool { + uint8_t key[SHA256_DIGEST_LENGTH]; + uint8_t offermsg[NEWHOPE_OFFERMSG_LENGTH]; + NEWHOPE_offer(offermsg, sk); + if (!NEWHOPE_finish(key, sk, acceptmsg, NEWHOPE_ACCEPTMSG_LENGTH)) { + return false; + } + return true; + })) { + fprintf(stderr, "failed to exchange key.\n"); + return false; + } + + NEWHOPE_POLY_free(sk); + results.Print("newhope key exchange"); + return true; +} + bool Speed(const std::vector<std::string> &args) { std::string selected; if (args.size() > 1) { @@ -546,7 +622,9 @@ bool Speed(const std::vector<std::string> &args) { !SpeedRandom(selected) || !SpeedECDH(selected) || !SpeedECDSA(selected) || - !Speed25519(selected)) { + !Speed25519(selected) || + !SpeedSPAKE2(selected) || + !SpeedNewHope(selected)) { return false; } |