You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
4.7 KiB

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