如何从已签名的 PE PKCS#7 块中获取算法字段
How to get algorithm field from signed PE PKCS#7 block
我已经从 PE 文件中提取了 PKCS#7
内容。
证书链之前的第一部分(从开头到 cert:
标签)包含有关文件完整性的信息。
特别是与文件哈希匹配的哈希和用于生成此哈希的算法(在下面列出的示例中相应地值 FA0FE65F973A5709DC04EE18ABEF353EBEFEA669
和 sha1
)。
我正在使用 openssl
,我想从 X509
格式中提取哈希算法类型。我尝试了类似从调试器打印 md_algs struct 的方法,并希望找到 algorithm
值 1.3.14.3.2.26
的字段,但这就是我所看到的..
p *(Pkcs7->d.sign->md_algs)
(stack_st_X509_ALGOR) = {
stack = {
num = 1
data = 0x00000001024457f0
sorted = 0
num_alloc = 4
comp = 0x0000000000000000
}
}
在哪里可以看到算法字段?
P.s。这是 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:
...
谢谢
在 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 的一堆字节。
我已经从 PE 文件中提取了 PKCS#7
内容。
证书链之前的第一部分(从开头到 cert:
标签)包含有关文件完整性的信息。
特别是与文件哈希匹配的哈希和用于生成此哈希的算法(在下面列出的示例中相应地值 FA0FE65F973A5709DC04EE18ABEF353EBEFEA669
和 sha1
)。
我正在使用 openssl
,我想从 X509
格式中提取哈希算法类型。我尝试了类似从调试器打印 md_algs struct 的方法,并希望找到 algorithm
值 1.3.14.3.2.26
的字段,但这就是我所看到的..
p *(Pkcs7->d.sign->md_algs)
(stack_st_X509_ALGOR) = {
stack = {
num = 1
data = 0x00000001024457f0
sorted = 0
num_alloc = 4
comp = 0x0000000000000000
}
}
在哪里可以看到算法字段?
P.s。这是 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:
...
谢谢
在 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 的一堆字节。