LibCrypto: Use OpenSSL wrappers in KMAC
Use OpenSSL_MAC and OpenSSL_MAC_CTX wrappers together with OPENSSL_TRY to replace manual EVP_MAC resource management in KMAC::sign(). This eliminates manual EVP_MAC_free/EVP_MAC_CTX_free calls in every error path.
This commit is contained in:
parent
29ae949798
commit
4110a05684
3 changed files with 15 additions and 23 deletions
|
|
@ -48,14 +48,8 @@ ErrorOr<ByteBuffer> KMAC::sign(ReadonlyBytes key, ReadonlyBytes message, u32 out
|
|||
|
||||
auto const* mac_name = (m_kind == KMACKind::KMAC128) ? OSSL_MAC_NAME_KMAC128 : OSSL_MAC_NAME_KMAC256;
|
||||
|
||||
auto* mac = EVP_MAC_fetch(nullptr, mac_name, nullptr);
|
||||
if (!mac)
|
||||
return Error::from_string_literal("EVP_MAC_fetch failed for KMAC");
|
||||
|
||||
auto* ctx = EVP_MAC_CTX_new(mac);
|
||||
EVP_MAC_free(mac);
|
||||
if (!ctx)
|
||||
return Error::from_string_literal("EVP_MAC_CTX_new failed");
|
||||
auto mac = TRY(OpenSSL_MAC::wrap(EVP_MAC_fetch(nullptr, mac_name, nullptr)));
|
||||
auto ctx = TRY(OpenSSL_MAC_CTX::wrap(EVP_MAC_CTX_new(mac.ptr())));
|
||||
|
||||
size_t output_size = output_length_bits / 8;
|
||||
|
||||
|
|
@ -65,24 +59,12 @@ ErrorOr<ByteBuffer> KMAC::sign(ReadonlyBytes key, ReadonlyBytes message, u32 out
|
|||
params.append(OSSL_PARAM_octet_string(OSSL_MAC_PARAM_CUSTOM, const_cast<u8*>(customization.value().data()), customization.value().size()));
|
||||
params.append(OSSL_PARAM_END);
|
||||
|
||||
if (EVP_MAC_init(ctx, key.data(), key.size(), params.data()) != 1) {
|
||||
EVP_MAC_CTX_free(ctx);
|
||||
return Error::from_string_literal("EVP_MAC_init failed for KMAC");
|
||||
}
|
||||
|
||||
if (EVP_MAC_update(ctx, message.data(), message.size()) != 1) {
|
||||
EVP_MAC_CTX_free(ctx);
|
||||
return Error::from_string_literal("EVP_MAC_update failed for KMAC");
|
||||
}
|
||||
OPENSSL_TRY(EVP_MAC_init(ctx.ptr(), key.data(), key.size(), params.data()));
|
||||
OPENSSL_TRY(EVP_MAC_update(ctx.ptr(), message.data(), message.size()));
|
||||
|
||||
auto buf = TRY(ByteBuffer::create_uninitialized(output_size));
|
||||
size_t written = 0;
|
||||
if (EVP_MAC_final(ctx, buf.data(), &written, output_size) != 1) {
|
||||
EVP_MAC_CTX_free(ctx);
|
||||
return Error::from_string_literal("EVP_MAC_final failed for KMAC");
|
||||
}
|
||||
|
||||
EVP_MAC_CTX_free(ctx);
|
||||
OPENSSL_TRY(EVP_MAC_final(ctx.ptr(), buf.data(), &written, output_size));
|
||||
|
||||
if (written != output_size)
|
||||
return Error::from_string_literal("EVP_MAC_final returned an unexpected output length");
|
||||
|
|
|
|||
|
|
@ -100,6 +100,14 @@ class OpenSSL_PKEY_CTX {
|
|||
OPENSSL_WRAPPER_CLASS(OpenSSL_PKEY_CTX, EVP_PKEY_CTX, EVP_PKEY_CTX);
|
||||
};
|
||||
|
||||
class OpenSSL_MAC {
|
||||
OPENSSL_WRAPPER_CLASS(OpenSSL_MAC, EVP_MAC, EVP_MAC);
|
||||
};
|
||||
|
||||
class OpenSSL_MAC_CTX {
|
||||
OPENSSL_WRAPPER_CLASS(OpenSSL_MAC_CTX, EVP_MAC_CTX, EVP_MAC_CTX);
|
||||
};
|
||||
|
||||
class OpenSSL_MD_CTX {
|
||||
OPENSSL_WRAPPER_CLASS(OpenSSL_MD_CTX, EVP_MD_CTX, EVP_MD_CTX);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,5 +34,7 @@ void EVP_PKEY_CTX_free(EVP_PKEY_CTX*);
|
|||
void EVP_PKEY_free(EVP_PKEY*);
|
||||
void EVP_KDF_CTX_free(EVP_KDF_CTX* ctx);
|
||||
void EVP_KDF_free(EVP_KDF* kdf);
|
||||
void EVP_MAC_CTX_free(EVP_MAC_CTX*);
|
||||
void EVP_MAC_free(EVP_MAC*);
|
||||
void BN_free(BIGNUM*);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue