OpenSSL/GMSSL EVP接口说明——3.3 密钥生成

3.3 密钥生成

密钥生成流程

假设EVP_PKEY *pkey已经生成完毕。

签名和验签各有两套流程:

  1. 基于EVP_PKEY_CTX的流程
  2. 基于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);

其中

  1. EVP_PKEY_CTX_new_idEVP_PKEY_CTX_free函数的说明请参见3.2 EVP_PKEY_CTXEVP_PKEY操作。
  2. 剩余函数的说明见本节。

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设置曲线参数(宏定义)

    :  

  1. 便于后续利用对应的曲线参数生成密钥
  2. SM2curve_nid = NID_sm2p256v1
  3. 调用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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值