14#ifndef OPENVPN_SSL_TLSPRF_H
15#define OPENVPN_SSL_TLSPRF_H
36template <
typename CRYPTO_API>
96 throw tlsprf_client_server_mismatch();
98 gen_exp(dest, peer, psid_peer, *
this, psid_self);
100 gen_exp(dest, *
this, psid_self, peer, psid_peer);
115 std::string
dump(
const char *title)
117 std::ostringstream
out;
130 const size_t secret_len,
132 const unsigned char *client_seed,
133 const size_t client_seed_len,
134 const unsigned char *server_seed,
135 const size_t server_seed_len,
138 unsigned char *output,
139 const size_t output_len)
141 const size_t label_len = std::strlen(label);
150 seed.
write((
unsigned char *)label, label_len);
151 seed.
write(client_seed, client_seed_len);
152 seed.
write(server_seed, server_seed_len);
154 client_sid->
write(seed);
156 server_sid->
write(seed);
159 if (!CRYPTO_API::TLS1PRF::PRF(seed.
data(),
166 throw tlsprf_tlsprf_failed();
177 static const char master_secret_id[] =
"OpenVPN master secret";
178 static const char key_expansion_id[] =
"OpenVPN key expansion";
180 unsigned char master[48];
211 std::memset(master, 0,
sizeof(master));
217 throw tlsprf_uninitialized();
257template <
typename CRYPTO_API>
262 :
self(self_is_server),
263 peer(!self_is_server)
284 return peer.read_complete(bc);
297 self.generate_key_expansion(dest,
peer, psid_self, psid_peer);
305template <
typename CRYPTO_API>
bool advance(size_t size)
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 write(const T *data, const size_t size)
Write data to the buffer.
void read(NCT *data, const size_t size)
Read data from the buffer into the specified memory location.
TLSPRFInstance::Ptr new_obj(const bool self_is_server) override
void self_randomize(StrongRandomAPI &rng) override
TLSPRF< CRYPTO_API > self
void generate_key_expansion(OpenVPNStaticKey &dest, const ProtoSessionID &psid_self, const ProtoSessionID &psid_peer) const override
void self_write(Buffer &buf) override
void peer_read(Buffer &buf) override
TLSPRF< CRYPTO_API > peer
CryptoTLSPRFInstance(const bool self_is_server)
bool peer_read_complete(BufferComplete &bc) override
unsigned char * raw_alloc()
void write(Buffer &buf) const
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
virtual void rand_bytes(unsigned char *buf, size_t size)=0
Fill a buffer with random bytes.
Abstract base class for cryptographically strong random number generators.
RCPtr< TLSPRFFactory > Ptr
virtual TLSPRFInstance::Ptr new_obj(const bool self_is_server)=0
virtual void self_write(Buffer &buf)=0
RCPtr< TLSPRFInstance > Ptr
virtual void peer_read(Buffer &buf)=0
virtual void self_randomize(StrongRandomAPI &rng)=0
virtual void generate_key_expansion(OpenVPNStaticKey &dest, const ProtoSessionID &psid_self, const ProtoSessionID &psid_peer) const =0
virtual bool peer_read_complete(BufferComplete &bc)=0
void verify_initialized() const
void randomize(StrongRandomAPI &rng)
unsigned char pre_master[48]
OPENVPN_SIMPLE_EXCEPTION(tlsprf_uninitialized)
OPENVPN_SIMPLE_EXCEPTION(tlsprf_tlsprf_failed)
static void openvpn_PRF(const unsigned char *secret, const size_t secret_len, const char *label, const unsigned char *client_seed, const size_t client_seed_len, const unsigned char *server_seed, const size_t server_seed_len, const ProtoSessionID *client_sid, const ProtoSessionID *server_sid, unsigned char *output, const size_t output_len)
void generate_key_expansion(OpenVPNStaticKey &dest, const TLSPRF &peer, const ProtoSessionID &psid_self, const ProtoSessionID &psid_peer) const
bool read_complete(BufferComplete &bc)
unsigned char random1[SIZE_OF_RANDOM]
std::string dump(const char *title)
static void gen_exp(OpenVPNStaticKey &dest, const TLSPRF &client, const ProtoSessionID &psid_client, const TLSPRF &server, const ProtoSessionID &psid_server)
TLSPRF(const bool server)
unsigned char random2[SIZE_OF_RANDOM]
OPENVPN_SIMPLE_EXCEPTION(tlsprf_client_server_mismatch)
constexpr BufferFlags DESTRUCT_ZERO(1u<< 1)
if enabled, destructor will zero data before deletion
std::string render_hex(const unsigned char *data, size_t size, const bool caps=false)
Implementation of the base classes for random number generators.
static std::stringstream out