1 package keccakf1600
2
3 import (
4 "reflect"
5 "testing"
6 )
7
8
9 var permutationOfZeroes = [25]uint64{
10 0xF1258F7940E1DDE7, 0x84D5CCF933C0478A, 0xD598261EA65AA9EE,
11 0xBD1547306F80494D, 0x8B284E056253D057, 0xFF97A42D7F8E6FD4,
12 0x90FEE5A0A44647C4, 0x8C5BDA0CD6192E76, 0xAD30A6F71B19059C,
13 0x30935AB7D08FFC64, 0xEB5AA93F2317D635, 0xA9A6E6260D712103,
14 0x81A57C16DBCF555F, 0x43B831CD0347C826, 0x01F22F1A11A5569F,
15 0x05E5635A21D9AE61, 0x64BEFEF28CC970F2, 0x613670957BC46611,
16 0xB87C5A554FD00ECB, 0x8C3EE88A1CCF32C8, 0x940C7922AE3A2614,
17 0x1841F924A2C509E4, 0x16F53526E70465C2, 0x75F644E97F30A13B,
18 0xEAF1FF7B5CECA249,
19 }
20
21 func TestKeccakF1600x2(t *testing.T) {
22 test := func(t *testing.T, turbo bool, f func(s *StateX2, a []uint64)) {
23 t.Helper()
24 var state StateX2
25 a := state.Initialize(turbo)
26 f(&state, a)
27 for i := 0; i < 25; i++ {
28 for j := 0; j < 2; j++ {
29 if a[2*i+j] != permutationOfZeroes[i] {
30 t.Fatalf("%X", a)
31 }
32 }
33 }
34 }
35
36 t.Run("Generic", func(t *testing.T) {
37 test(t, false, func(s *StateX2, a []uint64) { permuteScalarX2(a, false) })
38 })
39 t.Run("SIMD", func(t *testing.T) {
40 test(t, false, func(s *StateX2, a []uint64) { s.Permute() })
41 })
42 }
43
44 func TestKeccakF1600x4(t *testing.T) {
45 test := func(t *testing.T, turbo bool, f func(s *StateX4, a []uint64)) {
46 t.Helper()
47 var state StateX4
48 a := state.Initialize(turbo)
49 f(&state, a)
50 for i := 0; i < 25; i++ {
51 for j := 0; j < 4; j++ {
52 if a[4*i+j] != permutationOfZeroes[i] {
53 t.Fatal()
54 }
55 }
56 }
57 }
58
59 t.Run("Generic", func(t *testing.T) {
60 test(t, false, func(s *StateX4, a []uint64) { permuteScalarX4(a, false) })
61 })
62 t.Run("SIMD", func(t *testing.T) {
63 test(t, false, func(s *StateX4, a []uint64) { s.Permute() })
64 })
65 }
66
67 func TestTurboX2(t *testing.T) {
68 var state1, state2 StateX2
69 a1 := state1.Initialize(true)
70 a2 := state2.Initialize(true)
71 permuteScalarX2(a1, true)
72 state2.Permute()
73 if !reflect.DeepEqual(a1, a2) {
74 t.Fatal()
75 }
76 }
77
78 func TestTurboX4(t *testing.T) {
79 var state1, state2 StateX4
80 a1 := state1.Initialize(true)
81 a2 := state2.Initialize(true)
82 permuteScalarX4(a1, true)
83 state2.Permute()
84 if !reflect.DeepEqual(a1, a2) {
85 t.Fatal()
86 }
87 }
88
89 func BenchmarkF1600x2(b *testing.B) {
90 benchmark := func(b *testing.B, turbo bool, f func(s *StateX2, a []uint64)) {
91 var state StateX2
92 a := state.Initialize(turbo)
93
94 for i := 0; i < b.N; i++ {
95 f(&state, a)
96 }
97 }
98
99 bench2 := func(b *testing.B, turbo bool) {
100 b.Run("Generic", func(b *testing.B) {
101 benchmark(b, turbo, func(s *StateX2, a []uint64) { permuteScalarX2(a, turbo) })
102 })
103 b.Run("SIMD", func(b *testing.B) {
104 benchmark(b, turbo, func(s *StateX2, a []uint64) { s.Permute() })
105 })
106 }
107
108 b.Run("Regular", func(b *testing.B) { bench2(b, false) })
109 b.Run("Turbo", func(b *testing.B) { bench2(b, true) })
110 }
111
112 func BenchmarkF1600x4(b *testing.B) {
113 benchmark := func(b *testing.B, turbo bool, f func(s *StateX4, a []uint64)) {
114 var state StateX4
115 a := state.Initialize(turbo)
116
117 for i := 0; i < b.N; i++ {
118 f(&state, a)
119 }
120 }
121
122 bench2 := func(b *testing.B, turbo bool) {
123 b.Run("Generic", func(b *testing.B) {
124 benchmark(b, turbo, func(s *StateX4, a []uint64) { permuteScalarX4(a, turbo) })
125 })
126 b.Run("SIMD", func(b *testing.B) {
127 benchmark(b, turbo, func(s *StateX4, a []uint64) { s.Permute() })
128 })
129 }
130
131 b.Run("Regular", func(b *testing.B) { bench2(b, false) })
132 b.Run("Turbo", func(b *testing.B) { bench2(b, true) })
133 }
134
View as plain text