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

来源:互联网 发布:小米平板windows版本 编辑:程序博客网 时间:2024/06/05 07:45

(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_constraintslong ex_pcpathlen;unsigned long ex_flags;//通过“与”计算存放各种标记unsigned long ex_kusage;//密钥用法,对应扩展项为NID_key_usageunsigned long ex_xkusage;//扩展密钥用法,对应扩展项为NID_ext_key_usageunsigned long ex_nscert;//Netscape证书类型,对应扩展项为NID_netscape_cert_typeASN1_OCTET_STRING *skid;//主体密钥标识,对应扩展项为NID_subject_key_identifierstruct AUTHORITY_KEYID_st *akid;//颁发者密钥标识,对应扩展项为NID_authority_key_identifierX509_POLICY_CACHE *policy_cache;//各种策略缓存,对应的策略为NID_policy_constraints、NID_certificate_policies、NID_policy_mappings和NID_inhibit_any_policy#ifndef OPENSSL_NO_RFC3779STACK_OF(IPAddressFamily) *rfc3779_addr;struct ASIdentifiers_st *rfc3779_asid;#endif#ifndef OPENSSL_NO_SHAunsigned char sha1_hash[SHA_DIGEST_LENGTH];//存放证书的sha1摘要值#endifX509_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_BUFFERBUF_MEM *bytes;//存放DER编码值#elsechar *bytes;#endifunsigned 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) STACKtypedef 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;





 




原创粉丝点击