package model_test import ( "crypto/sha256" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.yandata.net/iod/iod/go-trustlog/api/model" ) // TestSM2HashConsistency 验证SM2加签和验签的一致性 // 关键发现:SM2库内部会处理hash,但加签和验签必须使用相同的数据类型. func TestSM2HashConsistency(t *testing.T) { t.Parallel() // 生成SM2密钥对 keyPair, err := model.GenerateSM2KeyPair() require.NoError(t, err) // 测试数据 originalData := []byte("test data for consistency check") t.Logf("=== 测试1:加签和验签都使用原始数据(当前实现)===") // 1. 加签:使用原始数据 signature1, err := keyPair.SignMessage(originalData) require.NoError(t, err) // 2. 验签:使用原始数据 valid1, err := keyPair.VerifyMessage(originalData, signature1) require.NoError(t, err) t.Logf("加签(原始数据) + 验签(原始数据): %v", valid1) assert.True(t, valid1, "加签和验签都使用原始数据应该成功") t.Logf("\n=== 测试2:加签和验签都使用hash值 ===") // 3. 加签:使用hash值 hashBytes := sha256.Sum256(originalData) signature2, err := keyPair.SignMessage(hashBytes[:]) require.NoError(t, err) // 4. 验签:使用hash值 valid2, err := keyPair.VerifyMessage(hashBytes[:], signature2) require.NoError(t, err) t.Logf("加签(hash值) + 验签(hash值): %v", valid2) assert.True(t, valid2, "加签和验签都使用hash值应该成功") t.Logf("\n=== 测试3:不一致的情况(应该失败)===") // 5. 加签使用原始数据,验签使用hash值 - 应该失败 valid3, err := keyPair.VerifyMessage(hashBytes[:], signature1) require.NoError(t, err) t.Logf("加签(原始数据) + 验签(hash值): %v", valid3) assert.False(t, valid3, "加签和验签使用不同类型数据应该失败") // 6. 加签使用hash值,验签使用原始数据 - 应该失败 valid4, err := keyPair.VerifyMessage(originalData, signature2) require.NoError(t, err) t.Logf("加签(hash值) + 验签(原始数据): %v", valid4) assert.False(t, valid4, "加签和验签使用不同类型数据应该失败") t.Logf("\n=== 结论 ===") t.Logf("✓ SM2库内部会处理hash") t.Logf("✓ 加签和验签必须使用相同的数据类型(都是原始数据,或都是hash值)") t.Logf("✓ 当前实现(加签和验签都使用原始数据)是正确的") }