diff options
Diffstat (limited to 'src/tests/kat_rsa.cpp')
-rw-r--r-- | src/tests/kat_rsa.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/tests/kat_rsa.cpp b/src/tests/kat_rsa.cpp new file mode 100644 index 000000000..2d24c6073 --- /dev/null +++ b/src/tests/kat_rsa.cpp @@ -0,0 +1,117 @@ +#include "tests.h" +#include "test_pubkey.h" + +#include <botan/auto_rng.h> +#include <botan/pubkey.h> +#include <botan/rsa.h> +#include <botan/hex.h> +#include <iostream> +#include <fstream> + +using namespace Botan; + +namespace { + +size_t rsaes_kat(const std::string& e, + const std::string& p, + const std::string& q, + const std::string& msg, + std::string padding, + const std::string& nonce, + const std::string& output) + { + AutoSeeded_RNG rng; + + RSA_PrivateKey privkey(rng, BigInt(p), BigInt(q), BigInt(e)); + + RSA_PublicKey pubkey = privkey; + + if(padding == "") + padding = "Raw"; + + PK_Encryptor_EME enc(pubkey, padding); + PK_Decryptor_EME dec(privkey, padding); + + return validate_encryption(enc, dec, "RSAES/" + padding, msg, nonce, output); + } + +size_t rsa_sig_kat(const std::string& e, + const std::string& p, + const std::string& q, + const std::string& msg, + std::string padding, + const std::string& nonce, + const std::string& output) + { + AutoSeeded_RNG rng; + + RSA_PrivateKey privkey(rng, BigInt(p), BigInt(q), BigInt(e)); + + RSA_PublicKey pubkey = privkey; + + if(padding == "") + padding = "Raw"; + + PK_Verifier verify(pubkey, padding); + PK_Signer sign(privkey, padding); + + return validate_signature(verify, sign, "RSA/" + padding, msg, nonce, output); + } + +size_t rsa_sig_verify(const std::string& e, + const std::string& n, + const std::string& msg, + std::string padding, + const std::string& signature) + { + AutoSeeded_RNG rng; + + BigInt e_bn(e); + BigInt n_bn(n); + + RSA_PublicKey key(n_bn, e_bn); + + if(padding == "") + padding = "Raw"; + + PK_Verifier verify(key, padding); + + if(!verify.verify_message(hex_decode(msg), hex_decode(signature))) + return 1; + return 0; + } + +} + +size_t test_rsa() + { + std::ifstream rsa_enc(TEST_DATA_DIR "/rsaes.vec"); + std::ifstream rsa_sig(TEST_DATA_DIR "/rsa_sig.vec"); + std::ifstream rsa_verify(TEST_DATA_DIR "/rsa_verify.vec"); + + size_t fails = 0; + + fails += run_tests_bb(rsa_enc, "RSA Encryption", "Ciphertext", true, + [](std::map<std::string, std::string> m) -> size_t + { + return rsaes_kat(m["E"], m["P"], m["Q"], m["Msg"], + m["Padding"], m["Nonce"], m["Ciphertext"]); + }); + + fails += run_tests_bb(rsa_sig, "RSA Signature", "Signature", true, + [](std::map<std::string, std::string> m) -> size_t + { + return rsa_sig_kat(m["E"], m["P"], m["Q"], m["Msg"], + m["Padding"], m["Nonce"], m["Signature"]); + }); + + fails += run_tests_bb(rsa_verify, "RSA Verify", "Signature", true, + [](std::map<std::string, std::string> m) -> size_t + { + return rsa_sig_verify(m["E"], m["N"], m["Msg"], + m["Padding"], m["Signature"]); + }); + + return fails; + } + |