该结构用来存放摘要或者签名值,定义在crypto/x509/x509.h中,如下:
typedef struct X509_sig_st
{
X509_ALGOR *algor;
ASN1_OCTET_STRING *digest;
} X509_SIG;
其中,algor为算法,digest用于存放摘要或者签名值。对数据进行签名时,要先对数据摘要,摘要的结果要通过本结构进行DER编码,然后才能用私钥进行计算,此时digest中存放的就是摘要值。
本结构的DER编码通过ASN1宏在crypto/asn1/x_sig.c中实现,包括new、free、i2d和d2i函数。
用于签名的摘要DER编码示例如下:
#include <string.h>
#include <openssl/x509.h>
int main()
{
X509_SIG *sig;
unsigned char data[50]={"123456789"};
unsigned char dgst[20];
int len;
unsigned char *buf,*p;
FILE *fp;
SHA1(data,strlen(data),dgst);
sig=X509_SIG_new();
/* sig->algor->algorithm 不是动态分配的,所有不需要释放
ASN1_OBJECT_free(sig->algor->algorithm); */
sig->algor->algorithm=OBJ_nid2obj(NID_sha1);
ASN1_OCTET_STRING_set(sig->digest,dgst,20);
len=i2d_X509_SIG(sig,NULL);
p=buf=malloc(len);
len=i2d_X509_SIG(sig,&p);
fp=fopen("sig.cer","wb");
fwrite(buf,1,len,fp);
fclose(fp);
free(buf);
X509_SIG_free(sig);
return 0;
}