C语言 openssl 解析P7签名值所有结构
P7签名值是使用PKCS#7标准生成的数字签名,其中包含了签名本身和证书链等信息。在C语言中,可以使用OpenSSL库对P7签名值进行解析,以下是P7签名值中涉及到的主要结构体:
- PKCS7结构体
PKCS7结构体是OpenSSL中表示P7签名值的主要结构体,它包含了签名本身和证书链等信息。其定义如下:
typedef struct pkcs7_st {
ASN1_INTEGER *version; // 版本号
STACK_OF(X509_ALGOR) *md_algs; // 消息摘要算法列表
struct pkcs7_st *contents; // 内容,可以是数据或其他PKCS7结构体
struct pkcs7_st *cert; // 证书链
struct pkcs7_st *crl; // 吊销列表
STACK_OF(PKCS7_SIGNER_INFO) *signer_info; // 签名者信息列表
struct pkcs7_st *enc_data; // 加密数据
struct pkcs7_st *decrypted; // 解密后的数据
ASN1_TYPE *type; // 类型
... // 其他成员变量
} PKCS7;
- X509_ALGOR结构体
X509_ALGOR结构体表示PKCS7签名值中使用的消息摘要算法,其定义如下:
typedef struct X509_algor_st {
ASN1_OBJECT *algorithm; // 算法
ASN1_TYPE *parameter; // 参数
} X509_ALGOR;
- PKCS7_SIGNER_INFO结构体
PKCS7_SIGNER_INFO结构体表示PKCS7签名值中的签名者信息,其定义如下:
typedef struct pkcs7_signer_info_st {
ASN1_INTEGER *version; // 版本号
PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; // 签名者证书的颁发者和序列号
X509_ALGOR *digest_alg; // 消息摘要算法
STACK_OF(PKCS7_ATTRIBUTE) *auth_attr; // 签名者的认证属性
X509_ALGOR *digest_enc_alg; // 签名者的消息摘要算法
ASN1_OCTET_STRING *enc_digest; // 签名者的加密消息摘要
STACK_OF(PKCS7_ATTRIBUTE) *unauth_attr; // 签名者的非认证属性
... // 其他成员变量
} PKCS7_SIGNER_INFO;
- PKCS7_ISSUER_AND_SERIAL结构体
PKCS7_ISSUER_AND_SERIAL结构体表示签名者证书的颁发者和序列号,其定义如下:
typedef struct pkcs7_issuer_and_serial_st {
X509_NAME *issuer; // 颁发者
ASN1_INTEGER *serial; // 序列号
} PKCS7_ISSUER_AND_SERIAL;
- PKCS7_ATTRIBUTE结构体
PKCS7_ATTRIBUTE结构体表示PKCS7签名值中的属性,其定义如下:
typedef struct pkcs7_attribute_st {
ASN1_OBJECT *type; // 属性类型
STACK_OF(ASN1_TYPE) *value; // 属性值
} PKCS7_ATTRIBUTE;
除了以上结构体,还有一些辅助结构体和函数,可以帮助解析P7签名值。需要注意的是,P7签名值中可能包含多个签名者和证书链,因此需要遍历PKCS7结构体中的相关成员变量来获取所有的签名者信息和证书链
原文地址: https://www.cveoy.top/t/topic/c4hN 著作权归作者所有。请勿转载和采集!