14#ifndef OPENVPN_CRYPTO_OVPNHMAC_H
15#define OPENVPN_CRYPTO_OVPNHMAC_H
30template <
typename CRYPTO_API>
49 return ctx.is_initialized();
64 throw ovpn_hmac_context_digest_size();
71 const size_t out_size,
72 const unsigned char *in,
76 ctx.update(in, in_size);
83 const size_t data_size,
91 throw ovpn_hmac_context_bad_sizing();
96 const size_t data_size,
101 unsigned char local_hmac[CRYPTO_API::HMACContext::MAX_HMAC_SIZE];
104 ctx.final(local_hmac);
119 const size_t data_size,
124 const size_t lsum = l1 + l2 + l3;
125 if (lsum > data_size || l2 !=
ctx.size())
128 ctx.update(data + l1 + l2, l3);
129 ctx.update(data, l1);
130 ctx.update(data + lsum, data_size - lsum);
134 typename CRYPTO_API::HMACContext
ctx;
149 const size_t data_size,
152 const size_t l3) = 0;
155 const size_t data_size,
158 const size_t l3) = 0;
166 virtual size_t size()
const = 0;
181template <
typename CRYPTO_API>
201 const size_t data_size,
204 const size_t l3)
override
206 ovpn_hmac.ovpn_hmac_gen(data, data_size, l1, l2, l3);
210 const size_t data_size,
213 const size_t l3)
override
215 return ovpn_hmac.ovpn_hmac_cmp(data, data_size, l1, l2, l3);
223template <
typename CRYPTO_API>
246template <
typename CRYPTO_API>
OvpnHMACInstance::Ptr new_obj() override
CryptoOvpnHMACContext(const CryptoAlgs::Type digest_type)
size_t size() const override
OvpnHMACContext::Ptr new_obj(const CryptoAlgs::Type digest_type) override
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) override
void ovpn_hmac_gen(unsigned char *data, const size_t data_size, const size_t l1, const size_t l2, const size_t l3) override
CryptoOvpnHMACInstance(const CryptoAlgs::Type digest_arg)
OvpnHMAC< CRYPTO_API > ovpn_hmac
void init(const StaticKey &key) override
size_t output_size() const override
virtual OvpnHMACInstance::Ptr new_obj()=0
virtual size_t size() const =0
RCPtr< OvpnHMACContext > Ptr
virtual OvpnHMACContext::Ptr new_obj(const CryptoAlgs::Type digest_type)=0
RCPtr< OvpnHMACFactory > Ptr
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
RCPtr< OvpnHMACInstance > Ptr
virtual size_t output_size() const =0
bool ovpn_hmac_pre(const unsigned char *data, const size_t data_size, const size_t l1, const size_t l2, const size_t l3)
void ovpn_hmac_gen(unsigned char *data, const size_t data_size, const size_t l1, const size_t l2, const size_t l3)
size_t output_size() const
OPENVPN_SIMPLE_EXCEPTION(ovpn_hmac_context_digest_size)
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)
CRYPTO_API::HMACContext ctx
void init(const CryptoAlgs::Type digest, const StaticKey &key)
OvpnHMAC(const CryptoAlgs::Type digest, const StaticKey &key)
void hmac(unsigned char *out, const size_t out_size, const unsigned char *in, const size_t in_size)
OPENVPN_SIMPLE_EXCEPTION(ovpn_hmac_context_bad_sizing)
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
const unsigned char * data() const
const Alg & get(const Type type)
size_t size(const Type type)
bool memneq(const void *a, const void *b, size_t size)
static std::stringstream out