OpenSSL开源工程中,因ED25519是后补算法,故相关资料较少,最近做的相关工作需要用到ED25519的验签,查询了相关资料后写了一个C语言的简易程序 分享给大家。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bn.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
//ed25519 验签
int ed25519_test()
{
//签名数据-64位
uint8_t buf[64]={0xbd,0xe8,0x4e,0xb7,0x0a,0xf2,0xe9,0x8d,0x77,0x47,0xee,0x53,0xe0,0xd0,0x03,0x41,0x08,0x66,0x4b,0xdf,0x1f,0x9d,0x4f,0x3d,0xc7,0x61,0x2e,0xa4,0xc6,0x9a,0x73,0x99,0x99,0x4b,0x4a,0x2a,0x20,0x65,0xd0,0x46,0x52,0x01,0x58,0xa5,0x7c,0xdd,0x11,0x58,0x23,0xec,0xda,0xab,0x4d,0x0e,0x22,0x70,0x7f,0x8d,0x12,0x94,0x4c,0xb2,0x22,0x08};
uint16_t pubkeylen=32;
//公钥数据-32位
uint8_t pubkey[32]={0x6c,0x89,0xdf,0xc3,0xfc,0x0c,0xc6,0xdb,0x14,0xc5,0xdd,0xeb,0xcd,0x0a,0x6f,0x61,0x99,0xf9,0x85,0xe2,0x70,0x15,0x37,0x04,0x2c,0x30,0xb8,0x43,0x2c,0x34,0xc7,0xf7};
//明文数据
unsigned char msg[] = "\x61\x62\x63\x31\x32\x33\x34\x35\x36\x39\x38\x37\x64\x65\x66\x71\x77\x65\x72\x74\x79\x75\x69\x6f\x70\x6c\x6b\x6a\x68\x67\x66\x64\x73\x61\x6d\x6e\x62\x76\x63\x78\x7a";
unsigned int msglen = sizeof(msg) - 1;
int ret=0;
EVP_MD_CTX *mdctx = NULL;
EVP_PKEY *pkey = NULL;
pkey = EVP_PKEY_new();
if(pkey == NULL)
{
printf("EVP_PKEY_new is failed.\n");
return -1;
}
//设置公钥数据到EVP_PKEY结构
pkey = EVP_PKEY_new_raw_public_key(NID_ED25519,NULL,pubkey,pubkeylen);
if(pkey == NULL){
printf("EVP_MD_CTX_create is failed.\n");
return -2;
}
//此处需用EVP_MD_CTX_new
mdctx = EVP_MD_CTX_new();
if (mdctx == NULL)
{
printf("EVP_MD_CTX_create is failed.\n");
EVP_PKEY_free(pkey);
return -3;
}
//摘要类型参数必须设置为NULL
if (EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL,pkey)<=0)
{
printf("EVP_DigestVerifyInit is failed.\n");
EVP_PKEY_free(pkey);
EVP_MD_CTX_free(mdctx);
return -4;
}
ret=EVP_DigestVerify(mdctx, buf, 64, msg, msglen);
if(ret!=1){
printf("EVP_DigestVerifyFinal is failed. ret=[%d]\n",ret);
EVP_MD_CTX_free(mdctx);
return -1;
}else{
printf("EVP_DigestVerifyFinal is succ. ret=[%d]\n",ret);
EVP_MD_CTX_free(mdctx);
return 0;
}
if (pkey != NULL){
EVP_PKEY_free(pkey);
}
EVP_MD_CTX_free(mdctx);
return 0;
}
int main(int argc,char *argv[])
{
int ret;
ret = ed25519_test();
if (ret < 0)
{
printf("rsa_sign_test is failed.\n");
}
else
{
printf("rsa_sign_test successed.\n");
}
return 0;
}