From d4ffd85a71f480ba3ef68b141f6f775ef1c786ae Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 4 Feb 2016 12:04:35 -0500 Subject: [PATCH] add elg tests and fix up dsa tests --- src/tests/unit_tests/CMakeLists.txt | 3 +- src/tests/unit_tests/crypto/dsa.cpp | 13 ++--- src/tests/unit_tests/crypto/elg.cpp | 87 +++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 src/tests/unit_tests/crypto/elg.cpp diff --git a/src/tests/unit_tests/CMakeLists.txt b/src/tests/unit_tests/CMakeLists.txt index 9e65c01c..41830e5e 100644 --- a/src/tests/unit_tests/CMakeLists.txt +++ b/src/tests/unit_tests/CMakeLists.txt @@ -4,7 +4,8 @@ set(TESTS_SRC "Utility.cpp" "crypto/aes.cpp" "crypto/dsa.cpp" - "crypto/ed25519.cpp") + "crypto/ed25519.cpp" + "crypto/elg.cpp") include_directories( "../../" diff --git a/src/tests/unit_tests/crypto/dsa.cpp b/src/tests/unit_tests/crypto/dsa.cpp index a8934cc6..215f1067 100644 --- a/src/tests/unit_tests/crypto/dsa.cpp +++ b/src/tests/unit_tests/crypto/dsa.cpp @@ -57,6 +57,7 @@ struct DSAFixture { uint8_t publicKey[128]; DSAVerifier* verifier; DSASigner* signer; + static constexpr size_t messageLen = 1024; }; BOOST_FIXTURE_TEST_CASE(DSASHA1KeyLength, DSAFixture) { @@ -69,7 +70,6 @@ BOOST_FIXTURE_TEST_CASE(DSASHA1SignatureLength, DSAFixture) { } BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyValid, DSAFixture) { - constexpr size_t messageLen = 1024; uint8_t signature[40]; uint8_t message[messageLen]; RandBytes(message, messageLen); @@ -78,33 +78,30 @@ BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyValid, DSAFixture) { BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), true); } BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadSignature, DSAFixture) { - constexpr size_t messageLen = 1024; uint8_t signature[40]; uint8_t message[messageLen]; RandBytes(message, messageLen); signer->Sign(message, messageLen, signature); // now we fugg up the signature a bit :-DDDD - signature[5] = Rand(); + signature[5] ^= RandInRange(1, 128); // it should fail verification BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false); } BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadMessage, DSAFixture) { - constexpr size_t messageLen = 1024; uint8_t signature[40]; uint8_t message[messageLen]; RandBytes(message, messageLen); signer->Sign(message, messageLen, signature); // fugg up the message - message[5] = Rand(); + message[5] ^= RandInRange(1, 128); // this should also fail verification BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false); } BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadSignatureAndMessage, DSAFixture) { - constexpr size_t messageLen = 1024; uint8_t signature[40]; uint8_t message[messageLen]; RandBytes(message, messageLen); @@ -112,8 +109,8 @@ BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadSignatureAndMessage, DSAFixture) { signer->Sign(message, messageLen, signature); // now we fug up both message and signature - message[6] = Rand(); - signature[2] = Rand(); + message[6] ^= RandInRange(1, 128); + signature[2] ^= RandInRange(1, 128); // this should fail verification as well BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false); } diff --git a/src/tests/unit_tests/crypto/elg.cpp b/src/tests/unit_tests/crypto/elg.cpp new file mode 100644 index 00000000..e976bd3a --- /dev/null +++ b/src/tests/unit_tests/crypto/elg.cpp @@ -0,0 +1,87 @@ + +#define BOOST_TEST_DYN_LINK + +#include +#include "crypto/ElGamal.h" +#include "crypto/Rand.h" + +using namespace i2p::crypto; + +BOOST_AUTO_TEST_SUITE(ElgamalTests) + +struct ElgamalFixture { + + uint8_t privateKey[256]; + uint8_t publicKey[256]; + ElGamalEncryption* enc; + static constexpr size_t messageLen = 222; + + ElgamalFixture() { + // TODO(psi): use static keys + GenerateElGamalKeyPair(privateKey, publicKey); + enc = new ElGamalEncryption(publicKey); + } + + ~ElgamalFixture() { + delete enc; + } + + +}; + + +BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptSuccess, ElgamalFixture) { + uint8_t plaintext[messageLen]; + uint8_t ciphertext[512]; + uint8_t result[messageLen]; + RandBytes(plaintext, messageLen); + enc->Encrypt(plaintext, messageLen, ciphertext, false); + BOOST_CHECK(ElGamalDecrypt(privateKey, ciphertext, result, false)); + + BOOST_CHECK_EQUAL_COLLECTIONS( + plaintext, plaintext + messageLen, + result, result + messageLen); +} + +BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptFail, ElgamalFixture) { + uint8_t plaintext[messageLen]; + uint8_t ciphertext[512]; + uint8_t result[messageLen]; + RandBytes(plaintext, messageLen); + enc->Encrypt(plaintext, messageLen, ciphertext, false); + // fug up the ciphertext + ciphertext[4] ^= RandInRange(1, 128); + + BOOST_CHECK(!ElGamalDecrypt(privateKey, ciphertext, result, false)); +} + +BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptZeroPaddBadPad, ElgamalFixture) { + uint8_t plaintext[messageLen]; + uint8_t ciphertext[514]; + uint8_t result[messageLen]; + RandBytes(plaintext, messageLen); + enc->Encrypt(plaintext, messageLen, ciphertext, true); + // fug up the ciphertext zeropadding + ciphertext[0] = RandInRange(1, 128); + BOOST_CHECK(!ElGamalDecrypt(privateKey, ciphertext, result, true)); +} + + +BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptZeroPadSuccess, ElgamalFixture) { + uint8_t plaintext[messageLen]; + uint8_t ciphertext[514]; + uint8_t result[messageLen]; + RandBytes(plaintext, messageLen); + enc->Encrypt(plaintext, messageLen, ciphertext, true); + + bool res = ElGamalDecrypt(privateKey, ciphertext, result, true); + + BOOST_CHECK(res); + if (res) { + BOOST_CHECK_EQUAL_COLLECTIONS( + plaintext, plaintext + messageLen, + result, result + messageLen); + } +} + +BOOST_AUTO_TEST_SUITE_END()