aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/kat_dlies.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/kat_dlies.cpp')
-rw-r--r--src/tests/kat_dlies.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/tests/kat_dlies.cpp b/src/tests/kat_dlies.cpp
new file mode 100644
index 000000000..cd931fd35
--- /dev/null
+++ b/src/tests/kat_dlies.cpp
@@ -0,0 +1,77 @@
+#include "tests.h"
+#include "test_pubkey.h"
+
+#include <botan/auto_rng.h>
+#include <botan/pubkey.h>
+#include <botan/lookup.h>
+#include <botan/dlies.h>
+#include <botan/dh.h>
+#include <botan/hex.h>
+#include <iostream>
+#include <fstream>
+
+using namespace Botan;
+
+namespace {
+
+size_t dlies_kat(const std::string& p,
+ const std::string& g,
+ const std::string& x1,
+ const std::string& x2,
+ const std::string& msg,
+ const std::string& ciphertext)
+ {
+ AutoSeeded_RNG rng;
+
+ BigInt p_bn(p);
+ BigInt g_bn(g);
+ BigInt x1_bn(x1);
+ BigInt x2_bn(x2);
+
+ DL_Group domain(p_bn, g_bn);
+
+ DH_PrivateKey from(rng, domain, x1_bn);
+ DH_PrivateKey to(rng, domain, x2_bn);
+
+ const std::string opt_str = "KDF2(SHA-1)/HMAC(SHA-1)/16";
+
+ std::vector<std::string> options = split_on(opt_str, '/');
+
+ if(options.size() != 3)
+ throw std::runtime_error("DLIES needs three options: " + opt_str);
+
+ const size_t mac_key_len = to_u32bit(options[2]);
+
+ DLIES_Encryptor e(from,
+ get_kdf(options[0]),
+ get_mac(options[1]),
+ mac_key_len);
+
+ DLIES_Decryptor d(to,
+ get_kdf(options[0]),
+ get_mac(options[1]),
+ mac_key_len);
+
+ e.set_other_key(to.public_value());
+
+ const std::string empty = "";
+ return validate_encryption(e, d, "DLIES", msg, empty, ciphertext);
+ }
+
+}
+
+size_t test_dlies()
+ {
+ std::ifstream dlies(TEST_DATA_DIR "/dlies.vec");
+
+ size_t fails = 0;
+
+ fails += run_tests_bb(dlies, "DLIES Encryption", "Ciphertext", true,
+ [](std::map<std::string, std::string> m) -> size_t
+ {
+ return dlies_kat(m["P"], m["G"], m["X1"], m["X2"], m["Msg"], m["Ciphertext"]);
+ });
+
+ return fails;
+ }
+