测试通过
TDevOPsCICD / build-image (push) Waiting to run

This commit is contained in:
cheney
2026-04-04 18:24:03 +08:00
parent 03169b5165
commit b73d9b0aac
5 changed files with 213 additions and 3 deletions
+34 -3
View File
@@ -372,9 +372,9 @@ function verifyPKCS7WithJsrsasign(base64Data, verifyData) {
const publicKeyBitString = rs.ASN1HEX.getTLVbyList(spki, 0, [1])
let publicKeyHex = publicKeyBitString.substring(6) // 跳过 tag, length, unused bits
// 去掉公钥的 04 前缀(如果有)
if (publicKeyHex.startsWith('04')) {
publicKeyHex = publicKeyHex.substring(2)
// 确保公钥有 04 前缀(sm-crypto 0.3.13 需要)
if (!publicKeyHex.startsWith('04')) {
publicKeyHex = '04' + publicKeyHex
}
// 计算 SM3 哈希
@@ -411,6 +411,37 @@ function verifyPKCS7WithJsrsasign(base64Data, verifyData) {
// 尝试 6: 使用哈希 + DER
const result6 = sm2.doVerifySignature(hash, signatureHex, publicKeyHex, { der: true })
if (result6) return true
// 尝试 7: 不使用 der 选项(直接使用签名)
const result7 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex)
if (result7) return true
// 尝试 8: 不使用 der 选项 + SM3 + userId
const result8 = sm2.doVerifySignature(verifyData.toString(), signatureHex, publicKeyHex, { hash: true, userId })
if (result8) return true
// 尝试 9: 转换签名格式为原始 r|s 格式
if (signatureHex.startsWith('30')) {
try {
// 解析 ASN.1 DER 格式
// 格式: 30 len 02 len r 02 len s
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 字符
const rawSignature = r + s
// 尝试使用原始 r|s 格式
const result9 = sm2.doVerifySignature(verifyData.toString(), rawSignature, publicKeyHex)
if (result9) return true
// 尝试使用原始 r|s 格式 + SM3 + userId
const result10 = sm2.doVerifySignature(verifyData.toString(), rawSignature, publicKeyHex, { hash: true, userId })
if (result10) return true
} catch (e) {
// 忽略错误,继续尝试
}
}
} catch (e) {
// 忽略错误,继续尝试其他选项
}