3.3 密钥生成
密钥生成流程
假设EVP_PKEY *pkey已经生成完毕。
签名和验签各有两套流程:
- 基于EVP_PKEY_CTX的流程
- 基于EVP_MD_CTX的流程
表3.1 密钥生成步骤
密钥生成 | |
1 | pkctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); |
2 | EVP_PKEY_keygen_init(pkctx); |
3 | EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pkctx, NID_sm2p256v1); |
4 | EVP_PKEY_keygen(pkctx, &ret); |
5 | EVP_PKEY_CTX_free(pkctx); |
其中
- EVP_PKEY_CTX_new_id和EVP_PKEY_CTX_free函数的说明请参见3.2 EVP_PKEY_CTX和EVP_PKEY操作。
- 剩余函数的说明见本节。
EVP_PKEY_keygen_init
函 数 名: int EVP_PKEY_keygen_init(EVP_PKEY_CTX *ctx);
功能描述: 生成密钥之前的EVP_PKEY_CTX初始化
说 明:
参数说明:
ctx (in/out) EVP_PKEY_CTX
返 回 值: 1[成功],<=0[失败]
EVP_PKEY_CTX_set_ec_paramgen_curve_nid
函 数 名: #define EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, curve_nid)
功能描述: 利用曲线NID设置曲线参数(宏定义)
说 明:
- 便于后续利用对应的曲线参数生成密钥
- SM2的curve_nid = NID_sm2p256v1
- 调用EVP_PKEY_CTX_ctrl
参数说明:
ctx (in/out) EVP_PKEY_CTX
curve_nid (in) 曲线NID
返 回 值: 1[成功],<=0[失败]
EVP_PKEY_keygen
函 数 名: int EVP_PKEY_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY **ppkey);
功能描述: 生成密钥EVP_PKEY
说 明: 调用前EVP_PKEY *pkey=NULL即可
参数说明:
ctx (in/out) EVP_PKEY_CTX
ppkey (out) 生成的密钥
返 回 值: 1[成功],<=0[失败]
密钥生成代码示例
EVP_PKEY *genpkey()
{
int curve_nid = NID_sm2p256v1
int ok = 0;
EVP_PKEY *ret = NULL;
EVP_PKEY_CTX *pkctx = NULL;
pkctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL));
EVP_PKEY_keygen_init(pkctx);
EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pkctx, curve_nid);
EVP_PKEY_keygen(pkctx, &ret);
EVP_PKEY_CTX_free(pkctx);
return ret;
}