第十三章 NSA1库 / 13.5 用openssl的ASN.1库DER编解码

       当采用OpensslASN.1库编码一个asn.1定义的结构的时候,需要采用如下步骤:

1)    ASN.1语法定义内部数据结构,并声明函数;

              所谓内部数据结构,指的是Openssl中用基本的数据类型按照ASN.1语法定义的其他的数据结构,这种数据结构可以方便的用于编解码。

              x509v4中的证书有效期为例,证书有效期定义如下:

              AttCertValidityPeriod  ::= SEQUENCE

              {

              notBeforeTime  GeneralizedTime,

              notAfterTime   GeneralizedTime

              }

              所以我们可以定义相应的内部数据结构,如下:

              typedef    struct      X509V4_VALID_st

              {

              ASN1_GENERALIZEDTIME *notBefore;

              ASN1_GENERALIZEDTIME *notAfter;

              }X509V4_VALID;

              DECLARE_ASN1_FUNCTIONS(X509V4_VALID)

              其中最后一行用于定义四个函数:

              X509V4_VALID *X509V4_VALID_new(void);

              void *X509V4_VALID_free(X509V4_VALID *a);

              X509V4_VALID  *d2i_ASN1_INTEGER(X509V4_VALID **a,unsigned char **in,long len);

              int    i2d_ X509V4_VALID (X509V4_VALID *a,unsigned char **out);

       2)    实现内部数据结构的四个基本函数

              实现内部数据结构的基本函数,是通过一系列的宏来实现的。定义的模式如下,以属性证书有效期为例,如下:

              /* X509V4_VALID */

              ASN1_SEQUENCE(X509V4_VALID) =

              {

              ASN1_SIMPLE(X509V4_VALID, notBefore, ASN1_GENERALIZEDTIME),

              ASN1_SIMPLE(X509V4_VALID, notAfter, ASN1_GENERALIZEDTIME)

              } ASN1_SEQUENCE_END(X509V4_VALID)

              IMPLEMENT_ASN1_FUNCTIONS(X509V4_VALID)

              这样通过宏就实现了一个asn.1定义结构的最基本的四个函数。

              本例有五个宏,采用什么样的宏,与数据结构的asn.1定义相关。