使用OPENSSL实现SM2生成PEM格式公私钥对并用于签名验签

        使用OPENSSL实现SM2生成PEM格式公私钥对并用于签名验签:

        操作系统:centos7.9

        openssl版本:v1.1.1u

#include <stdio.h>
#include <stdlib.h>
#include <openssl/ec.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <string.h>

// 全局变量,存储公私钥对的 PEM 格式数据
char *publicKeyPEM = NULL;
char *privateKeyPEM = NULL;

// 辅助函数,用于从 EC_KEY 转换为 EVP_PKEY
EVP_PKEY *EC_KEY_to_EVP_PKEY(EC_KEY *ec_key) {
    EVP_PKEY *pkey = EVP_PKEY_new();
    if (!pkey) {
        fprintf(stderr, "Error: Failed to create EVP_PKEY.\n");
        return NULL;
    }

    if (!EVP_PKEY_set1_EC_KEY(pkey, ec_key)) {
        EVP_PKEY_free(pkey);
        fprintf(stderr, "Error: Failed to set EVP_PKEY with EC_KEY.\n");
        return NULL;
    }

    return pkey;
}

int SM2_sign(const char *sourcefilename, const char *sigfilename) {
    int ret = 0;

    // 从全局变量中获取私钥
    BIO *bio_mem = BIO_new(BIO_s_mem());
    BIO_write(bio_mem, privateKeyPEM, strlen(privateKeyPEM));
    EVP_PKEY *pkey = PEM_read_bio_PrivateKey(bio_mem, NULL, NULL, NULL);
    BIO_free_all(bio_mem);
    if (pkey == NULL) {
        fprintf(stderr, "Error: Unable to read private key from global variable.\n");
        return -1;
    }

    /* compute SM2 signature */
    EVP_PKEY_set_alias_type(pkey, EVP_PKEY_SM2);

    EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
    EVP_MD_CTX *mctx = EVP_MD_CTX_new();
    EVP_MD_CTX_set_pkey_ctx(mctx, ctx);

    ret = EVP_DigestSignInit(mctx, NULL, EVP_sm3(), NULL, pkey);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值