第二十四章 通用数据结构 / 24.8 X509_ATTRIBUTE

该数据结构用来存放属性信息,定义在crypto/x509/x509.h中,如下:

typedef struct x509_attributes_st

{

       ASN1_OBJECT *object;

       int single;

       union     

{

              char        *ptr;

STACK_OF(ASN1_TYPE) *set;

ASN1_TYPE  *single;

       } value;

} X509_ATTRIBUTE;

X509_ATTRIBUTE可以存放任意类型的数据,object指明了属性的类型,single用于表示value的类型是ASN1_TYPE(0)还是ASN1_TYPE堆栈(1)ASN1_TYPE可以存放任意ASN1类型数据。

该结构的DER编解码在crypto/asn1/x_attrib.c中由宏实现,实现了newfreei2dd2idup函数。

主要函数:

1)      i       nt X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr)

获取属性中ASN1_TYPE的个数。

       2X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)

生成一个属性。id用来生成ASN1_OBJECT,指明是哪种属性,atrtypeASN1类型,value为值,用来设置set堆栈。

3X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,

            const ASN1_OBJECT *obj, int atrtype, const void *data, int len)

生成一个属性,obj指明了属性类型,atrtypeASN1类型,datalen指明了需要设置的值。

4X509_ATTRIBUTE_create_by_NID

       同上,属性类型由nid指定。

5X509_ATTRIBUTE_create_by_txt

       同上,属性类型由ASN1_OBJECT的名字指定。

6X509_ATTRIBUTE_dup

       拷贝函数。

7ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)

获取属性中由堆栈位置idx指定的ASN1_TYPE,如果属性不是set集合则返回value. single

       8void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,

                                   int atrtype, void *data)

              idxASN1类型atrtype来获取value. ptr

9X509_ATTRIBUTE_get0_object

              获取属性类型信息。

10)   X509_ATTRIBUTE_set1_data

设置属性信息。

11)   X509_ATTRIBUTE_set1_object

              设置属性类别。

       12STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(

STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr)

性堆栈中添加一个属性,返回属性堆栈;如果*xNULL,则生成一个新的堆栈。

13)   STACK_OF(X509_ATTRIBUTE) 509at_add1_attr_by_NID(

STACK_OF(X509_ATTRIBUTE) **x,int nid,

int type,const unsigned char *bytes, int len)

往属性堆栈中添加一个属性,添加属性的类型由nid指定,bytes为属性值,len为其长度,type指明了bytesASN1类型。

14X509at_add1_attr_by_OBJ

       同上,属性类型由ASN1_OBJECT指定。

15X509at_add1_attr_by_txt

       同上,属性类型由属性名指定。