aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/speed_pk.cpp71
-rw-r--r--src/lib/pubkey/mce/mce_kem.h10
2 files changed, 81 insertions, 0 deletions
diff --git a/src/cmd/speed_pk.cpp b/src/cmd/speed_pk.cpp
index 6ebb366c5..141248d7d 100644
--- a/src/cmd/speed_pk.cpp
+++ b/src/cmd/speed_pk.cpp
@@ -12,6 +12,7 @@
#include <botan/parsing.h>
#include <botan/oids.h>
#include <map>
+#include <sstream>
#if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO)
#include <botan/x509_key.h>
@@ -62,6 +63,11 @@
#include <botan/gost_3410.h>
#endif
+#if defined(BOTAN_HAS_MCELIECE)
+ #include <botan/mceliece.h>
+ #include <botan/mce_kem.h>
+#endif
+
using namespace Botan;
#include <iostream>
@@ -670,6 +676,66 @@ void benchmark_elg(RandomNumberGenerator& rng,
}
#endif
+#if defined(BOTAN_HAS_MCELIECE)
+void benchmark_mce(RandomNumberGenerator& rng,
+ double seconds,
+ Benchmark_Report& report)
+ {
+ const std::vector<std::pair<size_t, size_t>> params = {
+ { 256, 15 },
+ { 512, 33 },
+ { 1024, 35 },
+ { 2048, 50 },
+ { 2960, 56 },
+ { 6624, 115 }
+ };
+
+ const std::string algo_name = "McEliece";
+ const std::string padding = "Raw";
+
+ for(auto& param : params)
+ {
+ Timer keygen_timer("keygen");
+ Timer enc_timer(padding + " encrypt");
+ Timer dec_timer(padding + " decrypt");
+
+ keygen_timer.start();
+ McEliece_PrivateKey priv_key(rng, param.first, param.second);
+ McEliece_PublicKey pub_key(priv_key.x509_subject_public_key());
+ keygen_timer.stop();
+
+ McEliece_KEM_Encryptor enc_kem(pub_key);
+ McEliece_KEM_Decryptor dec_kem(priv_key);
+
+ while(enc_timer.seconds() < seconds ||
+ dec_timer.seconds() < seconds)
+ {
+ enc_timer.start();
+ auto enc_pair = enc_kem.encrypt(rng);
+ enc_timer.stop();
+
+ dec_timer.start();
+ auto dec_key = dec_kem.decrypt_vec(enc_pair.first);
+ dec_timer.stop();
+
+ BOTAN_ASSERT_EQUAL(enc_pair.second, dec_key, "KEM result matches");
+ }
+
+ const std::string nm = algo_name + "-" +
+ std::to_string(param.first) + "," +
+ std::to_string(param.second);
+
+ std::ostringstream keysize_report;
+ keysize_report << "(size " << pub_key.x509_subject_public_key().size() << " pub "
+ << priv_key.pkcs8_private_key().size() << " priv)";
+
+ report.report(nm + " " + keysize_report.str(), keygen_timer);
+ report.report(nm, enc_timer);
+ report.report(nm, dec_timer);
+ }
+ }
+#endif
+
}
void bench_pk(RandomNumberGenerator& rng,
@@ -752,4 +818,9 @@ void bench_pk(RandomNumberGenerator& rng,
if(algo == "All" || algo == "RW")
benchmark_rw(rng, seconds, report);
#endif
+
+#if defined(BOTAN_HAS_MCELIECE)
+ if(algo == "All" || algo == "McEliece")
+ benchmark_mce(rng, seconds, report);
+#endif
}
diff --git a/src/lib/pubkey/mce/mce_kem.h b/src/lib/pubkey/mce/mce_kem.h
index 4e46a0fab..2bb1edba5 100644
--- a/src/lib/pubkey/mce/mce_kem.h
+++ b/src/lib/pubkey/mce/mce_kem.h
@@ -37,6 +37,16 @@ class BOTAN_DLL McEliece_KEM_Decryptor
* returns the derived 512-bit symmetric key
*/
secure_vector<Botan::byte> decrypt(const byte msg[], size_t msg_len);
+
+ /**
+ * returns the derived 512-bit symmetric key
+ */
+ template<typename Alloc>
+ secure_vector<Botan::byte> decrypt_vec(const std::vector<byte, Alloc>& v)
+ {
+ return decrypt(&v[0], v.size());
+
+ }
private:
McEliece_Private_Operation m_raw_priv_op;
};