/* * Created by victoria on 2021-05-13. */ #include "hmac_sha256_openssl.h" extern "C" { #include #include #include } using namespace Signal::Crypto; int HmacSha256::init(void **hmac_context, const uint8_t *key, size_t key_len, void *) { #if OPENSSL_VERSION_NUMBER >= 0x1010000fL HMAC_CTX *ctx = HMAC_CTX_new(); if (!ctx) { return SG_ERR_NOMEM; } #else auto ctx = new HMAC_CTX; HMAC_CTX_init(ctx); #endif *hmac_context = ctx; if (HMAC_Init_ex(ctx, key, key_len, EVP_sha256(), nullptr) != 1) { return SG_ERR_UNKNOWN; } return SG_SUCCESS; } int HmacSha256::update(void *hmac_context, const uint8_t *data, size_t data_len, void *) { auto ctx = static_cast(hmac_context); int result = HMAC_Update(ctx, data, data_len); return (result == 1) ? SG_SUCCESS : SG_ERR_UNKNOWN; } int HmacSha256::final(void *hmac_context, signal_buffer **output, void *) { auto ctx = static_cast(hmac_context); unsigned char md[EVP_MAX_MD_SIZE]; unsigned int len = 0; if (HMAC_Final(ctx, md, &len) != 1) { return SG_ERR_UNKNOWN; } signal_buffer *output_buffer = signal_buffer_create(md, len); if (!output_buffer) { return SG_ERR_NOMEM; } *output = output_buffer; return SG_SUCCESS; } void HmacSha256::cleanup(void *hmac_context, void *) { if (hmac_context) { auto ctx = static_cast(hmac_context); #if OPENSSL_VERSION_NUMBER >= 0x1010000fL HMAC_CTX_free(ctx); #else HMAC_CTX_cleanup(ctx); delete ctx; #endif } }