diff --git a/Destination.cpp b/Destination.cpp index e299a5c6..154cfee0 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -1,13 +1,13 @@ #include #include #include -#include #include "Log.h" #include "util.h" +#include "ElGamal.h" #include "Timestamp.h" #include "NetDb.h" -#include "Destination.h" #include "ClientContext.h" +#include "Destination.h" namespace i2p { @@ -19,8 +19,7 @@ namespace client m_Keys (keys), m_LeaseSet (nullptr), m_IsPublic (isPublic), m_PublishReplyToken (0), m_DatagramDestination (nullptr), m_PublishConfirmationTimer (m_Service) { - CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg); - dh.GenerateKeyPair(i2p::context.GetRandomNumberGenerator (), m_EncryptionPrivateKey, m_EncryptionPublicKey); + i2p::crypto::GenerateElGamalKeyPair(i2p::context.GetRandomNumberGenerator (), m_EncryptionPrivateKey, m_EncryptionPublicKey); int inboundTunnelLen = DEFAULT_INBOUND_TUNNEL_LENGTH; int outboundTunnelLen = DEFAULT_OUTBOUND_TUNNEL_LENGTH; if (params) diff --git a/ElGamal.h b/ElGamal.h index dd9228d7..e69c5993 100644 --- a/ElGamal.h +++ b/ElGamal.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "CryptoConst.h" #include "Log.h" @@ -70,6 +71,17 @@ namespace crypto memcpy (data, m + 33, 222); return true; } + + inline void GenerateElGamalKeyPair (CryptoPP::RandomNumberGenerator& rnd, uint8_t * priv, uint8_t * pub) + { +#if defined(__x86_64__) || defined(__i386__) || defined(_MSC_VER) + rnd.GenerateBlock (priv, 256); + a_exp_b_mod_c (elgg, CryptoPP::Integer (priv, 256), elgp).Encode (pub, 256); +#else + CryptoPP::DH dh (elgp, elgg); + dh.GenerateKeyPair(rnd, priv, pub); +#endif + } } } diff --git a/Identity.cpp b/Identity.cpp index 52920f6b..410ddeb7 100644 --- a/Identity.cpp +++ b/Identity.cpp @@ -5,6 +5,7 @@ #include #include "base64.h" #include "CryptoConst.h" +#include "ElGamal.h" #include "RouterContext.h" #include "Identity.h" #include "I2PEndian.h" @@ -509,8 +510,7 @@ namespace data Keys keys; auto& rnd = i2p::context.GetRandomNumberGenerator (); // encryption - CryptoPP::DH dh (i2p::crypto::elgp, i2p::crypto::elgg); - dh.GenerateKeyPair(rnd, keys.privateKey, keys.publicKey); + i2p::crypto::GenerateElGamalKeyPair(rnd, keys.privateKey, keys.publicKey); // signing i2p::crypto::CreateDSARandomKeys (rnd, keys.signingPrivateKey, keys.signingKey); return keys;