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;

}

posted @ 2023-04-05 10:15  艾米的爸爸  阅读(3)  评论(0)    收藏  举报  来源