* Generic HMAC functions
*
*/
-
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
HMAC_CTX *
hmac_ctx_new(void)
{
}
int
-hmac_ctx_size(const HMAC_CTX *ctx)
+hmac_ctx_size(HMAC_CTX *ctx)
{
return HMAC_size(ctx);
}
HMAC_Final(ctx, dst, &in_hmac_len);
}
+#else
+hmac_ctx_t *
+hmac_ctx_new(void)
+{
+ hmac_ctx_t *ctx;
+ ALLOC_OBJ_CLEAR(ctx, hmac_ctx_t);
+ EVP_MAC *hmac = EVP_MAC_fetch(NULL, "HMAC", NULL);
+ ctx->ctx = EVP_MAC_CTX_new(hmac);
+ check_malloc_return(ctx->ctx);
+ return ctx;
+}
+
+void
+hmac_ctx_free(hmac_ctx_t *ctx)
+{
+ EVP_MAC_CTX_free(ctx->ctx);
+ secure_memzero(ctx, sizeof(hmac_ctx_t));
+ free(ctx);
+}
+
+void
+hmac_ctx_init(hmac_ctx_t *ctx, const uint8_t *key, int key_len,
+ const EVP_MD *kt)
+{
+ ASSERT(NULL != kt && NULL != ctx && ctx->ctx != NULL);
+ ASSERT(key_len <= EVP_MAX_KEY_LENGTH);
+
+ /* We need to make a copy of the key since the OSSL parameters
+ * only reference it */
+ memcpy(ctx->key, key, key_len);
+
+ /* Lookup/setting of parameters in OpenSSL 3.0 are string based
+ *
+ * The OSSL_PARAM_construct_utf8_string needs a non const str but this
+ * only used for lookup so we cast (as OpenSSL also does internally)
+ * the constness away here.
+ */
+ ctx->params[0] = OSSL_PARAM_construct_utf8_string("digest",
+ (char *) EVP_MD_get0_name(kt), 0);
+ ctx->params[1] = OSSL_PARAM_construct_octet_string("key",
+ ctx->key, key_len);
+ ctx->params[2] = OSSL_PARAM_construct_end();
+
+ if (!EVP_MAC_init(ctx->ctx, NULL, 0, ctx->params))
+ {
+ crypto_msg(M_FATAL, "EVP_MAC_init failed");
+ }
+
+ /* make sure we used a big enough key */
+ ASSERT(EVP_MAC_CTX_get_mac_size(ctx->ctx) <= key_len);
+}
+
+void
+hmac_ctx_cleanup(hmac_ctx_t *ctx)
+{
+ EVP_MAC_init(ctx->ctx, NULL, 0, NULL);
+}
+
+int
+hmac_ctx_size(hmac_ctx_t *ctx)
+{
+ return (int)EVP_MAC_CTX_get_mac_size(ctx->ctx);
+}
+
+void
+hmac_ctx_reset(hmac_ctx_t *ctx)
+{
+ /* The OpenSSL MAC API lacks a reset method and passing NULL as params
+ * does not reset it either, so use the params array to reinitialise it the
+ * same way as before */
+ if (!EVP_MAC_init(ctx->ctx, NULL, 0, ctx->params))
+ {
+ crypto_msg(M_FATAL, "EVP_MAC_init failed");
+ }
+}
+
+void
+hmac_ctx_update(hmac_ctx_t *ctx, const uint8_t *src, int src_len)
+{
+ EVP_MAC_update(ctx->ctx, src, src_len);
+}
+
+void
+hmac_ctx_final(hmac_ctx_t *ctx, uint8_t *dst)
+{
+ /* The calling code always gives us a buffer that has the size of our
+ * algorithm */
+ size_t in_hmac_len = EVP_MAC_CTX_get_mac_size(ctx->ctx);
+
+ EVP_MAC_final(ctx->ctx, dst, &in_hmac_len, in_hmac_len);
+}
+#endif
int
memcmp_constant_time(const void *a, const void *b, size_t size)