forked from blue/squawk
71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
/*
|
|
* Created by victoria on 2021-05-13.
|
|
*/
|
|
|
|
#include "hmac_sha256_openssl.h"
|
|
|
|
extern "C" {
|
|
#include <openssl/evp.h>
|
|
#include <openssl/hmac.h>
|
|
#include <openssl/sha.h>
|
|
}
|
|
|
|
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_CTX *>(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_CTX *>(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_CTX *>(hmac_context);
|
|
#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
|
|
HMAC_CTX_free(ctx);
|
|
#else
|
|
HMAC_CTX_cleanup(ctx);
|
|
delete ctx;
|
|
#endif
|
|
}
|
|
} |