2020-05-22 13:18:41 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2013-2020, The PurpleI2P Project
|
|
|
|
*
|
|
|
|
* This file is part of Purple i2pd project and licensed under BSD3
|
|
|
|
*
|
|
|
|
* See full license text in LICENSE file at top of project tree
|
|
|
|
*/
|
|
|
|
|
2014-10-20 20:09:59 +00:00
|
|
|
#ifndef TRANSPORT_SESSION_H__
|
|
|
|
#define TRANSPORT_SESSION_H__
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
2014-10-28 15:34:50 +00:00
|
|
|
#include <iostream>
|
2014-11-21 17:34:17 +00:00
|
|
|
#include <memory>
|
2015-01-21 02:05:57 +00:00
|
|
|
#include <vector>
|
2020-04-01 13:54:10 +00:00
|
|
|
#include <mutex>
|
2014-10-24 19:50:48 +00:00
|
|
|
#include "Identity.h"
|
2015-11-03 14:15:49 +00:00
|
|
|
#include "Crypto.h"
|
2014-10-24 19:50:48 +00:00
|
|
|
#include "RouterInfo.h"
|
2015-01-11 04:00:27 +00:00
|
|
|
#include "I2NPProtocol.h"
|
2016-08-24 15:21:49 +00:00
|
|
|
#include "Timestamp.h"
|
2014-10-20 20:09:59 +00:00
|
|
|
|
|
|
|
namespace i2p
|
|
|
|
{
|
|
|
|
namespace transport
|
|
|
|
{
|
2014-10-28 15:34:50 +00:00
|
|
|
class SignedData
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2015-11-03 14:15:49 +00:00
|
|
|
SignedData () {}
|
2018-01-06 03:48:51 +00:00
|
|
|
SignedData (const SignedData& other)
|
2015-11-03 14:15:49 +00:00
|
|
|
{
|
|
|
|
m_Stream << other.m_Stream.rdbuf ();
|
2018-01-06 03:48:51 +00:00
|
|
|
}
|
|
|
|
void Insert (const uint8_t * buf, size_t len)
|
|
|
|
{
|
|
|
|
m_Stream.write ((char *)buf, len);
|
|
|
|
}
|
2014-10-28 15:34:50 +00:00
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
void Insert (T t)
|
|
|
|
{
|
2018-01-06 03:48:51 +00:00
|
|
|
m_Stream.write ((char *)&t, sizeof (T));
|
2014-10-28 15:34:50 +00:00
|
|
|
}
|
|
|
|
|
2015-11-03 14:15:49 +00:00
|
|
|
bool Verify (std::shared_ptr<const i2p::data::IdentityEx> ident, const uint8_t * signature) const
|
2014-10-28 15:34:50 +00:00
|
|
|
{
|
2018-01-06 03:48:51 +00:00
|
|
|
return ident->Verify ((const uint8_t *)m_Stream.str ().c_str (), m_Stream.str ().size (), signature);
|
2014-10-28 15:34:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Sign (const i2p::data::PrivateKeys& keys, uint8_t * signature) const
|
|
|
|
{
|
2018-01-06 03:48:51 +00:00
|
|
|
keys.Sign ((const uint8_t *)m_Stream.str ().c_str (), m_Stream.str ().size (), signature);
|
|
|
|
}
|
2014-10-28 15:34:50 +00:00
|
|
|
|
|
|
|
private:
|
2018-01-06 03:48:51 +00:00
|
|
|
|
2014-10-28 15:34:50 +00:00
|
|
|
std::stringstream m_Stream;
|
2018-01-06 03:48:51 +00:00
|
|
|
};
|
2014-10-28 15:34:50 +00:00
|
|
|
|
2014-10-20 20:09:59 +00:00
|
|
|
class TransportSession
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2018-01-06 03:48:51 +00:00
|
|
|
TransportSession (std::shared_ptr<const i2p::data::RouterInfo> router, int terminationTimeout):
|
|
|
|
m_DHKeysPair (nullptr), m_NumSentBytes (0), m_NumReceivedBytes (0), m_IsOutgoing (router), m_TerminationTimeout (terminationTimeout),
|
2016-08-24 15:21:49 +00:00
|
|
|
m_LastActivityTimestamp (i2p::util::GetSecondsSinceEpoch ())
|
2014-10-24 19:50:48 +00:00
|
|
|
{
|
2015-11-03 14:15:49 +00:00
|
|
|
if (router)
|
|
|
|
m_RemoteIdentity = router->GetRouterIdentity ();
|
2014-10-24 19:50:48 +00:00
|
|
|
}
|
|
|
|
|
2015-11-03 14:15:49 +00:00
|
|
|
virtual ~TransportSession () {};
|
2015-02-07 01:53:48 +00:00
|
|
|
virtual void Done () = 0;
|
2016-10-20 13:12:15 +00:00
|
|
|
|
2016-11-01 17:57:25 +00:00
|
|
|
std::string GetIdentHashBase64() const { return m_RemoteIdentity ? m_RemoteIdentity->GetIdentHash().ToBase64() : ""; }
|
2018-01-06 03:48:51 +00:00
|
|
|
|
2020-03-01 10:25:50 +00:00
|
|
|
std::shared_ptr<const i2p::data::IdentityEx> GetRemoteIdentity ()
|
2020-04-01 13:54:10 +00:00
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> l(m_RemoteIdentityMutex);
|
2020-03-01 10:25:50 +00:00
|
|
|
return m_RemoteIdentity;
|
2020-04-01 13:54:10 +00:00
|
|
|
}
|
2020-03-01 10:25:50 +00:00
|
|
|
void SetRemoteIdentity (std::shared_ptr<const i2p::data::IdentityEx> ident)
|
2020-04-01 13:54:10 +00:00
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> l(m_RemoteIdentityMutex);
|
2020-03-01 10:25:50 +00:00
|
|
|
m_RemoteIdentity = ident;
|
2020-04-01 13:54:10 +00:00
|
|
|
}
|
2018-01-06 03:48:51 +00:00
|
|
|
|
2015-03-16 22:57:22 +00:00
|
|
|
size_t GetNumSentBytes () const { return m_NumSentBytes; };
|
|
|
|
size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; };
|
2015-11-03 14:15:49 +00:00
|
|
|
bool IsOutgoing () const { return m_IsOutgoing; };
|
2018-01-06 03:48:51 +00:00
|
|
|
|
2016-08-04 14:26:50 +00:00
|
|
|
int GetTerminationTimeout () const { return m_TerminationTimeout; };
|
2018-01-06 03:48:51 +00:00
|
|
|
void SetTerminationTimeout (int terminationTimeout) { m_TerminationTimeout = terminationTimeout; };
|
|
|
|
bool IsTerminationTimeoutExpired (uint64_t ts) const
|
|
|
|
{ return ts >= m_LastActivityTimestamp + GetTerminationTimeout (); };
|
2016-08-04 14:26:50 +00:00
|
|
|
|
2018-08-14 15:27:27 +00:00
|
|
|
virtual void SendLocalRouterInfo () { SendI2NPMessages ({ CreateDatabaseStoreMsg () }); };
|
2015-06-17 14:47:26 +00:00
|
|
|
virtual void SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs) = 0;
|
2018-01-06 03:48:51 +00:00
|
|
|
|
2014-10-20 20:09:59 +00:00
|
|
|
protected:
|
|
|
|
|
2018-01-06 03:48:51 +00:00
|
|
|
std::shared_ptr<const i2p::data::IdentityEx> m_RemoteIdentity;
|
2020-04-01 13:54:10 +00:00
|
|
|
mutable std::mutex m_RemoteIdentityMutex;
|
2015-11-03 14:15:49 +00:00
|
|
|
std::shared_ptr<i2p::crypto::DHKeys> m_DHKeysPair; // X - for client and Y - for server
|
2015-03-16 22:57:22 +00:00
|
|
|
size_t m_NumSentBytes, m_NumReceivedBytes;
|
2015-11-03 14:15:49 +00:00
|
|
|
bool m_IsOutgoing;
|
2016-08-04 14:26:50 +00:00
|
|
|
int m_TerminationTimeout;
|
2016-08-24 15:21:49 +00:00
|
|
|
uint64_t m_LastActivityTimestamp;
|
2018-01-06 03:48:51 +00:00
|
|
|
};
|
2014-10-20 20:09:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|