Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Openssl3 HMAC Deperated #157

Draft
wants to merge 50 commits into
base: openssl3
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
9770129
add wrapping for new APIs
cps-b Nov 10, 2023
a26ab83
remove deprecated functions
cps-b Nov 13, 2023
b48aac5
fixup! remove deprecated functions add required functions that were i…
cps-b Nov 13, 2023
0caac47
add function prototype to .h
cps-b Nov 13, 2023
daae945
readd old pointer type definitions
cps-b Nov 13, 2023
e1b021d
remove old pointer type definitions
cps-b Nov 13, 2023
734aaa2
add missing ;
cps-b Nov 13, 2023
acdc181
remove additional argument
cps-b Nov 13, 2023
1b40181
use OSSL_LIB_CTX_Ptr
cps-b Nov 14, 2023
22b7daf
fix parameter in call to OSSL_PARAM_construct_utf8_string
cps-b Nov 14, 2023
277a35c
fix incorrect pointer
cps-b Nov 14, 2023
7e9a1c8
add missing ;
cps-b Nov 14, 2023
f012d98
Use _Ptr instead of *
cps-b Nov 14, 2023
5723922
fix incorrect function signatures
cps-b Nov 14, 2023
d87ba0b
add missing pointer type
cps-b Nov 14, 2023
c11b4ec
add createOpenSSLObject for EVP_MAC_CTX
cps-b Nov 14, 2023
c3957e4
add OSSL_PARAM_construct_utf8_string and OSSL_PARAM_construct_end usi…
cps-b Nov 14, 2023
8eac458
add missing , between arguments
cps-b Nov 14, 2023
30fd5c5
fix SSL_OSSL_PARAM_construct_utf8_string declaration
cps-b Nov 14, 2023
2c0c3f8
remove typo :
cps-b Nov 14, 2023
206853f
change int to size_t
cps-b Nov 14, 2023
801dbef
use proper raw pointer
cps-b Nov 14, 2023
f345b98
use raw pointer
cps-b Nov 14, 2023
8162ff1
fix typo in template type
cps-b Nov 14, 2023
03e4822
update signature of _EVP_MAC_fetch to use raw pointer
cps-b Nov 14, 2023
d08e889
correct usage of raw pointer in _EVP_MAC_CTX_new
cps-b Nov 14, 2023
4286acf
fix typo
cps-b Nov 14, 2023
04150e0
remove HMAC_CTX object creation
cps-b Nov 14, 2023
f276821
add params.h to check for OSSL_MAC_PARAM_DIGEST
cps-b Nov 14, 2023
7968653
remove params.h, but add hmac.h
cps-b Nov 14, 2023
9799dcb
remove hmac.h, add core_names.h
cps-b Nov 14, 2023
1563b09
convert to char* instead of const char*
cps-b Nov 14, 2023
eb7ace2
fix template definition of array
cps-b Nov 14, 2023
f568b24
convert mac to EVP_MAC_Ptr
cps-b Nov 14, 2023
e397c9e
add proper implementation for _EVP_MAC_CTX_new
cps-b Nov 14, 2023
1060ac1
fix typo
cps-b Nov 14, 2023
2ea187f
remove tamplate for EVP_MAC_CTX creation
cps-b Nov 14, 2023
efad578
use variadic templates for passing arguments in createManagedOpenSSLO…
cps-b Nov 15, 2023
80b1fe0
add missing variadic ...
cps-b Nov 15, 2023
2dc8562
avoid fall-thorugh in switch statement
cps-b Nov 24, 2023
642f2ce
Add template fix
johnfxgalea-e Nov 27, 2023
abdd44b
add mocks
cps-b Nov 30, 2023
836d926
remove double declaration
cps-b Nov 30, 2023
2557a75
remove double declaration
cps-b Nov 30, 2023
ec5d861
add missing brackets
cps-b Nov 30, 2023
d53994c
fix typo
cps-b Nov 30, 2023
9c8150d
fix incorrect function added by add_function ptyhon script
cps-b Nov 30, 2023
ff69341
fix number of arguments
cps-b Nov 30, 2023
154a486
fix missing *
cps-b Nov 30, 2023
0e3fbd4
deleted old code
cps-b Dec 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions src/mac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,22 @@ class HMAC::Impl
public:
Impl(openssl::DigestTypes hashFunction, const std::vector<uint8_t> &key)
{
const EVP_MD *digestFn = openssl::_getMDPtrFromDigestType(hashFunction);

if (key.empty()) {
throw MoCOCrWException("Key for HMAC is empty.");
}

_ctx = openssl::_HMAC_CTX_new();
openssl::_HMAC_Init_ex(_ctx.get(), key, digestFn, NULL);
openssl::OSSL_LIB_CTX_Ptr library_context = openssl::_OSSL_LIB_CTX_new();
openssl::EVP_MAC_Ptr mac = openssl::_EVP_MAC_fetch(library_context.get(), "HMAC");

_ctx = openssl::_EVP_MAC_CTX_new(mac.get());

std::array<OSSL_PARAM, 4> ossl_params = openssl::_getOSSLParamFromDigestType(hashFunction);
OSSL_PARAM params[4];
std::copy(std::begin(ossl_params), std::end(ossl_params), std::begin(params));

openssl::_EVP_MAC_init(_ctx.get(), key, params);

}

~Impl() = default;
Expand All @@ -55,7 +63,7 @@ class HMAC::Impl
if (_isFinished) {
throw MoCOCrWException("update() can't be called after finish()");
}
openssl::_HMAC_Update(_ctx.get(), message);
openssl::_EVP_MAC_update(_ctx.get(), message);
}

std::vector<uint8_t> finish()
Expand All @@ -64,7 +72,7 @@ class HMAC::Impl
throw MoCOCrWException("finish() can't be called twice.");
}

_result = openssl::_HMAC_Final(_ctx.get());
_result = openssl::_EVP_MAC_final(_ctx.get());

_isFinished = true;

Expand All @@ -89,7 +97,7 @@ class HMAC::Impl
}

private:
openssl::SSL_HMAC_CTX_Ptr _ctx = nullptr;
openssl::EVP_MAC_CTX_Ptr _ctx = nullptr;
bool _isFinished = false;
std::vector<uint8_t> _result;
};
Expand Down
26 changes: 20 additions & 6 deletions src/mococrw/openssl_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ extern "C" {
#include <openssl/ssl.h>
#include <openssl/x509.h>
#include <openssl/x509v3.h>
#include <openssl/core_names.h>
}

namespace mococrw
Expand All @@ -59,6 +60,8 @@ namespace lib
class OpenSSLLib
{
public:
static OSSL_PARAM SSL_OSSL_PARAM_construct_utf8_string(const char *key, char *buf, size_t bsize) noexcept;
static OSSL_PARAM SSL_OSSL_PARAM_construct_end() noexcept;
static void SSL_OPENSSL_cleanse(void *ptr, size_t len) noexcept;
static int SSL_EVP_PKEY_bits(EVP_PKEY *pkey) noexcept;
static const char *SSL_EC_curve_nid2nist(int nid) noexcept;
Expand Down Expand Up @@ -436,13 +439,24 @@ class OpenSSLLib
size_t sinfolen,
const EVP_MD *md) noexcept;

static OSSL_LIB_CTX *OSSL_LIB_CTX_new(void) noexcept;
static void OSSL_LIB_CTX_free(OSSL_LIB_CTX *ctx) noexcept;


/* HMAC */
static void SSL_HMAC_CTX_free(HMAC_CTX *ctx) noexcept;
static HMAC_CTX *SSL_HMAC_CTX_new() noexcept;
static int SSL_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) noexcept;
static int SSL_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len) noexcept;
static int SSL_HMAC_Init_ex(
HMAC_CTX *ctx, const void *key, int key_len, const EVP_MD *md, ENGINE *impl) noexcept;
static void EVP_MAC_CTX_free(EVP_MAC_CTX *ctx) noexcept;
static EVP_MAC_CTX *EVP_MAC_CTX_new(EVP_MAC *mac) noexcept;
static int EVP_MAC_final(EVP_MAC_CTX *ctx, unsigned char *out, int *outl, int outsize) noexcept;
static int EVP_MAC_update(EVP_MAC_CTX *ctx, const unsigned char *data, int datalen) noexcept;
static int EVP_MAC_init(EVP_MAC_CTX *ctx,
const unsigned char *key,
int keylen,
const OSSL_PARAM params[]) noexcept;
static EVP_MAC *EVP_MAC_fetch(OSSL_LIB_CTX *libctx,
const char *algorithm,
const char *properties) noexcept;

static void EVP_MAC_free(EVP_MAC *mac) noexcept;

/* CMAC */
static CMAC_CTX *SSL_CMAC_CTX_new() noexcept;
Expand Down
43 changes: 31 additions & 12 deletions src/mococrw/openssl_wrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,17 @@ using SSL_PKCS8_PRIV_KEY_INFO_Ptr = std::unique_ptr<
using SSL_PKCS8_PRIV_KEY_INFO_SharedPtr =
utility::SharedPtrTypeFromUniquePtr<SSL_PKCS8_PRIV_KEY_INFO_Ptr>;

using SSL_HMAC_CTX_Ptr =
std::unique_ptr<HMAC_CTX, SSLDeleter<HMAC_CTX, lib::OpenSSLLib::SSL_HMAC_CTX_free>>;
using SSL_HMAC_CTX_SharedPtr = utility::SharedPtrTypeFromUniquePtr<SSL_HMAC_CTX_Ptr>;

using EVP_MAC_CTX_Ptr =
std::unique_ptr<EVP_MAC_CTX, SSLDeleter<EVP_MAC_CTX, lib::OpenSSLLib::EVP_MAC_CTX_free>>;
using EVP_MAC_CTX_SharedPtr = utility::SharedPtrTypeFromUniquePtr<EVP_MAC_CTX_Ptr>;

using EVP_MAC_Ptr = std::unique_ptr<EVP_MAC, SSLDeleter<EVP_MAC, lib::OpenSSLLib::EVP_MAC_free>>;
using EVP_MAC_SharedPtr = utility::SharedPtrTypeFromUniquePtr<EVP_MAC_Ptr>;

using OSSL_LIB_CTX_Ptr =
std::unique_ptr<OSSL_LIB_CTX, SSLDeleter<OSSL_LIB_CTX, lib::OpenSSLLib::OSSL_LIB_CTX_free>>;
using OSSL_LIB_CTX_SharedPtr = utility::SharedPtrTypeFromUniquePtr<OSSL_LIB_CTX_Ptr>;

using SSL_CMAC_CTX_Ptr =
std::unique_ptr<CMAC_CTX, SSLDeleter<CMAC_CTX, lib::OpenSSLLib::SSL_CMAC_CTX_free>>;
Expand Down Expand Up @@ -665,6 +673,13 @@ void _X509_REQ_sign_ctx(X509_REQ *req, EVP_MD_CTX *ctx);
*/
const EVP_MD *_getMDPtrFromDigestType(DigestTypes type);

/**
* Get OSSL Params array for a given digest type.
* @param type
* @throws std::runtime_error if the requested digest function was not found.
*/
const std::array<OSSL_PARAM, 4> _getOSSLParamFromDigestType(DigestTypes type);

/**
* Create an MD_CTX object.
*
Expand Down Expand Up @@ -828,13 +843,13 @@ void _X509_verify_cert(X509_STORE_CTX *ctx);
*
* @throw OpenSSLException when no object could be created
*/
template <class SslType>
SslType *createOpenSSLObject();
template <class SslType, typename... Types>
SslType *createOpenSSLObject(Types... args);

template <class SSLSmartPtrType>
SSLSmartPtrType createManagedOpenSSLObject()
template <class SSLSmartPtrType, typename... Types>
SSLSmartPtrType createManagedOpenSSLObject(Types... args)
{
return SSLSmartPtrType{createOpenSSLObject<typename SSLSmartPtrType::element_type>()};
return SSLSmartPtrType{createOpenSSLObject<typename SSLSmartPtrType::element_type>(args...)};
}

template <class StackType, class ObjType>
Expand Down Expand Up @@ -1481,11 +1496,15 @@ void _ECDH_KDF_X9_63(std::vector<uint8_t> &out,
const std::vector<uint8_t> &sinfo,
const EVP_MD *md);

OSSL_LIB_CTX_Ptr _OSSL_LIB_CTX_new(void);

/* HMAC */
void _HMAC_Init_ex(HMAC_CTX *ctx, const std::vector<uint8_t> &key, const EVP_MD *md, ENGINE *impl);
std::vector<uint8_t> _HMAC_Final(HMAC_CTX *ctx);
void _HMAC_Update(HMAC_CTX *ctx, const std::vector<uint8_t> &data);
SSL_HMAC_CTX_Ptr _HMAC_CTX_new(void);
void _EVP_MAC_init(EVP_MAC_CTX *ctx, const std::vector<uint8_t> &key, const OSSL_PARAM params[]);
std::vector<uint8_t> _EVP_MAC_final(EVP_MAC_CTX *ctx);
void _EVP_MAC_update(EVP_MAC_CTX *ctx, const std::vector<uint8_t> &data);
EVP_MAC_CTX_Ptr _EVP_MAC_CTX_new(EVP_MAC *mac);

EVP_MAC_Ptr _EVP_MAC_fetch(OSSL_LIB_CTX *libctx, std::string algorithm);

/* CMAC */
SSL_CMAC_CTX_Ptr _CMAC_CTX_new(void);
Expand Down
57 changes: 48 additions & 9 deletions src/openssl_lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -919,22 +919,61 @@ int OpenSSLLib::SSL_ECDH_KDF_X9_63(unsigned char *out,
return ECDH_KDF_X9_62(out, outlen, Z, Zlen, sinfo, sinfolen, md);
}

int OpenSSLLib::SSL_HMAC_Init_ex(
HMAC_CTX *ctx, const void *key, int key_len, const EVP_MD *md, ENGINE *impl) noexcept
OSSL_LIB_CTX *OpenSSLLib::OSSL_LIB_CTX_new() noexcept
{
return HMAC_Init_ex(ctx, key, key_len, md, impl);
return OSSL_LIB_CTX_new();
}
int OpenSSLLib::SSL_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len) noexcept

void OpenSSLLib::OSSL_LIB_CTX_free(OSSL_LIB_CTX *ctx) noexcept
{
OSSL_LIB_CTX_free(ctx);
}

OSSL_PARAM OpenSSLLib::SSL_OSSL_PARAM_construct_utf8_string(const char *key, char *buf, size_t bsize) noexcept
{
return OSSL_PARAM_construct_utf8_string(key, buf, bsize);
}

OSSL_PARAM OpenSSLLib::SSL_OSSL_PARAM_construct_end() noexcept
{
return OSSL_PARAM_construct_end();
}

int OpenSSLLib::EVP_MAC_init(EVP_MAC_CTX *ctx, const unsigned char *key, int keylen, const OSSL_PARAM *params) noexcept
{
return EVP_MAC_init(ctx, key, keylen, params);
}

int OpenSSLLib::EVP_MAC_update(EVP_MAC_CTX *ctx, const unsigned char *data, int datalen) noexcept
{
return HMAC_Update(ctx, data, len);
return EVP_MAC_update(ctx, data, datalen);
}
int OpenSSLLib::SSL_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) noexcept

int OpenSSLLib::EVP_MAC_final(EVP_MAC_CTX *ctx, unsigned char *out, int *outl, int outsize) noexcept
{
return EVP_MAC_final(ctx, out, outl, outsize);
}

EVP_MAC_CTX *OpenSSLLib::EVP_MAC_CTX_new(EVP_MAC *mac) noexcept
{
return EVP_MAC_CTX_new(mac);
}

void OpenSSLLib::EVP_MAC_CTX_free(EVP_MAC_CTX *ctx) noexcept
{
EVP_MAC_CTX_free(ctx);
}

EVP_MAC *OpenSSLLib::EVP_MAC_fetch(OSSL_LIB_CTX *libctx, const char *algorithm, const char *properties) noexcept
{
return EVP_MAC_fetch(libctx, algorithm, properties);
}

void OpenSSLLib::EVP_MAC_free(EVP_MAC *mac) noexcept
{
return HMAC_Final(ctx, md, len);
EVP_MAC_free(mac);
}
HMAC_CTX *OpenSSLLib::SSL_HMAC_CTX_new() noexcept { return HMAC_CTX_new(); }

void OpenSSLLib::SSL_HMAC_CTX_free(HMAC_CTX *ctx) noexcept { HMAC_CTX_free(ctx); }

int OpenSSLLib::SSL_EC_KEY_oct2key(EC_KEY *eckey, const unsigned char *buf, size_t len) noexcept
{
Expand Down
83 changes: 67 additions & 16 deletions src/openssl_wrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,45 @@ const EVP_MD *_getMDPtrFromDigestType(DigestTypes type)
}
}

const std::array<OSSL_PARAM, 4> _getOSSLParamFromDigestType(DigestTypes type)
{
std::string digest_name;
switch (type) {
case DigestTypes::SHA1:
digest_name = "SHA1";
break;
case DigestTypes::SHA256:
digest_name = "SHA256";
break;
case DigestTypes::SHA384:
digest_name = "SHA384";
break;
case DigestTypes::SHA512:
digest_name = "SHA512";
break;
case DigestTypes::SHA3_256:
digest_name = "SHA3-256";
break;
case DigestTypes::SHA3_384:
digest_name = "SHA3-384";
break;
case DigestTypes::SHA3_512:
digest_name = "SHA3-512";
break;
default:
throw std::runtime_error("Unknown digest type");
}

OSSL_PARAM params[4], *p = params;
*p++ = lib::OpenSSLLib::SSL_OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, const_cast<char*>(digest_name.c_str()), sizeof(digest_name.c_str()));
*p = lib::OpenSSLLib::SSL_OSSL_PARAM_construct_end();

std::array<OSSL_PARAM, 4> ossl_params;
std::copy(std::begin(params), std::end(params), ossl_params.begin());

return ossl_params;
}

void _EVP_DigestSignInit(EVP_MD_CTX *ctx, DigestTypes type, EVP_PKEY *pkey)
{
const EVP_MD *md;
Expand Down Expand Up @@ -661,9 +700,9 @@ X509_CRL *createOpenSSLObject<X509_CRL>()
}

template <>
HMAC_CTX *createOpenSSLObject<HMAC_CTX>()
EVP_MAC_CTX *createOpenSSLObject<EVP_MAC_CTX>(EVP_MAC *mac)
{
return OpensslCallPtr::callChecked(lib::OpenSSLLib::SSL_HMAC_CTX_new);
return OpensslCallPtr::callChecked(lib::OpenSSLLib::EVP_MAC_CTX_new, mac);
}

template <>
Expand Down Expand Up @@ -1440,31 +1479,43 @@ void _ECDH_KDF_X9_63(std::vector<uint8_t> &out,
md);
}

void _HMAC_Init_ex(HMAC_CTX *ctx, const std::vector<uint8_t> &key, const EVP_MD *md, ENGINE *impl)

OSSL_LIB_CTX_Ptr _OSSL_LIB_CTX_new(void) {
return createManagedOpenSSLObject<OSSL_LIB_CTX_Ptr>();
}

void _EVP_MAC_init(EVP_MAC_CTX *ctx, const std::vector<uint8_t> &key, const OSSL_PARAM params[])
{
OpensslCallIsOne::callChecked(lib::OpenSSLLib::SSL_HMAC_Init_ex,
OpensslCallIsOne::callChecked(lib::OpenSSLLib::EVP_MAC_init,
ctx,
reinterpret_cast<const void *>(key.data()),
reinterpret_cast<const unsigned char *>(key.data()),
key.size(),
md,
impl);
params);
}

std::vector<uint8_t> _EVP_MAC_final(EVP_MAC_CTX *ctx)
{
int outlen = 0;
OpensslCallIsOne::callChecked(lib::OpenSSLLib::EVP_MAC_final, ctx, nullptr, &outlen, 0);
std::vector<uint8_t> out(outlen);
OpensslCallIsOne::callChecked(lib::OpenSSLLib::EVP_MAC_final, ctx, out.data(), &outlen, outlen);
return out;
}

std::vector<uint8_t> _HMAC_Final(HMAC_CTX *ctx)
void _EVP_MAC_update(EVP_MAC_CTX *ctx, const std::vector<uint8_t> &data)
{
unsigned int length = EVP_MAX_MD_SIZE;
std::vector<uint8_t> md(length);
OpensslCallIsOne::callChecked(lib::OpenSSLLib::SSL_HMAC_Final, ctx, md.data(), &length);
md.resize(length);
return md;
OpensslCallIsOne::callChecked(lib::OpenSSLLib::EVP_MAC_update, ctx, data.data(), data.size());
}

void _HMAC_Update(HMAC_CTX *ctx, const std::vector<uint8_t> &data)
EVP_MAC_CTX_Ptr _EVP_MAC_CTX_new(EVP_MAC *mac)
{
OpensslCallIsOne::callChecked(lib::OpenSSLLib::SSL_HMAC_Update, ctx, data.data(), data.size());
return createManagedOpenSSLObject<EVP_MAC_CTX_Ptr, EVP_MAC*>(mac);
}

SSL_HMAC_CTX_Ptr _HMAC_CTX_new() { return createManagedOpenSSLObject<SSL_HMAC_CTX_Ptr>(); }
EVP_MAC_Ptr _EVP_MAC_fetch(OSSL_LIB_CTX *libctx, std::string algorithm) {
return EVP_MAC_Ptr{OpensslCallPtr::callChecked(
lib::OpenSSLLib::EVP_MAC_fetch, libctx, algorithm.c_str(), nullptr)};
}

SSL_CMAC_CTX_Ptr _CMAC_CTX_new(void) { return createManagedOpenSSLObject<SSL_CMAC_CTX_Ptr>(); }

Expand Down
Loading