制作CA数字证书用到的结构体(持续添加中)

(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 */;

(4)EVP_PKEY结构

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;


(5)BIO结构

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;





 




你可能感兴趣的:(OpenSSL证书制作)