Skip to content

对SM2签名后的数据进行base64编码会存在换行,导致GB35114身份认证失败 #1861

@lazy-wangxl

Description

@lazy-wangxl

最近在做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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions