14#ifndef OPENVPN_CRYPTO_TLSCRYPT_H
15#define OPENVPN_CRYPTO_TLSCRYPT_H
35template <
typename CRYPTO_API>
50 init(libctx, digest, key_hmac, cipher, key_crypt,
mode);
69 if (key_hmac.
size() < alg_hmac.
size())
70 throw ovpn_tls_crypt_context_digest_size();
81 bool hmac_gen(
unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len)
83 hmac_pre(header, header_len, payload, payload_len);
89 bool hmac_cmp(
const unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len)
91 unsigned char local_hmac[CRYPTO_API::HMACContext::MAX_HMAC_SIZE];
93 hmac_pre(header, header_len, payload, payload_len);
99 size_t encrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen)
101 if (
mode != CRYPTO_API::CipherContext::ENCRYPT)
102 throw ovpn_tls_crypt_wrong_mode();
107 size_t decrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen)
109 if (
mode != CRYPTO_API::CipherContext::DECRYPT)
110 throw ovpn_tls_crypt_wrong_mode();
117 void hmac_pre(
const unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len)
120 ctx_hmac.update(header, header_len);
121 ctx_hmac.update(payload, payload_len);
124 size_t encrypt_decrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen)
133 if (!
ctx_crypt.final(
out + outlen, olen - outlen, outlen))
155 virtual bool hmac_gen(
unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len) = 0;
157 virtual bool hmac_cmp(
const unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len) = 0;
159 virtual size_t encrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen) = 0;
161 virtual size_t decrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen) = 0;
198template <
typename CRYPTO_API>
223 bool hmac_gen(
unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len)
225 return tls_crypt.hmac_gen(header, header_len, payload, payload_len);
229 bool hmac_cmp(
const unsigned char *header,
const size_t header_len,
const unsigned char *payload,
const size_t payload_len)
231 return tls_crypt.hmac_cmp(header, header_len, payload, payload_len);
234 size_t encrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen)
239 size_t decrypt(
const unsigned char *iv,
unsigned char *
out,
const size_t olen,
const unsigned char *in,
const size_t ilen)
252template <
typename CRYPTO_API>
289template <
typename CRYPTO_API>
CryptoTLSCryptContext(SSLLib::Ctx libctx_arg, const CryptoAlgs::Type digest_type, const CryptoAlgs::Type cipher_type)
size_t digest_size() const override
TLSCryptInstance::Ptr new_obj_send() override
TLSCryptInstance::Ptr new_obj_recv() override
size_t cipher_key_size() const override
TLSCryptContext::Ptr new_obj(SSLLib::Ctx libctx, const CryptoAlgs::Type digest_type, const CryptoAlgs::Type cipher_type) override
size_t output_hmac_size() const
bool hmac_gen(unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)
CryptoTLSCryptInstance(SSLLib::Ctx libctx_arg, const CryptoAlgs::Type digest_arg, const CryptoAlgs::Type cipher_arg, int mode_arg)
size_t decrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)
size_t encrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)
TLSCrypt< CRYPTO_API > tls_crypt
bool hmac_cmp(const unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)
void init(SSLLib::Ctx libctx, const StaticKey &key_hmac, const StaticKey &key_crypt)
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
const unsigned char * data() const
virtual size_t cipher_key_size() const =0
RCPtr< TLSCryptContext > Ptr
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
RCPtr< TLSCryptFactory > Ptr
virtual TLSCryptContext::Ptr new_obj(SSLLib::Ctx libctx, const CryptoAlgs::Type digest_type, const CryptoAlgs::Type cipher_type)=0
virtual bool hmac_cmp(const unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)=0
virtual size_t output_hmac_size() const =0
virtual bool hmac_gen(unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)=0
virtual size_t encrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)=0
virtual void init(SSLLib::Ctx libctx, const StaticKey &key_hmac, const StaticKey &key_crypt)=0
virtual size_t decrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)=0
RCPtr< TLSCryptInstance > Ptr
void init(SSLLib::Ctx libctx, const CryptoAlgs::Type digest, const StaticKey &key_hmac, const CryptoAlgs::Type cipher, const StaticKey &key_crypt, const int mode_arg)
void hmac_pre(const unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)
size_t encrypt_decrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)
OPENVPN_SIMPLE_EXCEPTION(ovpn_tls_crypt_wrong_mode)
TLSCrypt(SSLLib::Ctx libctx, const CryptoAlgs::Type digest, const StaticKey &key_hmac, const CryptoAlgs::Type cipher, const StaticKey &key_crypt, const int mode)
CRYPTO_API::CipherContext ctx_crypt
OPENVPN_SIMPLE_EXCEPTION(ovpn_tls_crypt_context_bad_sizing)
bool hmac_gen(unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)
OPENVPN_SIMPLE_EXCEPTION(ovpn_tls_crypt_context_digest_size)
CRYPTO_API::HMACContext ctx_hmac
size_t decrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)
size_t encrypt(const unsigned char *iv, unsigned char *out, const size_t olen, const unsigned char *in, const size_t ilen)
bool hmac_cmp(const unsigned char *header, const size_t header_len, const unsigned char *payload, const size_t payload_len)
size_t output_hmac_size() const
const Alg & get(const Type type)
size_t key_length(const Type type)
size_t size(const Type type)
bool memneq(const void *a, const void *b, size_t size)
static constexpr size_t idsize
static std::stringstream out