开放SSL

密码学和 SSL/TLS 工具包

EVP_MAC-KMAC128

名称

EVP_MAC-KMAC、EVP_MAC-KMAC128、EVP_MAC-KMAC256 - KMAC EVP_MAC 实现

描述

通过 EVP_MAC API 支持计算 KMAC MAC。

身份

这些实现使用以下名称和属性标识,用于与 EVP_MAC_fetch() 一起使用

"KMAC-128","provider=default" 或 "provider=fips"
"KMAC-256","provider=default" 或 "provider=fips"

支持的参数

这些参数的一般描述可以在 "PARAMETERS" in EVP_MAC(3) 中找到。

所有这些参数(除了 "block-size")都可以使用 EVP_MAC_CTX_set_params() 设置。此外,"size" 参数可以使用 EVP_MAC_CTX_get_params() 或 EVP_MAC_CTX_get_mac_size() 获取。 "size" 参数的长度不应超过 size_t 的长度。同样,"block-size" 参数可以使用 EVP_MAC_CTX_get_params() 或 EVP_MAC_CTX_get_block_size() 获取。

"key" (OSSL_MAC_PARAM_KEY) <八位字节串>

设置 MAC 密钥。设置此参数等同于将 key 传递给 EVP_MAC_init(3)。密钥的长度(以字节为单位)必须在 4...512 范围内。

"custom" (OSSL_MAC_PARAM_CUSTOM) <八位字节串>

设置自定义字符串。它是一个可选值,长度最多 512 个字节,默认情况下为空。

"size" (OSSL_MAC_PARAM_SIZE) <无符号整数>

设置 MAC 大小。默认情况下,它对于 KMAC-128 为 32,对于 KMAC-256 为 64。

"block-size" (OSSL_MAC_PARAM_BLOCK_SIZE) <无符号整数>

获取 MAC 块大小。它对于 KMAC-128 为 168,对于 KMAC-256 为 136。

"xof" (OSSL_MAC_PARAM_XOF) <整数>

"xof" 参数值应为 1 或 0。使用 1 启用 XOF 模式。默认值为 0。

"custom" 参数必须作为或在 EVP_MAC_init() 调用之前设置。"xof" 和 "size" 参数可以在 EVP_MAC_final() 之前随时设置。"key" 参数在 EVP_MAC_init() 调用时设置,但也可以在此之前设置。

示例

#include <openssl/evp.h>
#include <openssl/params.h>

static int do_kmac(const unsigned char *in, size_t in_len,
                   const unsigned char *key, size_t key_len,
                   const unsigned char *custom, size_t custom_len,
                   int xof_enabled, unsigned char *out, int out_len)
{
    EVP_MAC_CTX *ctx = NULL;
    EVP_MAC *mac = NULL;
    OSSL_PARAM params[4], *p;
    int ret = 0;
    size_t l = 0;

    mac = EVP_MAC_fetch(NULL, "KMAC-128", NULL);
    if (mac == NULL)
        goto err;
    ctx = EVP_MAC_CTX_new(mac);
    /* The mac can be freed after it is used by EVP_MAC_CTX_new */
    EVP_MAC_free(mac);
    if (ctx == NULL)
        goto err;

    /*
     * Setup parameters required before calling EVP_MAC_init()
     * The parameters OSSL_MAC_PARAM_XOF and OSSL_MAC_PARAM_SIZE may also be
     * used at this point.
     */
    p = params;
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY,
                                             (void *)key, key_len);
    if (custom != NULL && custom_len != 0)
      *p++ = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
                                               (void *)custom, custom_len);
    *p = OSSL_PARAM_construct_end();
    if (!EVP_MAC_CTX_set_params(ctx, params))
        goto err;

    if (!EVP_MAC_init(ctx))
        goto err;

    /*
     * Note: the following optional parameters can be set any time
     * before EVP_MAC_final().
     */
    p = params;
    *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_XOF, &xof_enabled);
    *p++ = OSSL_PARAM_construct_int(OSSL_MAC_PARAM_SIZE, &out_len);
    *p = OSSL_PARAM_construct_end();
    if (!EVP_MAC_CTX_set_params(ctx, params))
        goto err;

    /* The update may be called multiple times here for streamed input */
    if (!EVP_MAC_update(ctx, in, in_len))
        goto err;
    if (!EVP_MAC_final(ctx, out, &l, out_len))
        goto err;
    ret = 1;
err:
    EVP_MAC_CTX_free(ctx);
    return ret;
}

另请参阅

EVP_MAC_CTX_get_params(3)EVP_MAC_CTX_set_params(3)"PARAMETERS" in EVP_MAC(3)OSSL_PARAM(3)

版权所有 2018-2021 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0 版(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取副本。