我有一个96字节长的ecdsa签名,用sha384算法用原始格式的智能卡创建。它由两个人组成 48个字节长的整数r和s。 ecdsa签名位于sign_ptr指向的缓冲区中。我正在转换原始格式 使用此函数(在C中)以ASN1格式签名到buf_out:
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;
}
我想知道是否有一个等效的openssl函数可以帮助我以更优雅的方式做到这一点?我确实看过很多d2i函数(d2i_ASN1_xxxx,ASN1_item_d2i,ASN_d2i_func等),但不清楚哪一个适合。
答案 0 :(得分:0)
以下是我从Stephen N. Henson博士那里得到的答案。 openssl-users论坛中的OpenSSL项目核心开发人员:
“结构ECDSA_SIG是您需要的结构。
概述:使用ECDSA_SIG_new分配结构,使用BN_bin2bn设置r和s值,使用i2d_ECDSA_SIG编码结果,最后使用ECDSA_SIG_free免费“。