P7签名值是使用PKCS#7标准生成的数字签名,其中包含了签名本身和证书链等信息。在C语言中,可以使用OpenSSL库对P7签名值进行解析,以下是P7签名值中涉及到的主要结构体:

  1. 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;
  1. X509_ALGOR结构体

X509_ALGOR结构体表示PKCS7签名值中使用的消息摘要算法,其定义如下:

typedef struct X509_algor_st {
    ASN1_OBJECT *algorithm;  // 算法
    ASN1_TYPE *parameter;  // 参数
} X509_ALGOR;
  1. 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;
  1. 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;
  1. PKCS7_ATTRIBUTE结构体

PKCS7_ATTRIBUTE结构体表示PKCS7签名值中的属性,其定义如下:

typedef struct pkcs7_attribute_st {
    ASN1_OBJECT *type;  // 属性类型
    STACK_OF(ASN1_TYPE) *value;  // 属性值
} PKCS7_ATTRIBUTE;

除了以上结构体,还有一些辅助结构体和函数,可以帮助解析P7签名值。需要注意的是,P7签名值中可能包含多个签名者和证书链,因此需要遍历PKCS7结构体中的相关成员变量来获取所有的签名者信息和证书链

C语言 openssl 解析P7签名值所有结构

原文地址: https://www.cveoy.top/t/topic/c4hN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录