aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests/test_elg.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-01-05 06:23:21 +0000
committerlloyd <[email protected]>2014-01-05 06:23:21 +0000
commitc431fb65b883a0a5fa060ea7caace0aca3628ec6 (patch)
tree09898d2307801bffa7e1aeee9251d57ed4837870 /src/tests/test_elg.cpp
parent052345203b67eb5cacacd5659ec9837eeb59af35 (diff)
Split up public key tests and data, use new test framework
Diffstat (limited to 'src/tests/test_elg.cpp')
-rw-r--r--src/tests/test_elg.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/tests/test_elg.cpp b/src/tests/test_elg.cpp
new file mode 100644
index 000000000..65e01d4ac
--- /dev/null
+++ b/src/tests/test_elg.cpp
@@ -0,0 +1,60 @@
+#include "tests.h"
+#include "test_pubkey.h"
+
+#include <botan/auto_rng.h>
+#include <botan/pubkey.h>
+#include <botan/elgamal.h>
+#include <botan/hex.h>
+#include <iostream>
+#include <fstream>
+
+using namespace Botan;
+
+namespace {
+
+size_t elgamal_kat(const std::string& p,
+ const std::string& g,
+ const std::string& x,
+ const std::string& msg,
+ std::string padding,
+ const std::string& nonce,
+ const std::string& ciphertext)
+ {
+ AutoSeeded_RNG rng;
+
+ const BigInt p_bn = BigInt(p);
+ const BigInt g_bn = BigInt(g);
+ const BigInt x_bn = BigInt(x);
+
+ DL_Group group(p_bn, g_bn);
+ ElGamal_PrivateKey privkey(rng, group, x_bn);
+
+ ElGamal_PublicKey pubkey = privkey;
+
+ if(padding == "")
+ padding = "Raw";
+
+ PK_Encryptor_EME enc(pubkey, padding);
+ PK_Decryptor_EME dec(privkey, padding);
+
+ return validate_encryption(enc, dec, "ElGamal/" + padding, msg, nonce, ciphertext);
+ }
+
+}
+
+size_t test_elgamal()
+ {
+ std::ifstream elgamal_enc(TEST_DATA_DIR "/elgamal.vec");
+
+ size_t fails = 0;
+
+ fails += run_tests_bb(elgamal_enc, "ElGamal Encryption", "Ciphertext", true,
+ [](std::map<std::string, std::string> m) -> size_t
+ {
+ return elgamal_kat(m["P"], m["G"], m["X"], m["Msg"],
+ m["Padding"], m["Nonce"], m["Ciphertext"]);
+ });
+
+ return fails;
+ }
+