第十三章 NSA1库 / 13.4 openssl 的ASN.1库

       OpensslASN.1库定义了asn.1对应的基本数据结构和大量用于DER编码的宏。比如整型定义如下:

       typedef struct asn1_string_st ASN1_INTEGER;

       另外,还用相同的数据结构asn1_string_st定义了:

       ASN1_ENUMERATED

       ASN1_BIT_STRING

       ASN1_OCTET_STRING

       ASN1_PRINTABLESTRING

       ASN1_T61STRING

       ASN1_IA5STRING

       ASN1_GENERALSTRING

       ASN1_UNIVERSALSTRING

       ASN1_BMPSTRING

       ASN1_UTCTIME

       ASN1_TIME

       ASN1_GENERALIZEDTIME

       ASN1_VISIBLESTRING

       ASN1_UTF8STRING

       ASN1_TYPE;

       这些都是定义基本数据结构的必要元素。

对于每种类型,均有四种最基本的函数:newfreei2dd2i。其中new函数用于生成一个新的数据结构;free用于释放该结构;       i2d用于将该内部数据结构转换成DER编码;d2i用于将DER编码转换成内部数据结构。另外,大部分类型都有setget函数,用于给内部数据结构赋值和从中取值。以ASN1_INTEGER为例,它有如下基本函数:

              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)

              前面的四个函数由DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER)声明,并由             IMPLEMENT_ASN1_FUNCTIONS(ASN1_INTEGER)实现。

              采用ASN.1定义的复杂的结构都是由基本的类型构造的,因此可以用这些基本的数据来实现对复杂结构的编码。