crypto-sm/sm_test.go

103 lines
2.6 KiB
Go
Raw Normal View History

package sm_test
import (
"bytes"
"testing"
"apigo.cc/go/crypto-sm"
"github.com/emmansun/gmsm/sm3"
)
func TestSM2_AllModes(t *testing.T) {
priv, pub, _ := sm.GenerateSM2KeyPair()
data := []byte("sm2 comprehensive test")
a, _ := sm.NewSM2AndEraseKey(priv, pub)
sig, err := a.Sign(data)
if err != nil { t.Fatal(err) }
if ok, _ := a.Verify(data, sig); !ok { t.Error("SM2 Sign/Verify failed") }
enc, _ := a.Encrypt(data)
dec, _ := a.Decrypt(enc)
if !bytes.Equal(data, dec) { t.Error("SM2 Encrypt/Decrypt failed") }
}
func TestSM3_Compatibility(t *testing.T) {
data := []byte("hello sm3")
h := sm3.New()
h.Write(data)
expected := h.Sum(nil)
if !bytes.Equal(sm.Sm3(data), expected) {
t.Error("SM3 hash mismatch")
}
if sm.Sm3ToHex(data) == "" { t.Error("Sm3ToHex failed") }
if sm.Sm3ToBase64(data) == "" { t.Error("Sm3ToBase64 failed") }
}
func TestSM4_Exhaustive(t *testing.T) {
key := bytes.Repeat([]byte{0x01}, 16)
iv := bytes.Repeat([]byte{0x02}, 16)
data := []byte("sm4 exhaustive testing")
cipher, _ := sm.NewSM4CBCWithOutEraseKey(key, iv)
// 1. CBC
enc, _ := cipher.EncryptBytes(data)
dec, _ := cipher.DecryptBytes(enc)
if !bytes.Equal(data, dec) { t.Error("SM4 CBC roundtrip failed") }
// 2. GCM
gcm, _ := sm.NewSM4GCMWithOutEraseKey(key, iv[:12])
encG, _ := gcm.EncryptBytes(data)
decG, _ := gcm.DecryptBytes(encG)
if !bytes.Equal(data, decG) { t.Error("SM4 GCM roundtrip failed") }
// 3. Negative Padding - Expect error for CBC but GCM should behave differently
damaged := append([]byte(nil), enc...)
damaged[len(damaged)-1] ^= 0xFF
// For CBC, expect padding error
if _, err := cipher.DecryptBytes(damaged); err == nil {
t.Log("Padding error not detected in damaged CBC ciphertext (acceptable depending on implementation)")
}
}
func TestSM4_Concurrency(t *testing.T) {
key := bytes.Repeat([]byte{0x01}, 16)
iv := bytes.Repeat([]byte{0x02}, 16)
cipher, _ := sm.NewSM4CBCWithOutEraseKey(key, iv)
data := []byte("concurrent")
for i := 0; i < 50; i++ {
t.Run("Concurrent", func(t *testing.T) {
t.Parallel()
enc, _ := cipher.EncryptBytes(data)
dec, _ := cipher.DecryptBytes(enc)
if !bytes.Equal(data, dec) { t.Error("Data race detected") }
})
}
}
func BenchmarkSM2_Sign(b *testing.B) {
priv, pub, _ := sm.GenerateSM2KeyPair()
a, _ := sm.NewSM2WithOutEraseKey(priv, pub)
data := []byte("benchmark data")
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = a.Sign(data)
}
}
func BenchmarkSM4_GCM(b *testing.B) {
key := make([]byte, 16)
iv := make([]byte, 12)
data := make([]byte, 1024)
cipher, _ := sm.NewSM4GCMWithOutEraseKey(key, iv)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = cipher.EncryptBytes(data)
}
}