该数据结构用来表示算法,它定义在crypto/x509/x509.h中,如下:

struct X509_algor_st

{

ASN1_OBJECT *algorithm;

ASN1_TYPE *parameter;

}

包含两项:

algorithmASN1_OBJECT类型,表明了是何种算法;

parameterASN1_TYPE类型,代表该算法需要的参数。ASN1_TYPE类型可以存放任意数据。

该结构的DER编解码接口在crypto/asn1/x_algor.c中由ASN1宏来实现,其中parameter是可选的。该结构相关的函数为:new(生成数据结构)free(释放数据结构)i2d(将它转换为DER编码)d2i(DER编码转换为该结构)dup(拷贝)

编程示例如下:

#include <string.h>

#include <openssl/x509.h>

int    main()

{

       FILE       *fp;

       char*buf,*p;

       chardata[]={"12345678"},read[1024];

       int           len;

       X509_ALGOR       *alg=NULL,*alg2=NULL,*alg3=NULL;

 

       /* new 函数 */

       alg=X509_ALGOR_new();

       /* 构造内容 */

       alg->algorithm=OBJ_nid2obj(NID_sha256);

       alg->parameter=ASN1_TYPE_new();

       ASN1_TYPE_set_octetstring(alg->parameter,data,strlen(data));

       /* i2d 函数 */

       len=i2d_X509_ALGOR(alg,NULL);

       p=buf=malloc(len);

       len=i2d_X509_ALGOR(alg,&p);

       /* 写入文件 */

       fp=fopen("alg.cer","wb");

       fwrite(buf,1,len,fp);

       fclose(fp);

       /* 读文件 */

       fp=fopen("alg.cer","rb");

       len=fread(read,1,1024,fp);

       fclose(fp);

       p=read;

       /* d2i 函数 */

       d2i_X509_ALGOR(&alg2,&p,len);

       if(alg2==NULL)

       {

              printf("err\n");

       }

       /* dup 函数 */

       alg3=X509_ALGOR_dup(alg);

       /* free 函数 */

       X509_ALGOR_free(alg);

       if(alg2)

              X509_ALGOR_free(alg2);

       X509_ALGOR_free(alg3);

       free(buf);

       return 0;

}