mirror of
https://github.com/lux-tel/libsession-util.git
synced 2026-10-30 20:25:11 +00:00
48 lines
1.6 KiB
C++
48 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <session/types.hpp>
|
|
|
|
#include "hop_encryption.hpp"
|
|
|
|
namespace session::onionreq {
|
|
|
|
/// The default maximum size of an onion request accepted by the OnionReqParser constructor.
|
|
constexpr size_t DEFAULT_MAX_SIZE = 10'485'760; // 10 MiB
|
|
|
|
class OnionReqParser {
|
|
private:
|
|
network::x25519_keypair keys;
|
|
HopEncryption enc;
|
|
EncryptType enc_type = EncryptType::aes_gcm;
|
|
network::x25519_pubkey remote_pk;
|
|
std::vector<unsigned char> payload_;
|
|
|
|
public:
|
|
/// Constructs a parser, parsing the given request sent to us. Throws if parsing or decryption
|
|
/// fails.
|
|
OnionReqParser(
|
|
std::span<const unsigned char> x25519_pubkey,
|
|
std::span<const unsigned char> x25519_privkey,
|
|
std::span<const unsigned char> req,
|
|
size_t max_size = DEFAULT_MAX_SIZE);
|
|
|
|
/// plaintext payload, decrypted from the incoming request during construction.
|
|
std::span<const unsigned char> payload() const { return to_span(payload_); }
|
|
|
|
/// Extracts payload from this object (via a std::move); after the call the object's payload
|
|
/// will be empty.
|
|
std::vector<unsigned char> move_payload() {
|
|
std::vector<unsigned char> ret{std::move(payload_)};
|
|
payload_.clear(); // Guarantee empty, even if SSO active
|
|
return ret;
|
|
}
|
|
|
|
std::span<const unsigned char> remote_pubkey() const { return to_span(remote_pk.view()); }
|
|
|
|
/// Encrypts a reply using the appropriate encryption as determined when parsing the
|
|
/// request.
|
|
std::vector<unsigned char> encrypt_reply(std::span<const unsigned char> reply) const;
|
|
};
|
|
|
|
} // namespace session::onionreq
|