OpenSSL/GMSSL EVP接口说明 |
您所在的位置:网站首页 › 数字签名验签图 › OpenSSL/GMSSL EVP接口说明 |
3.4 签名验签
签名验签的几种流程
假设EVP_PKEY *pkey已经生成完毕。 签名和验签各有几套流程: 基于EVP_PKEY_CTX的流程。待签名的数据为SM2的A1和A2步的计算结果,必须是32字节,所以此流程内不再做签名的A1和A2步。验签同理。基于EVP_MD_CTX的流程1。待签名的数据为SM2的A1步的计算结果,可以是任意长度,所以此流程内不再做签名的A1步,从A2步开始执行。验签同理。基于EVP_MD_CTX的流程2。待签名的数据为SM2的A1步的计算结果,可以是任意长度,所以此流程内不再做签名的A1步,从A2步开始执行。验签同理。 SM2_sign和SM2_verify流程图几种签名验签流程都要涉及SM2_sign和SM2_verify,这两个函数又存在层层调用,所以下面列出SM2_sign和SM2_verify的流程图。 图3.1 SM2_sign和SM2_verify流程图 基于EVP_PKEY_CTX的流程表3.2基于EVP_PKEY_CTX的签名验签使用步骤 签名 验签 1 pkctx = EVP_PKEY_CTX_new( pkey, NULL)) pkctx = EVP_PKEY_CTX_new( pkey, NULL)) 2 EVP_PKEY_sign_init(pkctx) EVP_PKEY_verify_init(pkctx) 3 EVP_PKEY_CTX_set_ec_sign_type( pkctx, NID_sm_scheme) EVP_PKEY_CTX_set_ec_sign_type( pkctx, NID_sm_scheme) 4 EVP_PKEY_sign( pkctx, sig, &siglen, dgst, dgstlen) EVP_PKEY_verify( pkctx, sig, siglen, dgst, dgstlen) 5 EVP_PKEY_CTX_free(pkctx); EVP_PKEY_CTX_free(pkctx); 其中 EVP_PKEY_CTX_new和EVP_PKEY_CTX_free函数的使用说明请参见3.2 EVP_PKEY_CTX和EVP_PKEY操作。剩余函数的说明见后。基于EVP_PKEY_CTX的签名验签流程图如下。 图3.2 基于EVP_PKEY_CTX的签名验签流程图 以上流程图中的SM2_sign和SM2_verify的流程图见SM2_sign和SM2_verify的流程图。 基于EVP_MD_CTX的流程1表3.3基于EVP_MD_CTX的流程1的签名验签使用步骤 签名 验签 1 mdctx = EVP_MD_CTX_create() mdctx = EVP_MD_CTX_create() 2 EVP_SignInit_ex(mdctx, md, NULL) EVP_VerifyInit_ex(mdctx,md,NULL) 3 EVP_SignUpdate(mdctx, msg, mlen) EVP_VerifyUpdate(mdctx, msg,mlen) 4 EVP_SignFinal(mdctx,sig,&slen,pkey) EVP_VerifyFinal(mdctx,sig,slen,pkey) 5 EVP_MD_CTX_destroy(mdctx) EVP_MD_CTX_destroy(mdctx) 其中 EVP_MD_CTX_create和EVP_MD_CTX_destroy函数的使用说明请参见2.2 EVP_MD_CTX操作。剩余函数的说明见后。基于EVP_MD_CTX的流程1的签名验签流程图如下。 图3.3 基于EVP_MD_CTX的流程1的签名验签流程图 以上流程图中的SM2_sign和SM2_verify的流程图见SM2_sign和SM2_verify的流程图。 基于EVP_MD_CTX的流程2表3.4基于EVP_MD_CTX的流程2的签名验签使用步骤 签名 验签 1 mdctx = EVP_MD_CTX_create(); mdctx = EVP_MD_CTX_create(); 2 EVP_DigestSignInit( mdctx, &pkctx, md, NULL, pkey); EVP_DigestVerifyInit( mdctx, &pkctx, md, NULL, pkey); 3 EVP_PKEY_CTX_set_ec_sign_type( pkctx, type); EVP_PKEY_CTX_set_ec_sign_type( pkctx, type); 4 EVP_DigestSignUpdate( mdctx, msg, msglen); EVP_DigestVerifyUpdate( mdctx, msg, msglen); 5 EVP_DigestSignFinal( mdctx, sig, &siglen); EVP_DigestVerifyFinal( mdctx, sig, siglen); 6 EVP_MD_CTX_destroy(mdctx); EVP_MD_CTX_destroy(mdctx); 其中 EVP_MD_CTX_create和EVP_MD_CTX_destroy函数的使用说明请参见2.2 EVP_MD_CTX操作。剩余函数的说明见后。基于EVP_MD_CTX的流程2的签名验签流程图如下。 图3.4 基于EVP_MD_CTX的流程2的签名验签流程图 以上流程图中的SM2_sign和SM2_verify的流程图见SM2_sign和SM2_verify的流程图。 EVP_PKEY_sign_init函 数 名: int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx); 功能描述: 签名之前的EVP_PKEY_CTX初始化 说 明: - 参数说明: ctx (in/out) EVP_PKEY_CTX 返 回 值: 1[成功], |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |