首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >活化填料和盐

活化填料和盐
EN

Stack Overflow用户
提问于 2017-06-14 13:29:47
回答 1查看 701关注 0票数 0

我正在尝试实现函数来使用OpenSSL对文件进行签名,我需要激活填充和。我的签名功能如下:

代码语言:javascript
复制
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; 
} 

有没有添加填充物和盐的例子?有谁知道能帮助解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-20 11:44:19

我刚刚在OpenSSL论坛上找到了解决方案:

代码语言:javascript
复制
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; 
}

希望这能对未来的人有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44546272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档