#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;
}