#pragma once #include #include "../identity.h" #include #include namespace erebos { using std::array; using std::atomic; using std::unique_ptr; struct ChannelRequestData { Ref store(const Storage & st) const; static ChannelRequestData load(const Ref &); const vector>> peers; const Stored key; }; typedef Signed ChannelRequest; struct ChannelAcceptData { Ref store(const Storage & st) const; static ChannelAcceptData load(const Ref &); unique_ptr channel() const; const Stored request; const Stored key; }; typedef Signed ChannelAccept; class Channel { public: Channel(const vector>> & peers, vector && key, bool ourRequest): peers(peers), key(std::move(key)), nonceFixedOur({ uint8_t(ourRequest ? 1 : 2), 0, 0, 0, 0, 0 }), nonceFixedPeer({ uint8_t(ourRequest ? 2 : 1), 0, 0, 0, 0, 0 }) {} Channel(const Channel &) = delete; Channel(Channel &&) = delete; Channel & operator=(const Channel &) = delete; Channel & operator=(Channel &&) = delete; static Stored generateRequest(const Storage &, const Identity & self, const Identity & peer); static optional> acceptRequest(const Identity & self, const Identity & peer, const Stored & request); using Buffer = vector; using BufferCIt = Buffer::const_iterator; uint64_t encrypt(BufferCIt plainBegin, BufferCIt plainEnd, Buffer & encBuffer, size_t encOffset); optional decrypt(BufferCIt encBegin, BufferCIt encEnd, Buffer & decBuffer, size_t decOffset); private: const vector>> peers; const vector key; const array nonceFixedOur; const array nonceFixedPeer; atomic nonceCounter = 0; }; }