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 }