EVP_MAC-KMAC
名称
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"
支持的参数
这些参数的通用描述可以在"EVP_MAC(3) 中的 PARAMETERS"中找到。
所有这些参数(除了“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)、"EVP_MAC(3) 中的 PARAMETERS"、OSSL_PARAM(3)
版权
版权所有 2018-2021 OpenSSL 项目作者。保留所有权利。
根据 Apache 许可证 2.0(“许可证”)获得许可。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的 LICENSE 文件或https://www.openssl.org/source/license.html中获取副本。