|
|
|
@ -272,6 +272,16 @@ namespace garlic
@@ -272,6 +272,16 @@ namespace garlic
|
|
|
|
|
size += 4; |
|
|
|
|
// create msg
|
|
|
|
|
I2NPMessage * msg = CreateDeliveryStatusMsg (msgID); |
|
|
|
|
if (m_Owner) |
|
|
|
|
{ |
|
|
|
|
//encrypt
|
|
|
|
|
uint8_t key[32], tag[32]; |
|
|
|
|
m_Rnd.GenerateBlock (key, 32); // random session key
|
|
|
|
|
m_Rnd.GenerateBlock (tag, 32); // random session tag
|
|
|
|
|
m_Owner->AddSessionKey (key, tag); |
|
|
|
|
GarlicRoutingSession garlic (key, tag); |
|
|
|
|
msg = garlic.WrapSingleMessage (msg); |
|
|
|
|
} |
|
|
|
|
memcpy (buf + size, msg->GetBuffer (), msg->GetLength ()); |
|
|
|
|
size += msg->GetLength (); |
|
|
|
|
DeleteI2NPMessage (msg); |
|
|
|
@ -304,9 +314,10 @@ namespace garlic
@@ -304,9 +314,10 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
if (key) |
|
|
|
|
{ |
|
|
|
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch (); |
|
|
|
|
auto decryption = std::make_shared<i2p::crypto::CBCDecryption>(); |
|
|
|
|
decryption->SetKey (key); |
|
|
|
|
m_Tags[SessionTag(tag)] = decryption; |
|
|
|
|
m_Tags[SessionTag(tag, ts)] = decryption; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -314,7 +325,7 @@ namespace garlic
@@ -314,7 +325,7 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
uint8_t * buf = msg->GetPayload (); |
|
|
|
|
uint32_t length = be32toh (*(uint32_t *)buf); |
|
|
|
|
buf += 4; // lentgh
|
|
|
|
|
buf += 4; // length
|
|
|
|
|
auto it = m_Tags.find (SessionTag(buf)); |
|
|
|
|
if (it != m_Tags.end ()) |
|
|
|
|
{ |
|
|
|
|