void DatagramDestination::HandleDatagram( uint16_t fromPort, uint16_t toPort, const uint8_t* buf, size_t len) { i2p::data::IdentityEx identity; size_t identityLen = identity.FromBuffer(buf, len); const uint8_t* signature = buf + identityLen; size_t headerLen = identityLen + identity.GetSignatureLen(); bool verified = false; if (identity.GetSigningKeyType() == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1) { uint8_t hash[32]; i2p::crypto::SHA256().CalculateDigest(hash, buf + headerLen, len - headerLen); verified = identity.Verify(hash, 32, signature); } else { verified = identity.Verify(buf + headerLen, len - headerLen, signature); } if (verified) { auto it = m_ReceiversByPorts.find(toPort); if (it != m_ReceiversByPorts.end()) it->second( identity, fromPort, toPort, buf + headerLen, len - headerLen); else if (m_Receiver != nullptr) m_Receiver( identity, fromPort, toPort, buf + headerLen, len - headerLen); else LogPrint(eLogWarn, "DatagramDestination: receiver for datagram is not set"); } else { LogPrint(eLogWarn, "DatagramDestination: datagram signature verification failed"); } }
void DatagramDestination::HandleDatagram (const uint8_t * buf, size_t len) { i2p::data::IdentityEx identity; size_t identityLen = identity.FromBuffer (buf, len); const uint8_t * signature = buf + identityLen; size_t headerLen = identityLen + identity.GetSignatureLen (); bool verified = false; if (identity.GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1) { uint8_t hash[32]; CryptoPP::SHA256().CalculateDigest (hash, buf + headerLen, len - headerLen); verified = identity.Verify (hash, 32, signature); } else verified = identity.Verify (buf + headerLen, len - headerLen, signature); if (verified) { if (m_Receiver != nullptr) m_Receiver (identity, buf + headerLen, len -headerLen); else LogPrint (eLogWarning, "Receiver for datagram is not set"); } else LogPrint (eLogWarning, "Datagram signature verification failed"); }