#pragma once #include #include "policy.hpp" #include #include namespace llarp::routing { struct ObtainExitMessage final : public AbstractRoutingMessage { std::vector blacklist_policy; uint64_t flag{0}; // 0 for snode, 1 for internet access llarp::PubKey pubkey; uint64_t tx_id{0}; std::vector whitelist_policy; uint64_t address_lifetime{0}; llarp::Signature sig; ObtainExitMessage() : AbstractRoutingMessage() {} ~ObtainExitMessage() override = default; void clear() override { blacklist_policy.clear(); flag = 0; pubkey.Zero(); tx_id = 0; whitelist_policy.clear(); address_lifetime = 0; sig.Zero(); } /// populates I and signs bool Sign(const llarp::SecretKey& sk); bool Verify() const; std::string bt_encode() const override; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; }; struct GrantExitMessage final : public AbstractRoutingMessage { using Nonce_t = llarp::AlignedBuffer<16>; uint64_t tx_id; Nonce_t nonce; llarp::Signature sig; std::string bt_encode() const override; bool Sign(const llarp::SecretKey& sk); bool Verify(const llarp::PubKey& pk) const; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; void clear() override { tx_id = 0; nonce.Zero(); sig.Zero(); } }; struct RejectExitMessage final : public AbstractRoutingMessage { using Nonce_t = llarp::AlignedBuffer<16>; uint64_t backoff_time; std::vector blacklist_policy; uint64_t tx_id; Nonce_t nonce; llarp::Signature sig; void clear() override { backoff_time = 0; blacklist_policy.clear(); tx_id = 0; nonce.Zero(); sig.Zero(); } bool Sign(const llarp::SecretKey& sk); bool Verify(const llarp::PubKey& pk) const; std::string bt_encode() const override; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; }; struct UpdateExitVerifyMessage final : public AbstractRoutingMessage { using Nonce_t = llarp::AlignedBuffer<16>; uint64_t tx_id; Nonce_t nonce; llarp::Signature sig; ~UpdateExitVerifyMessage() override = default; void clear() override { tx_id = 0; nonce.Zero(); sig.Zero(); } std::string bt_encode() const override; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; }; struct UpdateExitMessage final : public AbstractRoutingMessage { using Nonce_t = llarp::AlignedBuffer<16>; llarp::PathID_t path_id; uint64_t tx_id; Nonce_t nonce; llarp::Signature sig; bool Sign(const llarp::SecretKey& sk); bool Verify(const llarp::PubKey& pk) const; std::string bt_encode() const override; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; void clear() override { path_id.Zero(); tx_id = 0; nonce.Zero(); sig.Zero(); } }; struct CloseExitMessage final : public AbstractRoutingMessage { using Nonce_t = llarp::AlignedBuffer<16>; Nonce_t nonce; llarp::Signature sig; std::string bt_encode() const override; bool decode_key(const llarp_buffer_t& key, llarp_buffer_t* buf) override; bool handle_message(AbstractRoutingMessageHandler* h, AbstractRouter* r) const override; bool Sign(const llarp::SecretKey& sk); bool Verify(const llarp::PubKey& pk) const; void clear() override { nonce.Zero(); sig.Zero(); } }; } // namespace llarp::routing