sm2 验签不通过

This commit is contained in:
cheney
2026-04-04 17:54:13 +08:00
parent f9d9203349
commit 959f058def
6 changed files with 376 additions and 2 deletions
+59 -2
View File
@@ -370,13 +370,70 @@ function verifyPKCS7WithJsrsasign(base64Data, verifyData) {
const tbsCert = rs.ASN1HEX.getTLVbyList(certHex, 0, [0])
const spki = rs.ASN1HEX.getTLVbyList(tbsCert, 0, [6])
const publicKeyBitString = rs.ASN1HEX.getTLVbyList(spki, 0, [1])
const publicKeyHex = publicKeyBitString.substring(6) // 跳过 tag, length, unused bits
let publicKeyHex = publicKeyBitString.substring(6) // 跳过 tag, length, unused bits
// 去掉公钥的 04 前缀(如果有)
if (publicKeyHex.startsWith('04')) {
publicKeyHex = publicKeyHex.substring(2)
}
// 计算 SM3 哈希
const hash = sm3(verifyData.toString())
// 转换签名格式:从 ASN.1 DER 格式转换为原始 r|s 格式
let signatureHex = signer.sighex
if (signatureHex.startsWith('30')) {
// ASN.1 DER 格式: 30 44 02 20 [r] 02 20 [s]
try {
const rStart = 8 // 30440220
const r = signatureHex.substring(rStart, rStart + 64) // 32字节 = 64 hex 字符
const sStart = rStart + 64 + 4 // 0220
const s = signatureHex.substring(sStart, sStart + 64) // 32字节 = 64 hex 字符
signatureHex = r + s
} catch (e) {
// 如果解析失败,使用原始签名
}
}
// 使用 SM2 验证签名 (注意:使用 doVerifySignature,不是 doVerify)
return sm2.doVerifySignature(hash, signer.sighex, publicKeyHex)
// 尝试不同的选项组合
try {
// 尝试 1: 直接验证
const result1 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex)
if (result1) return true
// 尝试 2: 使用 DER 格式
const result2 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true })
if (result2) return true
// 尝试 3: 使用 SM3 哈希
const result3 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { hash: true })
if (result3) return true
// 尝试 4: 同时使用 DER 和 SM3
const result4 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true, hash: true })
if (result4) return true
// 尝试 5: 直接使用原始数据而不是哈希
const result5 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex)
if (result5) return true
// 尝试 6: 使用原始数据 + DER
const result6 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true })
if (result6) return true
// 尝试 7: 使用原始数据 + SM3
const result7 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { hash: true })
if (result7) return true
// 尝试 8: 所有选项
const result8 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { der: true, hash: true })
if (result8) return true
} catch (e) {
// 忽略错误,继续尝试其他选项
}
return false
} else {
// RSA 验证(通过 jsrsasign)
try {