From 0cf9478cd49c4df184a4b745db18e3999b29cba9 Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Thu, 2 Jun 2022 20:12:25 -0400
Subject: [PATCH] create SSU2 session for peer test msgs 5-7

---
 libi2pd/SSU2.cpp | 19 ++++++++++++++-----
 libi2pd/SSU2.h   |  2 +-
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/libi2pd/SSU2.cpp b/libi2pd/SSU2.cpp
index 2263b044..9fafe7e6 100644
--- a/libi2pd/SSU2.cpp
+++ b/libi2pd/SSU2.cpp
@@ -109,8 +109,19 @@ namespace transport
 	void SSU2Session::SendPeerTest ()
 	{
 		// we are Alice
+		uint32_t nonce;
+		RAND_bytes ((uint8_t *)&nonce, 4);
+		auto ts = i2p::util::GetSecondsSinceEpoch ();
+		// session for message 5
+		auto session = std::make_shared<SSU2Session> (m_Server);
+		session->SetState (eSSU2SessionStatePeerTest);
+		m_PeerTests.emplace (nonce, std::make_pair (session, ts));
+		session->m_SourceConnID = htobe64 (((uint64_t)nonce << 32) | nonce);
+		session->m_DestConnID = ~session->m_SourceConnID;
+		m_Server.AddSession (session);
+		// peer test block
 		uint8_t payload[SSU2_MAX_PAYLOAD_SIZE];
-		size_t payloadSize = CreatePeerTestBlock (payload, SSU2_MAX_PAYLOAD_SIZE);
+		size_t payloadSize = CreatePeerTestBlock (payload, SSU2_MAX_PAYLOAD_SIZE, nonce);
 		payloadSize += CreatePaddingBlock (payload + payloadSize, SSU2_MAX_PAYLOAD_SIZE - payloadSize);
 		SendData (payload, payloadSize);
 	}	
@@ -1316,7 +1327,7 @@ namespace transport
 				auto it = m_PeerTests.find (nonce);
 				if (it != m_PeerTests.end ())
 				{
-					// TODO: send to Charlie
+					// TODO: update Charlie's session RouterInfo
 					m_PeerTests.erase (it);
 				}	
 				break;
@@ -1593,13 +1604,11 @@ namespace transport
 		return payloadSize + 3;
 	}
 
-	size_t SSU2Session::CreatePeerTestBlock (uint8_t * buf, size_t len)
+	size_t SSU2Session::CreatePeerTestBlock (uint8_t * buf, size_t len, uint32_t nonce)
 	{
 		auto localAddress = FindLocalAddress ();  
 		if (!localAddress) return 0;
 		// signed data
-		uint32_t nonce;
-		RAND_bytes ((uint8_t *)&nonce, 4);
 		auto ts = i2p::util::GetSecondsSinceEpoch ();
 		uint8_t signedData[96];
 		signedData[0] = 2; // ver
diff --git a/libi2pd/SSU2.h b/libi2pd/SSU2.h
index 03c72b52..fd0719ea 100644
--- a/libi2pd/SSU2.h
+++ b/libi2pd/SSU2.h
@@ -219,7 +219,7 @@ namespace transport
 			size_t CreateRelayIntroBlock (uint8_t * buf, size_t len, const uint8_t * introData, size_t introDataLen);
 			size_t CreateRelayResponseBlock (uint8_t * buf, size_t len, uint32_t nonce); // Charlie
 			size_t CreatePeerTestBlock (uint8_t * buf, size_t len, uint8_t msg, const uint8_t * routerHash, const uint8_t * signedData, size_t signedDataLen);
-			size_t CreatePeerTestBlock (uint8_t * buf, size_t len); // Alice
+			size_t CreatePeerTestBlock (uint8_t * buf, size_t len, uint32_t nonce); // Alice
 
 		private: