/* * Copyright (c) 2022, 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 */ #ifndef SSU2_H__ #define SSU2_H__ #include #include #include "Crypto.h" #include "RouterInfo.h" #include "TransportSession.h" namespace i2p { namespace transport { const int SSU2_TERMINATION_TIMEOUT = 330; // 5.5 minutes enum SSU2MessageType { eSSU2SessionRequest = 0 }; class SSU2Server; class SSU2Session: public TransportSession, public std::enable_shared_from_this { union Header { uint64_t ll[2]; uint8_t buf[16]; struct { uint8_t connID[8]; uint8_t packetNum[4]; uint8_t type; uint8_t flags[3]; } h; }; public: SSU2Session (SSU2Server& server, std::shared_ptr in_RemoteRouter = nullptr, std::shared_ptr addr = nullptr, bool peerTest = false); ~SSU2Session (); private: void SendSessionRequest (); void EncryptHeader (Header& h); void CreateHeaderMask (const uint8_t * kh1, const uint8_t * nonce1, const uint8_t * kh2, const uint8_t * nonce2); private: SSU2Server& m_Server; std::shared_ptr m_EphemeralKeys; std::unique_ptr m_NoiseState; std::shared_ptr m_Address; union { uint64_t ll[2]; uint8_t buf[16]; } m_HeaderMask; }; class SSU2Server { public: SSU2Server (int port) {}; ~SSU2Server () {}; void AddSession (uint64_t connID, std::shared_ptr session); private: void ProcessNextPacket (uint8_t * buf, size_t len); private: std::unordered_map > m_Sessions; }; } } #endif