c言语 用pcks8格式pem证书 验签

图片说明
已知有pcks8格式的pem证书,原始待签名数据和签名后结果。 用工具验签可以。
问题:对方用PCKS8私钥签名(md5摘要然后RSA私钥加密),提供PCKS8格式pem证书公钥,我这边设备linux下c语言怎么验签?请求具体c语言源码实现

签名数据:
EX9Iul4A1FnPvBrVklejk2K/KNvbwN4/sbSoCep8jHJN3vgVBqfazX9Jm1OSK3F6bwHlXH4rAXjDm5ZuMbq7MneGZEadS38XtOSSo90seMTQpeWiYOK5tclDlbq1HsYlqE0bGHxkXL6ZHjWnjykC04Dyw7MkpP+E2dGqfg5R2GU=

PCKS8 公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJIwo5ACSqybdPYdLkCxTMmSS0x
RqIsPvh21KOveWPlppDgr46IZ0YAbw+nJbaI9B5Y5heDRuAW+BqYPKxhELsKKfSLP
SOxk0rbqJogaOW6MfLrPdLGXFpAO+hvBPgEcChowYCtNK8GrFLiXZRoHPWzM6r4c8
tijX1KnTaI4RIjwIDAQAB
-----END PUBLIC KEY-----

原始数据:
08388dc68ce73b694315d1a094427749201910291205251006076402773128

原始数据摘要(MD5)后:
eeef5aea8b919e7afb80a5e1ba895815

#include <openssl/rsa.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/pkcs12.h>
#include <openssl/ssl.h>
#include <openssl/evp.h>
#include <openssl/md5.h>
#include <openssl/des.h>  
#include <ctype.h>

#define PUB_KEY_FILE "/mtd0/res/pub_key.pem"

bool verify_init_pos(const char *mess1, unsigned char *sign_value, int sign_len)
{
    EVP_MD_CTX mdctx; //摘要算法上下文变量
    RSA *rsa=NULL; //RSA结构体变量
    EVP_PKEY *evpKey=NULL; //EVPKEY 结构体变量
    FILE* fp=NULL;
    bool flag = false;
    int ret=0;
    if (!(fp = fopen(PUB_KEY_FILE, "rb")))
    {
        fprintf(stderr, "Error opening file %s\n", PUB_KEY_FILE);
        return flag;
    }
    /* Read private key */
    evpKey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
    fclose (fp);

    if (evpKey == NULL) { 
        ERR_print_errors_fp (stderr);
        return flag;
    }
    EVP_MD_CTX_init(&mdctx); //初始化摘要上下文

    Trace("lilin","\r\nwill verify data\r\n");
    //以下为验证代码
    ret=EVP_VerifyInit_ex(&mdctx,EVP_md5(),NULL);
    Trace("lilin","EVP_VerifyInit_ex ret=%d\r\n",ret);
    if (1 != ret)
    {
        Trace("lilin","EVP_VerifyInit_ex err\r\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return flag;
    }
    Trace("lilin","mess1 is:\r\n%s\r\n", mess1);
    TraceHex("lilin","hex mess1 is:", mess1, strlen(mess1));
    TraceHex("lilin", "sign_value", sign_value, sign_len);
    ret=EVP_VerifyUpdate(&mdctx,mess1,strlen(mess1));
    Trace("lilin","EVP_VerifyUpdate ret=%d\r\n",ret);
    if (1 != ret)
    {
        Trace("lilin","EVP_VerifyUpdate err\r\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return flag;
    }
    ret=EVP_VerifyFinal(&mdctx, sign_value, sign_len, evpKey);
    Trace("lilin","EVP_VerifyFinal err ret=%d\r\n",ret);
    if (1 != ret)
    {
        Trace("lilin","EVP_VerifyFinal err\r\n");
        EVP_PKEY_free(evpKey);
        RSA_free(rsa);
        return flag;
    }
    else
    {
        flag = true;
        Trace("lilin","verify success..\r\n");
    }

    EVP_PKEY_free(evpKey);
    RSA_free(rsa);
    EVP_MD_CTX_cleanup(&mdctx);
    Trace("lilin","--------------------------------------\r\n");
    fp=NULL;
    evpKey=NULL;
    rsa=NULL;
    return flag;
}

https://bbs.csdn.net/topics/392254657