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	"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}