-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Open
Description
最近在做GB35114的SIP 双向身份认证功能,目前遇到一个问题,使用SM2对random2+random1+sip服务器ID做数字签名,得到结果sign1,然后进行base64编码,但是编码之后存在换行(SIP头中存在换行肯定是有问题的);也不知道具体是哪里的问题,以下是签名和base64编码的相关代码:
// 1. 用FDWSF私钥对random2+random1+sip服务器ID做数字签名,得到结果sign1。
uint8_t msg[2048] = {0};
size_t msg_len = 0;
memset(msg, 0, sizeof(msg));
memcpy(msg + msg_len, random2.c_str(), random2.length());
msg_len += random2.length();
memcpy(msg + msg_len, random1.c_str(), random1.length());
msg_len += random1.length();
memcpy(msg + msg_len, serverid.c_str(), serverid.length());
msg_len += serverid.length();
uint8_t dgst[32];
SM3_CTX ctx;
sm3_init(&ctx);
sm3_update(&ctx, msg, msg_len );
sm3_finish(&ctx, dgst);
SM2_SIGNATURE sm2_sig;
uint8_t sig[64];
memset(sig, 0, sizeof(sig));
if (sm2_do_sign(key, dgst, &sm2_sig) != 1) {
error_print();
return -1;
}
// 直接拼接r和s(各32字节)
memcpy(sig, sm2_sig.r, 32);
memcpy(sig + 32, sm2_sig.s, 32);
BASE64_CTX ctx;
base64_encode_init(&ctx);
int update_len;
uint8_t out[2048] = {0};
size_t out_len = sizeof(out);
uint8_t *p = out;
// 处理数据块
base64_encode_update(&ctx, in, in_len, p, &update_len);
p += update_len;
// 完成编码
int finish_len;
base64_encode_finish(&ctx, p, &finish_len);
p += finish_len;
out_len = p - out;
Metadata
Metadata
Assignees
Labels
No labels