(1)X509结构
typedef struct x509_st X509;
struct x509_st
{
X509_CINF *cert_info;//证书主体信息
X509_ALGOR *sig_alg;//签名算法信息
ASN1_BIT_STRING *signature;//CA对证书的签名值
int valid;//是否是合法证书,1为合法,0为未知
int references;//引用次数,被引用一次则加一
char *name;//证书持有者信息,内容形式为/C=CN/O=ourinfo,该内容在调用d2i_X509的过程中,通过回调函数x509_cb(crypto/asn1/x_x509.c)调用X509_NAME_oneline来设置
CRYPTO_EX_DATA ex_data;//扩展数据结构,用于存放用户自定义的信息
/* These contain copies of various extension values */
long ex_pathlen;//证书路径长度,对应扩展项为NID_basic_constraints
long ex_pcpathlen;
unsigned long ex_flags;//通过“与”计算存放各种标记
unsigned long ex_kusage;//密钥用法,对应扩展项为NID_key_usage
unsigned long ex_xkusage;//扩展密钥用法,对应扩展项为NID_ext_key_usage
unsigned long ex_nscert;//Netscape证书类型,对应扩展项为NID_netscape_cert_type
ASN1_OCTET_STRING *skid;//主体密钥标识,对应扩展项为NID_subject_key_identifier
struct AUTHORITY_KEYID_st *akid;//颁发者密钥标识,对应扩展项为NID_authority_key_identifier
X509_POLICY_CACHE *policy_cache;//各种策略缓存,对应的策略为NID_policy_constraints、NID_certificate_policies、NID_policy_mappings和NID_inhibit_any_policy
#ifndef OPENSSL_NO_RFC3779
STACK_OF(IPAddressFamily) *rfc3779_addr;
struct ASIdentifiers_st *rfc3779_asid;
#endif
#ifndef OPENSSL_NO_SHA
unsigned char sha1_hash[SHA_DIGEST_LENGTH];//存放证书的sha1摘要值
#endif
X509_CERT_AUX *aux;//辅助信息
} /* X509 */;
(2)X509_CINF结构
typedef struct x509_cinf_st
{
ASN1_INTEGER *version;/* 证书版本,0代表V1,1代表V2 */
ASN1_INTEGER *serialNumber;//证书序列号
X509_ALGOR *signature;//签名算法
X509_NAME *issuer;//颁发者信息
X509_VAL *validity;//有效期
X509_NAME *subject;//拥有者信息
X509_PUBKEY *key;//拥有者的公钥
ASN1_BIT_STRING *issuerUID;/* [ 1 ] optional in v2 */
ASN1_BIT_STRING *subjectUID;/* [ 2 ] optional in v2 */
STACK_OF(X509_EXTENSION) *extensions;/* [ 3 ] optional in v3 */
} X509_CINF;
(3) X509_ALGOR 结构
typedef struct X509_algor_st X509_ALGOR;
struct X509_algor_st
{
ASN1_OBJECT *algorithm;//ASN1_OBJECT类型,表明了是何种算法
ASN1_TYPE *parameter;//ASN1_TYPE类型,代表该算法需要的参数。ASN1_TYPE类型可以存放任意数据
} /* X509_ALGOR */;
typedef struct evp_pkey_st EVP_PKEY;
typedef struct evp_pkey_st
{
int type;
int save_type;
int references;
union
{
char *ptr;//存放密钥结构地址
#ifndef OPENSSL_NO_RSA
struct rsa_st *rsa; /* RSA */
#endif
#ifndef OPENSSL_NO_DSA
struct dsa_st *dsa; /* DSA */
#endif
#ifndef OPENSSL_NO_DH
struct dh_st *dh; /* DH */
#endif
} pkey;
int save_parameters;
STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */ //存放密钥属性
}EVP_PKEY;
typedef struct bio_st BIO;
struct bio_st
{
BIO_METHOD *method;//BIO方法结构,是决定BIO类型和行为的重要参数,各种BIO的不同之处主要也正在于此项。
/* bio, mode, argp, argi, argl, ret */
long (*callback)(struct bio_st *,int,const char *,int, long,long);//BIO回调函数
char *cb_arg; /* first argument for the callback *//回调函数的第一个参量
int init;//初始化标志,初始化了为1,否则为0
int shutdown;//BIO开关标志,如果为1,则处于关闭状态,如果为0,则处于打开的状态。
int flags; /* extra storage */
int retry_reason;
int num;
void *ptr;
struct bio_st *next_bio; /* used by filter BIOs */BIO下联
struct bio_st *prev_bio; /* used by filter BIOs */BIO上联
int references;
unsigned long num_read;//读出的数据长度
unsigned long num_write;//写入的数据长度
CRYPTO_EX_DATA ex_data;
};
(6)BIO_METHOD结构
typedef struct bio_method_st
{
int type;//具体BIO类型
const char *name;//具体BIO的名字
int (*bwrite)(BIO *, const char *, int);//具体BIO写操作回调函数
int (*bread)(BIO *, char *, int);//具体BIO读操作回调函数
int (*bputs)(BIO *, const char *);//具体BIO中写入字符串回调函数
int (*bgets)(BIO *, char *, int);//具体BIO中读取字符串函数
long (*ctrl)(BIO *, int, long, void *);//具体BIO的控制回调函数
int (*create)(BIO *);//生成具体BIO回调函数
int (*destroy)(BIO *);//销毁具体BIO回调函数
long (*callback_ctrl)(BIO *, int, bio_info_cb *);具体BIO控制回调函数,该函数可由调用者(而不是实现者)来实现,然后通过BIO_set_callback等函数来设置
} BIO_METHOD;
(7)RSA结构
typedef struct rsa_st RSA;
struct rsa_st
{
/* The first parameter is used to pickup errors where
* this is passed instead of aEVP_PKEY, it is set to 0 */
int pad;
long version;
const RSA_METHOD *meth;//RSA_METHOD结构,指明了本RSA密钥的各种运算函数地址
/* functional reference if 'meth' is ENGINE-provided */
ENGINE *engine;//硬件引擎
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
/* be careful using this if the RSA structure is shared */
CRYPTO_EX_DATA ex_data;//扩展数据结构,用于存放用户数据
int references;//RSA结构引用数
int flags;
/* Used to cache montgomery values */
BN_MONT_CTX *_method_mod_n;
BN_MONT_CTX *_method_mod_p;
BN_MONT_CTX *_method_mod_q;
/* all BIGNUM values are actually in the following data, if it is not
* NULL */
char *bignum_data;
BN_BLINDING *blinding;
BN_BLINDING *mt_blinding;
};
(8)X509_NAME结构
typedef struct X509_name_st X509_NAME;
/* we always keep X509_NAMEs in 2 forms. */
struct X509_name_st
{
STACK_OF(X509_NAME_ENTRY) *entries;//X509_NAME_ENTRY堆栈信息
int modified; /* true if 'bytes' needs to be built */
#ifndef OPENSSL_NO_BUFFER
BUF_MEM *bytes;//存放DER编码值
#else
char *bytes;
#endif
unsigned long hash; /* Keep the hash around for lookups *///该结构的摘要计算值
} /* X509_NAME */;
(9)X509_NAME_ENTRY结构
typedef struct X509_name_entry_st
{
ASN1_OBJECT *object;//实体的类型
ASN1_STRING *value;//实体的内容
int set;
int size; /* temp variable */
} X509_NAME_ENTRY;
(10)X509_CRL结构
typedef struct X509_crl_st X509_CRL;
structX509_crl_st
{
X509_CRL_INFO *crl;//crl信息主体
X509_ALGOR *sig_alg;//签名算法
ASN1_BIT_STRING *signature;//签名值
int references;//引用
} ;
(11)X509_CRL_INFO结构
typedef struct X509_crl_info_st
{
ASN1_INTEGER *version;//crl版本
X509_ALGOR *sig_alg;//签名算法
X509_NAME *issuer;//签名者信息
ASN1_TIME *lastUpdate;//上次更新时间
ASN1_TIME *nextUpdate;//下次更新时间
STACK_OF(X509_REVOKED) *revoked;//被撤销证书信息
STACK_OF(X509_EXTENSION) *extensions;//扩展信息,可选
ASN1_ENCODING enc;
} X509_CRL_INFO;
(12)X509_REVOKED结构
typedef struct X509_revoked_st
{
ASN1_INTEGER *serialNumber;//被撤销证书的序列号
ASN1_TIME *revocationDate;//撤销时间
STACK_OF(X509_EXTENSION) *extensions;//扩展项,可选
int sequence; //顺序号,用于排序,表示当前被撤销证书在CRL中的顺序
} X509_REVOKED;
(13)BIGNUM结构
typedef struct bignum_st BIGNUM;
struct bignum_st
{
BN_ULONG *d;//BN_ULONG(应系统而异,win32下为4个字节)数组指针首地址,大数就存放在这里面,不过是倒放的
int top;//用来指明大数占多少个BN_ULONG空间
int dmax;//d数组的大小
int neg;//是否为负数,如果为1,则是负数,为0,则为正数
int flags;//用于存放一些标记,比如flags含有BN_FLG_STATIC_DATA时,表明d的内存是静态分配的;含有BN_FLG_MALLOCED时,d的内存是动态分配的
};
(14)STACK_OF结构
#define STACK_OF(type) STACK
typedef struct stack_st
{
int num;//堆栈中存放数据的个数
char **data;//用于存放数据地址,每个数据地址存放在data[0]到data[num-1]中
int sorted;//堆栈是否已排序,如果排序则值为1,否则为0,堆栈数据一般是无序的,只有当用户调用了sk_sort操作,其值才为1
int num_alloc;//
int (*comp)(const char * const *, const char * const *);//堆栈内存放数据的比较函数地址,此函数用于排序和查找操作
} STACK;