keccak256-circom/go-keccak256-bits-impl/keccak_test.go
go-keccak256-bits-impl/keccak_test.goRaw
1package keccak
2
3import (
4 "encoding/hex"
5 "testing"
6
7 "github.com/ethereum/go-ethereum/crypto"
8 qt "github.com/frankban/quicktest"
9)
10
11func TestKeccak(t *testing.T) {
12 testKeccak(t, []byte("test"), "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658")
13 testKeccak(t, make([]byte, 32), "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")
14 testKeccak(t, make([]byte, 100), "913fb9e1f6f1c6d910fd574a5cad8857aa43bfba24e401ada4f56090d4d997a7")
15}
16
17func testKeccak(t *testing.T, input []byte, expectedHex string) {
18 expected := crypto.Keccak256(input)
19
20 hBits := ComputeKeccak(bytesToBits(input))
21 h := bitsToBytes(hBits)
22
23 qt.Assert(t, h, qt.DeepEquals, expected)
24 qt.Assert(t, hex.EncodeToString(h), qt.Equals, expectedHex)
25}
26
27func TestPad(t *testing.T) {
28 b := make([]byte, 32)
29 for i := 0; i < len(b); i++ {
30 b[i] = byte(i)
31 }
32 bBits := bytesToBits(b)
33 fBits := pad(bBits)
34
35 qt.Assert(t, bitsToBytes(fBits[:]), qt.DeepEquals,
36 []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
37 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
38 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39 0, 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, 128})
43}
44
45func TestKeccakfRound(t *testing.T) {
46 s, _ := newS()
47
48 s = keccakfRound(s, 0)
49 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
50 []uint64{
51 26388279066651, 246290629787648, 26388279902208,
52 25165850, 246290605457408, 7784628352, 844424965783552,
53 2305843009213694083, 844432714760192,
54 2305843009249345539, 637534226, 14848, 641204224,
55 14354, 3670528, 6308236288, 2130304761856,
56 648518346341354496, 6309216256, 648520476645130240,
57 4611706359392501763, 792677514882318336,
58 20340965113972, 4611732197915754499,
59 792633534417207412})
60
61 s = keccakfRound(s, 20)
62 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
63 []uint64{17728382861289829725, 13654073086381141005,
64 9912591532945168756, 2030068283137172501, 5084683018496047808,
65 151244976540463006, 11718217461613725815, 11636071286320763433,
66 15039144509240642782, 11629028282864249197,
67 2594633730779457624, 14005558505838459171, 4612881094252610438,
68 2828009553220809993, 4838578484623267135, 1006588603063111352,
69 11109191860075454495, 1187545859779038208,
70 14661669042642437042, 5345317080454741069, 8196674451365552863,
71 635818354583088260, 13515759754032305626, 1708499319988748543,
72 7509292798507899312})
73
74}
75
76func TestKeccakf(t *testing.T) {
77 s, _ := newS()
78
79 s = keccakf(s)
80
81 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
82 []uint64{9472389783892099349, 2159377575142921216,
83 17826682512249813373, 2325963263767348549,
84 15086930817298358378, 11661812091723830419,
85 3517755057770134847, 5223775837645169598, 933274647126506074,
86 3451250694486589320, 825065683101361807, 6192414258352188799,
87 14426505790672879210, 3326742392640380689,
88 16749975585634164134, 17847697619892908514,
89 11598434253200954839, 6049795840392747215, 8610635351954084385,
90 18234131770974529925, 15330347418010067760,
91 12047099911907354591, 4763389569697138851, 6779624089296570504,
92 15083668107635345971})
93
94 // compute again keccakf on the current state
95 s = keccakf(s)
96 qt.Assert(t, bitsToU64Array(s[:]), qt.DeepEquals,
97 []uint64{269318771259381490, 15892848561416382510,
98 12485559500958802382, 4360182510883008729,
99 14284025675983944434, 8800366419087562177, 7881853509112258378,
100 9503857914080778528, 17110477940977988953,
101 13825318756568052601, 11460650932194163315,
102 13272167288297399439, 13599957064256729412,
103 12730838251751851758, 13736647180617564382,
104 5651695613583298166, 15496251216716036782, 9748494184433838858,
105 3637745438296580159, 3821184813198767406, 15603239432236101315,
106 3726326332491237029, 7819962668913661099, 2285898735263816116,
107 13518516210247555620})
108}
109
110func TestFinal(t *testing.T) {
111 b := make([]byte, 32)
112 for i := 0; i < len(b); i++ {
113 b[i] = byte(i)
114 }
115 bBits := bytesToBits(b)
116 fBits := final(bBits)
117
118 qt.Assert(t, bitsToU64Array(fBits[:]), qt.DeepEquals,
119 []uint64{16953415415620100490, 7495738965189503699,
120 12723370805759944158, 3295955328722933810,
121 12121371508560456016, 174876831679863147, 15944933357501475584,
122 7502339663607726274, 12048918224562833898,
123 16715284461100269102, 15582559130083209842,
124 1743886467337678829, 2424196198791253761, 1116417308245482383,
125 10367365997906434042, 1849801549382613906,
126 13294939539683415102, 4478091053375708790, 2969967870313332958,
127 14618962068930014237, 2721742233407503451,
128 12003265593030191290, 8109318293656735684, 6346795302983965746,
129 12210038122000333046})
130}