diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 5389d4c5..51e566e7 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -99,9 +99,8 @@ namespace i2p return m; } - I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, - uint32_t replyTunnelID, bool exploratory, std::set * excludedPeers, - bool encryption, i2p::tunnel::TunnelPool * pool) + I2NPMessage * CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, + uint32_t replyTunnelID, bool exploratory, std::set * excludedPeers) { I2NPMessage * m = NewI2NPMessage (); uint8_t * buf = m->GetPayload (); @@ -109,60 +108,37 @@ namespace i2p buf += 32; memcpy (buf, from, 32); // from buf += 32; + uint8_t flag = exploratory ? 0x0C : 0x08; // 1000 - RI, 1100 -exporatory if (replyTunnelID) { - *buf = encryption ? 0x03: 0x01; // set delivery flag + *buf = flag | 0x01; // set delivery flag htobe32buf (buf+1, replyTunnelID); buf += 5; } else { - encryption = false; // encryption can we set for tunnels only - *buf = 0; // flag + *buf = flag; // flag buf++; } - - if (exploratory) + + if (excludedPeers) { - htobe16buf (buf,1); // one exlude record + int cnt = excludedPeers->size (); + htobe16buf (buf, cnt); buf += 2; - // reply with non-floodfill routers only - memset (buf, 0, 32); - buf += 32; - } - else - { - if (excludedPeers) + for (auto& it: *excludedPeers) { - int cnt = excludedPeers->size (); - htobe16buf (buf, cnt); - buf += 2; - for (auto& it: *excludedPeers) - { - memcpy (buf, it, 32); - buf += 32; - } - } - else - { - // nothing to exclude - htobuf16 (buf, 0); - buf += 2; + memcpy (buf, it, 32); + buf += 32; } - } - if (encryption) - { - // session key and tag for reply - auto& rnd = i2p::context.GetRandomNumberGenerator (); - rnd.GenerateBlock (buf, 32); // key - buf[32] = 1; // 1 tag - rnd.GenerateBlock (buf + 33, 32); // tag - if (pool && pool->GetLocalDestination ()) - pool->GetLocalDestination ()->SubmitSessionKey (buf, buf + 33); // introduce new key-tag to garlic engine - else - LogPrint ("Destination for encrypteed reply not specified"); - buf += 65; - } + } + else + { + // nothing to exclude + htobuf16 (buf, 0); + buf += 2; + } + m->len += (buf - m->GetPayload ()); FillI2NPMessageHeader (m, eI2NPDatabaseLookup); return m; diff --git a/I2NPProtocol.h b/I2NPProtocol.h index 5b8d8bb7..8f8dddd3 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -189,10 +189,8 @@ namespace tunnel I2NPMessage * CreateI2NPMessage (const uint8_t * buf, int len, i2p::tunnel::InboundTunnel * from = nullptr); I2NPMessage * CreateDeliveryStatusMsg (uint32_t msgID); - I2NPMessage * CreateDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, - uint32_t replyTunnelID, bool exploratory = false, - std::set * excludedPeers = nullptr, bool encryption = false, - i2p::tunnel::TunnelPool * pool = nullptr); + I2NPMessage * CreateRouterInfoDatabaseLookupMsg (const uint8_t * key, const uint8_t * from, + uint32_t replyTunnelID, bool exploratory = false, std::set * excludedPeers = nullptr); I2NPMessage * CreateLeaseSetDatabaseLookupMsg (const i2p::data::IdentHash& dest, const std::set& excludedFloodfills, const i2p::tunnel::InboundTunnel * replyTunnel, const uint8_t * replyKey, const uint8_t * replyTag); diff --git a/NetDb.cpp b/NetDb.cpp index ee7e2fa2..c959edb8 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -25,7 +25,7 @@ namespace data I2NPMessage * RequestedDestination::CreateRequestMessage (std::shared_ptr router, const i2p::tunnel::InboundTunnel * replyTunnel) { - I2NPMessage * msg = i2p::CreateDatabaseLookupMsg (m_Destination, + I2NPMessage * msg = i2p::CreateRouterInfoDatabaseLookupMsg (m_Destination, replyTunnel->GetNextIdentHash (), replyTunnel->GetNextTunnelID (), m_IsExploratory, &m_ExcludedPeers); m_ExcludedPeers.insert (router->GetIdentHash ()); @@ -36,7 +36,7 @@ namespace data I2NPMessage * RequestedDestination::CreateRequestMessage (const IdentHash& floodfill) { - I2NPMessage * msg = i2p::CreateDatabaseLookupMsg (m_Destination, + I2NPMessage * msg = i2p::CreateRouterInfoDatabaseLookupMsg (m_Destination, i2p::context.GetRouterInfo ().GetIdentHash () , 0, false, &m_ExcludedPeers); m_ExcludedPeers.insert (floodfill); m_LastRouter = nullptr;