|
|
|
@ -18,7 +18,7 @@ namespace garlic
@@ -18,7 +18,7 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
GarlicRoutingSession::GarlicRoutingSession (GarlicDestination * owner, |
|
|
|
|
std::shared_ptr<const i2p::data::RoutingDestination> destination, int numTags, bool attachLeaseSet): |
|
|
|
|
m_Owner (owner), m_Destination (destination), m_NumTags (numTags), |
|
|
|
|
m_Owner (owner), m_IsDestination (destination->IsDestination ()), m_NumTags (numTags), |
|
|
|
|
m_LeaseSetUpdateStatus (attachLeaseSet ? eLeaseSetUpdated : eLeaseSetDoNotSend), |
|
|
|
|
m_LeaseSetUpdateMsgID (0), |
|
|
|
|
m_ElGamalEncryption (new i2p::crypto::ElGamalEncryption (destination->GetEncryptionPublicKey ())) |
|
|
|
@ -26,10 +26,12 @@ namespace garlic
@@ -26,10 +26,12 @@ namespace garlic
|
|
|
|
|
// create new session tags and session key
|
|
|
|
|
RAND_bytes (m_SessionKey, 32); |
|
|
|
|
m_Encryption.SetKey (m_SessionKey); |
|
|
|
|
if (m_IsDestination) |
|
|
|
|
m_DestinationIdent = destination->GetIdentHash (); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag): |
|
|
|
|
m_Owner (nullptr), m_Destination (nullptr), m_NumTags (1), m_LeaseSetUpdateStatus (eLeaseSetDoNotSend), m_LeaseSetUpdateMsgID (0) |
|
|
|
|
m_Owner (nullptr), m_IsDestination (false), m_NumTags (1), m_LeaseSetUpdateStatus (eLeaseSetDoNotSend), m_LeaseSetUpdateMsgID (0) |
|
|
|
|
{ |
|
|
|
|
memcpy (m_SessionKey, sessionKey, 32); |
|
|
|
|
m_Encryption.SetKey (m_SessionKey); |
|
|
|
@ -177,7 +179,7 @@ namespace garlic
@@ -177,7 +179,7 @@ namespace garlic
|
|
|
|
|
if (!tagFound) // new session
|
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogInfo, "Garlic: No tags available, will use ElGamal"); |
|
|
|
|
if (!m_Destination) |
|
|
|
|
if (!m_ElGamalEncryption) |
|
|
|
|
{ |
|
|
|
|
LogPrint (eLogError, "Garlic: Can't use ElGamal for unknown destination"); |
|
|
|
|
return nullptr; |
|
|
|
@ -297,7 +299,7 @@ namespace garlic
@@ -297,7 +299,7 @@ namespace garlic
|
|
|
|
|
} |
|
|
|
|
if (msg) // clove message ifself if presented
|
|
|
|
|
{ |
|
|
|
|
size += CreateGarlicClove (payload + size, msg, m_Destination ? m_Destination->IsDestination () : false); |
|
|
|
|
size += CreateGarlicClove (payload + size, msg, m_IsDestination); |
|
|
|
|
(*numCloves)++; |
|
|
|
|
} |
|
|
|
|
memset (payload + size, 0, 3); // certificate of message
|
|
|
|
@ -315,11 +317,11 @@ namespace garlic
@@ -315,11 +317,11 @@ namespace garlic
|
|
|
|
|
{ |
|
|
|
|
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 8000; // 8 sec
|
|
|
|
|
size_t size = 0; |
|
|
|
|
if (isDestination && m_Destination) |
|
|
|
|
if (isDestination) |
|
|
|
|
{ |
|
|
|
|
buf[size] = eGarlicDeliveryTypeDestination << 5;// delivery instructions flag destination
|
|
|
|
|
size++; |
|
|
|
|
memcpy (buf + size, m_Destination->GetIdentHash (), 32); |
|
|
|
|
memcpy (buf + size, m_DestinationIdent, 32); |
|
|
|
|
size += 32; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|