我正在尝试实现函数来使用OpenSSL对文件进行签名,我需要激活填充和。我的签名功能如下:
unsigned char * sign( EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len )
{
EVP_MD_CTX md_ctx;
unsigned char *sig = malloc( EVP_PKEY_size(pkey) );
*sig_len = EVP_PKEY_size(pkey);
EVP_SignInit (&md_ctx, htype);
EVP_SignUpdate (&md_ctx, data, data_len);
if (EVP_SignFinal (&md_ctx, sig, sig_len, pkey) != 1)
{
free(sig);
sig = 0;
*sig_len = 0;
ERR_print_errors_fp(stderr);
}
return sig;
} 有没有添加填充物和盐的例子?有谁知道能帮助解决这个问题吗?
发布于 2017-06-20 11:44:19
我刚刚在OpenSSL论坛上找到了解决方案:
unsigned char * signData( EVP_PKEY * pkey, const EVP_MD * htype, char * data, int data_len, int * sig_len, int padding, int salt )
{
unsigned int signature_l;
unsigned char signature[512];
int res;
EVP_MD_CTX* verif_ctx = EVP_MD_CTX_create();
EVP_MD_CTX* md_ctx = EVP_MD_CTX_create();
EVP_PKEY_CTX* keygen_ctx = EVP_PKEY_CTX_new(pkey, NULL);
/* signing */
if (EVP_DigestSignInit(md_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1)
return 0;
if (EVP_PKEY_CTX_set_rsa_padding(keygen_ctx, padding)<1)
return 0;
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(keygen_ctx, salt)<1)
return 0;
signature_l = EVP_PKEY_size(pkey);
if (EVP_DigestSignUpdate(md_ctx, data, data_len)<1) return 0;
if (EVP_DigestSignFinal(md_ctx, signature, &signature_l)<1) return 0;
/* verifying */
if (EVP_DigestVerifyInit(verif_ctx, &keygen_ctx, EVP_sha512(), NULL, pkey)<1)
return 0;
if (EVP_PKEY_CTX_set_rsa_padding(verif_ctx->pctx, padding)<1)
return 0;
if (EVP_PKEY_CTX_set_rsa_pss_saltlen(verif_ctx->pctx, salt)<1)
return 0;
if (EVP_DigestVerifyUpdate(verif_ctx, data, data_len)<1)
return 0;
res = EVP_DigestVerifyFinal(verif_ctx, signature, signature_l);
switch(res)
{
case 1:printf("sig checks out!\n");
break;
case 0:printf("nope nope nope.\n"); break;
default: return 0;
}
return signature;
}希望这能对未来的人有所帮助!
https://stackoverflow.com/questions/44546272
复制相似问题