59 :
pcfg_(*psfp->proto_context_config),
104 return is_tls_crypt_v2
110 return is_tls_crypt_v2
128 pctb_ = std::move(pctb);
153 static const size_t reqd_packet_size
158 if (pkt_buf.
size() < reqd_packet_size)
169 recv_buf_copy.
advance(hmac_size);
172 cli_auth_pktid.
read(recv_buf_copy);
174 uint8_t cli_net_id[4];
176 recv_buf_copy.
read(cli_net_id,
sizeof(cli_net_id));
186 send_buf.
prepend(
static_cast<const void *
>(&net_id),
sizeof(net_id));
190 send_buf.
prepend(cli_net_id,
sizeof(cli_net_id));
236 static const size_t reqd_packet_size
243 if (pkt_buf.
size() < reqd_packet_size)
254 recv_buf_copy.
advance(hmac_size);
257 cli_auth_pktid.
read(recv_buf_copy);
259 unsigned int ack_count = recv_buf_copy[0];
287 replay_packet_id.
read(recv_buf_copy);
299 auto [send, recv] = *pipes;
308 packet_id.write(payload,
true);
310 client_session_id.
prepend(payload);
313 payload.
prepend(&acked_packet_id,
sizeof(acked_packet_id));
320 work.prepend_alloc(hmac_size);
338 work.data() + data_offset,
339 work.max_size() - data_offset,
342 work.inc_size(encrypt_bytes);
359 auto [send, recv] = *pipes;
364 const unsigned char *orig_data = pkt_buf.
c_data();
375 const size_t decrypt_bytes = recv->decrypt(orig_data + head_size,
379 recv_buf_copy.
size());
383 work.inc_size(decrypt_bytes);
448 uint32_t valid_time =
static_cast<uint32_t
>(
now_->
raw() / interval - offset);
450 hmac_ctx_.update(
reinterpret_cast<const unsigned char *
>(&valid_time),
455 size_t cli_addrport_size;
457 hmac_ctx_.update(cli_addr_port, cli_addrport_size);
464 BufferAllocated hmac_result(SSLLib::CryptoAPI::HMACContext::MAX_HMAC_SIZE);
467 srv_psid.
read(hmac_result);
478 for (
unsigned int offset = 0; offset <= 1; ++offset)
482 if (srv_psid.
match(calc_psid))
521 return std::pair{send, recv};
const T * c_data() const
Returns a const pointer to the start of the buffer.
T * prepend_alloc(const size_t size)
Allocate space for prepending data to the buffer.
T * write_alloc(const size_t size)
Allocate space for writing data to the buffer.
void prepend(const T *data, const size_t size)
Prepend data to the buffer.
size_t size() const
Returns the size of the buffer in T objects.
T * data()
Get a mutable pointer to the start of the array.
void advance(const size_t delta)
Advances the buffer by the specified delta.
bool empty() const
Returns true if the buffer is empty.
void push_front(const T &value)
Append a T object to the array, with possible resize.
void read(NCT *data, const size_t size)
Read data from the buffer into the specified memory location.
size_t prepare(const unsigned int context, Buffer &buf) const
StaticKey slice(unsigned int key_specifier) const
virtual OvpnHMACInstance::Ptr new_obj()=0
virtual void ovpn_hmac_gen(unsigned char *data, const size_t data_size, const size_t l1, const size_t l2, const size_t l3)=0
virtual void init(const StaticKey &key)=0
virtual bool ovpn_hmac_cmp(const unsigned char *data, const size_t data_size, const size_t l1, const size_t l2, const size_t l3)=0
virtual size_t output_size() const =0
void write_next(Buffer &buf, const bool prepend, const PacketIDControl::time_t now)
static Error::Type unwrap_tls_crypt_wkc(Buffer &recv, ProtoConfig &proto_config, TLSCryptInstance &tls_crypt_server, TLSCryptMetadata::Ptr tls_crypt_metadata=nullptr)
Extract and process the TLS crypt WKc information.
SSLFactoryAPI::Ptr ssl_factory
TLSCryptContext::Ptr tls_crypt_context
bool tls_auth_enabled() const
OpenVPNStaticKey tls_auth_key
leave this undefined to disable tls_auth
OpenVPNStaticKey wrapped_tls_crypt_key
For TLS crypt V2, this (if defined()) is the wrapped WKc client key.
OvpnHMACContext::Ptr tls_auth_context
bool tls_crypt_v2_enabled() const
static unsigned char get_server_hard_reset_opfield()
bool supports_early_negotiation(const PacketIDControl &pidc) const noexcept
Returns true if the peer supports early negotiation (i.e. is able to reply with CONTROL_WKC_V1).
static void prepend_TLV(Buffer &payload)
Adds an {EARLY_NEG_FLAGS, 2, EARLY_NEG_FLAG_RESEND_WKC} TLV to a payload buffer (use with TLS crypt V...
bool is_clients_server_reset_ack() const
bool is_tls_crypt_v2() const noexcept
Returns true if this is a TLS crypt V2 protocol packet.
bool is_clients_initial_reset() const
bool match(const ProtoSessionID &other) const
const Buffer get_buf() const
void prepend(Buffer &buf) const
Interface to communicate the server's address semantics.
virtual const unsigned char * get_abstract_cli_addrport(size_t &slab_size) const =0
Implements the PsidCookie interface.
static StaticKey create_key()
SSLLib::CryptoAPI::HMACContext hmac_ctx_
OvpnHMACInstance::Ptr ta_hmac_recv_
ProtoSessionID get_cookie_psid() override
Get the cookie psid from client's 2nd packet.
static const StaticKey & get_key()
ProtoSessionID cookie_psid_
const Time::Duration & handwindow_
bool check_session_id_hmac(const ProtoSessionID &srv_psid, const ProtoSessionID &cli_psid, const PsidCookieAddrInfoBase &pcaib)
PsidCookieTransportBase::Ptr pctb_
Intercept process_clients_initial_reset_tls_crypt(Buffer &pkt_buf, const PsidCookieAddrInfoBase &pcaib, const CookieHelper &ch)
static constexpr int SID_SIZE
ProtoContext::ProtoConfig & pcfg_
Intercept intercept(Buffer &pkt_buf, const PsidCookieAddrInfoBase &pcaib) override
Called when a potential new client session packet is received.
ProtoSessionID calculate_session_id_hmac(const ProtoSessionID &cli_psid, const PsidCookieAddrInfoBase &pcaib, unsigned int offset)
Calculate the psid cookie, the ProtoSessionID hmac.
Intercept process_clients_initial_reset_tls_auth(ConstBuffer &pkt_buf, const PsidCookieAddrInfoBase &pcaib)
static constexpr CryptoAlgs::Type digest_
std::optional< std::pair< TLSCryptInstance::Ptr, TLSCryptInstance::Ptr > > init_tls_crypt_v2(Buffer &pkt_buf)
Set up a couple of TLSCryptInstance (send, recv) from a TLS crypt V2 packet's WKc.
static void pre_threading_setup()
Intercept process_clients_server_reset_ack_tls_crypt(Buffer &pkt_buf, const PsidCookieAddrInfoBase &pcaib)
static constexpr int OPCODE_SIZE
Intercept process_clients_server_reset_ack_tls_auth(ConstBuffer &pkt_buf, const PsidCookieAddrInfoBase &pcaib)
void provide_psid_cookie_transport(PsidCookieTransportBase::Ptr pctb) override
Give this component the transport needed to send the server's HARD_RESET.
PsidCookieImpl(ServerProto::Factory *psfp)
OvpnHMACInstance::Ptr ta_hmac_send_
virtual bool psid_cookie_send_const(Buffer &send_buf, const PsidCookieAddrInfoBase &pcaib)=0
Interface to integrate this component into the server implementation.
Intercept
Values returned by the intercept() function.
virtual SSLLib::Ctx libctx()=0
virtual const Mode & mode() const =0
void init_from_rng(StrongRandomAPI &rng, const size_t key_size)
const unsigned char * data() const
virtual TLSCryptInstance::Ptr new_obj_send()=0
virtual TLSCryptInstance::Ptr new_obj_recv()=0
constexpr static const size_t hmac_offset
virtual size_t digest_size() const =0
virtual void init(SSLLib::Ctx libctx, const StaticKey &key_hmac, const StaticKey &key_crypt)=0
base_type seconds_since_epoch() const
void work(openvpn_io::io_context &io_context, ThreadCommon &tc, MyRunContext &runctx, const unsigned int unit)
const Alg & get(const Type type)
static constexpr std::size_t id_size
Support deferred server-side state creation when client connects.
static constexpr size_t size()
static constexpr size_t idsize