i2pd/libi2pd/TransitTunnel.h

118 lines
3.6 KiB
C
Raw Permalink Normal View History

/*
* Copyright (c) 2013-2024, 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
*/
2013-11-11 03:19:49 +04:00
#ifndef TRANSIT_TUNNEL_H__
#define TRANSIT_TUNNEL_H__
#include <inttypes.h>
#include <list>
2014-06-26 23:41:12 +04:00
#include <mutex>
#include <memory>
2015-11-03 17:15:49 +03:00
#include "Crypto.h"
2013-11-11 03:19:49 +04:00
#include "I2NPProtocol.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
2013-11-29 16:52:09 +04:00
#include "TunnelBase.h"
2013-11-11 03:19:49 +04:00
namespace i2p
{
namespace tunnel
2018-01-06 06:48:51 +03:00
{
class TransitTunnel: public TunnelBase
2013-11-11 03:19:49 +04:00
{
public:
TransitTunnel (uint32_t receiveTunnelID,
const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID,
const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey);
2018-01-06 06:48:51 +03:00
2015-01-22 05:50:46 +03:00
virtual size_t GetNumTransmittedBytes () const { return 0; };
2013-11-11 03:19:49 +04:00
2013-11-29 16:52:09 +04:00
// implements TunnelBase
2023-04-04 04:35:10 +03:00
void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg) override;
void HandleTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage>&& tunnelMsg) override;
void EncryptTunnelMsg (std::shared_ptr<const I2NPMessage> in, std::shared_ptr<I2NPMessage> out) override;
2013-11-11 03:19:49 +04:00
private:
2018-01-06 06:48:51 +03:00
i2p::crypto::AESKey m_LayerKey, m_IVKey;
std::unique_ptr<i2p::crypto::TunnelEncryption> m_Encryption;
2018-01-06 06:48:51 +03:00
};
2013-11-29 16:52:09 +04:00
2015-01-22 05:50:46 +03:00
class TransitTunnelParticipant: public TransitTunnel
{
public:
TransitTunnelParticipant (uint32_t receiveTunnelID,
const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID,
const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey):
2018-01-06 06:48:51 +03:00
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
2015-01-22 05:50:46 +03:00
layerKey, ivKey), m_NumTransmittedBytes (0) {};
~TransitTunnelParticipant ();
2023-04-04 20:42:54 +03:00
size_t GetNumTransmittedBytes () const override { return m_NumTransmittedBytes; };
2023-04-04 04:35:10 +03:00
void HandleTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage>&& tunnelMsg) override;
void FlushTunnelDataMsgs () override;
2015-01-22 05:50:46 +03:00
private:
size_t m_NumTransmittedBytes;
std::list<std::shared_ptr<i2p::I2NPMessage> > m_TunnelDataMsgs;
2018-01-06 06:48:51 +03:00
};
2013-11-29 16:52:09 +04:00
class TransitTunnelGateway: public TransitTunnel
{
public:
TransitTunnelGateway (uint32_t receiveTunnelID,
const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID,
const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey):
2018-01-06 06:48:51 +03:00
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
2013-11-29 16:52:09 +04:00
layerKey, ivKey), m_Gateway(this) {};
2023-04-04 04:35:10 +03:00
void SendTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage> msg) override;
void FlushTunnelDataMsgs () override;
2023-04-04 20:42:54 +03:00
size_t GetNumTransmittedBytes () const override { return m_Gateway.GetNumSentBytes (); };
2018-01-06 06:48:51 +03:00
2013-11-29 16:52:09 +04:00
private:
2014-06-26 23:41:12 +04:00
std::mutex m_SendMutex;
2013-11-29 16:52:09 +04:00
TunnelGateway m_Gateway;
2018-01-06 06:48:51 +03:00
};
2013-11-29 16:52:09 +04:00
class TransitTunnelEndpoint: public TransitTunnel
{
public:
TransitTunnelEndpoint (uint32_t receiveTunnelID,
const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID,
const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey),
m_Endpoint (false) {}; // transit endpoint is always outbound
2013-11-29 16:52:09 +04:00
2023-04-04 05:50:31 +03:00
void Cleanup () override { m_Endpoint.Cleanup (); }
2018-01-06 06:48:51 +03:00
2023-04-04 04:35:10 +03:00
void HandleTunnelDataMsg (std::shared_ptr<i2p::I2NPMessage>&& tunnelMsg) override;
2023-04-04 20:57:46 +03:00
size_t GetNumTransmittedBytes () const override { return m_Endpoint.GetNumReceivedBytes (); }
2018-01-06 06:48:51 +03:00
2013-11-29 16:52:09 +04:00
private:
TunnelEndpoint m_Endpoint;
};
2018-01-06 06:48:51 +03:00
2016-03-01 23:22:36 +03:00
std::shared_ptr<TransitTunnel> CreateTransitTunnel (uint32_t receiveTunnelID,
const i2p::data::IdentHash& nextIdent, uint32_t nextTunnelID,
const i2p::crypto::AESKey& layerKey, const i2p::crypto::AESKey& ivKey,
2013-11-29 16:52:09 +04:00
bool isGateway, bool isEndpoint);
void HandleShortTransitTunnelBuildMsg (uint8_t * buf, size_t len);
void HandleVariableTransitTunnelBuildMsg (uint8_t * buf, size_t len);
2013-11-11 03:19:49 +04:00
}
}
#endif