现在的位置: 首页 > 综合 > 正文

openssl之ASN.1系列之3—ASN.1函数概述和结构

2013年08月28日 ⁄ 综合 ⁄ 共 2836字 ⁄ 字号 评论关闭

 DragonKing在2003-2-24 8:49:35写道 openssl之ASN.1系列之3---ASN.1函数概述和结构 ---根据openssl源代码、SSLeay Documents以及其它相关材料写成 作者:DragonKing(Eric Wang) Mail: wzhah@263.net 版权声明:未经作者授权,本文不能在任何商业性质的出版物或网站上进行转载
发布网站:
http://openssl.126.com OpenSSL版本:openssl-0.9.7
  【ASN.1函数库概述】 因为X509相关的协议都是基于ASN.1和DER编码的,所以openssl提供了一组函数,这些函数可以读取DER编码的对象,并将它们转换成openssl能够处理的内部格式;这些函数也可以将openssl里定义的C格式的对象结构转换成DER编码的对象。此外,该系列还提供了一些对这些对象进行比较、读取和设定指定值的函数。该系列函数还包括了一些签名函数,这是因为在签名之前,有些对象需要进行DER编码。 下面对ASN.1函数库中重要的数据结构做简单的介绍。
  【ASN1_CTX】 该结构用来在ASN1处理过程中维护跟踪各种相关变量,其定义如下: typedef struct asn1_ctx_st { unsigned char *p; int eos; int error; int inf; int tag; int xclass; long slen; unsigned char *max; unsigned char *q; unsigned char **pp; int line; } ASN1_CTX; 其中,参数p是工作字符指针,其最大长度由参数max指定;eos是indefinite编码模式的结束标识标志;error是错误代码;inf值为0x20代表constructd模式,
为0x21代表indefinite模式;tag是最后取得的对象的tag值;xclass是最后取得的对象的类型;slen是最后取得的对象的长度;line变量在出错处理的时候使用。 【ASN1_OBJECT】 该结构用来保存一个ASN1对象,其定义如下: typedef struct asn1_object_st { char *sn,*ln; int nid; int length; unsigned char *data; int flags; }ASN1_OBJECT; 其中,nid是openssl内部定义的每个数字对象的独特标识码;sn是对象的简称;ln是对象的长名或小写名;data是相应对象的数据,length是该data字段的长度,flags是一个释放标志。
  【ASN1_STRING】 该结构是openssl里一个很基本的ASN.1对象结构,Openssl里定义的很多类型的对象都是采用该结构的,他们包括ASN1_INTEGER、ASN1_BIT_STRING、ASN1_OCTET_STRING、ASN1_PRINTABLESTRING、ASN1_T61STRING、ASN1_IA5STRING、ASN1_UTCTIME、ASN1_GENERALIZEDTIME、ASN1_GENERALSTRING、ASN1_UNIVERSALSTRING和ASN1_BMPSTRING。该结构的定义如下:
typedef struct asn1_string_st { int length; int type; unsigned char *data; long flags; } ASN1_STRING; 其中,type参数指明对象的类型;data参数是对象的数据,length指定了其长度;flags值跟type有关,一般来说,在BIT_STRING对象中使用。
  【ASN1_TYPE】 该结构可以保存任意类型的ASN.1对象,其定义如下: typedef struct asn1_type_st { int type; union { char *ptr; ASN1_BOOLEAN boolean; ASN1_STRING * asn1_string; ASN1_OBJECT * object; ASN1_INTEGER * integer; ASN1_ENUMERATED * enumerated; ASN1_BIT_STRING * bit_string; ASN1_OCTET_STRING
* octet_string; ASN1_PRINTABLESTRING * printablestring; ASN1_T61STRING * t61string; ASN1_IA5STRING * ia5string; ASN1_GENERALSTRING * generalstring; ASN1_BMPSTRING * bmpstring; ASN1_UNIVERSALSTRING * universalstring; ASN1_UTCTIME * utctime; ASN1_GENERALIZEDTIME
* generalizedtime; ASN1_VISIBLESTRING * visiblestring; ASN1_UTF8STRING * utf8string; ASN1_STRING * set; ASN1_STRING * sequence; } value; } ASN1_TYPE; 其中,参数type指定了对象的类型。
  【ASN1_METHOD】 该结构包含了指向一组函数的指针,这些函数定义了在openssl内部结构和DER编码对象之间进行格式转换的功能,还定义了分配和释放一个结构的功能。其定义如下: typedef struct asn1_method_st { int (*i2d)(); char *(*d2i)(); char *(*create)(); void (*destroy)(); } ASN1_METHOD; 其中,i2d指向的函数将内部格式转换成DER编码格式;d2i指向的函数将DER编码的对象转换成内部结构;create指向的函数给新对象分配内存;destroy指向的函数释放对象的内存。
例如,在文件x_x509.c里,X509对象的METHOD结构初始化如下: static ASN1_METHOD meth= { (int (*)()) i2d_X509, (char *(*)())d2i_X509, (char *(*)())X509_new, (void (*)()) X509_free }; ASN1_METHOD *X509_asn1_meth() { return(&meth); }
  【ASN1_HEADER】 该结构只在Netscape格式的证书里使用了(参考apps/x509.c文件),其定义如下: typedef struct asn1_header_st { ASN1_OCTET_STRING *header; char *data; ASN1_METHOD *meth; } ASN1_HEADER; 除了上述介绍的基本结构外,ASN.1相关的结构还有几个,但这些因为不是特别通用,在这里不再作介绍,有兴趣可以看文件x509.h。 

抱歉!评论已关闭.