keccakf.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package sha3
  5. // rc stores the round constants for use in the ι step.
  6. var rc = [24]uint64{
  7. 0x0000000000000001,
  8. 0x0000000000008082,
  9. 0x800000000000808A,
  10. 0x8000000080008000,
  11. 0x000000000000808B,
  12. 0x0000000080000001,
  13. 0x8000000080008081,
  14. 0x8000000000008009,
  15. 0x000000000000008A,
  16. 0x0000000000000088,
  17. 0x0000000080008009,
  18. 0x000000008000000A,
  19. 0x000000008000808B,
  20. 0x800000000000008B,
  21. 0x8000000000008089,
  22. 0x8000000000008003,
  23. 0x8000000000008002,
  24. 0x8000000000000080,
  25. 0x000000000000800A,
  26. 0x800000008000000A,
  27. 0x8000000080008081,
  28. 0x8000000000008080,
  29. 0x0000000080000001,
  30. 0x8000000080008008,
  31. }
  32. // keccakF1600 applies the Keccak permutation to a 1600b-wide
  33. // state represented as a slice of 25 uint64s.
  34. func keccakF1600(a *[25]uint64) {
  35. var t, bc0, bc1, bc2, bc3, bc4 uint64
  36. for _, roundConstant := range rc {
  37. // θ step
  38. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  39. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  40. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  41. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  42. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  43. t = bc4 ^ (bc1<<1 ^ bc1>>63)
  44. a[0] ^= t
  45. a[5] ^= t
  46. a[10] ^= t
  47. a[15] ^= t
  48. a[20] ^= t
  49. t = bc0 ^ (bc2<<1 ^ bc2>>63)
  50. a[1] ^= t
  51. a[6] ^= t
  52. a[11] ^= t
  53. a[16] ^= t
  54. a[21] ^= t
  55. t = bc1 ^ (bc3<<1 ^ bc3>>63)
  56. a[2] ^= t
  57. a[7] ^= t
  58. a[12] ^= t
  59. a[17] ^= t
  60. a[22] ^= t
  61. t = bc2 ^ (bc4<<1 ^ bc4>>63)
  62. a[3] ^= t
  63. a[8] ^= t
  64. a[13] ^= t
  65. a[18] ^= t
  66. a[23] ^= t
  67. t = bc3 ^ (bc0<<1 ^ bc0>>63)
  68. a[4] ^= t
  69. a[9] ^= t
  70. a[14] ^= t
  71. a[19] ^= t
  72. a[24] ^= t
  73. // ρ and π steps
  74. t = a[1]
  75. t, a[10] = a[10], t<<1^t>>(64-1)
  76. t, a[7] = a[7], t<<3^t>>(64-3)
  77. t, a[11] = a[11], t<<6^t>>(64-6)
  78. t, a[17] = a[17], t<<10^t>>(64-10)
  79. t, a[18] = a[18], t<<15^t>>(64-15)
  80. t, a[3] = a[3], t<<21^t>>(64-21)
  81. t, a[5] = a[5], t<<28^t>>(64-28)
  82. t, a[16] = a[16], t<<36^t>>(64-36)
  83. t, a[8] = a[8], t<<45^t>>(64-45)
  84. t, a[21] = a[21], t<<55^t>>(64-55)
  85. t, a[24] = a[24], t<<2^t>>(64-2)
  86. t, a[4] = a[4], t<<14^t>>(64-14)
  87. t, a[15] = a[15], t<<27^t>>(64-27)
  88. t, a[23] = a[23], t<<41^t>>(64-41)
  89. t, a[19] = a[19], t<<56^t>>(64-56)
  90. t, a[13] = a[13], t<<8^t>>(64-8)
  91. t, a[12] = a[12], t<<25^t>>(64-25)
  92. t, a[2] = a[2], t<<43^t>>(64-43)
  93. t, a[20] = a[20], t<<62^t>>(64-62)
  94. t, a[14] = a[14], t<<18^t>>(64-18)
  95. t, a[22] = a[22], t<<39^t>>(64-39)
  96. t, a[9] = a[9], t<<61^t>>(64-61)
  97. t, a[6] = a[6], t<<20^t>>(64-20)
  98. a[1] = t<<44 ^ t>>(64-44)
  99. // χ step
  100. bc0 = a[0]
  101. bc1 = a[1]
  102. bc2 = a[2]
  103. bc3 = a[3]
  104. bc4 = a[4]
  105. a[0] ^= bc2 &^ bc1
  106. a[1] ^= bc3 &^ bc2
  107. a[2] ^= bc4 &^ bc3
  108. a[3] ^= bc0 &^ bc4
  109. a[4] ^= bc1 &^ bc0
  110. bc0 = a[5]
  111. bc1 = a[6]
  112. bc2 = a[7]
  113. bc3 = a[8]
  114. bc4 = a[9]
  115. a[5] ^= bc2 &^ bc1
  116. a[6] ^= bc3 &^ bc2
  117. a[7] ^= bc4 &^ bc3
  118. a[8] ^= bc0 &^ bc4
  119. a[9] ^= bc1 &^ bc0
  120. bc0 = a[10]
  121. bc1 = a[11]
  122. bc2 = a[12]
  123. bc3 = a[13]
  124. bc4 = a[14]
  125. a[10] ^= bc2 &^ bc1
  126. a[11] ^= bc3 &^ bc2
  127. a[12] ^= bc4 &^ bc3
  128. a[13] ^= bc0 &^ bc4
  129. a[14] ^= bc1 &^ bc0
  130. bc0 = a[15]
  131. bc1 = a[16]
  132. bc2 = a[17]
  133. bc3 = a[18]
  134. bc4 = a[19]
  135. a[15] ^= bc2 &^ bc1
  136. a[16] ^= bc3 &^ bc2
  137. a[17] ^= bc4 &^ bc3
  138. a[18] ^= bc0 &^ bc4
  139. a[19] ^= bc1 &^ bc0
  140. bc0 = a[20]
  141. bc1 = a[21]
  142. bc2 = a[22]
  143. bc3 = a[23]
  144. bc4 = a[24]
  145. a[20] ^= bc2 &^ bc1
  146. a[21] ^= bc3 &^ bc2
  147. a[22] ^= bc4 &^ bc3
  148. a[23] ^= bc0 &^ bc4
  149. a[24] ^= bc1 &^ bc0
  150. // ι step
  151. a[0] ^= roundConstant
  152. }
  153. }