13.openssl編程——ASN1庫(kù)
13.1 ASN1簡(jiǎn)介
ANS.1(Abstract Syntax Notation One, X.208),是一套靈活的標(biāo)記語(yǔ)言,他允許定義多種數(shù)據(jù)類型,從integer、bit string、一類的簡(jiǎn)單類型到結(jié)構(gòu)化類型,如set和sequence,并且可以使用這些類型構(gòu)建復(fù)雜類型。
DER編碼是ANS.1定義的將對(duì)象描述數(shù)據(jù)編碼成8位串值的編碼規(guī)則,他給出了對(duì)ANS.1值(對(duì)象的類型和值)的唯一編碼規(guī)則。
a 簡(jiǎn)單類型
BIT STRING 任意0、1位串;
IA5String 任意IA5(ASCII)字符串;
INTEGER 任意一個(gè)整數(shù);
NULL 空值;
OBJECT IDENTIFIER 一個(gè)對(duì)象標(biāo)識(shí)號(hào)(一串整數(shù)),標(biāo)識(shí)算法或?qū)傩灶愋偷葘?duì)象;
OCTET STRING 8位串;
PrintableString 任意可打印字符串;
T61String 任意T.61(8位)字符串;
UTCTime 一個(gè)“協(xié)同世界時(shí)”或“格林威治標(biāo)準(zhǔn)時(shí)(G.M.T)”。
b 結(jié)構(gòu)類型
結(jié)構(gòu)類型由組件組成,ANS.1定義了四種結(jié)構(gòu)類型:
SEQUENCE 一個(gè)或多個(gè)類型的有序排列;
SEQUENCE OF 一個(gè)給定類型的0個(gè)或多個(gè)有序排列;
SET 一個(gè)或多個(gè)類型的無(wú)序集合;
SET OF 一個(gè)給定類型的0個(gè)或多個(gè)無(wú)序集合。
c 帶標(biāo)記類型
在一個(gè)應(yīng)用內(nèi)部區(qū)分類型的有效方法是使用標(biāo)記,標(biāo)記也同樣用于區(qū)分一個(gè)結(jié)構(gòu)類型內(nèi)部不同的組件。例如SET或SEQUENCE類型可選項(xiàng)通常使用上下文標(biāo)記以避免混淆。有兩種標(biāo)記類型的方法:隱式和顯式。隱式標(biāo)記類型是將其它類型的標(biāo)記改變,得到新的類型。隱式標(biāo)記的關(guān)鍵字是IMPLICIT。顯式標(biāo)記類型是將其它類型加上一個(gè)外部標(biāo)記,得到新的類型。顯式標(biāo)記的關(guān)鍵字是EXPLICIT。
為了進(jìn)行編碼,隱式標(biāo)記類型除了標(biāo)記不同以外,可以視為與其基礎(chǔ)類型相同。顯式標(biāo)記類型可以視為只有一個(gè)組件的結(jié)構(gòu)類型。
d 其它類型
類型和值用符號(hào)::=表示,符號(hào)左邊的是名字,右邊是類型和值。名字又可以用于定義其它的類型和值。
除了CHOICE類型、ANY類型以外,所有ANS.1類型都有一個(gè)標(biāo)記,標(biāo)記由一個(gè)類和一個(gè)非負(fù)的標(biāo)記碼組成,當(dāng)且僅當(dāng)標(biāo)記碼相同時(shí),ANS.1類型是相同的。也就是說(shuō),影響其抽象意義的不是ANS.1類型的名字,而是其標(biāo)記。
13.2 DER編碼
DER給出了一種將ASN.1值為8位串的方法。DER編碼包含三個(gè)部分:
標(biāo)識(shí)(一個(gè)或多個(gè)8位串):定義值的類和標(biāo)記碼,指出是原始編碼還是結(jié)構(gòu)化編碼
長(zhǎng)度(一個(gè)或多個(gè)8位串):對(duì)于定長(zhǎng)編碼,指出內(nèi)容中8位串的個(gè)數(shù);對(duì)于不定長(zhǎng)編碼
內(nèi)容(一個(gè)或多個(gè)8位串):對(duì)于原始定長(zhǎng)編碼,給出真實(shí)值,對(duì)于結(jié)構(gòu)化編碼,給出個(gè)串聯(lián)結(jié)果
內(nèi)容結(jié)束(一個(gè)或多個(gè)8位串):對(duì)于結(jié)構(gòu)化不定長(zhǎng)編碼,標(biāo)識(shí)內(nèi)容結(jié)束,對(duì)于其他編碼,無(wú)此項(xiàng)。
13.3 ANS1基本類型示例
a.ANS1_BOOLEAN
表明ASN1語(yǔ)法中的true和flase。
其中0x01 (表示為BOOLEAN) 0x01(表示后面值的長(zhǎng)度) 0x00(值)為本例BOOLEAN的DER編碼。
b.ANS1_OBJECT
ANS1中OBJECT表明一個(gè)對(duì)象,每個(gè)對(duì)象有一個(gè)OID(object id)
其中0x06(表示為OBJECT類型) 0x03(值的長(zhǎng)度) 0x55 0x04 0x0A
c.ASN1_INTEGER
ANS1中的INTEGER類型用于表示整數(shù)。
其內(nèi)容為:0x30 0x03 0x02(整數(shù)) 0x01 (整數(shù)值長(zhǎng)度)0x55 (整數(shù)值)。
d.ASN1_ENUMERATED
e. ASN1_BIT_STRING
0x01 0x02的DER編碼:0x03(BIT STRING 類型) 0x02(長(zhǎng)度) 0x01 0x02(比特值)
f.ANS1_OCTET_STRING
0x04(OCTET STRING) 0x02(長(zhǎng)度) 0x01 0x02(值)
g.ASN1_PRINGTABLESTRING
可打印字符
0x13(PRINTABLESTRING) 0x04(長(zhǎng)度) 0x61 0x73 0x6E 0X31(即"asn1")
ASN1_UTCTIME:表示時(shí)間
ASN1_GENERALIZEDTIME:表示時(shí)間
ASN1_VISIBLESTRING:存放可見(jiàn)字符
ASN1_UTF8STRING:用于存放utf8字符串,存放漢子需要將漢子轉(zhuǎn)換utf8字符串
ASN1_TYPE:用于存放任意類型
13.4 openssl的ASN.1庫(kù)
typedef struct asn1_string_st ASN1_INTGER;
ASN1_INTEGER
ASN1_ENUMERATED
ASN1_BIT_STRING
ASN1_OCTET_STRING
ASN1_PRINTABLESTRING
ASN1_T61STRING
ASN1_IAS5STRING
ASN1_UTCTIME
ASN1_GENERALIZEDTIME
ASN1_TIME
ASN1_GENERALSTRING
ASN1_TIME
ASN1_GENERALSTRING
ASN1_UNIVERSALSTRING
ASN1_BMPSTRING
ASN1_VISIBLESTRING
ASN1_UTF8STRING
ASN1_BOOLEAN
ASN1_NULL
四種基本的函數(shù)
new:用于生成一個(gè)新的數(shù)據(jù)結(jié)構(gòu)
free:用于釋放該結(jié)構(gòu)
i2d:用于將該內(nèi)部數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成DER編碼
d2i:用于將DER編碼轉(zhuǎn)換成內(nèi)部數(shù)據(jù)結(jié)構(gòu)
ASN1_INTEGER_ASN1_INTEGER_new(void);
void *ASN1_INTEGER_free(ASN1_INTEGER *a)
ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **in, long ,len)
int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **out);
long ASN1_INTEGER_get(ASN1_INTEGER *a)
int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
13.5 用openssl的ASN.1庫(kù)DER編解碼
當(dāng)采用openssl的ASN.1庫(kù)編碼一個(gè)asn.1定義結(jié)構(gòu)的時(shí)候,需要采用如下步驟
a.用ASN.1語(yǔ)法定義內(nèi)部數(shù)據(jù)結(jié)構(gòu),并聲明函數(shù)
所謂內(nèi)部數(shù)據(jù)結(jié)構(gòu),指的是openssl中用基本的數(shù)據(jù)類型按照ASN.1語(yǔ)法數(shù)據(jù)結(jié)構(gòu)
以x509v4中正數(shù)有效期為例,正數(shù)有效期定義如下:
AttCertValidityPeriod::= SEQUENCE
{
notBeforeTime GeneralizedTime,
notAfterTime GenerailizedTime,
}
我們定義相應(yīng)內(nèi)部數(shù)據(jù)結(jié)構(gòu)
typedef struct X509V4_VALID_st
{
ASN1_GENERALIZEDTIME *notBefore;
ASN1_GENERALIZEDTIME *notAfter;
} X509V4_VALID;
DECLARE_ASN1_FUNCTIONS(X509V4_VALID)
其中最后一行用于定義四個(gè)函數(shù)
X509V4_VALID *X509V4_VALID_new(void);
void *X509V4_VALID_free(X509V4_VALID *a);
X509V4_VALID *d2i_ASN1_INTEGER(X509V4_VALID **a, unsgined char **in, long len);
b. 實(shí)現(xiàn)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的四個(gè)基本函數(shù)
實(shí)現(xiàn)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的基本函數(shù),是通過(guò)一系列的紅來(lái)實(shí)現(xiàn)的。定義的模式如下,定義的模式如下,以屬性證書有效期為例,
/*X509V4_VALID*/
ASN1_SEQUENCE(X509V4_VALID) =
{
ASN1_SIMPLE(X509V4_VALID, notBefore, ASN1_GENERALIZEDTIME),
ASN1_SIMPLE(X509V4_VALID, notAfter, ASN1_GENERALIZEDTIME)
} ASN1_SEQUNCE_END(X509V4_VALID)
IMPLEMENT_ASN1_FUNCTIONS(X509V4_VALID)
這樣通過(guò)宏實(shí)現(xiàn)了一個(gè)asn.1定義結(jié)構(gòu)的最基本的四個(gè)函數(shù)
13.6 Openssl的ASN.1宏
openssl中ASN.1宏用來(lái)定義某種內(nèi)部數(shù)據(jù)結(jié)構(gòu)以及這種結(jié)構(gòu)如何編碼,部分宏定義說(shuō)明如下
a.DECLARE_ASN1_FUNCTIONS
用于聲明一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的四個(gè)基本函數(shù),一般可以在頭文件中定義。
b.IMPLEMENT_ASN1_FUNCTIONS
用于實(shí)現(xiàn)一個(gè)數(shù)據(jù)結(jié)構(gòu)的四個(gè)基本函數(shù)
c.ASN1_SEQUENCE
用于SEQUENCE,表明下面的編碼是一個(gè)SEQUENCE.
d.ASN1_CHOICE
表明下面的編碼是選擇其中一項(xiàng),為CHOICE類型
e.ASN1_SIMPLE
用于簡(jiǎn)單類型或結(jié)構(gòu)類型,并且是必須項(xiàng)。
f.ANS1_OPT
用于可選項(xiàng),表明asn.1語(yǔ)法中,本項(xiàng)可選的。
g.ANS1_EXP_OPT
用于顯示標(biāo)記,表明asn.1語(yǔ)法中,本項(xiàng)是顯示類型,并且是可選的。
h.ASN1_EXP
用于顯示標(biāo)記,表明asn.1語(yǔ)法中,本項(xiàng)是顯示標(biāo)記
i.ASN1_IMP_SEQUENCE_OF_OPT
用于隱示標(biāo)記,表明asn.1語(yǔ)法中,本項(xiàng)是一個(gè)SEQUENCE序列,為隱的。
j.ASN1_IMP_OPT
用于隱示標(biāo)記,表明asn.1語(yǔ)法中,本想是隱示類型,并且是可選的。
k.ASN1_SEQUENCE_END
用于SEQUENCE結(jié)束
l.ASN1_CHOICE_END
用于結(jié)束CHOICE類型。
13.7 ASN1常用函數(shù)
ANS1的基本數(shù)據(jù)類型如下函數(shù):new, free, i2d, d2i, i2a a2i print set get cmp和dup。
new函數(shù)用于分配空間,生成ASN1數(shù)據(jù)結(jié)構(gòu)
free用于釋放空間
i2d函數(shù)用于ASN1數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為DER編碼
d2i將DER編碼轉(zhuǎn)換為ASN1數(shù)據(jù)結(jié)構(gòu)
i2a將內(nèi)部結(jié)構(gòu)轉(zhuǎn)換為ASCII碼
a2i將ASCII碼轉(zhuǎn)換為內(nèi)部數(shù)據(jù)結(jié)構(gòu)
set函數(shù)用于設(shè)置ASN1類型的值
get函數(shù)用于獲取ASN1類型值
print將ASN1類型打印
cmp用于比較ASN1數(shù)據(jù)結(jié)構(gòu)
dup函數(shù)進(jìn)行數(shù)據(jù)結(jié)構(gòu)的拷貝。
常用的函數(shù)有:
a.int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num)
功能:計(jì)算OID的DER編碼
b.int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size)
功能:將bp中ASC碼轉(zhuǎn)換為ASN1_INTEGER,buf存放BIO中ASC碼
c.int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size)
功能:將ASCII碼轉(zhuǎn)換為ASN1_STRING
d.unsigned char *asc2uni(const char *asc, int asclen, usngined char **uni, int *unilen)
功能:將ASCII碼轉(zhuǎn)換為unicode
e.int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n)
功能:本函數(shù)根據(jù)n獲取比特位上的值
f.ASN1_BIT_STRING_set
設(shè)置ASN1_BIT_STRING的值,他調(diào)用ASN1_STRING_set函數(shù)
g.void *ASN1_d2i_bio(void *(xnew)(void), d2i_of_void *d2i, BIO *in, void **x)
對(duì)bio的數(shù)據(jù)DER解碼,xnew無(wú)意義,d2i為DER解碼函數(shù),in為bio數(shù)據(jù),x為數(shù)據(jù)類型,返回值為解碼后的結(jié)果。
h.void *ANS1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x)
將in只想的文件進(jìn)行DER解碼,器內(nèi)部調(diào)用了ASN1_d2i_b函數(shù),用法與ASN1_d2i_b類似。
i.int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x)
將ASN1數(shù)據(jù)結(jié)構(gòu)DER編碼,并將結(jié)果寫入bio
j.int ASN1_i2d_fp(i2d_of_void *i2d, d2i_of_void *d2i, char *x)
ASN1數(shù)據(jù)復(fù)制。x為ASN1內(nèi)部數(shù)據(jù)結(jié)構(gòu),本函數(shù)先將x通過(guò)i2d將他變成DER編碼,然后用d2i在DERb編碼結(jié)果
k.ASN1_ENUMERATED_set
設(shè)置ASN1_ENUMERATED的值
l.ASN1_ENUMERATED_get
獲取ASN1_ENUMERTED的值。
m.BIGNUM * ANS1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn)
將ASN1_ENUMERATED類型轉(zhuǎn)換為BN大數(shù)類型。此函數(shù)調(diào)用BN_bin2bn函數(shù)獲取bn,如果ai->type表明他在調(diào)用BN_set_negative設(shè)置bn成負(fù)數(shù)。
n.int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len; int indent, int dump)
本函數(shù)用于將pp和len指明的DER編碼值寫在BIO中,其中indent和dump用于設(shè)置打印的格式。
o.int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_LAGOR *algor2, ANS1_BIT_STRING *data, EVP_PKEY *pkey, const EVP_MD *type)
對(duì)ASN1數(shù)據(jù)類型簽名。i2d為ASN1數(shù)據(jù)的DER方法,signature用于存放簽名結(jié)果,data為ASN1數(shù)據(jù)指針,pkey指明簽名密鑰,type為摘要算法,algor1和algor2無(wú)用,可全為NULL.簽名時(shí),先將ASN1數(shù)據(jù)DER編碼,然后摘要,最后簽名運(yùn)算
p.ASN1_STRING *ASN1_STRING_dup(ASN1_STRING *str)
ASN1_STRING類型拷貝。內(nèi)部申請(qǐng)空間,需要用戶調(diào)用ASN1_STRING_free釋放該空間
q.int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b)
ASN1_STRING比較.ossl_typ.h中絕大多數(shù)ASN1基本類型都定義 ASN1_STRING,所以,此函數(shù)比較通用。
r.unsigned char *ASN1_STRING_data(ASN1_STRING *x)
獲取ASN1_STRING數(shù)據(jù)存放地址,即ASN1_STRING數(shù)據(jù)結(jié)構(gòu)中data地址。
s.int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
設(shè)置ASN1字符串類型的值。str為ASN1_STRING地址,_data為設(shè)置值的首地址,len為被設(shè)置值的長(zhǎng)度。
t.ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
根據(jù)nid來(lái)查找ASN1_STRING_TABLE表。此函數(shù)先查找標(biāo)準(zhǔn)表tbl_standard,再查找擴(kuò)展表stable。
u.ASN1_STRING *ASN1-STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in , int inlen, int inform, int nid)
根據(jù)nid和輸入值獲取對(duì)應(yīng)的ASN1_STIRNG類型
static const ASN1_STRING_TABLE tbl_standard[] = {
{NID_commonName, 1, ub_common_name, DIRSTRING_TYPE, 0},
{NID_countryName, 2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_localityName, 1, ub_locality_name, DIRSTRING_TYPE, 0},
{NID_stateOrProvinceName, 1, ub_state_name, DIRSTRING_TYPE, 0},
{NID_organizationName, 1, ub_organization_name, DIRSTRING_TYPE, 0},
{NID_organizationalUnitName, 1, ub_organization_unit_name, DIRSTRING_TYPE,
0},
{NID_pkcs9_emailAddress, 1, ub_email_address, B_ASN1_IA5STRING,
STABLE_NO_MASK},
{NID_pkcs9_unstructuredName, 1, -1, PKCS9STRING_TYPE, 0},
{NID_pkcs9_challengePassword, 1, -1, PKCS9STRING_TYPE, 0},
{NID_pkcs9_unstructuredAddress, 1, -1, DIRSTRING_TYPE, 0},
{NID_givenName, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_surname, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_initials, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_serialNumber, 1, ub_serial_number, B_ASN1_PRINTABLESTRING,
STABLE_NO_MASK},
{NID_friendlyName, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK},
{NID_name, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_dnQualifier, -1, -1, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_domainComponent, 1, -1, B_ASN1_IA5STRING, STABLE_NO_MASK},
{NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK},
{NID_rfc822Mailbox, 1, ub_rfc822_mailbox, B_ASN1_IA5STRING,
STABLE_NO_MASK},
{NID_jurisdictionCountryName, 2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_INN, 1, 12, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_OGRN, 1, 13, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_SNILS, 1, 11, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_countryCode3c, 3, 3, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_countryCode3n, 3, 3, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_dnsName, 0, -1, B_ASN1_UTF8STRING, STABLE_NO_MASK}
};
v.void ASN1_STRING_set_default_mask(unsigned long mask)
設(shè)置ASN1_STRING_set_by_NID函數(shù)返回的ASN1_STRING類型。
w.int ASN1_STRING_set_defualt_mask_asc(char *p)
設(shè)置ASN1_STRING_set_by_NID函數(shù)返回ASN1_STRING類型。字符串p可以的值由:nombstr, pkix\utf8only和defualt
x.int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, usngiend long mask, unsigned long flags)
添加擴(kuò)展ASN1_STRING_TABLE項(xiàng)
y.void ASN1_STRING_TABLE_cleanup(void)
清除用戶自建的擴(kuò)展ASN1_STRING_TBALE表
z.int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a)
將整數(shù)轉(zhuǎn)換為ASCII碼,放在BIO中。
a1.int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type)
type不起作用,將ASN1_STRING轉(zhuǎn)換為ASCII碼
b1.OBJ_bsearch
用于從排序好的數(shù)據(jù)結(jié)構(gòu)地址數(shù)組中用二分法查找數(shù)據(jù)。
c1.OBJ_create
根據(jù)oid以及名稱信息生成一個(gè)你不的object
d1.OBJ_NAME_add
OBJ_NAME_cleanup
OBJ_NAME_get
OBJ_NAME_init
OBJ_NAME_remove
OBJ_NAME_new_index
OBJ_NAME_do_all
OBJ_NAME_do_all_sorted
OBJ_NAME函數(shù)用于根據(jù)名字獲取對(duì)稱算法或者摘要算法。
e1. int OBJ_new_nid(int num)
此函數(shù)將內(nèi)部的new_nid加num,返回原nid
f1.const char *OBJ_nid2ln(int n)
根據(jù)nide得到對(duì)象的描述
g1.OBJ_nid2obj
根據(jù)nid得到對(duì)象
h1.const char *OBJ_nid2sn(int n)
根據(jù)nid得到的對(duì)象的sn(簡(jiǎn)稱)
i1.OBJ_nid2obj
根據(jù)nid得到對(duì)象
j1.const char *OBJ_nid2sn(int n)
根據(jù)nid得到對(duì)象
k1.int OBJ_obj2nid(const ASN1_OBJECT *a)
根據(jù)對(duì)象獲取其nid;
l1 int OBJ_obj2nid(const ASN1_OBJECT *a)
根據(jù)對(duì)象獲取器nid;
m1 OBJ_obj2txt
根據(jù)對(duì)象獲取對(duì)象說(shuō)明或者nid
n1.OBJ_txt2obj
根據(jù)sn或者ln得到的對(duì)象
13.8 屬性證書編碼
對(duì)屬性證書(x509v4)編碼
typedef struct X509V4_VALID_st
{
ASN1_GENERALIZEDTIME *notBefor;
ASN1_GENERALIZEDTIME *notAfer;
}X509V4_VALID;
DECLARE_ASN1_FUNCTIONS(X509V4_VALID)
typedef struct ISSUERSERIAL_st
{
GENERAL_NBAMES *issuer;
ASN1_INTEGER *subjectSN;
ASN1_BIT_STRING *issuerUID;
} ISSUERSERIAL;
DECLARE_ASN1_FUNCTIONS(ISSUERSERIAL)
typedef struct OBJDIGEST_st
{
ASN1_ENUMERATE *digestType;
ASN1_OBJECT *otherType;
X509_ALGOR *digestAlg;
ASN1_BIT_STRING *digestBit;
} OBJDIGEST;
DECLARE_ASN1_FUNCTIONS(OBJDIGEST)
typedef struct ACHOLDER_st
{
ISSUERSERIAL *baseCertificateID;
GENERAL_NAMES *entiyName
OBJDIGEST *objDigest;
}ACHOLDER;
DECLARE_ASN1_FUNCTIONS(ACHOLDER)
typedef struct V2FORM_st
{
GENERAL_NAMES *entiyName;
issuerserial *baseCertificateID;
OBJDIGEST *objDigest;
}V2FORM;
DECLARE_ASN1_FUNCTIONS(V2FORM)
typedef struct ACISSUER_st
{
int type;
union
{
V2FORM *v2Form;
}form;
} ACISSUER;
DECLARE_ASN1_FUNCTIONS(ACISSUER)
ASN1_SEQUENCE(ISSUERSERIAL) = {
asn1_simple(issuerserial, ISSUER, GENERAL_NAMES),
ASN1_SIMPLE(ISSUERSERIAL, subjectSN, ASN1_INTEGER)
ASN1_OPT(ISSUERSERIAL, isserUID, ASN1_BIT_STIRNG)
}ASN1_SEQUENCE_END(ISSUERSERIAL)
IMPLEMENT_ASN1_FUNCTIONS(ISSUERSERIAL)
ASN1_SEQUENCE(OBJDIGEST) = {
ASN1_SIMPLE(OBJDIGEST, digestType, ASN1_ENUMERATED),
ASN1_OPT(OBJDIGEST, otherType, ASN1_OBJECT),
ASN1_SIMPLE(OBJDIGEST, digestAlg, X509_ALGOR)
ASN1_SIMPLE(OBJDIGEST, digestBit, ASN1_BIT_STRING)
} ASN1_SEQUENEC_END(OBJDIGEST)
IMPLEMENT_ASN1_FUNCTIONS(OBJDIGEST)
ASN1_SEQUENCE(X509V4_ALID) = {
ASN1_SIMPLE(X509V4_VALID, notBefore, ASN1_GENERALIZEDTIME)
ASN1_SIMPLE(X509V4_VALID, notAfer, ASN1_GENERALIZEDTIME)
}IMPLEMENT_ASN1_FUNCTIONS(X509V4_VALID)\
ASN1_SEQUENCE(X5409V4_CINF) = {
ASN1_SIMPLE(X509V4_CINF, version, ASN1_INTEGER)
ASN1_SIMPLE(X509V4_CINF, holder, ACHOLDER)
ASN1_SIMPLE(X509V4_CINF, issuer, ACISSUER)
ASN1_SIMPLE(X509V4_CINF, signature, ACISSUER)
ASN1_SIMPLE(X509V4_CINF, serialNumber, ASN1_INTEGER)
ASN1_SIMPLE(X509V4_CINF, X509V4_VALID)
ASN1_SIMPLE(X509V4_CINF,attributes, X509_ATTRIBUTE)
ASN1_SIMPLE(X509V4_CINF, issuerUID, ASN1_BIT_STRING)
ASN1_SIMPLE(X509V4_CINF, EXTENSIONS, x509_extension
}ASN1_SEQUENCE_END(X509V4_CINF)
IMPLEMENT_ASN1_FUNCTIONS(X509V4_CINF)
ASN1_SEQUENCE(X509V4) = {
ASN1_SIMPLE(X509V4, cert_info, X509V4_CINF)
ASN1_SIMPLE(X509V4, sig_alg, X509_ALGOR)
ASN1_SIMPLE(X509V4, signature, ASN1_BIT_STRING)
}ASN1_SEQUENCE_END(X5509V4)
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。