Files
go-trustlog/api/model/sm2_consistency_test.go

67 lines
2.4 KiB
Go
Raw Normal View History

package model_test
import (
"crypto/sha256"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.yandata.net/wangsiyuan/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("✓ 当前实现(加签和验签都使用原始数据)是正确的")
}