kit.program/kit/test/debug_user_sm2_verify.js
cheney b73d9b0aac
Some checks are pending
TDevOPsCICD / build-image (push) Waiting to run
测试通过
2026-04-04 18:24:03 +08:00

92 lines
3.2 KiB
JavaScript

const sm2 = require('sm-crypto').sm2;
const sm3 = require('sm-crypto').sm3;
console.log('=== 验证用户提供的 SM2 数据 ===');
// 用户提供的数据
const dataHex = '51444A4E484856425F465751';
const signatureHex = '02D3816303EE2A352477F3227070CC34297BD6E89DC86E2C54840FFFC92C3B6766114B6BFA CB00408CC51B8C18D02023F50671844372094D9460BD5F85ACAC50'.replace(/\s/g, '');
const userId = '1234567812345678';
const hashHex = '0F76D50E476E24507187885DF1BC197B48F368F3C03DDF0A5C0C067D2EEF63EE';
// 从用户的 PKCS7 签名中提取的公钥(去掉 04 前缀)
const publicKeyHex = 'bb7754e559f6d158d52fdc4608244f07f12901363a1d6db8fb3219bf8e827efd11d8f18cf9926cfdd61aaf0eea2429e921b7b94f43ca9b2c89213355ad59e731';
// 转换数据
const data = Buffer.from(dataHex, 'hex').toString('utf8');
console.log('数据:', data);
console.log('数据长度:', data.length);
console.log('签名:', signatureHex);
console.log('签名长度:', signatureHex.length / 2, '字节');
console.log('公钥:', publicKeyHex);
console.log('userId:', userId);
// 计算哈希
const calculatedHash = sm3(data);
console.log('\n计算的哈希:', calculatedHash);
console.log('用户提供的哈希:', hashHex);
console.log('哈希是否匹配:', calculatedHash === hashHex);
// 测试不同的验证选项
console.log('\n测试不同的验证选项:');
// 尝试 1: 直接验证(原始 r|s 格式)
console.log('\n1. 直接验证(原始 r|s 格式):');
try {
const result1 = sm2.doVerifySignature(data, signatureHex, publicKeyHex);
console.log(' 验证结果:', result1);
} catch (e) {
console.error(' 错误:', e.message);
}
// 尝试 2: 带 SM3 哈希
console.log('\n2. 带 SM3 哈希:');
try {
const result2 = sm2.doVerifySignature(data, signatureHex, publicKeyHex, { hash: true });
console.log(' 验证结果:', result2);
} catch (e) {
console.error(' 错误:', e.message);
}
// 尝试 3: 带 SM3 哈希 + userId
console.log('\n3. 带 SM3 哈希 + userId:');
try {
const result3 = sm2.doVerifySignature(data, signatureHex, publicKeyHex, { hash: true, userId });
console.log(' 验证结果:', result3);
} catch (e) {
console.error(' 错误:', e.message);
}
// 尝试 4: 使用哈希值
console.log('\n4. 使用哈希值:');
try {
const result4 = sm2.doVerifySignature(hashHex, signatureHex, publicKeyHex, { hash: true });
console.log(' 验证结果:', result4);
} catch (e) {
console.error(' 错误:', e.message);
}
// 尝试 5: 使用哈希值 + userId
console.log('\n5. 使用哈希值 + userId:');
try {
const result5 = sm2.doVerifySignature(hashHex, signatureHex, publicKeyHex, { hash: true, userId });
console.log(' 验证结果:', result5);
} catch (e) {
console.error(' 错误:', e.message);
}
// 尝试 6: 转换为 DER 格式
console.log('\n6. 转换为 DER 格式:');
try {
// 构造 DER 格式: 30 44 02 20 [r] 02 20 [s]
const r = signatureHex.substring(0, 64);
const s = signatureHex.substring(64);
const derSignature = '30440220' + r + '0220' + s;
console.log(' DER 签名:', derSignature);
const result6 = sm2.doVerifySignature(data, derSignature, publicKeyHex, { der: true, hash: true, userId });
console.log(' 验证结果:', result6);
} catch (e) {
console.error(' 错误:', e.message);
}