github.com/hxx258456/ccgo@v0.0.5-0.20230213014102-48b35f46f66f/sm3/sm3_test.go (about)

     1  // Copyright 2022 s1ren@github.com/hxx258456.
     2  
     3  package sm3
     4  
     5  import (
     6  	"bytes"
     7  	"crypto/sha256"
     8  	"encoding"
     9  	"encoding/base64"
    10  	"encoding/hex"
    11  	"fmt"
    12  	"hash"
    13  	"io"
    14  	"io/ioutil"
    15  	"os"
    16  	"testing"
    17  
    18  	"golang.org/x/sys/cpu"
    19  )
    20  
    21  type sm3Test struct {
    22  	out       string
    23  	in        string
    24  	halfState string // marshaled hash state after first half of in written, used by TestGoldenMarshal
    25  }
    26  
    27  var golden = []sm3Test{
    28  	{"66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0", "abc", "sm3\x03s\x80\x16oI\x14\xb2\xb9\x17$B\xd7ڊ\x06\x00\xa9o0\xbc\x1618\xaa\xe3\x8d\xeeM\xb0\xfb\x0eNa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"},
    29  	{"debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", "sm3\x03s\x80\x16oI\x14\xb2\xb9\x17$B\xd7ڊ\x06\x00\xa9o0\xbc\x1618\xaa\xe3\x8d\xeeM\xb0\xfb\x0eNabcdabcdabcdabcdabcdabcdabcdabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 "},
    30  	{"952eb84cacee9c10bde4d6882d29d63140ba72af6fe485085095dccd5b872453", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc", "sm3\x03s\x80\x16oI\x14\xb2\xb9\x17$B\xd7ڊ\x06\x00\xa9o0\xbc\x1618\xaa\xe3\x8d\xeeM\xb0\xfb\x0eNabcdabcdabcdabcdabcdabcdabcdabcda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!"},
    31  	{"90d52a2e85631a8d6035262626941fa11b85ce570cec1e3e991e2dd7ed258148", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", "sm3\x03YPށF\x86d\xebB\xfdL\x86\x1e|\xa0\n\xc0\xa5\x91\v\xae\x9aU\xea\x1aۍ\x17v<\xa2\"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@"},
    32  	{"e1c53f367a9c5d19ab6ddd30248a7dafcc607e74e6bcfa52b00e0ba35e470421", "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc", "sm3\x03YPށF\x86d\xebB\xfdL\x86\x1e|\xa0\n\xc0\xa5\x91\v\xae\x9aU\xea\x1aۍ\x17v<\xa2\"a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A"},
    33  }
    34  
    35  func TestGolden(t *testing.T) {
    36  	for i := 0; i < len(golden); i++ {
    37  		g := golden[i]
    38  		h := Sm3Sum([]byte(g.in))
    39  		s := fmt.Sprintf("%x", h)
    40  		fmt.Printf("%s\n", base64.StdEncoding.EncodeToString(h[:]))
    41  		if s != g.out {
    42  			t.Fatalf("SM3 function: sm3(%s) = %s want %s", g.in, s, g.out)
    43  		}
    44  		c := New()
    45  		for j := 0; j < 3; j++ {
    46  			if j < 2 {
    47  				_, err := io.WriteString(c, g.in)
    48  				if err != nil {
    49  					t.Fatal(err)
    50  				}
    51  			} else {
    52  				_, err := io.WriteString(c, g.in[0:len(g.in)/2])
    53  				if err != nil {
    54  					t.Fatal(err)
    55  				}
    56  				c.Sum(nil)
    57  				_, err = io.WriteString(c, g.in[len(g.in)/2:])
    58  				if err != nil {
    59  					t.Fatal(err)
    60  				}
    61  			}
    62  			s := fmt.Sprintf("%x", c.Sum(nil))
    63  			if s != g.out {
    64  				t.Fatalf("sm3[%d](%s) = %s want %s", j, g.in, s, g.out)
    65  			}
    66  			c.Reset()
    67  		}
    68  	}
    69  }
    70  
    71  func TestGoldenMarshal(t *testing.T) {
    72  	tests := []struct {
    73  		name    string
    74  		newHash func() hash.Hash
    75  		gold    []sm3Test
    76  	}{
    77  		{"", New, golden},
    78  	}
    79  
    80  	for _, tt := range tests {
    81  		t.Run(tt.name, func(t *testing.T) {
    82  			for _, g := range tt.gold {
    83  				h := tt.newHash()
    84  				h2 := tt.newHash()
    85  
    86  				_, err := io.WriteString(h, g.in[:len(g.in)/2])
    87  				if err != nil {
    88  					t.Fatal(err)
    89  				}
    90  
    91  				state, err := h.(encoding.BinaryMarshaler).MarshalBinary()
    92  				if err != nil {
    93  					t.Errorf("could not marshal: %v", err)
    94  					continue
    95  				}
    96  
    97  				if string(state) != g.halfState {
    98  					t.Errorf("sm3%s(%q) state = %q, want %q", tt.name, g.in, state, g.halfState)
    99  					continue
   100  				}
   101  
   102  				if err := h2.(encoding.BinaryUnmarshaler).UnmarshalBinary(state); err != nil {
   103  					t.Errorf("could not unmarshal: %v", err)
   104  					continue
   105  				}
   106  
   107  				_, err = io.WriteString(h, g.in[len(g.in)/2:])
   108  				if err != nil {
   109  					t.Fatal(err)
   110  				}
   111  				_, err = io.WriteString(h2, g.in[len(g.in)/2:])
   112  				if err != nil {
   113  					t.Fatal(err)
   114  				}
   115  
   116  				if actual, actual2 := h.Sum(nil), h2.Sum(nil); !bytes.Equal(actual, actual2) {
   117  					t.Errorf("sm3%s(%q) = 0x%x != marshaled 0x%x", tt.name, g.in, actual, actual2)
   118  				}
   119  			}
   120  		})
   121  	}
   122  }
   123  
   124  func TestSize(t *testing.T) {
   125  	c := New()
   126  	if got := c.Size(); got != Size {
   127  		t.Errorf("Size = %d; want %d", got, Size)
   128  	}
   129  }
   130  
   131  func TestBlockSize(t *testing.T) {
   132  	c := New()
   133  	if got := c.BlockSize(); got != BlockSize {
   134  		t.Errorf("BlockSize = %d want %d", got, BlockSize)
   135  	}
   136  	switch cpuType {
   137  	case "arm64":
   138  		fmt.Printf("arm64 has sm3 %v, has sm4 %v, has aes %v\n", cpu.ARM64.HasSM3, cpu.ARM64.HasSM4, cpu.ARM64.HasAES)
   139  	case "amd64":
   140  		fmt.Printf("amd64 has AVX2 %v, has BMI2 %v\n", cpu.X86.HasAVX2, cpu.X86.HasBMI2)
   141  	}
   142  }
   143  
   144  var bench = New()
   145  var benchSH256 = sha256.New()
   146  var buf = make([]byte, 8192)
   147  
   148  func benchmarkSize(hash hash.Hash, b *testing.B, size int) {
   149  	b.SetBytes(int64(size))
   150  	sum := make([]byte, bench.Size())
   151  	for i := 0; i < b.N; i++ {
   152  		hash.Reset()
   153  		hash.Write(buf[:size])
   154  		hash.Sum(sum[:0])
   155  	}
   156  }
   157  
   158  func BenchmarkHash8Bytes(b *testing.B) {
   159  	benchmarkSize(bench, b, 8)
   160  }
   161  
   162  func BenchmarkHash1K(b *testing.B) {
   163  	benchmarkSize(bench, b, 1024)
   164  }
   165  
   166  func BenchmarkHash8K(b *testing.B) {
   167  	benchmarkSize(bench, b, 8192)
   168  }
   169  
   170  func BenchmarkHash8K_SH256(b *testing.B) {
   171  	benchmarkSize(benchSH256, b, 8192)
   172  }
   173  
   174  func TestSm3(t *testing.T) {
   175  	msg := []byte("天行健君子以自强不息")
   176  	// 生成msg文件
   177  	err := ioutil.WriteFile("testdata/msg", msg, os.FileMode(0644))
   178  	if err != nil {
   179  		t.Fatal(err)
   180  	}
   181  	// 读取msg文件
   182  	msg, err = ioutil.ReadFile("testdata/msg")
   183  	if err != nil {
   184  		t.Fatal(err)
   185  	}
   186  	fmt.Printf("读取到的文件内容: %s\n", msg)
   187  	// sm3.New()
   188  	hw := New()
   189  	// 添加散列内容
   190  	hw.Write(msg)
   191  	// 散列计算
   192  	sum := hw.Sum(nil)
   193  	fmt.Println("hash值: ", sum)
   194  	fmt.Printf("hash长度 : %d\n", len(sum))
   195  	fmt.Printf("hash字符串 : %s\n", hex.EncodeToString(sum))
   196  	// 直接sm3计算
   197  	hash1 := Sm3Sum(msg)
   198  	fmt.Println("hash1值: ", hash1)
   199  	fmt.Printf("hash1长度 : %d\n", len(hash1))
   200  	fmt.Printf("hash1字符串 : %s\n", hex.EncodeToString(hash1))
   201  }
   202  
   203  func BenchmarkSm3(t *testing.B) {
   204  	t.ReportAllocs()
   205  	msg := []byte("天行健君子以自强不息")
   206  	hw := New()
   207  	for i := 0; i < t.N; i++ {
   208  		hw.Reset()
   209  		hw.Write(msg)
   210  		hw.Sum(nil)
   211  	}
   212  }
   213  
   214  func BenchmarkSha256(t *testing.B) {
   215  	t.ReportAllocs()
   216  	msg := []byte("天行健君子以自强不息")
   217  	hw := sha256.New()
   218  	for i := 0; i < t.N; i++ {
   219  		hw.Reset()
   220  		hw.Write(msg)
   221  		hw.Sum(nil)
   222  	}
   223  }