mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-02 03:40:12 +00:00
7f9160bb6e
macOS doing a shared library build is not working without untangling some of the interdependencies. This commit does that, at least enough to get macOS to compile. This isn't the cleanest as currently implemented (we have some net/ things in `liblokinet-platform` and some in `liblokinet`, and likewise ev/vpnio.cpp is in `liblokinet` while the rest of `ev/*` is in `liblokinet-platform`).
168 lines
3.7 KiB
C++
168 lines
3.7 KiB
C++
#ifndef LLARP_SERVICE_PROTOCOL_HPP
|
|
#define LLARP_SERVICE_PROTOCOL_HPP
|
|
|
|
#include <crypto/encrypted.hpp>
|
|
#include <crypto/types.hpp>
|
|
#include <dht/message.hpp>
|
|
#include <routing/message.hpp>
|
|
#include <service/protocol_type.hpp>
|
|
#include <service/identity.hpp>
|
|
#include <service/info.hpp>
|
|
#include <service/intro.hpp>
|
|
#include <service/handler.hpp>
|
|
#include <util/bencode.hpp>
|
|
#include <util/time.hpp>
|
|
#include <path/pathset.hpp>
|
|
|
|
#include <vector>
|
|
|
|
struct llarp_threadpool;
|
|
|
|
namespace llarp
|
|
{
|
|
class Logic;
|
|
|
|
namespace path
|
|
{
|
|
/// forward declare
|
|
struct Path;
|
|
} // namespace path
|
|
|
|
namespace service
|
|
{
|
|
constexpr std::size_t MAX_PROTOCOL_MESSAGE_SIZE = 2048 * 2;
|
|
|
|
/// inner message
|
|
struct ProtocolMessage
|
|
{
|
|
ProtocolMessage(const ConvoTag& tag);
|
|
ProtocolMessage();
|
|
~ProtocolMessage();
|
|
ProtocolType proto = eProtocolTrafficV4;
|
|
llarp_time_t queued = 0s;
|
|
std::vector<byte_t> payload;
|
|
Introduction introReply;
|
|
ServiceInfo sender;
|
|
IDataHandler* handler = nullptr;
|
|
ConvoTag tag;
|
|
uint64_t seqno = 0;
|
|
uint64_t version = LLARP_PROTO_VERSION;
|
|
|
|
bool
|
|
DecodeKey(const llarp_buffer_t& key, llarp_buffer_t* val);
|
|
|
|
bool
|
|
BEncode(llarp_buffer_t* buf) const;
|
|
|
|
void
|
|
PutBuffer(const llarp_buffer_t& payload);
|
|
|
|
static void
|
|
ProcessAsync(path::Path_ptr p, PathID_t from, std::shared_ptr<ProtocolMessage> self);
|
|
|
|
bool
|
|
operator<(const ProtocolMessage& other) const
|
|
{
|
|
return seqno < other.seqno;
|
|
}
|
|
};
|
|
|
|
/// outer message
|
|
struct ProtocolFrame final : public routing::IMessage
|
|
{
|
|
using Encrypted_t = Encrypted<2048>;
|
|
PQCipherBlock C;
|
|
Encrypted_t D;
|
|
uint64_t R;
|
|
KeyExchangeNonce N;
|
|
Signature Z;
|
|
PathID_t F;
|
|
service::ConvoTag T;
|
|
|
|
ProtocolFrame(const ProtocolFrame& other)
|
|
: routing::IMessage()
|
|
, C(other.C)
|
|
, D(other.D)
|
|
, R(other.R)
|
|
, N(other.N)
|
|
, Z(other.Z)
|
|
, F(other.F)
|
|
, T(other.T)
|
|
{
|
|
S = other.S;
|
|
version = other.version;
|
|
}
|
|
|
|
ProtocolFrame() : routing::IMessage()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
~ProtocolFrame() override;
|
|
|
|
bool
|
|
operator==(const ProtocolFrame& other) const;
|
|
|
|
bool
|
|
operator!=(const ProtocolFrame& other) const
|
|
{
|
|
return !(*this == other);
|
|
}
|
|
|
|
ProtocolFrame&
|
|
operator=(const ProtocolFrame& other);
|
|
|
|
bool
|
|
EncryptAndSign(
|
|
const ProtocolMessage& msg, const SharedSecret& sharedkey, const Identity& localIdent);
|
|
|
|
bool
|
|
Sign(const Identity& localIdent);
|
|
|
|
bool
|
|
AsyncDecryptAndVerify(
|
|
std::shared_ptr<Logic> logic,
|
|
path::Path_ptr fromPath,
|
|
const std::shared_ptr<llarp::thread::ThreadPool>& worker,
|
|
const Identity& localIdent,
|
|
IDataHandler* handler) const;
|
|
|
|
bool
|
|
DecryptPayloadInto(const SharedSecret& sharedkey, ProtocolMessage& into) const;
|
|
|
|
bool
|
|
DecodeKey(const llarp_buffer_t& key, llarp_buffer_t* val) override;
|
|
|
|
bool
|
|
BEncode(llarp_buffer_t* buf) const override;
|
|
|
|
bool
|
|
BDecode(llarp_buffer_t* buf)
|
|
{
|
|
return bencode_decode_dict(*this, buf);
|
|
}
|
|
|
|
void
|
|
Clear() override
|
|
{
|
|
C.Zero();
|
|
D.Clear();
|
|
F.Zero();
|
|
T.Zero();
|
|
N.Zero();
|
|
Z.Zero();
|
|
R = 0;
|
|
version = LLARP_PROTO_VERSION;
|
|
}
|
|
|
|
bool
|
|
Verify(const ServiceInfo& from) const;
|
|
|
|
bool
|
|
HandleMessage(routing::IMessageHandler* h, AbstractRouter* r) const override;
|
|
};
|
|
} // namespace service
|
|
} // namespace llarp
|
|
|
|
#endif
|