arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
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}