diff --git a/libi2pd/I2NPProtocol.cpp b/libi2pd/I2NPProtocol.cpp index 2fc1df3b..9f6c609b 100644 --- a/libi2pd/I2NPProtocol.cpp +++ b/libi2pd/I2NPProtocol.cpp @@ -279,7 +279,7 @@ namespace i2p if (!leaseSet) return nullptr; auto m = NewI2NPShortMessage (); uint8_t * payload = m->GetPayload (); - memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetIdentHash (), 32); + memcpy (payload + DATABASE_STORE_KEY_OFFSET, leaseSet->GetStoreHash (), 32); payload[DATABASE_STORE_TYPE_OFFSET] = leaseSet->GetStoreType (); // LeaseSet or LeaseSet2 htobe32buf (payload + DATABASE_STORE_REPLY_TOKEN_OFFSET, replyToken); size_t size = DATABASE_STORE_HEADER_SIZE; diff --git a/libi2pd/LeaseSet.cpp b/libi2pd/LeaseSet.cpp index 31183f48..a8eccbc2 100644 --- a/libi2pd/LeaseSet.cpp +++ b/libi2pd/LeaseSet.cpp @@ -904,6 +904,8 @@ namespace data i2p::crypto::ChaCha20 (outerPlainText, lenOuterPlaintext, keys1, keys1 + 32, outerPlainText); // encrypt Layer 1 // signature blindedSigner->Sign (m_Buffer, offset, m_Buffer + offset); + // store hash + m_StoreHash.reset (new IdentHash (blindedKey.GetStoreHash ())); } } } diff --git a/libi2pd/LeaseSet.h b/libi2pd/LeaseSet.h index 3f864452..b526728a 100644 --- a/libi2pd/LeaseSet.h +++ b/libi2pd/LeaseSet.h @@ -236,6 +236,7 @@ namespace data { return GetBufferLen () == other.GetBufferLen () && !memcmp (GetBuffer (), other.GetBuffer (), GetBufferLen ()); }; virtual uint8_t GetStoreType () const { return NETDB_STORE_TYPE_LEASESET; }; + virtual const IdentHash& GetStoreHash () const { return GetIdentHash (); }; // differ from ident hash for encrypted LeaseSet2 private: @@ -261,11 +262,13 @@ namespace data size_t GetBufferLen () const { return m_BufferLen; }; uint8_t GetStoreType () const { return m_Buffer[0]; }; + const IdentHash& GetStoreHash () const { return m_StoreHash ? *m_StoreHash : LocalLeaseSet::GetStoreHash (); }; private: uint8_t * m_Buffer; // 1 byte store type + actual buffer size_t m_BufferLen; + std::unique_ptr m_StoreHash; // for encrypted }; } }