Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/boringssl.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tool/speed.cc')
-rw-r--r--tool/speed.cc86
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;
}