内核中public_key_verify_signature返回-74(EBADMSG)的问题求助
问题原因及解决方法
核心问题
你在代码中直接传入了原始SHA-256哈希值,但内核的PKCS#1签名验证逻辑要求传入的是包含哈希算法标识的PKCS#1 DigestInfo结构,而非裸哈希。
OpenSSL的openssl dgst -sha256 -sign命令在签名时,会自动将原始哈希值封装进PKCS#1的DigestInfo结构后再进行RSA签名;而内核的public_key_verify_signature(底层调用rsa_pkcs1_verify)在验证时,会期望签名对应的明文是这个完整的DigestInfo结构,而非裸哈希,因此直接传裸哈希会导致验证失败,返回EBADMSG。
DigestInfo结构格式
SHA-256对应的DigestInfo ASN.1结构DER编码前缀为:0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20
将这段前缀拼接在原始SHA-256哈希值前,就是内核验证需要的完整数据。
修改后的关键代码片段
// SHA-256 DigestInfo结构 + 原始哈希值"123" static u8 _digest[] = { 0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20, 0xa6,0x65,0xa4,0x59,0x20,0x42,0x2f,0x9d,0x41,0x7e,0x48,0x67,0xef,0xdc,0x4f,0xb8,0xa0,0x4a,0x1f,0x3f,0xff,0x1f,0xa0,0x7e,0x99,0x8e,0x86,0xf7,0xf7,0xa2,0x7a,0xe3 }; struct public_key_signature sig = { .s = _sign, .s_size = (u32)(sizeof(_sign)), //256 .digest = _digest, .digest_size = 50, // 修正为DigestInfo结构的总长度(19字节前缀+32字节哈希) .pkey_algo = "rsa", .hash_algo = "sha256", .encoding = "pkcs1", };
验证逻辑说明
内核PKCS#1验证流程:
- 使用公钥解密签名得到明文
- 检查明文是否符合PKCS#1的DigestInfo格式(包括算法OID匹配)
- 提取其中的哈希值与传入的哈希值对比
如果传入的是裸哈希,第二步格式检查会直接失败,返回EBADMSG。
内容的提问来源于stack exchange,提问作者luohe
相关产品推荐
相关产品推荐

