keccakf.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. // Copyright 2013 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. // This file implements the core Keccak permutation function necessary for computing SHA3.
  6. // This is implemented in a separate file to allow for replacement by an optimized implementation.
  7. // Nothing in this package is exported.
  8. // For the detailed specification, refer to the Keccak web site (http://keccak.noekeon.org/).
  9. // rc stores the round constants for use in the ι step.
  10. var rc = [...]uint64{
  11. 0x0000000000000001,
  12. 0x0000000000008082,
  13. 0x800000000000808A,
  14. 0x8000000080008000,
  15. 0x000000000000808B,
  16. 0x0000000080000001,
  17. 0x8000000080008081,
  18. 0x8000000000008009,
  19. 0x000000000000008A,
  20. 0x0000000000000088,
  21. 0x0000000080008009,
  22. 0x000000008000000A,
  23. 0x000000008000808B,
  24. 0x800000000000008B,
  25. 0x8000000000008089,
  26. 0x8000000000008003,
  27. 0x8000000000008002,
  28. 0x8000000000000080,
  29. 0x000000000000800A,
  30. 0x800000008000000A,
  31. 0x8000000080008081,
  32. 0x8000000000008080,
  33. 0x0000000080000001,
  34. 0x8000000080008008,
  35. }
  36. // keccakF computes the complete Keccak-f function consisting of 24 rounds with a different
  37. // constant (rc) in each round. This implementation fully unrolls the round function to avoid
  38. // inner loops, as well as pre-calculating shift offsets.
  39. func keccakF(a *[numLanes]uint64) {
  40. var t, bc0, bc1, bc2, bc3, bc4 uint64
  41. for _, roundConstant := range rc {
  42. // θ step
  43. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  44. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  45. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  46. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  47. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  48. t = bc4 ^ (bc1<<1 ^ bc1>>63)
  49. a[0] ^= t
  50. a[5] ^= t
  51. a[10] ^= t
  52. a[15] ^= t
  53. a[20] ^= t
  54. t = bc0 ^ (bc2<<1 ^ bc2>>63)
  55. a[1] ^= t
  56. a[6] ^= t
  57. a[11] ^= t
  58. a[16] ^= t
  59. a[21] ^= t
  60. t = bc1 ^ (bc3<<1 ^ bc3>>63)
  61. a[2] ^= t
  62. a[7] ^= t
  63. a[12] ^= t
  64. a[17] ^= t
  65. a[22] ^= t
  66. t = bc2 ^ (bc4<<1 ^ bc4>>63)
  67. a[3] ^= t
  68. a[8] ^= t
  69. a[13] ^= t
  70. a[18] ^= t
  71. a[23] ^= t
  72. t = bc3 ^ (bc0<<1 ^ bc0>>63)
  73. a[4] ^= t
  74. a[9] ^= t
  75. a[14] ^= t
  76. a[19] ^= t
  77. a[24] ^= t
  78. // ρ and π steps
  79. t = a[1]
  80. t, a[10] = a[10], t<<1^t>>(64-1)
  81. t, a[7] = a[7], t<<3^t>>(64-3)
  82. t, a[11] = a[11], t<<6^t>>(64-6)
  83. t, a[17] = a[17], t<<10^t>>(64-10)
  84. t, a[18] = a[18], t<<15^t>>(64-15)
  85. t, a[3] = a[3], t<<21^t>>(64-21)
  86. t, a[5] = a[5], t<<28^t>>(64-28)
  87. t, a[16] = a[16], t<<36^t>>(64-36)
  88. t, a[8] = a[8], t<<45^t>>(64-45)
  89. t, a[21] = a[21], t<<55^t>>(64-55)
  90. t, a[24] = a[24], t<<2^t>>(64-2)
  91. t, a[4] = a[4], t<<14^t>>(64-14)
  92. t, a[15] = a[15], t<<27^t>>(64-27)
  93. t, a[23] = a[23], t<<41^t>>(64-41)
  94. t, a[19] = a[19], t<<56^t>>(64-56)
  95. t, a[13] = a[13], t<<8^t>>(64-8)
  96. t, a[12] = a[12], t<<25^t>>(64-25)
  97. t, a[2] = a[2], t<<43^t>>(64-43)
  98. t, a[20] = a[20], t<<62^t>>(64-62)
  99. t, a[14] = a[14], t<<18^t>>(64-18)
  100. t, a[22] = a[22], t<<39^t>>(64-39)
  101. t, a[9] = a[9], t<<61^t>>(64-61)
  102. t, a[6] = a[6], t<<20^t>>(64-20)
  103. a[1] = t<<44 ^ t>>(64-44)
  104. // χ step
  105. bc0 = a[0]
  106. bc1 = a[1]
  107. bc2 = a[2]
  108. bc3 = a[3]
  109. bc4 = a[4]
  110. a[0] ^= bc2 &^ bc1
  111. a[1] ^= bc3 &^ bc2
  112. a[2] ^= bc4 &^ bc3
  113. a[3] ^= bc0 &^ bc4
  114. a[4] ^= bc1 &^ bc0
  115. bc0 = a[5]
  116. bc1 = a[6]
  117. bc2 = a[7]
  118. bc3 = a[8]
  119. bc4 = a[9]
  120. a[5] ^= bc2 &^ bc1
  121. a[6] ^= bc3 &^ bc2
  122. a[7] ^= bc4 &^ bc3
  123. a[8] ^= bc0 &^ bc4
  124. a[9] ^= bc1 &^ bc0
  125. bc0 = a[10]
  126. bc1 = a[11]
  127. bc2 = a[12]
  128. bc3 = a[13]
  129. bc4 = a[14]
  130. a[10] ^= bc2 &^ bc1
  131. a[11] ^= bc3 &^ bc2
  132. a[12] ^= bc4 &^ bc3
  133. a[13] ^= bc0 &^ bc4
  134. a[14] ^= bc1 &^ bc0
  135. bc0 = a[15]
  136. bc1 = a[16]
  137. bc2 = a[17]
  138. bc3 = a[18]
  139. bc4 = a[19]
  140. a[15] ^= bc2 &^ bc1
  141. a[16] ^= bc3 &^ bc2
  142. a[17] ^= bc4 &^ bc3
  143. a[18] ^= bc0 &^ bc4
  144. a[19] ^= bc1 &^ bc0
  145. bc0 = a[20]
  146. bc1 = a[21]
  147. bc2 = a[22]
  148. bc3 = a[23]
  149. bc4 = a[24]
  150. a[20] ^= bc2 &^ bc1
  151. a[21] ^= bc3 &^ bc2
  152. a[22] ^= bc4 &^ bc3
  153. a[23] ^= bc0 &^ bc4
  154. a[24] ^= bc1 &^ bc0
  155. // ι step
  156. a[0] ^= roundConstant
  157. }
  158. }