mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-02-07 03:34:15 +00:00
implement DatabaseLookupTagSet
This commit is contained in:
parent
d0d71c93af
commit
2b0d1a2190
@ -99,6 +99,56 @@ namespace garlic
|
|||||||
m_ExpirationTimestamp = i2p::util::GetSecondsSinceEpoch () + ECIESX25519_PREVIOUS_TAGSET_EXPIRATION_TIMEOUT;
|
m_ExpirationTimestamp = i2p::util::GetSecondsSinceEpoch () + ECIESX25519_PREVIOUS_TAGSET_EXPIRATION_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RatchetTagSet::HandleNextMessage (uint8_t * buf, size_t len, int index)
|
||||||
|
{
|
||||||
|
auto session = GetSession ();
|
||||||
|
if (!session) return false;
|
||||||
|
return session->HandleNextMessage (buf, len, shared_from_this (), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
DatabaseLookupTagSet::DatabaseLookupTagSet (GarlicDestination * destination, const uint8_t * key):
|
||||||
|
RatchetTagSet (nullptr), m_Destination (destination)
|
||||||
|
{
|
||||||
|
memcpy (m_Key, key, 32);
|
||||||
|
Expire ();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DatabaseLookupTagSet::HandleNextMessage (uint8_t * buf, size_t len, int index)
|
||||||
|
{
|
||||||
|
if (len < 24) return false;
|
||||||
|
uint8_t nonce[12];
|
||||||
|
memset (nonce, 0, 12); // n = 0
|
||||||
|
size_t offset = 8; // first 8 bytes is reply tag used as AD
|
||||||
|
len -= 16; // poly1305
|
||||||
|
if (!i2p::crypto::AEADChaCha20Poly1305 (buf + offset, len - offset, buf, 8, m_Key, nonce, buf + offset, len - offset, false)) // decrypt
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Garlic: Lookup reply AEAD decryption failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// we assume 1 I2NP block with delivery type local
|
||||||
|
if (offset + 3 > len)
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Garlic: Lookup reply is too short ", len);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (buf[offset] != eECIESx25519BlkGalicClove)
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Garlic: Lookup reply unexpected block ", (int)buf[offset]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
offset++;
|
||||||
|
auto size = bufbe16toh (buf + offset);
|
||||||
|
offset += 2;
|
||||||
|
if (offset + size > len)
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Garlic: Lookup reply block is too long ", size);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_Destination)
|
||||||
|
m_Destination->HandleECIESx25519GarlicClove (buf + offset, size);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ECIESX25519AEADRatchetSession::ECIESX25519AEADRatchetSession (GarlicDestination * owner, bool attachLeaseSet):
|
ECIESX25519AEADRatchetSession::ECIESX25519AEADRatchetSession (GarlicDestination * owner, bool attachLeaseSet):
|
||||||
GarlicRoutingSession (owner, attachLeaseSet)
|
GarlicRoutingSession (owner, attachLeaseSet)
|
||||||
{
|
{
|
||||||
|
@ -40,7 +40,7 @@ namespace garlic
|
|||||||
// - 16 /* I2NP header */ - 16 /* poly hash */ - 8 /* tag */ - 4 /* garlic length */
|
// - 16 /* I2NP header */ - 16 /* poly hash */ - 8 /* tag */ - 4 /* garlic length */
|
||||||
|
|
||||||
class ECIESX25519AEADRatchetSession;
|
class ECIESX25519AEADRatchetSession;
|
||||||
class RatchetTagSet
|
class RatchetTagSet: public std::enable_shared_from_this<RatchetTagSet>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -61,7 +61,9 @@ namespace garlic
|
|||||||
|
|
||||||
void Expire ();
|
void Expire ();
|
||||||
bool IsExpired (uint64_t ts) const { return m_ExpirationTimestamp && ts > m_ExpirationTimestamp; };
|
bool IsExpired (uint64_t ts) const { return m_ExpirationTimestamp && ts > m_ExpirationTimestamp; };
|
||||||
bool IsIndexExpired (int index) const { return m_Session.expired () || index < m_TrimBehindIndex; };
|
virtual bool IsIndexExpired (int index) const { return m_Session.expired () || index < m_TrimBehindIndex; };
|
||||||
|
|
||||||
|
virtual bool HandleNextMessage (uint8_t * buf, size_t len, int index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -94,6 +96,21 @@ namespace garlic
|
|||||||
|
|
||||||
std::shared_ptr<ECIESX25519AEADRatchetSession> m_DummySession; // we need a strong pointer for NS
|
std::shared_ptr<ECIESX25519AEADRatchetSession> m_DummySession; // we need a strong pointer for NS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class DatabaseLookupTagSet: public RatchetTagSet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DatabaseLookupTagSet (GarlicDestination * destination, const uint8_t * key);
|
||||||
|
|
||||||
|
bool IsIndexExpired (int index) const { return false; };
|
||||||
|
bool HandleNextMessage (uint8_t * buf, size_t len, int index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
GarlicDestination * m_Destination;
|
||||||
|
uint8_t m_Key[32];
|
||||||
|
};
|
||||||
|
|
||||||
enum ECIESx25519BlockType
|
enum ECIESx25519BlockType
|
||||||
{
|
{
|
||||||
|
@ -507,8 +507,7 @@ namespace garlic
|
|||||||
if (it1 != m_ECIESx25519Tags.end ())
|
if (it1 != m_ECIESx25519Tags.end ())
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
auto session = it1->second.tagset->GetSession ();
|
if (!it1->second.tagset->HandleNextMessage (buf, length, it1->second.index))
|
||||||
if (!session || !session->HandleNextMessage (buf, length, it1->second.tagset, it1->second.index))
|
|
||||||
LogPrint (eLogError, "Garlic: can't handle ECIES-X25519-AEAD-Ratchet message");
|
LogPrint (eLogError, "Garlic: can't handle ECIES-X25519-AEAD-Ratchet message");
|
||||||
m_ECIESx25519Tags.erase (it1);
|
m_ECIESx25519Tags.erase (it1);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user