该数据结构用来表示算法,它定义在crypto/x509/x509.h中,如下:
struct X509_algor_st
{
ASN1_OBJECT *algorithm;
ASN1_TYPE *parameter;
}
包含两项:
algorithm:ASN1_OBJECT类型,表明了是何种算法;
parameter:ASN1_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;
}