代码之家  ›  专栏  ›  技术社区  ›  Zohar81

如何从签名的PE PKCS#7块中获取算法字段

  •  3
  • Zohar81  · 技术社区  · 7 年前

    我有 PKCS#7

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

    特别是,与文件哈希匹配的哈希和用于生成此哈希的算法(值) FA0FE65F973A5709DC04EE18ABEF353EBEFEA669 sha1 相应地在下面列出的例子中)。

    openssl 我想从 X509 格式。我尝试了从调试器打印md\u algs struct之类的东西,希望能找到这个字段 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: 
       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: 
          ...
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   Reinier Torenbeek    7 年前

    定义于 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.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()


    调试器没有提供此信息,因为 data 中的字段 stack 元素不是强类型的。您必须自己强制转换它,以指示它是指向的指针数组 结构。OpenSSL堆栈API为您提供了一组宏,这些宏可以为您执行强制转换并以这种方式访问数组。然后,这个 ASN1_OBJECT ASN.1 格式。