|
|
|
@ -623,6 +623,41 @@ namespace garlic
@@ -623,6 +623,41 @@ namespace garlic
|
|
|
|
|
CleanupUnconfirmedLeaseSet (ts); |
|
|
|
|
return ts > m_LastActivityTimestamp + ECIESX25519_EXPIRATION_TIMEOUT; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<I2NPMessage> WrapECIESX25519AEADRatchetMessage (std::shared_ptr<const I2NPMessage> msg, const uint8_t * key, uint64_t tag) |
|
|
|
|
{ |
|
|
|
|
auto m = NewI2NPMessage (); |
|
|
|
|
m->Align (12); // in order to get buf aligned to 16 (12 + 4)
|
|
|
|
|
uint8_t * buf = m->GetPayload () + 4; // 4 bytes for length
|
|
|
|
|
uint8_t nonce[12]; |
|
|
|
|
memset (nonce, 0, 12); // n = 0
|
|
|
|
|
size_t offset = 0; |
|
|
|
|
memcpy (buf + offset, &tag, 8); offset += 8; |
|
|
|
|
auto payload = buf + offset; |
|
|
|
|
uint16_t cloveSize = msg->GetPayloadLength () + 9 + 1; |
|
|
|
|
size_t len = cloveSize + 3; |
|
|
|
|
payload[0] = eECIESx25519BlkGalicClove; // clove type
|
|
|
|
|
htobe16buf (payload + 1, cloveSize); // size
|
|
|
|
|
payload += 3; |
|
|
|
|
*payload = 0; payload++; // flag and delivery instructions
|
|
|
|
|
*payload = msg->GetTypeID (); // I2NP msg type
|
|
|
|
|
htobe32buf (payload + 1, msg->GetMsgID ()); // msgID
|
|
|
|
|
htobe32buf (payload + 5, msg->GetExpiration ()/1000); // expiration in seconds
|
|
|
|
|
memcpy (payload + 9, msg->GetPayload (), msg->GetPayloadLength ()); |
|
|
|
|
|
|
|
|
|
if (!i2p::crypto::AEADChaCha20Poly1305 (buf + offset, len, buf, 8, key, nonce, buf + offset, len + 16, true)) // encrypt
|
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogWarning, "Garlic: Payload section AEAD encryption failed"); |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
offset += len + 16; |
|
|
|
|
|
|
|
|
|
htobe32buf (m->GetPayload (), offset); |
|
|
|
|
m->len += offset + 4; |
|
|
|
|
m->FillI2NPMessageHeader (eI2NPGarlic); |
|
|
|
|
return m; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|