Openssl 将原始格式ecdsa sha384 csr签名转换为ASN1格式

Openssl 将原始格式ecdsa sha384 csr签名转换为ASN1格式,openssl,asn.1,csr,Openssl,Asn.1,Csr,我有一个96字节长的ecdsa签名,它是由一张原始格式的智能卡用sha384算法创建的 48字节长的整数r和s。ecdsa签名位于sign_ptr指向的缓冲区中。我正在转换原始格式 使用此函数以ASN1格式签名到buf_out(C): } 我想知道是否有一个等效的openssl函数可以帮助我以更优雅的方式完成这项工作?我确实看过很多d2i函数(d2i_ASN1_xxxx、ASN1_item_d2i、ASN_d2i_func等),但不清楚哪一个适合。以下是我从Stephen N.Henson博士那

我有一个96字节长的ecdsa签名,它是由一张原始格式的智能卡用sha384算法创建的 48字节长的整数r和s。ecdsa签名位于sign_ptr指向的缓冲区中。我正在转换原始格式 使用此函数以ASN1格式签名到buf_out(C):

}


我想知道是否有一个等效的openssl函数可以帮助我以更优雅的方式完成这项工作?我确实看过很多d2i函数(d2i_ASN1_xxxx、ASN1_item_d2i、ASN_d2i_func等),但不清楚哪一个适合。

以下是我从Stephen N.Henson博士那里得到的答案。OpenSSL用户论坛中的OpenSSL项目核心开发人员:

“ECDSA_SIG结构就是您需要的结构

概述:使用ECDSA_SIG_new分配结构,使用BN_bin2bn设置r和s值,使用i2d_ECDSA_SIG对结果进行编码,最后使用ECDSA_SIG_free释放。

信息:
int convert_ecdsa_sha384_sign(char **buf_out, char *sign_ptr)
{
   buf_out[0]=0x30;                            /* Type = Sequence of */
   buf_out[2]=0x02;                            /* Type = Integer */
   /* Verify if negative bit is set */
   if (!(sign_ptr[0] & 0x80))
   {
       buf_out[3]=0x30;                        /* Length */
       memcpy(&(buf_out[4]), sign_ptr, 48);    /* Copy first integer */
   }
   else
   {
       /* Negative bit is set. Add one padding byte */
       buf_out[3]=0x31;                        /* Length */
       buf_out[4]=0x00;                        /* Padding */
       memcpy(&(buf_out[5]), sign_ptr, 48);    /* Copy first integer */
       sign_offset += 1;
   }

   buf_out[52+sign_offset]=0x02;                                      /* Type = Integer */
   /* Verify if negative bit is set */
   if (!(sign_ptr[48] & 0x80))
   {
       buf_out[53+sign_offset]=0x30;                                  /* Length */
       memcpy(((&(buf_out[54]))+ sign_offset), sign_ptr + 48, 48);    /* Copy second integer */
   }
   else
   {
       /* Negative bit is set. Add one padding byte */
       buf_out[53+sign_offset]=0x31;                                 /* Length */
       buf_out[54+sign_offset]=0x00;                                 /* Padding */
       memcpy(((&(buf_out[55]))+ sign_offset), sign_ptr + 48, 48);   /* Copy second integer */
       sign_offset += 1;
   }
   buf_out[1]= 100 + sign_offset;                                    /* Total signature length */
   return 1;