Esempio n. 1
0
	void DatagramDestination::SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::IdentHash& ident, uint16_t fromPort, uint16_t toPort)
	{
		uint8_t buf[MAX_DATAGRAM_SIZE];
		auto identityLen = m_Owner.GetIdentity ().ToBuffer (buf, MAX_DATAGRAM_SIZE);
		uint8_t * signature = buf + identityLen;
		auto signatureLen = m_Owner.GetIdentity ().GetSignatureLen ();
		uint8_t * buf1 = signature + signatureLen;
		size_t headerLen = identityLen + signatureLen;
		
		memcpy (buf1, payload, len);	
		if (m_Owner.GetIdentity ().GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1)
		{
			uint8_t hash[32];	
			CryptoPP::SHA256().CalculateDigest (hash, buf1, len);
			m_Owner.Sign (hash, 32, signature);
		}
		else
			m_Owner.Sign (buf1, len, signature);

		auto msg = CreateDataMessage (buf, len + headerLen, fromPort, toPort); 
		auto remote = m_Owner.FindLeaseSet (ident);
		if (remote)
			m_Owner.GetService ().post (std::bind (&DatagramDestination::SendMsg, this, msg, remote));
		else
			m_Owner.RequestDestination (ident, std::bind (&DatagramDestination::HandleLeaseSetRequestComplete, this, std::placeholders::_1, msg));
	}
Esempio n. 2
0
	void DatagramDestination::SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::LeaseSet& remote)
	{
		uint8_t buf[MAX_DATAGRAM_SIZE];
		auto identityLen = m_Owner.GetIdentity ().ToBuffer (buf, MAX_DATAGRAM_SIZE);
		uint8_t * signature = buf + identityLen;
		auto signatureLen = m_Owner.GetIdentity ().GetSignatureLen ();
		uint8_t * buf1 = signature + signatureLen;
		size_t headerLen = identityLen + signatureLen;
		
		memcpy (buf1, payload, len);	
		if (m_Owner.GetIdentity ().GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1)
		{
			uint8_t hash[32];	
			CryptoPP::SHA256().CalculateDigest (hash, buf1, len);
			m_Owner.Sign (hash, 32, signature);
		}
		else
			m_Owner.Sign (buf1, len, signature);
		
		auto service = m_Owner.GetService ();
		if (service) 
			service->post (std::bind (&DatagramDestination::SendMsg, this, 
				CreateDataMessage (buf, len + headerLen), remote));
		else
			LogPrint (eLogWarning, "Failed to send datagram. Destination is not running");
	}