Skip to content
This repository has been archived by the owner on Sep 1, 2022. It is now read-only.

Commit

Permalink
Review PR #112 (resolves #114).
Browse files Browse the repository at this point in the history
  • Loading branch information
EinMByte committed Feb 5, 2016
1 parent aeca942 commit 20859e6
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 78 deletions.
16 changes: 7 additions & 9 deletions src/core/crypto/ElGamal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,10 @@ void ElGamalEncryption_Pimpl::Encrypt(
size_t len,
uint8_t* encrypted,
bool zeroPadding) const {
if ( len > 222 ) {
// bad size will overflow
// let's complain
throw std::logic_error("bad size for elgamal encryption: "+
std::to_string(len));
if (len > 222) {
// bad size, will cause an overflow
throw std::logic_error(
"bad size for ElGamal encryption: " + std::to_string(len));
}
uint8_t m[255];
// don't use uninitialized memory as padding
Expand All @@ -120,10 +119,9 @@ bool ElGamalDecrypt(
const uint8_t* encrypted,
uint8_t* data,
bool zeroPadding) {
if (zeroPadding && ( encrypted[0] || encrypted[257] ) ) {
// bad padding
return false;
}
if (zeroPadding && (encrypted[0] || encrypted[257]))
return false; // bad padding

CryptoPP::Integer
x(key, 256),
a(zeroPadding ? encrypted + 1 : encrypted, 256),
Expand Down
12 changes: 9 additions & 3 deletions src/tests/unit_tests/crypto/AES.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ BOOST_AUTO_TEST_CASE(XorZeroCipherBlocks) {
CipherBlock block = {0};
block ^= block;
const CipherBlock result = {0};
BOOST_CHECK_EQUAL_COLLECTIONS(result.buf, result.buf + 16, block.buf, block.buf + 16);
BOOST_CHECK_EQUAL_COLLECTIONS(
result.buf, result.buf + 16,
block.buf, block.buf + 16);
}

BOOST_AUTO_TEST_CASE(XorSelfCipherBlocks) {
Expand All @@ -51,7 +53,9 @@ BOOST_AUTO_TEST_CASE(XorSelfCipherBlocks) {
};
block ^= block;
const CipherBlock result = {0};
BOOST_CHECK_EQUAL_COLLECTIONS(result.buf, result.buf + 16, block.buf, block.buf + 16);
BOOST_CHECK_EQUAL_COLLECTIONS(
result.buf, result.buf + 16,
block.buf, block.buf + 16);
}

BOOST_AUTO_TEST_CASE(XorCipherBlocks) {
Expand All @@ -68,7 +72,9 @@ BOOST_AUTO_TEST_CASE(XorCipherBlocks) {
0xe7, 0xb7, 0x89, 0xac, 0xc, 0x27, 0xe7, 0xd6, 0x7c, 0x4d, 0x5e,
0xec, 0xe8, 0x10, 0x97, 0x7a
};
BOOST_CHECK_EQUAL_COLLECTIONS(block2.buf, block2.buf + 16, result.buf, result.buf + 16);
BOOST_CHECK_EQUAL_COLLECTIONS(
block2.buf, block2.buf + 16,
result.buf, result.buf + 16);
}

// NIST test parameters
Expand Down
45 changes: 22 additions & 23 deletions src/tests/unit_tests/crypto/DSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,10 @@ using namespace i2p::crypto;
BOOST_AUTO_TEST_SUITE(DSASHA1ests)

struct DSAFixture {

DSAFixture() {
// TODO(psi): generate static test keys
CreateDSARandomKeys(privateKey, publicKey);

verifier = new DSAVerifier(publicKey);
signer = new DSASigner(privateKey);
}
Expand All @@ -57,7 +56,7 @@ struct DSAFixture {
uint8_t publicKey[128];
DSAVerifier* verifier;
DSASigner* signer;
static constexpr size_t messageLen = 1024;
static constexpr size_t kMessageLen = 1024;
};

BOOST_FIXTURE_TEST_CASE(DSASHA1KeyLength, DSAFixture) {
Expand All @@ -71,48 +70,48 @@ BOOST_FIXTURE_TEST_CASE(DSASHA1SignatureLength, DSAFixture) {

BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyValid, DSAFixture) {
uint8_t signature[40];
uint8_t message[messageLen];
RandBytes(message, messageLen);
signer->Sign(message, messageLen, signature);
uint8_t message[kMessageLen];
RandBytes(message, kMessageLen);
signer->Sign(message, kMessageLen, signature);
// check that the signature is valid
BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), true);
BOOST_CHECK_EQUAL(verifier->Verify(message, kMessageLen, signature), true);
}

BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadSignature, DSAFixture) {
uint8_t signature[40];
uint8_t message[messageLen];
RandBytes(message, messageLen);
signer->Sign(message, messageLen, signature);
// introduce an error in the signature
uint8_t message[kMessageLen];
RandBytes(message, kMessageLen);
signer->Sign(message, kMessageLen, signature);

// introduce an error in the signature
signature[5] ^= RandInRange<uint8_t>(1, 128);
// it should fail verification
BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false);

BOOST_CHECK_EQUAL(verifier->Verify(message, kMessageLen, signature), false);
}

BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadMessage, DSAFixture) {
uint8_t signature[40];
uint8_t message[messageLen];
RandBytes(message, messageLen);
signer->Sign(message, messageLen, signature);
uint8_t message[kMessageLen];
RandBytes(message, kMessageLen);
signer->Sign(message, kMessageLen, signature);
// introduce an error in the message
message[5] ^= RandInRange<uint8_t>(1, 128);
// this should also fail verification
BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false);
BOOST_CHECK_EQUAL(verifier->Verify(message, kMessageLen, signature), false);
}

BOOST_FIXTURE_TEST_CASE(DSASHA1SignVerifyBadSignatureAndMessage, DSAFixture) {
uint8_t signature[40];
uint8_t message[messageLen];
RandBytes(message, messageLen);
signer->Sign(message, messageLen, signature);
uint8_t message[kMessageLen];
RandBytes(message, kMessageLen);

signer->Sign(message, kMessageLen, signature);

// introduce errors in both the message and signature
message[6] ^= RandInRange<uint8_t>(1, 128);
signature[2] ^= RandInRange<uint8_t>(1, 128);
// this should fail verification as well
BOOST_CHECK_EQUAL(verifier->Verify(message, messageLen, signature), false);
BOOST_CHECK_EQUAL(verifier->Verify(message, kMessageLen, signature), false);
}

BOOST_AUTO_TEST_SUITE_END()
82 changes: 39 additions & 43 deletions src/tests/unit_tests/crypto/ElGamal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,12 @@ 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;
static constexpr size_t cipherTextLen = 512;
static constexpr size_t zpCipherTextLen = cipherTextLen + 2;
static constexpr size_t kMessageLen = 222;
static constexpr size_t kCipherTextLen = 512;
static constexpr size_t kZpCipherTextLen = kCipherTextLen + 2;
ElgamalFixture() {
// TODO(psi): use static keys
GenerateElGamalKeyPair(privateKey, publicKey);
Expand All @@ -55,80 +54,77 @@ struct ElgamalFixture {
~ElgamalFixture() {
delete enc;
}


};


BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptSuccess, ElgamalFixture) {
uint8_t plaintext[messageLen];
uint8_t ciphertext[cipherTextLen];
uint8_t result[messageLen];
RandBytes(plaintext, messageLen);
enc->Encrypt(plaintext, messageLen, ciphertext, false);
uint8_t plaintext[kMessageLen];
uint8_t ciphertext[kCipherTextLen];
uint8_t result[kMessageLen];
RandBytes(plaintext, kMessageLen);
enc->Encrypt(plaintext, kMessageLen, ciphertext, false);
BOOST_CHECK(ElGamalDecrypt(privateKey, ciphertext, result, false));

BOOST_CHECK_EQUAL_COLLECTIONS(
plaintext, plaintext + messageLen,
result, result + messageLen);
plaintext, plaintext + kMessageLen,
result, result + kMessageLen);
}

BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptFail, ElgamalFixture) {
uint8_t plaintext[messageLen];
uint8_t ciphertext[cipherTextLen];
uint8_t result[messageLen];
RandBytes(plaintext, messageLen);
enc->Encrypt(plaintext, messageLen, ciphertext, false);
uint8_t plaintext[kMessageLen];
uint8_t ciphertext[kCipherTextLen];
uint8_t result[kMessageLen];
RandBytes(plaintext, kMessageLen);
enc->Encrypt(plaintext, kMessageLen, ciphertext, false);
// Introduce an error in the ciphertext
ciphertext[4] ^= RandInRange<uint8_t>(1, 128);

BOOST_CHECK(!ElGamalDecrypt(privateKey, ciphertext, result, false));
}

BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptZeroPaddBadPad, ElgamalFixture) {
uint8_t plaintext[messageLen];
uint8_t ciphertext[zpCipherTextLen];
uint8_t result[messageLen];
RandBytes(plaintext, messageLen);
enc->Encrypt(plaintext, messageLen, ciphertext, true);
uint8_t plaintext[kMessageLen];
uint8_t ciphertext[kZpCipherTextLen];
uint8_t result[kMessageLen];
RandBytes(plaintext, kMessageLen);
enc->Encrypt(plaintext, kMessageLen, ciphertext, true);
// Introduce an error in the ciphertext zeropadding
ciphertext[0] = RandInRange<uint8_t>(1, 128);
BOOST_CHECK(!ElGamalDecrypt(privateKey, ciphertext, result, true));
}


BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptZeroPadSuccess, ElgamalFixture) {
uint8_t plaintext[messageLen];
uint8_t ciphertext[zpCipherTextLen];
uint8_t result[messageLen];
RandBytes(plaintext, messageLen);
enc->Encrypt(plaintext, messageLen, ciphertext, true);
uint8_t plaintext[kMessageLen];
uint8_t ciphertext[kZpCipherTextLen];
uint8_t result[kMessageLen];
RandBytes(plaintext, kMessageLen);
enc->Encrypt(plaintext, kMessageLen, ciphertext, true);

bool res = ElGamalDecrypt(privateKey, ciphertext, result, true);

BOOST_CHECK(res);
if (res) {
BOOST_CHECK_EQUAL_COLLECTIONS(
plaintext, plaintext + messageLen,
result, result + messageLen);
plaintext, plaintext + kMessageLen,
result, result + kMessageLen);
}
}

BOOST_FIXTURE_TEST_CASE(ElgamalEncryptDecryptZeroPadSmallMessageSuccess,
ElgamalFixture) {
size_t smaller = 50;
uint8_t plaintext[messageLen-smaller];
uint8_t ciphertext[zpCipherTextLen];
uint8_t result[messageLen];
RandBytes(plaintext, messageLen-smaller);
enc->Encrypt(plaintext, messageLen, ciphertext, true);
constexpr size_t kSmaller = 50;
uint8_t plaintext[kMessageLen - kSmaller];
uint8_t ciphertext[kZpCipherTextLen];
uint8_t result[kMessageLen];
RandBytes(plaintext, kMessageLen - kSmaller);
enc->Encrypt(plaintext, kMessageLen, ciphertext, true);

BOOST_CHECK(ElGamalDecrypt(privateKey, ciphertext, result, true));

BOOST_CHECK_EQUAL_COLLECTIONS(
plaintext, plaintext + messageLen - smaller,
result, result + messageLen - smaller);

plaintext, plaintext + kMessageLen - kSmaller,
result, result + kMessageLen - kSpaller);
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 20859e6

Please sign in to comment.