From 75fc8202ab4f1b0f73cb07dbb65884ea71af9c56 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Fri, 15 Jul 2016 12:49:45 -0400 Subject: [PATCH] fix off by ones --- I2NPProtocol.cpp | 4 ++-- I2NPProtocol.h | 2 +- NetDb.cpp | 22 ++++++++++++++-------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 1b2d0317..1a64bb9c 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -165,7 +165,7 @@ namespace i2p buf += 32; memcpy (buf, replyTunnel->GetNextIdentHash (), 32); // reply tunnel GW buf += 32; - *buf = DATABASE_LOOKUP_DELIVERY_FLAG | DATABASE_LOOKUP_ENCYPTION_FLAG | DATABASE_LOOKUP_TYPE_LEASESET_LOOKUP; // flags + *buf = DATABASE_LOOKUP_DELIVERY_FLAG | DATABASE_LOOKUP_ENCRYPTION_FLAG | DATABASE_LOOKUP_TYPE_LEASESET_LOOKUP; // flags htobe32buf (buf + 1, replyTunnel->GetNextTunnelID ()); // reply tunnel ID buf += 5; @@ -182,7 +182,7 @@ namespace i2p } // encryption memcpy (buf, replyKey, 32); - buf[32] = 1; // 1 tag + buf[32] = (uint8_t) 1; // 1 tag memcpy (buf + 33, replyTag, 32); buf += 65; diff --git a/I2NPProtocol.h b/I2NPProtocol.h index 1ade55ed..76871114 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -90,7 +90,7 @@ namespace i2p // DatabaseLookup flags const uint8_t DATABASE_LOOKUP_DELIVERY_FLAG = 0x01; - const uint8_t DATABASE_LOOKUP_ENCYPTION_FLAG = 0x02; + const uint8_t DATABASE_LOOKUP_ENCRYPTION_FLAG = 0x02; const uint8_t DATABASE_LOOKUP_TYPE_FLAGS_MASK = 0x0C; const uint8_t DATABASE_LOOKUP_TYPE_NORMAL_LOOKUP = 0; const uint8_t DATABASE_LOOKUP_TYPE_LEASESET_LOOKUP = 0x04; // 0100 diff --git a/NetDb.cpp b/NetDb.cpp index beafeaee..c5b02615 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -632,17 +632,18 @@ namespace data char key[48]; int l = i2p::data::ByteStreamToBase64 (buf, 32, key, 48); key[l] = 0; - uint8_t flag = buf[64]; IdentHash replyIdent(buf + 32); - + uint8_t flag = buf[64]; + + LogPrint (eLogDebug, "NetDb: DatabaseLookup for ", key, " recieved flags=", (int)flag); uint8_t lookupType = flag & DATABASE_LOOKUP_TYPE_FLAGS_MASK; const uint8_t * excluded = buf + 65; uint32_t replyTunnelID = 0; if (flag & DATABASE_LOOKUP_DELIVERY_FLAG) //reply to tunnel { - replyTunnelID = bufbe32toh (buf + 65); + replyTunnelID = bufbe32toh (excluded); excluded += 4; } uint16_t numExcluded = bufbe16toh (excluded); @@ -650,7 +651,7 @@ namespace data if (numExcluded > 512) { LogPrint (eLogWarning, "NetDb: number of excluded peers", numExcluded, " exceeds 512"); - numExcluded = 0; // TODO: + return; } std::shared_ptr replyMsg; @@ -733,6 +734,8 @@ namespace data if (!numExcluded) // save if no excluded m_LookupResponses[ident] = std::make_pair(closestFloodfills, i2p::util::GetSecondsSinceEpoch ()); } + else + excluded += numExcluded * 32; replyMsg = CreateDatabaseSearchReply (ident, closestFloodfills); } } @@ -742,16 +745,19 @@ namespace data if (replyTunnelID) { // encryption might be used though tunnel only - if (flag & DATABASE_LOOKUP_ENCYPTION_FLAG) // encrypted reply requested + if (flag & DATABASE_LOOKUP_ENCRYPTION_FLAG) // encrypted reply requested { const uint8_t * sessionKey = excluded; - uint8_t numTags = sessionKey[32]; - if (numTags > 0) + const uint8_t numTags = excluded[32]; + if (numTags) { - const uint8_t * sessionTag = sessionKey + 33; // take first tag + const i2p::garlic::SessionTag sessionTag(excluded + 33); // take first tag i2p::garlic::GarlicRoutingSession garlic (sessionKey, sessionTag); replyMsg = garlic.WrapSingleMessage (replyMsg); + if(replyMsg == nullptr) LogPrint(eLogError, "NetDb: failed to wrap message"); } + else + LogPrint(eLogWarning, "NetDb: encrypted reply requested but no tags provided"); } auto exploratoryPool = i2p::tunnel::tunnels.GetExploratoryPool (); auto outbound = exploratoryPool ? exploratoryPool->GetNextOutboundTunnel () : nullptr;