|
|
|
@ -61,7 +61,7 @@ namespace garlic
@@ -61,7 +61,7 @@ namespace garlic
|
|
|
|
|
if (msgID == m_LeaseSetUpdateMsgID) |
|
|
|
|
{ |
|
|
|
|
m_LeaseSetUpdateStatus = eLeaseSetUpToDate; |
|
|
|
|
LogPrint (eLogInfo, "LeaseSet update confirmed"); |
|
|
|
|
LogPrint (eLogInfo, "Garlic: LeaseSet update confirmed"); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
CleanupExpiredTags (); |
|
|
|
@ -139,10 +139,10 @@ namespace garlic
@@ -139,10 +139,10 @@ namespace garlic
|
|
|
|
|
// create message
|
|
|
|
|
if (!tagFound) // new session
|
|
|
|
|
{ |
|
|
|
|
LogPrint ("No garlic tags available. Use ElGamal"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: No tags available. Use ElGamal"); |
|
|
|
|
if (!m_Destination) |
|
|
|
|
{ |
|
|
|
|
LogPrint ("Can't use ElGamal for unknown destination"); |
|
|
|
|
LogPrint (eLogError, "Garlic: Can't use ElGamal for unknown destination"); |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
// create ElGamal block
|
|
|
|
@ -237,7 +237,7 @@ namespace garlic
@@ -237,7 +237,7 @@ namespace garlic
|
|
|
|
|
m_Owner->DeliveryStatusSent (shared_from_this (), msgID); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint ("DeliveryStatus clove was not created"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: DeliveryStatus clove was not created"); |
|
|
|
|
} |
|
|
|
|
// attach LeaseSet
|
|
|
|
|
if (m_LeaseSetUpdateStatus == eLeaseSetUpdated) |
|
|
|
@ -337,10 +337,10 @@ namespace garlic
@@ -337,10 +337,10 @@ namespace garlic
|
|
|
|
|
size += 3; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint (eLogError, "No inbound tunnels in the pool for DeliveryStatus"); |
|
|
|
|
LogPrint (eLogError, "Garlic: No inbound tunnels in the pool for DeliveryStatus"); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint ("Missing local LeaseSet"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: Missing local LeaseSet"); |
|
|
|
|
|
|
|
|
|
return size; |
|
|
|
|
} |
|
|
|
@ -372,7 +372,7 @@ namespace garlic
@@ -372,7 +372,7 @@ namespace garlic
|
|
|
|
|
uint32_t length = bufbe32toh (buf); |
|
|
|
|
if (length > msg->GetLength ()) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "Garlic message length ", length, " exceeds I2NP message length ", msg->GetLength ()); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: message length ", length, " exceeds I2NP message length ", msg->GetLength ()); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
buf += 4; // length
|
|
|
|
@ -389,7 +389,7 @@ namespace garlic
@@ -389,7 +389,7 @@ namespace garlic
|
|
|
|
|
HandleAESBlock (buf + 32, length - 32, it->second, msg->from); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint (eLogError, "Garlic message length ", length, " is less than 32 bytes"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: message length ", length, " is less than 32 bytes"); |
|
|
|
|
m_Tags.erase (it); // tag might be used only once
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
@ -407,7 +407,7 @@ namespace garlic
@@ -407,7 +407,7 @@ namespace garlic
|
|
|
|
|
HandleAESBlock (buf + 514, length - 514, decryption, msg->from); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint (eLogError, "Failed to decrypt garlic"); |
|
|
|
|
LogPrint (eLogError, "Garlic: Failed to decrypt message"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// cleanup expired tags
|
|
|
|
@ -427,7 +427,7 @@ namespace garlic
@@ -427,7 +427,7 @@ namespace garlic
|
|
|
|
|
else |
|
|
|
|
it++; |
|
|
|
|
} |
|
|
|
|
LogPrint (numExpiredTags, " tags expired for ", GetIdentHash().ToBase64 ()); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: ", numExpiredTags, " tags expired for ", GetIdentHash().ToBase64 ()); |
|
|
|
|
} |
|
|
|
|
m_LastTagsCleanupTime = ts; |
|
|
|
|
} |
|
|
|
@ -442,7 +442,7 @@ namespace garlic
@@ -442,7 +442,7 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
if (tagCount*32 > len) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "Tag count ", tagCount, " exceeds length ", len); |
|
|
|
|
LogPrint (eLogError, "Garlic: Tag count ", tagCount, " exceeds length ", len); |
|
|
|
|
return ; |
|
|
|
|
} |
|
|
|
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch (); |
|
|
|
@ -454,7 +454,7 @@ namespace garlic
@@ -454,7 +454,7 @@ namespace garlic
|
|
|
|
|
uint32_t payloadSize = bufbe32toh (buf); |
|
|
|
|
if (payloadSize > len) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "Unexpected payload size ", payloadSize); |
|
|
|
|
LogPrint (eLogError, "Garlic: Unexpected payload size ", payloadSize); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
buf += 4; |
|
|
|
@ -469,7 +469,7 @@ namespace garlic
@@ -469,7 +469,7 @@ namespace garlic
|
|
|
|
|
SHA256 (buf, payloadSize, digest); |
|
|
|
|
if (memcmp (payloadHash, digest, 32)) // payload hash doesn't match
|
|
|
|
|
{ |
|
|
|
|
LogPrint ("Wrong payload hash"); |
|
|
|
|
LogPrint (eLogError, "Garlic: wrong payload hash"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
HandleGarlicPayload (buf, payloadSize, from); |
|
|
|
@ -479,7 +479,7 @@ namespace garlic
@@ -479,7 +479,7 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
const uint8_t * buf1 = buf; |
|
|
|
|
int numCloves = buf[0]; |
|
|
|
|
LogPrint (numCloves," cloves"); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: ", numCloves," cloves"); |
|
|
|
|
buf++; |
|
|
|
|
for (int i = 0; i < numCloves; i++) |
|
|
|
|
{ |
|
|
|
@ -489,24 +489,24 @@ namespace garlic
@@ -489,24 +489,24 @@ namespace garlic
|
|
|
|
|
if (flag & 0x80) // encrypted?
|
|
|
|
|
{ |
|
|
|
|
// TODO: implement
|
|
|
|
|
LogPrint ("Clove encrypted"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: clove encrypted"); |
|
|
|
|
buf += 32; |
|
|
|
|
} |
|
|
|
|
GarlicDeliveryType deliveryType = (GarlicDeliveryType)((flag >> 5) & 0x03); |
|
|
|
|
switch (deliveryType) |
|
|
|
|
{ |
|
|
|
|
case eGarlicDeliveryTypeLocal: |
|
|
|
|
LogPrint ("Garlic type local"); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: type local"); |
|
|
|
|
HandleI2NPMessage (buf, len, from); |
|
|
|
|
break; |
|
|
|
|
case eGarlicDeliveryTypeDestination: |
|
|
|
|
LogPrint ("Garlic type destination"); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: type destination"); |
|
|
|
|
buf += 32; // destination. check it later or for multiple destinations
|
|
|
|
|
HandleI2NPMessage (buf, len, from); |
|
|
|
|
break; |
|
|
|
|
case eGarlicDeliveryTypeTunnel: |
|
|
|
|
{ |
|
|
|
|
LogPrint ("Garlic type tunnel"); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: type tunnel"); |
|
|
|
|
// gwHash and gwTunnel sequence is reverted
|
|
|
|
|
uint8_t * gwHash = buf; |
|
|
|
|
buf += 32; |
|
|
|
@ -521,15 +521,15 @@ namespace garlic
@@ -521,15 +521,15 @@ namespace garlic
|
|
|
|
|
tunnel->SendTunnelDataMsg (gwHash, gwTunnel, msg); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
LogPrint ("No outbound tunnels available for garlic clove"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: No outbound tunnels available for garlic clove"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case eGarlicDeliveryTypeRouter: |
|
|
|
|
LogPrint ("Garlic type router not supported"); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: type router not supported"); |
|
|
|
|
buf += 32; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
LogPrint ("Unknow garlic delivery type ", (int)deliveryType); |
|
|
|
|
LogPrint (eLogWarning, "Garlic: unknown delivery type ", (int)deliveryType); |
|
|
|
|
} |
|
|
|
|
buf += GetI2NPMessageLength (buf); // I2NP
|
|
|
|
|
buf += 4; // CloveID
|
|
|
|
@ -537,7 +537,7 @@ namespace garlic
@@ -537,7 +537,7 @@ namespace garlic
|
|
|
|
|
buf += 3; // Certificate
|
|
|
|
|
if (buf - buf1 > (int)len) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "Garlic clove is too long"); |
|
|
|
|
LogPrint (eLogError, "Garlic: clove is too long"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -601,7 +601,7 @@ namespace garlic
@@ -601,7 +601,7 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
it->second->MessageConfirmed (msgID); |
|
|
|
|
m_CreatedSessions.erase (it); |
|
|
|
|
LogPrint (eLogInfo, "Garlic message ", msgID, " acknowledged"); |
|
|
|
|
LogPrint (eLogDebug, "Garlic: message ", msgID, " acknowledged"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|