开放SSL

密码学和 SSL/TLS 工具包

EVP_KEYMGMT-DSA

名称

EVP_PKEY-DSA, EVP_KEYMGMT-DSA - EVP_PKEY DSA 密钥类型和算法支持

描述

对于DSA,FIPS186-4 标准规定,用于 FFC 参数生成的数值也需要用于参数验证。这意味着可能需要存储用于验证目的的可选 FFC 域参数值,例如seedpcountergindex。对于DSA,这些字段不会存储在 ASN1 数据中,因此如果需要验证,则需要在外部存储它们。

DSA 参数

DSA 密钥类型支持 FFC 参数(参见 "EVP_PKEY-FFC(7) 中的 FFC 参数")。

DSA 密钥生成参数

DSA 密钥类型支持 FFC 密钥生成参数(参见 "EVP_PKEY-FFC(7) 中的 FFC 密钥生成参数")。

"pbits" 字段的以下限制适用。

对于 "fips186_4",它必须是 2048 或 3072。对于 "fips186_2",它必须是 1024。对于 "group",它可以是 2048、3072、4096、6144 或 8192 中的任何一个。

DSA 密钥验证

对于 DSA 密钥,EVP_PKEY_param_check(3) 的行为如下:OpenSSL FIPS 提供程序符合 FIPS186-4 标准中关于 FFC 参数验证的规则。为了向后兼容,OpenSSL 默认提供程序使用更简单的检查(见下文)进行参数验证,除非设置了种子参数。

对于 DSA 密钥,EVP_PKEY_param_check_quick(3) 的行为如下:对 L 和 N 以及部分 g 进行简单检查。默认提供程序还支持对旧版 "fips186_2" 密钥进行验证。

对于 DSA 密钥,EVP_PKEY_public_check(3)EVP_PKEY_private_check(3)EVP_PKEY_pairwise_check(3),OpenSSL 默认提供程序和 FIPS 提供程序分别符合 SP800-56Ar3 中关于公钥、私钥和成对测试的规则。

示例

可以通过调用以下方法获得EVP_PKEY 上下文:

EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL);

可以通过调用以下方法生成DSA 域参数:

unsigned int pbits = 2048;
unsigned int qbits = 256;
int gindex = 1;
OSSL_PARAM params[5];
EVP_PKEY *param_key = NULL;
EVP_PKEY_CTX *pctx = NULL;

pctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL);
EVP_PKEY_paramgen_init(pctx);

params[0] = OSSL_PARAM_construct_uint("pbits", &pbits);
params[1] = OSSL_PARAM_construct_uint("qbits", &qbits);
params[2] = OSSL_PARAM_construct_int("gindex", &gindex);
params[3] = OSSL_PARAM_construct_utf8_string("digest", "SHA384", 0);
params[4] = OSSL_PARAM_construct_end();
EVP_PKEY_CTX_set_params(pctx, params);

EVP_PKEY_generate(pctx, &param_key);
EVP_PKEY_CTX_free(pctx);

EVP_PKEY_print_params(bio_out, param_key, 0, NULL);

可以使用域参数通过调用以下方法生成DSA 密钥:

EVP_PKEY *key = NULL;
EVP_PKEY_CTX *gctx = NULL;

gctx = EVP_PKEY_CTX_new_from_pkey(NULL, param_key, NULL);
EVP_PKEY_keygen_init(gctx);
EVP_PKEY_generate(gctx, &key);
EVP_PKEY_CTX_free(gctx);
EVP_PKEY_print_private(bio_out, key, 0, NULL);

符合标准

FIPS186-4 的以下部分:

A.1.1.2 使用经批准的哈希函数生成可能的素数 p 和 q。
A.2.3 生成规范生成器 g。
A.2.1 生成器 g 的不可验证生成。

参见

EVP_PKEY-FFC(7)EVP_SIGNATURE-DSA(7) EVP_PKEY(3)provider-keymgmt(7)EVP_KEYMGMT(3)OSSL_PROVIDER-default(7)OSSL_PROVIDER-FIPS(7)

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

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