该结构用来存放摘要或者签名值,定义在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中实现,包括newfreei2dd2i函数。

用于签名的摘要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;

}