From a9a15e7ebc23f38a0b9424e5fc940eb3e4fbedd7 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 27 May 2026 08:57:37 -0400 Subject: [PATCH] create EVP_MD_CTX for siphash only once --- libi2pd/IdentMetrics.cpp | 22 ++++++++++++++++------ libi2pd/IdentMetrics.h | 5 +++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/libi2pd/IdentMetrics.cpp b/libi2pd/IdentMetrics.cpp index 19fabda4..c90cd981 100644 --- a/libi2pd/IdentMetrics.cpp +++ b/libi2pd/IdentMetrics.cpp @@ -46,19 +46,29 @@ namespace data PeerOrdering::PeerOrdering () { RAND_bytes (m_PeerOrderingKey, 16); +#if OPENSSL_SIPHASH + EVP_PKEY * sipKey = EVP_PKEY_new_raw_private_key (EVP_PKEY_SIPHASH, nullptr, m_PeerOrderingKey, 16); + m_MDCtx = EVP_MD_CTX_create (); + EVP_DigestSignInit (m_MDCtx, nullptr, nullptr, nullptr, sipKey); + EVP_PKEY_free (sipKey); +#endif + } + + PeerOrdering::~PeerOrdering () + { +#if OPENSSL_SIPHASH + if (m_MDCtx) EVP_MD_CTX_destroy (m_MDCtx); +#endif } int PeerOrdering::CalculatePeerOrderingGroup (const IdentHash& routerIdent) { uint8_t hash[16]; #if OPENSSL_SIPHASH - EVP_PKEY * sipKey = EVP_PKEY_new_raw_private_key (EVP_PKEY_SIPHASH, nullptr, m_PeerOrderingKey, 16); - EVP_MD_CTX * ctx = EVP_MD_CTX_create (); - EVP_DigestSignInit (ctx, nullptr, nullptr, nullptr, sipKey); + EVP_DigestSignInit (m_MDCtx, nullptr, nullptr, nullptr, nullptr); + EVP_DigestSignUpdate (m_MDCtx, routerIdent, 32); size_t l = 16; - EVP_DigestSign (ctx, hash, &l, routerIdent, 32); - EVP_MD_CTX_destroy (ctx); - EVP_PKEY_free (sipKey); + EVP_DigestSignFinal (m_MDCtx, hash, &l); #else i2p::crypto::Siphash<16> (hash, routerIdent, 32, m_PeerOrderingKey); #endif diff --git a/libi2pd/IdentMetrics.h b/libi2pd/IdentMetrics.h index 464896e8..dfc1d0c4 100644 --- a/libi2pd/IdentMetrics.h +++ b/libi2pd/IdentMetrics.h @@ -44,6 +44,8 @@ namespace data public: PeerOrdering (); + ~PeerOrdering (); + int GetPeerOrderingGroup (const IdentHash& routerIdent); void CleanUp (uint64_t ts); @@ -55,6 +57,9 @@ namespace data Tag<16> m_PeerOrderingKey; std::unordered_map > m_OrderingGroups; // router ident hash -> (group, last request time) +#if OPENSSL_SIPHASH + EVP_MD_CTX * m_MDCtx = nullptr; +#endif }; } }