|
|
|
@ -17,7 +17,8 @@ namespace garlic
@@ -17,7 +17,8 @@ namespace garlic
|
|
|
|
|
GarlicRoutingSession::GarlicRoutingSession (GarlicDestination * owner, |
|
|
|
|
const i2p::data::RoutingDestination * destination, int numTags): |
|
|
|
|
m_Owner (owner), m_Destination (destination), m_IsAcknowledged (false), |
|
|
|
|
m_NumTags (numTags), m_NextTag (-1), m_SessionTags (0), m_TagsCreationTime (0) |
|
|
|
|
m_NumTags (numTags), m_NextTag (-1), m_SessionTags (0), m_TagsCreationTime (0), |
|
|
|
|
m_LeaseSetUpdated (numTags > 0) |
|
|
|
|
{ |
|
|
|
|
// create new session tags and session key
|
|
|
|
|
m_Rnd.GenerateBlock (m_SessionKey, 32); |
|
|
|
@ -33,7 +34,7 @@ namespace garlic
@@ -33,7 +34,7 @@ namespace garlic
|
|
|
|
|
|
|
|
|
|
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag): |
|
|
|
|
m_Owner (nullptr), m_Destination (nullptr), m_IsAcknowledged (true), m_NumTags (1), |
|
|
|
|
m_NextTag (0) |
|
|
|
|
m_NextTag (0), m_LeaseSetUpdated (false) |
|
|
|
|
{ |
|
|
|
|
memcpy (m_SessionKey, sessionKey, 32); |
|
|
|
|
m_Encryption.SetKey (m_SessionKey); |
|
|
|
@ -58,7 +59,7 @@ namespace garlic
@@ -58,7 +59,7 @@ namespace garlic
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg, bool attachLeaseSet) |
|
|
|
|
I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg) |
|
|
|
|
{ |
|
|
|
|
I2NPMessage * m = NewI2NPMessage (); |
|
|
|
|
size_t len = 0; |
|
|
|
@ -117,7 +118,7 @@ namespace garlic
@@ -117,7 +118,7 @@ namespace garlic
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// AES block
|
|
|
|
|
len += CreateAESBlock (buf, msg, attachLeaseSet); |
|
|
|
|
len += CreateAESBlock (buf, msg); |
|
|
|
|
m_NextTag++; |
|
|
|
|
*(uint32_t *)(m->GetPayload ()) = htobe32 (len); |
|
|
|
|
m->len += len + 4; |
|
|
|
@ -127,7 +128,7 @@ namespace garlic
@@ -127,7 +128,7 @@ namespace garlic
|
|
|
|
|
return m; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t GarlicRoutingSession::CreateAESBlock (uint8_t * buf, const I2NPMessage * msg, bool attachLeaseSet) |
|
|
|
|
size_t GarlicRoutingSession::CreateAESBlock (uint8_t * buf, const I2NPMessage * msg) |
|
|
|
|
{ |
|
|
|
|
size_t blockSize = 0; |
|
|
|
|
*(uint16_t *)buf = m_NextTag < 0 ? htobe16 (m_NumTags) : 0; // tag count
|
|
|
|
@ -146,7 +147,7 @@ namespace garlic
@@ -146,7 +147,7 @@ namespace garlic
|
|
|
|
|
blockSize += 32; |
|
|
|
|
buf[blockSize] = 0; // flag
|
|
|
|
|
blockSize++; |
|
|
|
|
size_t len = CreateGarlicPayload (buf + blockSize, msg, attachLeaseSet); |
|
|
|
|
size_t len = CreateGarlicPayload (buf + blockSize, msg); |
|
|
|
|
*payloadSize = htobe32 (len); |
|
|
|
|
CryptoPP::SHA256().CalculateDigest(payloadHash, buf + blockSize, len); |
|
|
|
|
blockSize += len; |
|
|
|
@ -157,7 +158,7 @@ namespace garlic
@@ -157,7 +158,7 @@ namespace garlic
|
|
|
|
|
return blockSize; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t GarlicRoutingSession::CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg, bool attachLeaseSet) |
|
|
|
|
size_t GarlicRoutingSession::CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg) |
|
|
|
|
{ |
|
|
|
|
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 5000; // 5 sec
|
|
|
|
|
uint32_t msgID = m_Rnd.GenerateWord32 (); |
|
|
|
@ -180,8 +181,9 @@ namespace garlic
@@ -180,8 +181,9 @@ namespace garlic
|
|
|
|
|
else |
|
|
|
|
LogPrint ("DeliveryStatus clove was not created"); |
|
|
|
|
} |
|
|
|
|
if (attachLeaseSet) |
|
|
|
|
if (m_LeaseSetUpdated) |
|
|
|
|
{ |
|
|
|
|
m_LeaseSetUpdated = false; |
|
|
|
|
// clove if our leaseSet must be attached
|
|
|
|
|
auto leaseSet = CreateDatabaseStoreMsg (m_Owner->GetLeaseSet ()); |
|
|
|
|
size += CreateGarlicClove (payload + size, leaseSet, false); |
|
|
|
@ -428,10 +430,10 @@ namespace garlic
@@ -428,10 +430,10 @@ namespace garlic
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
I2NPMessage * GarlicDestination::WrapMessage (const i2p::data::RoutingDestination& destination, |
|
|
|
|
I2NPMessage * msg, const i2p::data::LeaseSet * leaseSet) |
|
|
|
|
I2NPMessage * msg, bool attachLeaseSet) |
|
|
|
|
{ |
|
|
|
|
auto session = GetRoutingSession (destination, leaseSet ? 32 : 0); // don't use tag if no LeaseSet
|
|
|
|
|
return session->WrapSingleMessage (msg, leaseSet); |
|
|
|
|
auto session = GetRoutingSession (destination, attachLeaseSet ? 32 : 0); // don't use tag if no LeaseSet
|
|
|
|
|
return session->WrapSingleMessage (msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GarlicRoutingSession * GarlicDestination::GetRoutingSession ( |
|
|
|
@ -472,5 +474,12 @@ namespace garlic
@@ -472,5 +474,12 @@ namespace garlic
|
|
|
|
|
} |
|
|
|
|
DeleteI2NPMessage (msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void GarlicDestination::SetLeaseSetUpdated () |
|
|
|
|
{ |
|
|
|
|
std::unique_lock<std::mutex> l(m_CreatedSessionsMutex); |
|
|
|
|
for (auto it: m_Sessions) |
|
|
|
|
it.second->SetLeaseSetUpdated (); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|