Browse Source

don't create full identity from buffer if only ident hash is needed

pull/2094/head
orignal 5 months ago
parent
commit
d3062d2994
  1. 8
      libi2pd/Identity.cpp
  2. 2
      libi2pd/Identity.h
  3. 11
      libi2pd_client/I2CP.cpp

8
libi2pd/Identity.cpp

@ -420,6 +420,14 @@ namespace data @@ -420,6 +420,14 @@ namespace data
return CreateEncryptor (GetCryptoKeyType (), key);
}
size_t GetIdentityBufferLen (const uint8_t * buf, size_t len)
{
if (len < DEFAULT_IDENTITY_SIZE) return 0;
size_t l = DEFAULT_IDENTITY_SIZE + bufbe16toh (buf + DEFAULT_IDENTITY_SIZE - 2);
if (l > len) return 0;
return l;
}
PrivateKeys& PrivateKeys::operator=(const Keys& keys)
{
m_Public = std::make_shared<IdentityEx>(Identity (keys));

2
libi2pd/Identity.h

@ -136,6 +136,8 @@ namespace data @@ -136,6 +136,8 @@ namespace data
uint8_t m_ExtendedBuffer[MAX_EXTENDED_BUFFER_SIZE];
};
size_t GetIdentityBufferLen (const uint8_t * buf, size_t len); // return actual identity length in buffer
class PrivateKeys // for eepsites
{
public:

11
libi2pd_client/I2CP.cpp

@ -777,11 +777,12 @@ namespace client @@ -777,11 +777,12 @@ namespace client
size_t offset = 2;
if (m_Destination)
{
i2p::data::IdentityEx identity;
size_t identsize = identity.FromBuffer (buf + offset, len - offset);
if (identsize)
size_t identSize = i2p::data::GetIdentityBufferLen (buf + offset, len - offset);
if (identSize)
{
offset += identsize;
i2p::data::IdentHash identHash;
SHA256(buf + offset, identSize, identHash); // caclulate ident hash, because we don't need full identity
offset += identSize;
uint32_t payloadLen = bufbe32toh (buf + offset);
if (payloadLen + offset <= len)
{
@ -791,7 +792,7 @@ namespace client @@ -791,7 +792,7 @@ namespace client
{
if (m_IsSendAccepted)
SendMessageStatusMessage (nonce, eI2CPMessageStatusAccepted); // accepted
m_Destination->SendMsgTo (buf + offset, payloadLen, identity.GetIdentHash (), nonce);
m_Destination->SendMsgTo (buf + offset, payloadLen, identHash, nonce);
}
else
SendMessageStatusMessage (nonce, eI2CPMessageStatusNoLocalTunnels);

Loading…
Cancel
Save