gmsm/zuc/eia256_test.go

336 lines
8.3 KiB
Go
Raw Normal View History

2022-04-26 10:04:30 +08:00
package zuc
import (
"encoding/hex"
"hash"
2022-04-26 10:04:30 +08:00
"testing"
"github.com/emmansun/gmsm/internal/cryptotest"
2022-04-26 10:04:30 +08:00
)
var zucEIA256Tests = []struct {
key []byte
iv []byte
msg []byte
nMsgs int
mac32 string
mac64 string
mac128 string
}{
{
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
1,
"9b972a74",
"673e54990034d38c",
"d85e54bbcb9600967084c952a1654b26",
},
{
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
[]byte{
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
},
10,
"8754f5cf",
"130dc225e72240cc",
"df1e8307b31cc62beca1ac6f8190c22f",
},
{
[]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
},
[]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
},
[]byte{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
},
1,
"1f3079b4",
"8c71394d39957725",
"a35bb274b567c48b28319f111af34fbd",
},
{
[]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
},
[]byte{
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
},
[]byte{
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
},
10,
"5c7c8b88",
"ea1dee544bb6223b",
"3a83b554be408ca5494124ed9d473205",
},
}
2022-07-14 14:10:49 +08:00
func TestEIA_Finish256_32(t *testing.T) {
2022-04-26 10:04:30 +08:00
for i, test := range zucEIA256Tests {
h, err := NewHash256(test.key, test.iv, 4)
if err != nil {
t.Error(err)
}
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest := h.Sum(nil)
if hex.EncodeToString(digest) != test.mac32 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac32, hex.EncodeToString(digest))
}
h.Reset()
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest = h.Sum(nil)
if hex.EncodeToString(digest) != test.mac32 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac32, hex.EncodeToString(digest))
}
}
}
2022-07-14 14:10:49 +08:00
func TestEIA_Finish256_64(t *testing.T) {
2022-04-26 10:04:30 +08:00
for i, test := range zucEIA256Tests {
h, err := NewHash256(test.key, test.iv, 8)
if err != nil {
t.Error(err)
}
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest := h.Sum(nil)
if hex.EncodeToString(digest) != test.mac64 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac64, hex.EncodeToString(digest))
}
h.Reset()
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest = h.Sum(nil)
if hex.EncodeToString(digest) != test.mac64 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac64, hex.EncodeToString(digest))
}
}
}
2022-07-14 14:10:49 +08:00
func TestEIA_Finish256_128(t *testing.T) {
2022-04-26 10:04:30 +08:00
for i, test := range zucEIA256Tests {
h, err := NewHash256(test.key, test.iv, 16)
if err != nil {
t.Error(err)
}
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest := h.Sum(nil)
if hex.EncodeToString(digest) != test.mac128 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac128, hex.EncodeToString(digest))
}
h.Reset()
for j := 0; j < test.nMsgs; j++ {
_, err = h.Write(test.msg)
if err != nil {
t.Error(err)
}
}
digest = h.Sum(nil)
if hex.EncodeToString(digest) != test.mac128 {
t.Errorf("case %d, expected=%s, result=%s\n", i+1, test.mac128, hex.EncodeToString(digest))
}
}
}
func TestEIA256_Sum32(t *testing.T) {
expected := "f4f20d7c"
h, err := NewHash256(zucEIA256Tests[2].key, zucEIA256Tests[2].iv, 4)
if err != nil {
t.Fatal(err)
}
_, err = h.Write([]byte("emmansun"))
if err != nil {
t.Fatal(err)
}
_, err = h.Write([]byte("shangmi1"))
if err != nil {
t.Fatal(err)
}
_, err = h.Write([]byte("emmansun shangmi"))
if err != nil {
t.Fatal(err)
}
_, err = h.Write([]byte("emmansun shangmi 1234"))
if err != nil {
t.Fatal(err)
}
mac := h.Sum(nil)
if hex.EncodeToString(mac) != expected {
t.Errorf("expected=%s, result=%s\n", expected, hex.EncodeToString(mac))
}
}
2022-07-15 17:18:14 +08:00
func TestEIA256_Finish(t *testing.T) {
expected := []struct {
expected string
macLen int
}{
{
"9dd592c4",
4,
},
{
"1f6f71e386a2ce01",
8,
},
{
"bf5339cfd87bba97d70ef4f5973af8bb",
16,
},
}
2022-07-15 17:18:14 +08:00
for _, exp := range expected {
h, err := NewHash256(zucEIA256Tests[2].key, zucEIA256Tests[2].iv, exp.macLen)
if err != nil {
t.Fatal(err)
}
mac := h.Finish([]byte("emmansunshangmi1emmansun shangmiemmansun shangmi 12345"), 8*53+4)
if hex.EncodeToString(mac) != exp.expected {
t.Errorf("expected=%s, result=%s\n", exp.expected, hex.EncodeToString(mac))
}
}
2022-04-26 10:04:30 +08:00
}
func TestEIA256Hash(t *testing.T) {
t.Run("EIA-256-32", func(t *testing.T) {
cryptotest.TestHash(t, func() hash.Hash {
h, _ := NewHash256(zucEIA256Tests[0].key, zucEIA256Tests[0].iv, 4)
return h
})
})
t.Run("EIA-256-64", func(t *testing.T) {
cryptotest.TestHash(t, func() hash.Hash {
h, _ := NewHash256(zucEIA256Tests[0].key, zucEIA256Tests[0].iv, 8)
return h
})
})
t.Run("EIA-256-128", func(t *testing.T) {
cryptotest.TestHash(t, func() hash.Hash {
h, _ := NewHash256(zucEIA256Tests[0].key, zucEIA256Tests[0].iv, 16)
return h
})
})
}
2022-04-26 10:04:30 +08:00
func benchmark256Size(b *testing.B, size, tagSize int) {
var key [32]byte
var iv [23]byte
var buf = make([]byte, 8192)
bench, _ := NewHash256(key[:], iv[:], tagSize)
b.SetBytes(int64(size))
sum := make([]byte, bench.Size())
for i := 0; i < b.N; i++ {
bench.Reset()
bench.Write(buf[:size])
bench.Sum(sum[:0])
}
}
func BenchmarkHash8Bytes_Tag32(b *testing.B) {
benchmark256Size(b, 8, 4)
}
func BenchmarkHash8Bytes_Tag64(b *testing.B) {
benchmark256Size(b, 8, 8)
}
func BenchmarkHash8Bytes_Tag128(b *testing.B) {
benchmark256Size(b, 8, 16)
}
func BenchmarkHash1K_Tag32(b *testing.B) {
benchmark256Size(b, 1024, 4)
}
func BenchmarkHash1K_Tag64(b *testing.B) {
benchmark256Size(b, 1024, 8)
}
func BenchmarkHash1K_Tag128(b *testing.B) {
benchmark256Size(b, 1024, 16)
}
func BenchmarkHash8K_Tag32(b *testing.B) {
benchmark256Size(b, 8192, 4)
}
func BenchmarkHash8K_Tag64(b *testing.B) {
benchmark256Size(b, 8192, 8)
}
func BenchmarkHash8K_Tag128(b *testing.B) {
benchmark256Size(b, 8192, 16)
}