keccak256-circom/go-keccak256-bits-impl/keccak_test.go
go-keccak256-bits-impl/keccak_test.goRaw
1package keccak
2
3import (
4 "encoding/hex"
5 "fmt"
6 "testing"
7
8 "github.com/ethereum/go-ethereum/crypto"
9 qt "github.com/frankban/quicktest"
10)
11
12func TestKeccak(t *testing.T) {
13 testKeccak(t, []byte("test"), "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658")
14 testKeccak(t, make([]byte, 32), "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")
15 testKeccak(t, make([]byte, 100), "913fb9e1f6f1c6d910fd574a5cad8857aa43bfba24e401ada4f56090d4d997a7")
16}
17
18func testKeccak(t *testing.T, input []byte, expectedHex string) {
19 expected := crypto.Keccak256(input)
20
21 hBits := ComputeKeccak(bytesToBits(input))
22 h := bitsToBytes(hBits)
23
24 qt.Assert(t, h, qt.DeepEquals, expected)
25 qt.Assert(t, hex.EncodeToString(h), qt.Equals, expectedHex)
26}
27
28func TestPad(t *testing.T) {
29 b := make([]byte, 32)
30 for i := 0; i < len(b); i++ {
31 b[i] = byte(i)
32 }
33 bBits := bytesToBits(b)
34 fBits := pad(bBits)
35
36 qt.Assert(t, bitsToBytes(fBits[:]), qt.DeepEquals,
37 []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
38 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
39 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128})
44}
45
46func TestKeccakfRound(t *testing.T) {
47 s, _ := newS()
48
49 s = keccakfRound(s, 0)
50 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
51 []uint64{
52 26388279066651, 246290629787648, 26388279902208,
53 25165850, 246290605457408, 7784628352, 844424965783552,
54 2305843009213694083, 844432714760192,
55 2305843009249345539, 637534226, 14848, 641204224,
56 14354, 3670528, 6308236288, 2130304761856,
57 648518346341354496, 6309216256, 648520476645130240,
58 4611706359392501763, 792677514882318336,
59 20340965113972, 4611732197915754499,
60 792633534417207412})
61
62 s = keccakfRound(s, 20)
63 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
64 []uint64{17728382861289829725, 13654073086381141005,
65 9912591532945168756, 2030068283137172501, 5084683018496047808,
66 151244976540463006, 11718217461613725815, 11636071286320763433,
67 15039144509240642782, 11629028282864249197,
68 2594633730779457624, 14005558505838459171, 4612881094252610438,
69 2828009553220809993, 4838578484623267135, 1006588603063111352,
70 11109191860075454495, 1187545859779038208,
71 14661669042642437042, 5345317080454741069, 8196674451365552863,
72 635818354583088260, 13515759754032305626, 1708499319988748543,
73 7509292798507899312})
74
75}
76
77func TestKeccakf(t *testing.T) {
78 s, _ := newS()
79
80 s = keccakf(s)
81
82 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
83 []uint64{9472389783892099349, 2159377575142921216,
84 17826682512249813373, 2325963263767348549,
85 15086930817298358378, 11661812091723830419,
86 3517755057770134847, 5223775837645169598, 933274647126506074,
87 3451250694486589320, 825065683101361807, 6192414258352188799,
88 14426505790672879210, 3326742392640380689,
89 16749975585634164134, 17847697619892908514,
90 11598434253200954839, 6049795840392747215, 8610635351954084385,
91 18234131770974529925, 15330347418010067760,
92 12047099911907354591, 4763389569697138851, 6779624089296570504,
93 15083668107635345971})
94
95 // compute again keccakf on the current state
96 s = keccakf(s)
97 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
98 []uint64{269318771259381490, 15892848561416382510,
99 12485559500958802382, 4360182510883008729,
100 14284025675983944434, 8800366419087562177, 7881853509112258378,
101 9503857914080778528, 17110477940977988953,
102 13825318756568052601, 11460650932194163315,
103 13272167288297399439, 13599957064256729412,
104 12730838251751851758, 13736647180617564382,
105 5651695613583298166, 15496251216716036782, 9748494184433838858,
106 3637745438296580159, 3821184813198767406, 15603239432236101315,
107 3726326332491237029, 7819962668913661099, 2285898735263816116,
108 13518516210247555620})
109}
110
111func printBytes(name string, b []byte) {
112 fmt.Printf("%s\n", name)
113 for _, v := range b {
114 fmt.Printf("\"%v\", ", v)
115 }
116 fmt.Println("")
117}
118func printU64Array(name string, b []uint64) {
119 fmt.Printf("%s\n", name)
120 for _, v := range b {
121 fmt.Printf("\"%v\", ", v)
122 }
123 fmt.Println("")
124}
125
126func TestAbsorb(t *testing.T) {
127 s, _ := newS()
128 block := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
129 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
130 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
132 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
134 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128}
135 // printU64Array("s", bitsToU64Array(s[:]))
136 // printBytes("block", block[:])
137
138 absorbed := absorb(s, bytesToBits(block))
139 // printU64Array("absorbed", bitsToU64Array(absorbed[:]))
140
141 qt.Assert(t, bitsToU64Array(absorbed[:]), qt.DeepEquals,
142 []uint64{8342348566319207042, 319359607942176202, 14410076088654599075,
143 15666111399434436772, 9558421567405313402, 3396178318116504023,
144 794353847439963108, 12717011319735989377, 3503398863218919239,
145 5517201702366862678, 15999361614129160496, 1325524015888689985,
146 11971708408118944333, 14874486179441062217, 12554876384974234666,
147 11129975558302206043, 11257826431949606534, 2740710607956478714,
148 15000019752453010167, 15593606854132419294, 2598425978562809333,
149 8872504799797239246, 1212062965004664308, 5443427421087086722,
150 10946808592826700411})
151
152 absorbed = absorb(absorbed, bytesToBits(block))
153 // printU64Array("absorbed", bitsToU64Array(absorbed[:]))
154
155 qt.Assert(t, bitsToU64Array(absorbed[:]), qt.DeepEquals,
156 []uint64{8909243822027471379, 1111840847970088140,
157 12093072708540612559, 11255033638786021658, 2082116894939842214,
158 12821085060245261575, 6901785969834988344, 3182430130277914993,
159 2164708585929408975, 14402143231999718904, 16231444410553803968,
160 1850945423480060493, 12856855675247400303, 1137248620532111171,
161 7389129221921446308, 12932467982741614601, 1350606937385760406,
162 10983682292859713641, 10305595434820307765, 13958651111365489854,
163 17206620388135196198, 4238113785249530092, 7230868147643218103,
164 603011106238724524, 16480095441097880488})
165}
166
167func TestFinal(t *testing.T) {
168 b := make([]byte, 32)
169 for i := 0; i < len(b); i++ {
170 b[i] = byte(i)
171 }
172 bBits := bytesToBits(b)
173 fBits := final(bBits)
174
175 qt.Assert(t, bitsToU64Array(fBits[:]), qt.DeepEquals,
176 []uint64{16953415415620100490, 7495738965189503699,
177 12723370805759944158, 3295955328722933810,
178 12121371508560456016, 174876831679863147, 15944933357501475584,
179 7502339663607726274, 12048918224562833898,
180 16715284461100269102, 15582559130083209842,
181 1743886467337678829, 2424196198791253761, 1116417308245482383,
182 10367365997906434042, 1849801549382613906,
183 13294939539683415102, 4478091053375708790, 2969967870313332958,
184 14618962068930014237, 2721742233407503451,
185 12003265593030191290, 8109318293656735684, 6346795302983965746,
186 12210038122000333046})
187}