Exemplo n.º 1
0
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");
  }
}
Exemplo n.º 2
0
	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");	
	}