From 34cfd205f635c57c72e8d3e5223f210dd28b3b85 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 1 Nov 2018 10:43:31 -0400 Subject: [PATCH] create new static keys by X25519Keys --- libi2pd/Crypto.cpp | 10 ++++++++++ libi2pd/Crypto.h | 1 + libi2pd/RouterContext.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/libi2pd/Crypto.cpp b/libi2pd/Crypto.cpp index 4393b2cc..ffd3c4ef 100644 --- a/libi2pd/Crypto.cpp +++ b/libi2pd/Crypto.cpp @@ -341,6 +341,16 @@ namespace crypto #endif } + void X25519Keys::GetPrivateKey (uint8_t * priv) const + { +#if OPENSSL_X25519 + size_t len = 32; + EVP_PKEY_get_raw_private_key (m_Pkey, priv, &len); +#else + memcpy (priv, m_PrivateKey, 32); +#endif + } + // ElGamal void ElGamalEncrypt (const uint8_t * key, const uint8_t * data, uint8_t * encrypted, BN_CTX * ctx, bool zeroPadding) { diff --git a/libi2pd/Crypto.h b/libi2pd/Crypto.h index 5fa58f6d..5daf82b0 100644 --- a/libi2pd/Crypto.h +++ b/libi2pd/Crypto.h @@ -72,6 +72,7 @@ namespace crypto void GenerateKeys (); const uint8_t * GetPublicKey () const { return m_PublicKey; }; + void GetPrivateKey (uint8_t * priv) const; void Agree (const uint8_t * pub, uint8_t * shared); private: diff --git a/libi2pd/RouterContext.cpp b/libi2pd/RouterContext.cpp index 9c1acfcc..6b5053a8 100644 --- a/libi2pd/RouterContext.cpp +++ b/libi2pd/RouterContext.cpp @@ -116,12 +116,12 @@ namespace i2p void RouterContext::NewNTCP2Keys () { + m_StaticKeys.reset (new i2p::crypto::X25519Keys ()); + m_StaticKeys->GenerateKeys (); m_NTCP2Keys.reset (new NTCP2PrivateKeys ()); - RAND_bytes (m_NTCP2Keys->staticPrivateKey, 32); + m_StaticKeys->GetPrivateKey (m_NTCP2Keys->staticPrivateKey); + memcpy (m_NTCP2Keys->staticPublicKey, m_StaticKeys->GetPublicKey (), 32); RAND_bytes (m_NTCP2Keys->iv, 16); - BN_CTX * ctx = BN_CTX_new (); - i2p::crypto::GetEd25519 ()->ScalarMulB (m_NTCP2Keys->staticPrivateKey, m_NTCP2Keys->staticPublicKey, ctx); - BN_CTX_free (ctx); // save std::ofstream fk (i2p::fs::DataDirPath (NTCP2_KEYS), std::ofstream::binary | std::ofstream::out); fk.write ((char *)m_NTCP2Keys.get (), sizeof (NTCP2PrivateKeys));