i2pd/TransitTunnel.h

90 lines
2.6 KiB
C
Raw Normal View History

2013-11-10 23:19:49 +00:00
#ifndef TRANSIT_TUNNEL_H__
#define TRANSIT_TUNNEL_H__
#include <inttypes.h>
#include <cryptopp/modes.h>
#include <cryptopp/aes.h>
#include "I2NPProtocol.h"
#include "TunnelEndpoint.h"
#include "TunnelGateway.h"
2013-11-29 12:52:09 +00:00
#include "TunnelBase.h"
2013-11-10 23:19:49 +00:00
namespace i2p
{
namespace tunnel
{
2013-11-29 12:52:09 +00:00
class TransitTunnel: public TunnelBase // tunnel patricipant
2013-11-10 23:19:49 +00:00
{
public:
TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
2013-11-29 12:52:09 +00:00
const uint8_t * layerKey,const uint8_t * ivKey);
2013-11-10 23:19:49 +00:00
2013-11-29 12:52:09 +00:00
virtual void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
virtual void SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg);
2014-01-06 03:52:17 +00:00
virtual size_t GetNumTransmittedBytes () const { return m_NumTransmittedBytes; };
2013-11-10 23:19:49 +00:00
uint32_t GetTunnelID () const { return m_TunnelID; };
2013-11-29 12:52:09 +00:00
// implements TunnelBase
void EncryptTunnelMsg (I2NPMessage * tunnelMsg);
uint32_t GetNextTunnelID () const { return m_NextTunnelID; };
const i2p::data::IdentHash& GetNextIdentHash () const { return m_NextIdent; };
2013-11-10 23:19:49 +00:00
private:
uint32_t m_TunnelID, m_NextTunnelID;
2013-11-29 12:52:09 +00:00
i2p::data::IdentHash m_NextIdent;
2013-11-10 23:19:49 +00:00
uint8_t m_LayerKey[32];
uint8_t m_IVKey[32];
2014-01-06 03:52:17 +00:00
size_t m_NumTransmittedBytes;
2013-11-10 23:19:49 +00:00
CryptoPP::ECB_Mode<CryptoPP::AES>::Encryption m_ECBEncryption;
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption m_CBCEncryption;
};
2013-11-29 12:52:09 +00:00
class TransitTunnelGateway: public TransitTunnel
{
public:
TransitTunnelGateway (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID,
layerKey, ivKey), m_Gateway(this) {};
void SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg);
2014-01-06 03:52:17 +00:00
size_t GetNumTransmittedBytes () const { return m_Gateway.GetNumSentBytes (); };
2013-11-29 12:52:09 +00:00
private:
TunnelGateway m_Gateway;
};
class TransitTunnelEndpoint: public TransitTunnel
{
public:
TransitTunnelEndpoint (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey) {};
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
2014-01-06 03:52:17 +00:00
size_t GetNumTransmittedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }
2013-11-29 12:52:09 +00:00
private:
TunnelEndpoint m_Endpoint;
};
TransitTunnel * CreateTransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey,
bool isGateway, bool isEndpoint);
2013-11-10 23:19:49 +00:00
}
}
#endif