21#include <openssl/core_names.h>
22#include <openssl/params.h>
23#include <openssl/pem.h>
24#include <openssl/provider.h>
32extern OSSL_DISPATCH
const HMAC_SHA256_funcs[];
33extern OSSL_ALGORITHM
const HMAC_SHA256_algs[];
34extern OSSL_DISPATCH
const HMAC_SHA256_method[];
45 _lib = OSSL_LIB_CTX_new();
46 OSSL_PROVIDER_add_builtin(_lib,
"trinity-rsa-hmac-sha256", &InitProvider);
47 _handle = OSSL_PROVIDER_try_load(_lib,
"trinity-rsa-hmac-sha256", 1);
53 OSSL_PROVIDER_unload(_handle);
55 OSSL_LIB_CTX_free(_lib);
58 OSSL_LIB_CTX* GetLib()
const
63 static int InitProvider(
const OSSL_CORE_HANDLE* ,
const OSSL_DISPATCH* ,
const OSSL_DISPATCH** out,
void** )
65 *out = HMAC_SHA256_method;
69 static OSSL_ALGORITHM
const* QueryProvider(
void* ,
int operation_id,
int* no_cache)
72 if (operation_id == OSSL_OP_DIGEST)
73 return HMAC_SHA256_algs;
78 static CTX_DATA* DigestNew()
80 CTX_DATA* data =
new CTX_DATA();
85 static int DigestInit(
void* dctx, OSSL_PARAM
const*
params)
87 CTX_DATA* ctxData =
reinterpret_cast<CTX_DATA*
>(dctx);
90 if (OSSL_PARAM
const* keyParam = OSSL_PARAM_locate_const(
params,
"hmac-key"))
92 uint8 const* key =
nullptr;
94 if (OSSL_PARAM_get_octet_ptr(keyParam,
reinterpret_cast<void const**
>(&key), &keyLength))
104 static int DigestUpdate(
void* dctx,
const unsigned char* in,
size_t inl)
106 reinterpret_cast<CTX_DATA*
>(dctx)->hmac->UpdateData(in, inl);
110 static int DigestFinal(
void* dctx,
unsigned char* out,
size_t* outl,
size_t outsz)
112 CTX_DATA* ctxData =
reinterpret_cast<CTX_DATA*
>(dctx);
113 ctxData->hmac->Finalize();
114 *outl = std::min(ctxData->hmac->GetDigest().size(), outsz);
115 memcpy(out, ctxData->hmac->GetDigest().data(), *outl);
119 static void DigestFree(
void* dctx)
121 CTX_DATA* data =
reinterpret_cast<CTX_DATA*
>(dctx);
125 data->hmac =
nullptr;
130 static void* DigestDup(
void* dctx)
132 CTX_DATA
const* ctxDataFrom =
reinterpret_cast<CTX_DATA const*
>(dctx);
133 CTX_DATA* ctxDataTo = DigestNew();
134 if (ctxDataFrom->hmac)
140 static int DigestGetParams(OSSL_PARAM
params[])
142 OSSL_PARAM* p =
nullptr;
144 p = OSSL_PARAM_locate(
params, OSSL_DIGEST_PARAM_BLOCK_SIZE);
145 if (p !=
nullptr && !OSSL_PARAM_set_size_t(p, SHA256_CBLOCK))
148 p = OSSL_PARAM_locate(
params, OSSL_DIGEST_PARAM_SIZE);
152 p = OSSL_PARAM_locate(
params, OSSL_DIGEST_PARAM_XOF);
153 if (p !=
nullptr && !OSSL_PARAM_set_int(p, 0))
156 p = OSSL_PARAM_locate(
params, OSSL_DIGEST_PARAM_ALGID_ABSENT);
157 if (p !=
nullptr && !OSSL_PARAM_set_int(p, 1))
163 static OSSL_PARAM
const* DigestGettableParams()
165 static constexpr OSSL_PARAM Params[] =
167 OSSL_PARAM_size_t(OSSL_DIGEST_PARAM_BLOCK_SIZE, NULL),
168 OSSL_PARAM_size_t(OSSL_DIGEST_PARAM_SIZE, NULL),
169 OSSL_PARAM_int(OSSL_DIGEST_PARAM_XOF, NULL),
170 OSSL_PARAM_int(OSSL_DIGEST_PARAM_ALGID_ABSENT, NULL),
179 OSSL_PROVIDER* _handle;
182OSSL_DISPATCH
const HMAC_SHA256_funcs[] =
184 { OSSL_FUNC_DIGEST_NEWCTX, (void (*)())HMAC_SHA256_MD::DigestNew },
185 { OSSL_FUNC_DIGEST_INIT, (void (*)())HMAC_SHA256_MD::DigestInit },
186 { OSSL_FUNC_DIGEST_UPDATE, (void (*)())HMAC_SHA256_MD::DigestUpdate },
187 { OSSL_FUNC_DIGEST_FINAL, (void (*)())HMAC_SHA256_MD::DigestFinal },
188 { OSSL_FUNC_DIGEST_FREECTX, (void (*)())HMAC_SHA256_MD::DigestFree },
189 { OSSL_FUNC_DIGEST_DUPCTX, (void (*)())HMAC_SHA256_MD::DigestDup },
190 { OSSL_FUNC_DIGEST_GET_PARAMS, (void (*)())HMAC_SHA256_MD::DigestGetParams },
191 { OSSL_FUNC_DIGEST_GETTABLE_PARAMS, (void (*)())HMAC_SHA256_MD::DigestGettableParams },
195OSSL_ALGORITHM
const HMAC_SHA256_algs[] =
198 { OSSL_DIGEST_NAME_SHA2_256,
"provider=trinity-rsa-hmac-sha256", HMAC_SHA256_funcs,
"HMAC SHA265 \"digest\" for RSA" },
199 {
nullptr,
nullptr,
nullptr,
nullptr}
202OSSL_DISPATCH
const HMAC_SHA256_method[] =
204 { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void(*)())HMAC_SHA256_MD::QueryProvider },
217std::unique_ptr<EVP_MD, RsaSignature::DigestGenerator::EVP_MD_Deleter> RsaSignature::SHA256::GetGenerator()
const
219 return std::unique_ptr<EVP_MD, EVP_MD_Deleter>(EVP_MD_fetch(
nullptr, OSSL_DIGEST_NAME_SHA2_256,
"provider=default"));
222OSSL_LIB_CTX* RsaSignature::SHA256::GetLib()
const
227std::unique_ptr<OSSL_PARAM[]> RsaSignature::SHA256::GetParams()
const
232std::unique_ptr<EVP_MD, RsaSignature::DigestGenerator::EVP_MD_Deleter> RsaSignature::HMAC_SHA256::GetGenerator()
const
234 return std::unique_ptr<EVP_MD, EVP_MD_Deleter>(EVP_MD_fetch(HmacSha256Md.GetLib(), OSSL_DIGEST_NAME_SHA2_256,
"provider=trinity-rsa-hmac-sha256"));
237OSSL_LIB_CTX* RsaSignature::HMAC_SHA256::GetLib()
const
239 return HmacSha256Md.GetLib();
242std::unique_ptr<OSSL_PARAM[]> RsaSignature::HMAC_SHA256::GetParams()
const
244 return std::unique_ptr<OSSL_PARAM[]>(
new OSSL_PARAM[2]
246 OSSL_PARAM_octet_ptr(
"hmac-key",
const_cast<void**
>(
reinterpret_cast<void const* const*
>(&
_key)), _keyLength),
262 *
this = std::move(other);
267 EVP_MD_CTX_free(
_ctx);
276 EVP_MD_CTX_copy_ex(
_ctx, right.
_ctx);
278 EVP_PKEY_up_ref(
_key);
288 _key = std::exchange(right._key, EVP_PKEY_new());
300 auto keyBIO = make_unique_ptr_with_deleter<&BIO_free>(BIO_new_file(fileName.c_str(),
"r"));
304 _key = EVP_PKEY_new();
305 if (!PEM_read_bio_PrivateKey(keyBIO.get(), &
_key,
nullptr,
nullptr))
319 auto keyBIO = make_unique_ptr_with_deleter<&BIO_free>(BIO_new_mem_buf(
320 const_cast<char*
>(keyPem.c_str()) ,
321 keyPem.length() + 1));
325 _key = EVP_PKEY_new();
326 if (!PEM_read_bio_PrivateKey(keyBIO.get(), &
_key,
nullptr,
nullptr))
334 std::unique_ptr<EVP_MD, DigestGenerator::EVP_MD_Deleter> digestGenerator = generator.
GetGenerator();
336 auto keyCtx = make_unique_ptr_with_deleter<&EVP_PKEY_CTX_free>(EVP_PKEY_CTX_new_from_pkey(generator.
GetLib(),
_key,
nullptr));
337 EVP_MD_CTX_set_pkey_ctx(
_ctx, keyCtx.get());
340 int result = EVP_DigestSignInit_ex(
_ctx,
nullptr, EVP_MD_get0_name(digestGenerator.get()), generator.
GetLib(),
nullptr,
_key,
params.get());
345 result = EVP_DigestSignUpdate(
_ctx, message, messageLength);
349 size_t signatureLength = 0;
350 result = EVP_DigestSignFinal(
_ctx,
nullptr, &signatureLength);
354 output.resize(signatureLength);
355 result = EVP_DigestSignFinal(
_ctx, output.data(), &signatureLength);
356 std::reverse(output.begin(), output.end());
std::unordered_set< uint32 > params[2]
virtual std::unique_ptr< OSSL_PARAM[]> GetParams() const =0
virtual std::unique_ptr< EVP_MD, EVP_MD_Deleter > GetGenerator() const =0
virtual OSSL_LIB_CTX * GetLib() const =0
bool LoadKeyFromFile(std::string const &fileName)
RsaSignature & operator=(RsaSignature const &right)
bool LoadKeyFromString(std::string const &keyPem)
bool Sign(std::array< uint8, N > const &message, DigestGenerator &generator, std::vector< uint8 > &output)
Trinity::Impl::GenericHMAC< EVP_sha256, Constants::SHA256_DIGEST_LENGTH_BYTES > HMAC_SHA256
static constexpr size_t SHA256_DIGEST_LENGTH_BYTES
void operator()(EVP_MD *md) const
static EVP_MD_CTX * MakeCTX() noexcept