mirror of
https://github.com/lux-tel/libsession-util.git
synced 2026-10-30 20:25:11 +00:00
99 lines
3.3 KiB
C++
99 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include <oxen/quic/address.hpp>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <variant>
|
|
|
|
#include "session/network/session_network_types.hpp"
|
|
|
|
namespace session::network {
|
|
struct service_node;
|
|
struct request_info;
|
|
struct Request;
|
|
} // namespace session::network
|
|
|
|
namespace session::onionreq {
|
|
|
|
namespace detail {
|
|
|
|
session::network::x25519_pubkey pubkey_for_destination(
|
|
network::network_destination destination);
|
|
}
|
|
|
|
enum class EncryptType {
|
|
aes_gcm,
|
|
xchacha20,
|
|
};
|
|
|
|
// Takes the encryption type as a string, returns the EncryptType value (or throws if invalid).
|
|
// Supported values: aes-gcm and xchacha20. gcm is accepted as an aliases for aes-gcm.
|
|
EncryptType parse_enc_type(std::string_view enc_type);
|
|
|
|
inline constexpr std::string_view to_string(EncryptType type) {
|
|
switch (type) {
|
|
case EncryptType::xchacha20: return "xchacha20"sv;
|
|
case EncryptType::aes_gcm: return "aes-gcm"sv;
|
|
}
|
|
return ""sv;
|
|
}
|
|
|
|
// Builder class for preparing onion request payloads.
|
|
class Builder {
|
|
public:
|
|
Builder(const network::network_destination& destination,
|
|
const std::string& endpoint,
|
|
const std::vector<network::service_node>& nodes,
|
|
const EncryptType enc_type_ = EncryptType::xchacha20);
|
|
|
|
static Builder make(
|
|
const network::network_destination& destination,
|
|
const std::string& endpoint,
|
|
const std::vector<network::service_node>& nodes,
|
|
const EncryptType enc_type_ = EncryptType::xchacha20);
|
|
|
|
EncryptType enc_type;
|
|
bool is_v4_request;
|
|
std::optional<network::x25519_keypair> final_hop_x25519_keypair = std::nullopt;
|
|
|
|
Builder(EncryptType enc_type_ = EncryptType::xchacha20) : enc_type{enc_type_} {}
|
|
|
|
void set_enc_type(EncryptType enc_type_) { enc_type = enc_type_; }
|
|
std::optional<network::x25519_pubkey> get_destination_x25519_public_key() const {
|
|
return destination_x25519_public_key_;
|
|
};
|
|
|
|
void set_destination(network::network_destination destination);
|
|
void add_hop(std::span<const unsigned char> remote_key);
|
|
void add_hop(std::pair<network::ed25519_pubkey, network::x25519_pubkey> keys) {
|
|
hops_.push_back(keys);
|
|
}
|
|
|
|
std::vector<unsigned char> build(std::vector<unsigned char> payload);
|
|
std::vector<unsigned char> generate_onion_blob(
|
|
const std::optional<std::vector<unsigned char>>& plaintext_body);
|
|
|
|
private:
|
|
std::vector<std::pair<network::ed25519_pubkey, network::x25519_pubkey>> hops_ = {};
|
|
std::string endpoint_;
|
|
std::optional<network::x25519_pubkey> destination_x25519_public_key_ = std::nullopt;
|
|
|
|
// Snode request values
|
|
|
|
std::optional<network::ed25519_pubkey> ed25519_public_key_ = std::nullopt;
|
|
|
|
// Proxied request values
|
|
|
|
std::optional<std::string> host_ = std::nullopt;
|
|
std::optional<std::string> protocol_ = std::nullopt;
|
|
std::optional<std::string> method_ = std::nullopt;
|
|
std::optional<uint16_t> port_ = std::nullopt;
|
|
std::optional<std::vector<std::pair<std::string, std::string>>> headers_ = std::nullopt;
|
|
std::optional<std::vector<std::pair<std::string, std::string>>> query_params_ = std::nullopt;
|
|
|
|
std::vector<unsigned char> _generate_payload(
|
|
std::optional<std::vector<unsigned char>> body) const;
|
|
};
|
|
|
|
} // namespace session::onionreq
|