【问题标题】:How to get algorithm field from signed PE PKCS#7 block如何从签名的 PE PKCS#7 块中获取算法字段
【发布时间】:2019-04-11 19:34:55
【问题描述】:

我从 PE 文件中提取了 PKCS#7 内容。

证书链之前的第一部分(从开头到cert: 标签)包含有关文件完整性的信息。

特别是与文件哈希匹配的哈希以及用于生成此哈希的算法(在下面列出的示例中对应FA0FE65F973A5709DC04EE18ABEF353EBEFEA669sha1)。

我正在使用openssl,我想从X509 格式中提取哈希算法类型。我尝试了从调试器打印 md_algs 结构之类的方法,并希望找到 algorithm 值得 1.3.14.3.2.26 的字段,但这就是我所看到的......

p *(Pkcs7->d.sign->md_algs)
(stack_st_X509_ALGOR) $6 = {
  stack = {
     num = 1
     data = 0x00000001024457f0
     sorted = 0
     num_alloc = 4
     comp = 0x0000000000000000
  }
}

在哪里可以看到算法字段?

附:这是 pkcs7 结构的相关部分:

PKCS7: 
   type: pkcs7-signedData (1.2.840.113549.1.7.2)
   d.sign: 
     version: 1
     md_algs:
       algorithm: sha1 (1.3.14.3.2.26)
       parameter: NULL
     contents: 
       type: undefined (1.3.6.1.4.1.311.2.1.4)
     d.other: SEQUENCE:
        0:d=0  hl=2 l=  60 cons: SEQUENCE          
        2:d=1  hl=2 l=  23 cons:  SEQUENCE          
        4:d=2  hl=2 l=  10 prim:   OBJECT            :1.3.6.1.4.1.311.2.1.15
       16:d=2  hl=2 l=   9 cons:   SEQUENCE          
       18:d=3  hl=2 l=   1 prim:    BIT STRING        
       21:d=3  hl=2 l=   4 cons:    cont [ 0 ]        
       23:d=4  hl=2 l=   2 cons:     cont [ 2 ]        
       25:d=5  hl=2 l=   0 prim:      cont [ 0 ]        
       27:d=1  hl=2 l=  33 cons:  SEQUENCE          
       29:d=2  hl=2 l=   9 cons:   SEQUENCE          
       31:d=3  hl=2 l=   5 prim:    OBJECT            :sha1
       38:d=3  hl=2 l=   0 prim:    NULL              
       40:d=2  hl=2 l=  20 prim:   OCTET STRING      [HEX DUMP]:FA0FE65F973A5709DC04EE18ABEF353EBEFEA669
     cert:
      cert_info: 
      ...

谢谢

【问题讨论】:

    标签: encryption openssl sha pkcs#7 asn1


    【解决方案1】:

    pkcs7.h 中定义,您正在检查的md_algs 属性是X509_ALGOR 实例的堆栈:

    typedef struct pkcs7_signed_st {
        ASN1_INTEGER *version;      /* version 1 */
        STACK_OF(X509_ALGOR) *md_algs; /* md used */
        STACK_OF(X509) *cert;       /* [ 0 ] */
        STACK_OF(X509_CRL) *crl;    /* [ 1 ] */
        STACK_OF(PKCS7_SIGNER_INFO) *signer_info;
        struct pkcs7_st *contents;
    } PKCS7_SIGNED;
    

    可以通过OpenSSL Stack API 安全地访问它,例如使用函数sk_X509_ALGOR_value() 来检查其元素。

    X509_ALGOR本身在x509.h中定义:

    struct X509_algor_st {
        ASN1_OBJECT *algorithm;
        ASN1_TYPE *parameter;
    } /* X509_ALGOR */ ;
    

    您要查找的信息存储在属性algorithm 中,您可以使用例如OBJ_obj2txt() 进行检查。

    将它们捆绑在一起,以获取堆栈中第一个算法的文本表示,您可以执行以下操作:

    char tbuf[20];
    X509_ALGOR *algor = sk_X509_ALGOR_value(Pkcs7->d.sign->md_algs, 0);
    int res = OBJ_obj2txt(tbuf, sizeof tbuf, algor->algorithm, 0);
    

    之后,tbuf 应该包含类似"sha1" 的值,res 包含该字符串的长度。出于编程目的,OBJ_obj2nid() 之类的函数可能更有用。


    调试器没有为您提供此信息,因为stack 元素中的data 字段不是强类型的。您必须自己进行转换以表明它是指向X509_ALGOR 结构的指针数组。 OpenSSL Stack API 为您提供了一组宏,它们可以为您进行转换并以这种方式访问​​数组。然后,您最终得到的 ASN1_OBJECT 很难在调试器中检查或解释,因为它只是代表 ASN.1 格式的对象 ID 的一堆字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多