diff --git a/Crypto.cpp b/Crypto.cpp index a4a794ac..cc138923 100644 --- a/Crypto.cpp +++ b/Crypto.cpp @@ -272,10 +272,9 @@ namespace crypto } // ElGamal - - ElGamalEncryption::ElGamalEncryption (const uint8_t * key) + void ElGamalEncrypt (const uint8_t * key, const uint8_t * data, uint8_t * encrypted, bool zeroPadding) { - ctx = BN_CTX_new (); + BN_CTX * ctx = BN_CTX_new (); // select random k BIGNUM * k = BN_new (); #if defined(__x86_64__) @@ -284,6 +283,7 @@ namespace crypto BN_rand (k, ELGAMAL_SHORT_EXPONENT_NUM_BITS, -1, 1); // short exponent of 226 bits #endif // calculate a + BIGNUM * a; if (g_ElggTable) a = ElggPow (k, g_ElggTable, ctx); else @@ -295,21 +295,10 @@ namespace crypto BIGNUM * y = BN_new (); BN_bin2bn (key, 256, y); // calculate b1 - b1 = BN_new (); + BIGNUM * b1 = BN_new (); BN_mod_exp (b1, y, k, elgp, ctx); BN_free (y); BN_free (k); - } - - ElGamalEncryption::~ElGamalEncryption () - { - BN_CTX_free (ctx); - BN_free (a); - BN_free (b1); - } - - void ElGamalEncryption::Encrypt (const uint8_t * data, uint8_t * encrypted, bool zeroPadding) const - { // create m uint8_t m[255]; m[0] = 0xFF; @@ -319,6 +308,7 @@ namespace crypto BIGNUM * b = BN_new (); BN_bin2bn (m, 255, b); BN_mod_mul (b, b1, b, elgp, ctx); + BN_free (b1); // copy a and b if (zeroPadding) { @@ -333,8 +323,10 @@ namespace crypto bn2buf (b, encrypted + 256, 256); } BN_free (b); + BN_free (a); + BN_CTX_free (ctx); } - + bool ElGamalDecrypt (const uint8_t * key, const uint8_t * encrypted, uint8_t * data, bool zeroPadding) { diff --git a/Crypto.h b/Crypto.h index 9e35f073..00255a37 100644 --- a/Crypto.h +++ b/Crypto.h @@ -47,21 +47,7 @@ namespace crypto }; // ElGamal - class ElGamalEncryption - { - public: - - ElGamalEncryption (const uint8_t * key); - ~ElGamalEncryption (); - - void Encrypt (const uint8_t * data, uint8_t * encrypted, bool zeroPadding = false) const; - - private: - - BN_CTX * ctx; - BIGNUM * a, * b1; - }; - + void ElGamalEncrypt (const uint8_t * key, const uint8_t * data, uint8_t * encrypted, bool zeroPadding = false); bool ElGamalDecrypt (const uint8_t * key, const uint8_t * encrypted, uint8_t * data, bool zeroPadding = false); void GenerateElGamalKeyPair (uint8_t * priv, uint8_t * pub); diff --git a/Garlic.cpp b/Garlic.cpp index 81941cfc..51fa6c3b 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -187,8 +187,7 @@ namespace garlic RAND_bytes (elGamal.preIV, 32); // Pre-IV uint8_t iv[32]; // IV is first 16 bytes SHA256(elGamal.preIV, 32, iv); - i2p::crypto::ElGamalEncryption elGamalEncryption (m_Destination->GetEncryptionPublicKey ()); - elGamalEncryption.Encrypt ((uint8_t *)&elGamal, buf, true); + i2p::crypto::ElGamalEncrypt (m_Destination->GetEncryptionPublicKey (), (uint8_t *)&elGamal, buf, true); m_Encryption.SetIV (iv); buf += 514; len += 514; diff --git a/TunnelConfig.h b/TunnelConfig.h index cb31243f..c131059c 100644 --- a/TunnelConfig.h +++ b/TunnelConfig.h @@ -101,8 +101,7 @@ namespace tunnel htobe32buf (clearText + BUILD_REQUEST_RECORD_REQUEST_TIME_OFFSET, i2p::util::GetHoursSinceEpoch ()); htobe32buf (clearText + BUILD_REQUEST_RECORD_SEND_MSG_ID_OFFSET, replyMsgID); RAND_bytes (clearText + BUILD_REQUEST_RECORD_PADDING_OFFSET, BUILD_REQUEST_RECORD_CLEAR_TEXT_SIZE - BUILD_REQUEST_RECORD_PADDING_OFFSET); - i2p::crypto::ElGamalEncryption elGamalEncryption (ident->GetEncryptionPublicKey ()); - elGamalEncryption.Encrypt (clearText, record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET); + i2p::crypto::ElGamalEncrypt (ident->GetEncryptionPublicKey (), clearText, record + BUILD_REQUEST_RECORD_ENCRYPTED_OFFSET); memcpy (record + BUILD_REQUEST_RECORD_TO_PEER_OFFSET, (const uint8_t *)ident->GetIdentHash (), 16); } };