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, []uint64{})
 97}
 98
 99func TestFinal(t *testing.T) {
100	b := make([]byte, 32)
101	for i := 0; i < len(b); i++ {
102		b[i] = byte(i)
103	}
104	bBits := bytesToBits(b)
105	fBits := final(bBits)
106
107	qt.Assert(t, bitsToU64Array(fBits[:]), qt.DeepEquals,
108		[]uint64{16953415415620100490, 7495738965189503699,
109			12723370805759944158, 3295955328722933810,
110			12121371508560456016, 174876831679863147, 15944933357501475584,
111			7502339663607726274, 12048918224562833898,
112			16715284461100269102, 15582559130083209842,
113			1743886467337678829, 2424196198791253761, 1116417308245482383,
114			10367365997906434042, 1849801549382613906,
115			13294939539683415102, 4478091053375708790, 2969967870313332958,
116			14618962068930014237, 2721742233407503451,
117			12003265593030191290, 8109318293656735684, 6346795302983965746,
118			12210038122000333046})
119}