数据结构定义在crypto/pkcs12/pkcs12.h中,如下所示:
1)PKCS12_MAC_DATA
typedef struct
{
X509_SIG *dinfo;
ASN1_OCTET_STRING *salt;
ASN1_INTEGER *iter;
} PKCS12_MAC_DATA;
该结构用于存放pkcs12中的MAC信息,防止他人篡改。xinfo用于存放MAC值和摘要算法,salt和iter用于根据口令来生成对称密钥(pbe)。
2)PKCS12
typedef struct
{
ASN1_INTEGER *version;
PKCS12_MAC_DATA *mac;
PKCS7 *authsafes;
} PKCS12;
pkcs12数据结构,version为版本,mac用于存放MAC信息以及对称密钥相关的信息authsafes为pkcs7结构,用于存放的证书、crl以及私钥等各种信息。
3)PKCS12_BAGS
typedef struct pkcs12_bag_st
{
ASN1_OBJECT *type;
union
{
ASN1_OCTET_STRING *x509cert;
ASN1_OCTET_STRING *x509crl;
ASN1_OCTET_STRING *octet;
ASN1_IA5STRING *sdsicert;
ASN1_TYPE *other;
}value;
} PKCS12_BAGS;
该结构用于存放各种实体对象。
4)PKCS12_SAFEBAG
typedef struct
{
ASN1_OBJECT *type;
union
{
struct pkcs12_bag_st *bag;
struct pkcs8_priv_key_info_st *keybag;
X509_SIG *shkeybag;
STACK_OF(PKCS12_SAFEBAG) *safes;
ASN1_TYPE *other;
}value;
STACK_OF(X509_ATTRIBUTE) *attrib;
} PKCS12_SAFEBAG;
该结构用于存放各种证书、crl和私钥数据。
上述两种结构与pkcs7数据结构的相互转化可参考p12_add.c。在使用中,用户根据证书、私钥以及crl等信息来构造PKCS12_SAFEBAG数据结构,然后将这些结构转化为pkcs12中的pkcs7结构。