Files
xgcl/sm/sm9/sm9_fuzz_test.go
T
2026-05-27 23:03:00 +08:00

110 lines
2.6 KiB
Go

//go:build go1.18
// +build go1.18
package sm9
// Fuzz Test use random data and run for a long time
import (
"bytes"
"crypto/rand"
"testing"
"xdx.jelly/xgcl/sm/sm3"
"xdx.jelly/xgcl/sm/sm4"
"xdx.jelly/xgcl/utils/padding"
)
func FuzzSign(f *testing.F) {
ks, pubs, err := GenerateMastSignPrivateKey(rand.Reader)
if err != nil {
f.Fatal(err)
}
f.Add([]byte{}, []byte{}, []byte{})
f.Fuzz(func(t *testing.T, uid, msg, seed []byte) {
ds, err := GenerateUserSignKey(uid, ks)
if err != nil {
t.Fatal(err)
}
dig := sm3.Sum(seed)
signature, err := Sign(msg, ds, pubs, dig[:])
if err != nil {
t.Fatal(err)
}
if !Verify(signature, uid, msg, pubs) {
t.Fatal("verify failed")
}
})
}
func FuzzKeyExchange(f *testing.F) {
ke, pube, err := GenerateMastEncPrivateKey(rand.Reader)
if err != nil {
f.Fatal(err)
}
f.Add([]byte{}, []byte{}, []byte{}, uint(1))
f.Fuzz(func(t *testing.T, idA, idB, seed []byte, kLen uint) {
kLen += 1
deA, _ := GenerateUserEncKey(idA, ke)
deB, _ := GenerateUserEncKey(idB, ke)
alice := NewSponsor(idA, deA)
bob := NewResponsor(idB, deB)
rnd := sm3.Sum(seed)
tempKeyOfSponsor, _ := alice.GenerateAgreementData(idB, pube, rnd[:])
rnd = sm3.Sum(seed)
keyOfResponsor, tempKeyOfResponsor, _ := bob.GenerateAgreementDataAndKey(idA, pube, tempKeyOfSponsor, int(kLen), rnd[:])
keyOfSponsor, _ := alice.GenerateKey(tempKeyOfResponsor, int(kLen))
if !bytes.Equal(keyOfResponsor, keyOfSponsor) {
t.Fatal()
}
alice.Clear()
bob.Clear()
})
}
func FuzzEnc(f *testing.F) {
ke, pube, err := GenerateMastEncPrivateKey(rand.Reader)
if err != nil {
f.Fatal(err)
}
f.Add([]byte{}, []byte{}, []byte{})
f.Fuzz(func(t *testing.T, id, msg, seed []byte) {
de, err := GenerateUserEncKey(id, ke)
if err != nil {
t.Fatal(err)
}
// msg,id可能共享内存,因此不能直接在msg上padding。先复制一份
paddedMsg := append([]byte{}, msg...)
paddedMsg = padding.P7.Pad(paddedMsg, sm4.BlockSize)
for _, encType := range []EncType{EncTypeKDF} {
c, err := Encrypt(encType, pube, id, msg, rand.Reader, nil)
if err != nil {
t.Fatal(err)
}
plain, err := Decrypt(id, c, de)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(plain, msg) {
t.Fatal(err)
}
}
for _, encType := range []EncType{EncTypeSM4ECB, EncTypeSM4CBC, EncTypeSM4CFB, EncTypeSM4OFB} {
c, err := Encrypt(encType, pube, id, paddedMsg, rand.Reader, nil)
if err != nil {
t.Fatal(err)
}
plain, err := Decrypt(id, c, de)
if !bytes.Equal(plain, paddedMsg) || err != nil {
t.Fatal()
}
}
})
}