该数据结构用来存放属性信息,定义在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中由宏实现,实现了new、free、i2d、d2i和dup函数。
主要函数:
1) i nt X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr)
获取属性中ASN1_TYPE的个数。
2)X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
生成一个属性。id用来生成ASN1_OBJECT,指明是哪种属性,atrtype为ASN1类型,value为值,用来设置set堆栈。
3)X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
const ASN1_OBJECT *obj, int atrtype, const void *data, int len)
生成一个属性,obj指明了属性类型,atrtype为ASN1类型,data和len指明了需要设置的值。
4)X509_ATTRIBUTE_create_by_NID
同上,属性类型由nid指定。
5)X509_ATTRIBUTE_create_by_txt
同上,属性类型由ASN1_OBJECT的名字指定。
6)X509_ATTRIBUTE_dup
拷贝函数。
7)ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)
获取属性中由堆栈位置idx指定的ASN1_TYPE,如果属性不是set集合则返回value. single。
8)void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
int atrtype, void *data)
由idx和ASN1类型atrtype来获取value. ptr。
9)X509_ATTRIBUTE_get0_object
获取属性类型信息。
10) X509_ATTRIBUTE_set1_data
设置属性信息。
11) X509_ATTRIBUTE_set1_object
设置属性类别。
12)STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(
STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr)
性堆栈中添加一个属性,返回属性堆栈;如果*x为NULL,则生成一个新的堆栈。
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指明了bytes的ASN1类型。
14)X509at_add1_attr_by_OBJ
同上,属性类型由ASN1_OBJECT指定。
15)X509at_add1_attr_by_txt
同上,属性类型由属性名指定。