From 6cc6849ccc408ee4c0366e042c14d41066d73fc5 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 12 Apr 2019 14:05:07 -0400 Subject: [PATCH] use published timestamp for blinding --- libi2pd/LeaseSet.cpp | 21 +++++++++++++-------- libi2pd/LeaseSet.h | 2 +- libi2pd/Timestamp.cpp | 8 +++++++- libi2pd/Timestamp.h | 1 + 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/libi2pd/LeaseSet.cpp b/libi2pd/LeaseSet.cpp index 77751cbd..38d24cdc 100644 --- a/libi2pd/LeaseSet.cpp +++ b/libi2pd/LeaseSet.cpp @@ -366,16 +366,21 @@ namespace data SHA256_Final (hash, &ctx); } - i2p::data::IdentHash BlindedPublicKey::GetStoreHash () const + i2p::data::IdentHash BlindedPublicKey::GetStoreHash (const char * date) const { i2p::data::IdentHash hash; if (m_BlindedSigType == i2p::data::SIGNING_KEY_TYPE_REDDSA_SHA512_ED25519 || m_BlindedSigType == SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519) { - char date[9]; - i2p::util::GetCurrentDate (date); uint8_t blinded[32]; - GetBlindedKey (date, blinded); + if (date) + GetBlindedKey (date, blinded); + else + { + char currentDate[9]; + i2p::util::GetCurrentDate (currentDate); + GetBlindedKey (currentDate, blinded); + } auto stA1 = htobe16 (m_BlindedSigType); SHA256_CTX ctx; SHA256_Init (&ctx); @@ -605,7 +610,7 @@ namespace data { // verify blinding char date[9]; - i2p::util::GetCurrentDate (date); + i2p::util::GetDateString (m_PublishedTimestamp, date); uint8_t blinded[32]; key->GetBlindedKey (date, blinded); if (memcmp (blindedPublicKey, blinded, 32)) @@ -862,15 +867,15 @@ namespace data m_Buffer = new uint8_t[m_BufferLen + 1]; m_Buffer[0] = NETDB_STORE_TYPE_ENCRYPTED_LEASESET2; BlindedPublicKey blindedKey (ls->GetIdentity ()); + auto timestamp = i2p::util::GetSecondsSinceEpoch (); char date[9]; - i2p::util::GetCurrentDate (date); + i2p::util::GetDateString (timestamp, date); uint8_t blindedPriv[32], blindedPub[32]; blindedKey.BlindPrivateKey (keys.GetSigningPrivateKey (), date, blindedPriv, blindedPub); std::unique_ptr blindedSigner (i2p::data::PrivateKeys::CreateSigner (blindedKeyType, blindedPriv)); auto offset = 1; htobe16buf (m_Buffer + offset, blindedKeyType); offset += 2; // Blinded Public Key Sig Type memcpy (m_Buffer + offset, blindedPub, 32); offset += 32; // Blinded Public Key - auto timestamp = i2p::util::GetSecondsSinceEpoch (); htobe32buf (m_Buffer + offset, timestamp); offset += 4; // published timestamp (seconds) auto nextMidnight = (timestamp/86400LL + 1)*86400LL; // 86400 = 24*3600 seconds auto expirationTime = ls->GetExpirationTime ()/1000LL; @@ -906,7 +911,7 @@ namespace data // signature blindedSigner->Sign (m_Buffer, offset, m_Buffer + offset); // store hash - m_StoreHash = blindedKey.GetStoreHash (); + m_StoreHash = blindedKey.GetStoreHash (date); } LocalEncryptedLeaseSet2::LocalEncryptedLeaseSet2 (std::shared_ptr identity, const uint8_t * buf, size_t len): diff --git a/libi2pd/LeaseSet.h b/libi2pd/LeaseSet.h index ce330ba7..b68679d5 100644 --- a/libi2pd/LeaseSet.h +++ b/libi2pd/LeaseSet.h @@ -144,7 +144,7 @@ namespace data void GetSubcredential (const uint8_t * blinded, size_t len, uint8_t * subcredential) const; // 32 bytes void GetBlindedKey (const char * date, uint8_t * blindedKey) const; // blinded key 32 bytes, date is 8 chars "YYYYMMDD" void BlindPrivateKey (const uint8_t * priv, const char * date, uint8_t * blindedPriv, uint8_t * blindedPub) const; // blinded key 32 bytes, date is 8 chars "YYYYMMDD" - i2p::data::IdentHash GetStoreHash () const; + i2p::data::IdentHash GetStoreHash (const char * date = nullptr) const; // date is 8 chars "YYYYMMDD", use current if null private: diff --git a/libi2pd/Timestamp.cpp b/libi2pd/Timestamp.cpp index 51b6dd4e..acc9cb10 100644 --- a/libi2pd/Timestamp.cpp +++ b/libi2pd/Timestamp.cpp @@ -182,7 +182,13 @@ namespace util void GetCurrentDate (char * date) { - time_t t = time (nullptr); + GetDateString (GetSecondsSinceEpoch (), date); + } + + void GetDateString (uint64_t timestamp, char * date) + { + using clock = std::chrono::system_clock; + auto t = clock::to_time_t (clock::time_point (std::chrono::seconds(timestamp))); struct tm tm; #ifdef _WIN32 gmtime_s(&tm, &t); diff --git a/libi2pd/Timestamp.h b/libi2pd/Timestamp.h index 4bbcf2de..31dc86aa 100644 --- a/libi2pd/Timestamp.h +++ b/libi2pd/Timestamp.h @@ -16,6 +16,7 @@ namespace util uint64_t GetSecondsSinceEpoch (); void GetCurrentDate (char * date); // returns date as YYYYMMDD string, 9 bytes + void GetDateString (uint64_t timestamp, char * date); // timestap is seconds since epoch, returns date as YYYYMMDD string, 9 bytes class NTPTimeSync {