sm2 验签不通过
This commit is contained in:
+59
-2
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user