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.

keccakf.go 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  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. //go:build !amd64 || purego || !gc
  5. package sha3
  6. import "math/bits"
  7. // rc stores the round constants for use in the ι step.
  8. var rc = [24]uint64{
  9. 0x0000000000000001,
  10. 0x0000000000008082,
  11. 0x800000000000808A,
  12. 0x8000000080008000,
  13. 0x000000000000808B,
  14. 0x0000000080000001,
  15. 0x8000000080008081,
  16. 0x8000000000008009,
  17. 0x000000000000008A,
  18. 0x0000000000000088,
  19. 0x0000000080008009,
  20. 0x000000008000000A,
  21. 0x000000008000808B,
  22. 0x800000000000008B,
  23. 0x8000000000008089,
  24. 0x8000000000008003,
  25. 0x8000000000008002,
  26. 0x8000000000000080,
  27. 0x000000000000800A,
  28. 0x800000008000000A,
  29. 0x8000000080008081,
  30. 0x8000000000008080,
  31. 0x0000000080000001,
  32. 0x8000000080008008,
  33. }
  34. // keccakF1600 applies the Keccak permutation to a 1600b-wide
  35. // state represented as a slice of 25 uint64s.
  36. func keccakF1600(a *[25]uint64) {
  37. // Implementation translated from Keccak-inplace.c
  38. // in the keccak reference code.
  39. var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64
  40. for i := 0; i < 24; i += 4 {
  41. // Combines the 5 steps in each round into 2 steps.
  42. // Unrolls 4 rounds per loop and spreads some steps across rounds.
  43. // Round 1
  44. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  45. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  46. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  47. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  48. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  49. d0 = bc4 ^ (bc1<<1 | bc1>>63)
  50. d1 = bc0 ^ (bc2<<1 | bc2>>63)
  51. d2 = bc1 ^ (bc3<<1 | bc3>>63)
  52. d3 = bc2 ^ (bc4<<1 | bc4>>63)
  53. d4 = bc3 ^ (bc0<<1 | bc0>>63)
  54. bc0 = a[0] ^ d0
  55. t = a[6] ^ d1
  56. bc1 = bits.RotateLeft64(t, 44)
  57. t = a[12] ^ d2
  58. bc2 = bits.RotateLeft64(t, 43)
  59. t = a[18] ^ d3
  60. bc3 = bits.RotateLeft64(t, 21)
  61. t = a[24] ^ d4
  62. bc4 = bits.RotateLeft64(t, 14)
  63. a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i]
  64. a[6] = bc1 ^ (bc3 &^ bc2)
  65. a[12] = bc2 ^ (bc4 &^ bc3)
  66. a[18] = bc3 ^ (bc0 &^ bc4)
  67. a[24] = bc4 ^ (bc1 &^ bc0)
  68. t = a[10] ^ d0
  69. bc2 = bits.RotateLeft64(t, 3)
  70. t = a[16] ^ d1
  71. bc3 = bits.RotateLeft64(t, 45)
  72. t = a[22] ^ d2
  73. bc4 = bits.RotateLeft64(t, 61)
  74. t = a[3] ^ d3
  75. bc0 = bits.RotateLeft64(t, 28)
  76. t = a[9] ^ d4
  77. bc1 = bits.RotateLeft64(t, 20)
  78. a[10] = bc0 ^ (bc2 &^ bc1)
  79. a[16] = bc1 ^ (bc3 &^ bc2)
  80. a[22] = bc2 ^ (bc4 &^ bc3)
  81. a[3] = bc3 ^ (bc0 &^ bc4)
  82. a[9] = bc4 ^ (bc1 &^ bc0)
  83. t = a[20] ^ d0
  84. bc4 = bits.RotateLeft64(t, 18)
  85. t = a[1] ^ d1
  86. bc0 = bits.RotateLeft64(t, 1)
  87. t = a[7] ^ d2
  88. bc1 = bits.RotateLeft64(t, 6)
  89. t = a[13] ^ d3
  90. bc2 = bits.RotateLeft64(t, 25)
  91. t = a[19] ^ d4
  92. bc3 = bits.RotateLeft64(t, 8)
  93. a[20] = bc0 ^ (bc2 &^ bc1)
  94. a[1] = bc1 ^ (bc3 &^ bc2)
  95. a[7] = bc2 ^ (bc4 &^ bc3)
  96. a[13] = bc3 ^ (bc0 &^ bc4)
  97. a[19] = bc4 ^ (bc1 &^ bc0)
  98. t = a[5] ^ d0
  99. bc1 = bits.RotateLeft64(t, 36)
  100. t = a[11] ^ d1
  101. bc2 = bits.RotateLeft64(t, 10)
  102. t = a[17] ^ d2
  103. bc3 = bits.RotateLeft64(t, 15)
  104. t = a[23] ^ d3
  105. bc4 = bits.RotateLeft64(t, 56)
  106. t = a[4] ^ d4
  107. bc0 = bits.RotateLeft64(t, 27)
  108. a[5] = bc0 ^ (bc2 &^ bc1)
  109. a[11] = bc1 ^ (bc3 &^ bc2)
  110. a[17] = bc2 ^ (bc4 &^ bc3)
  111. a[23] = bc3 ^ (bc0 &^ bc4)
  112. a[4] = bc4 ^ (bc1 &^ bc0)
  113. t = a[15] ^ d0
  114. bc3 = bits.RotateLeft64(t, 41)
  115. t = a[21] ^ d1
  116. bc4 = bits.RotateLeft64(t, 2)
  117. t = a[2] ^ d2
  118. bc0 = bits.RotateLeft64(t, 62)
  119. t = a[8] ^ d3
  120. bc1 = bits.RotateLeft64(t, 55)
  121. t = a[14] ^ d4
  122. bc2 = bits.RotateLeft64(t, 39)
  123. a[15] = bc0 ^ (bc2 &^ bc1)
  124. a[21] = bc1 ^ (bc3 &^ bc2)
  125. a[2] = bc2 ^ (bc4 &^ bc3)
  126. a[8] = bc3 ^ (bc0 &^ bc4)
  127. a[14] = bc4 ^ (bc1 &^ bc0)
  128. // Round 2
  129. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  130. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  131. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  132. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  133. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  134. d0 = bc4 ^ (bc1<<1 | bc1>>63)
  135. d1 = bc0 ^ (bc2<<1 | bc2>>63)
  136. d2 = bc1 ^ (bc3<<1 | bc3>>63)
  137. d3 = bc2 ^ (bc4<<1 | bc4>>63)
  138. d4 = bc3 ^ (bc0<<1 | bc0>>63)
  139. bc0 = a[0] ^ d0
  140. t = a[16] ^ d1
  141. bc1 = bits.RotateLeft64(t, 44)
  142. t = a[7] ^ d2
  143. bc2 = bits.RotateLeft64(t, 43)
  144. t = a[23] ^ d3
  145. bc3 = bits.RotateLeft64(t, 21)
  146. t = a[14] ^ d4
  147. bc4 = bits.RotateLeft64(t, 14)
  148. a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1]
  149. a[16] = bc1 ^ (bc3 &^ bc2)
  150. a[7] = bc2 ^ (bc4 &^ bc3)
  151. a[23] = bc3 ^ (bc0 &^ bc4)
  152. a[14] = bc4 ^ (bc1 &^ bc0)
  153. t = a[20] ^ d0
  154. bc2 = bits.RotateLeft64(t, 3)
  155. t = a[11] ^ d1
  156. bc3 = bits.RotateLeft64(t, 45)
  157. t = a[2] ^ d2
  158. bc4 = bits.RotateLeft64(t, 61)
  159. t = a[18] ^ d3
  160. bc0 = bits.RotateLeft64(t, 28)
  161. t = a[9] ^ d4
  162. bc1 = bits.RotateLeft64(t, 20)
  163. a[20] = bc0 ^ (bc2 &^ bc1)
  164. a[11] = bc1 ^ (bc3 &^ bc2)
  165. a[2] = bc2 ^ (bc4 &^ bc3)
  166. a[18] = bc3 ^ (bc0 &^ bc4)
  167. a[9] = bc4 ^ (bc1 &^ bc0)
  168. t = a[15] ^ d0
  169. bc4 = bits.RotateLeft64(t, 18)
  170. t = a[6] ^ d1
  171. bc0 = bits.RotateLeft64(t, 1)
  172. t = a[22] ^ d2
  173. bc1 = bits.RotateLeft64(t, 6)
  174. t = a[13] ^ d3
  175. bc2 = bits.RotateLeft64(t, 25)
  176. t = a[4] ^ d4
  177. bc3 = bits.RotateLeft64(t, 8)
  178. a[15] = bc0 ^ (bc2 &^ bc1)
  179. a[6] = bc1 ^ (bc3 &^ bc2)
  180. a[22] = bc2 ^ (bc4 &^ bc3)
  181. a[13] = bc3 ^ (bc0 &^ bc4)
  182. a[4] = bc4 ^ (bc1 &^ bc0)
  183. t = a[10] ^ d0
  184. bc1 = bits.RotateLeft64(t, 36)
  185. t = a[1] ^ d1
  186. bc2 = bits.RotateLeft64(t, 10)
  187. t = a[17] ^ d2
  188. bc3 = bits.RotateLeft64(t, 15)
  189. t = a[8] ^ d3
  190. bc4 = bits.RotateLeft64(t, 56)
  191. t = a[24] ^ d4
  192. bc0 = bits.RotateLeft64(t, 27)
  193. a[10] = bc0 ^ (bc2 &^ bc1)
  194. a[1] = bc1 ^ (bc3 &^ bc2)
  195. a[17] = bc2 ^ (bc4 &^ bc3)
  196. a[8] = bc3 ^ (bc0 &^ bc4)
  197. a[24] = bc4 ^ (bc1 &^ bc0)
  198. t = a[5] ^ d0
  199. bc3 = bits.RotateLeft64(t, 41)
  200. t = a[21] ^ d1
  201. bc4 = bits.RotateLeft64(t, 2)
  202. t = a[12] ^ d2
  203. bc0 = bits.RotateLeft64(t, 62)
  204. t = a[3] ^ d3
  205. bc1 = bits.RotateLeft64(t, 55)
  206. t = a[19] ^ d4
  207. bc2 = bits.RotateLeft64(t, 39)
  208. a[5] = bc0 ^ (bc2 &^ bc1)
  209. a[21] = bc1 ^ (bc3 &^ bc2)
  210. a[12] = bc2 ^ (bc4 &^ bc3)
  211. a[3] = bc3 ^ (bc0 &^ bc4)
  212. a[19] = bc4 ^ (bc1 &^ bc0)
  213. // Round 3
  214. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  215. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  216. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  217. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  218. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  219. d0 = bc4 ^ (bc1<<1 | bc1>>63)
  220. d1 = bc0 ^ (bc2<<1 | bc2>>63)
  221. d2 = bc1 ^ (bc3<<1 | bc3>>63)
  222. d3 = bc2 ^ (bc4<<1 | bc4>>63)
  223. d4 = bc3 ^ (bc0<<1 | bc0>>63)
  224. bc0 = a[0] ^ d0
  225. t = a[11] ^ d1
  226. bc1 = bits.RotateLeft64(t, 44)
  227. t = a[22] ^ d2
  228. bc2 = bits.RotateLeft64(t, 43)
  229. t = a[8] ^ d3
  230. bc3 = bits.RotateLeft64(t, 21)
  231. t = a[19] ^ d4
  232. bc4 = bits.RotateLeft64(t, 14)
  233. a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2]
  234. a[11] = bc1 ^ (bc3 &^ bc2)
  235. a[22] = bc2 ^ (bc4 &^ bc3)
  236. a[8] = bc3 ^ (bc0 &^ bc4)
  237. a[19] = bc4 ^ (bc1 &^ bc0)
  238. t = a[15] ^ d0
  239. bc2 = bits.RotateLeft64(t, 3)
  240. t = a[1] ^ d1
  241. bc3 = bits.RotateLeft64(t, 45)
  242. t = a[12] ^ d2
  243. bc4 = bits.RotateLeft64(t, 61)
  244. t = a[23] ^ d3
  245. bc0 = bits.RotateLeft64(t, 28)
  246. t = a[9] ^ d4
  247. bc1 = bits.RotateLeft64(t, 20)
  248. a[15] = bc0 ^ (bc2 &^ bc1)
  249. a[1] = bc1 ^ (bc3 &^ bc2)
  250. a[12] = bc2 ^ (bc4 &^ bc3)
  251. a[23] = bc3 ^ (bc0 &^ bc4)
  252. a[9] = bc4 ^ (bc1 &^ bc0)
  253. t = a[5] ^ d0
  254. bc4 = bits.RotateLeft64(t, 18)
  255. t = a[16] ^ d1
  256. bc0 = bits.RotateLeft64(t, 1)
  257. t = a[2] ^ d2
  258. bc1 = bits.RotateLeft64(t, 6)
  259. t = a[13] ^ d3
  260. bc2 = bits.RotateLeft64(t, 25)
  261. t = a[24] ^ d4
  262. bc3 = bits.RotateLeft64(t, 8)
  263. a[5] = bc0 ^ (bc2 &^ bc1)
  264. a[16] = bc1 ^ (bc3 &^ bc2)
  265. a[2] = bc2 ^ (bc4 &^ bc3)
  266. a[13] = bc3 ^ (bc0 &^ bc4)
  267. a[24] = bc4 ^ (bc1 &^ bc0)
  268. t = a[20] ^ d0
  269. bc1 = bits.RotateLeft64(t, 36)
  270. t = a[6] ^ d1
  271. bc2 = bits.RotateLeft64(t, 10)
  272. t = a[17] ^ d2
  273. bc3 = bits.RotateLeft64(t, 15)
  274. t = a[3] ^ d3
  275. bc4 = bits.RotateLeft64(t, 56)
  276. t = a[14] ^ d4
  277. bc0 = bits.RotateLeft64(t, 27)
  278. a[20] = bc0 ^ (bc2 &^ bc1)
  279. a[6] = bc1 ^ (bc3 &^ bc2)
  280. a[17] = bc2 ^ (bc4 &^ bc3)
  281. a[3] = bc3 ^ (bc0 &^ bc4)
  282. a[14] = bc4 ^ (bc1 &^ bc0)
  283. t = a[10] ^ d0
  284. bc3 = bits.RotateLeft64(t, 41)
  285. t = a[21] ^ d1
  286. bc4 = bits.RotateLeft64(t, 2)
  287. t = a[7] ^ d2
  288. bc0 = bits.RotateLeft64(t, 62)
  289. t = a[18] ^ d3
  290. bc1 = bits.RotateLeft64(t, 55)
  291. t = a[4] ^ d4
  292. bc2 = bits.RotateLeft64(t, 39)
  293. a[10] = bc0 ^ (bc2 &^ bc1)
  294. a[21] = bc1 ^ (bc3 &^ bc2)
  295. a[7] = bc2 ^ (bc4 &^ bc3)
  296. a[18] = bc3 ^ (bc0 &^ bc4)
  297. a[4] = bc4 ^ (bc1 &^ bc0)
  298. // Round 4
  299. bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
  300. bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
  301. bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
  302. bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
  303. bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
  304. d0 = bc4 ^ (bc1<<1 | bc1>>63)
  305. d1 = bc0 ^ (bc2<<1 | bc2>>63)
  306. d2 = bc1 ^ (bc3<<1 | bc3>>63)
  307. d3 = bc2 ^ (bc4<<1 | bc4>>63)
  308. d4 = bc3 ^ (bc0<<1 | bc0>>63)
  309. bc0 = a[0] ^ d0
  310. t = a[1] ^ d1
  311. bc1 = bits.RotateLeft64(t, 44)
  312. t = a[2] ^ d2
  313. bc2 = bits.RotateLeft64(t, 43)
  314. t = a[3] ^ d3
  315. bc3 = bits.RotateLeft64(t, 21)
  316. t = a[4] ^ d4
  317. bc4 = bits.RotateLeft64(t, 14)
  318. a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3]
  319. a[1] = bc1 ^ (bc3 &^ bc2)
  320. a[2] = bc2 ^ (bc4 &^ bc3)
  321. a[3] = bc3 ^ (bc0 &^ bc4)
  322. a[4] = bc4 ^ (bc1 &^ bc0)
  323. t = a[5] ^ d0
  324. bc2 = bits.RotateLeft64(t, 3)
  325. t = a[6] ^ d1
  326. bc3 = bits.RotateLeft64(t, 45)
  327. t = a[7] ^ d2
  328. bc4 = bits.RotateLeft64(t, 61)
  329. t = a[8] ^ d3
  330. bc0 = bits.RotateLeft64(t, 28)
  331. t = a[9] ^ d4
  332. bc1 = bits.RotateLeft64(t, 20)
  333. a[5] = bc0 ^ (bc2 &^ bc1)
  334. a[6] = bc1 ^ (bc3 &^ bc2)
  335. a[7] = bc2 ^ (bc4 &^ bc3)
  336. a[8] = bc3 ^ (bc0 &^ bc4)
  337. a[9] = bc4 ^ (bc1 &^ bc0)
  338. t = a[10] ^ d0
  339. bc4 = bits.RotateLeft64(t, 18)
  340. t = a[11] ^ d1
  341. bc0 = bits.RotateLeft64(t, 1)
  342. t = a[12] ^ d2
  343. bc1 = bits.RotateLeft64(t, 6)
  344. t = a[13] ^ d3
  345. bc2 = bits.RotateLeft64(t, 25)
  346. t = a[14] ^ d4
  347. bc3 = bits.RotateLeft64(t, 8)
  348. a[10] = bc0 ^ (bc2 &^ bc1)
  349. a[11] = bc1 ^ (bc3 &^ bc2)
  350. a[12] = bc2 ^ (bc4 &^ bc3)
  351. a[13] = bc3 ^ (bc0 &^ bc4)
  352. a[14] = bc4 ^ (bc1 &^ bc0)
  353. t = a[15] ^ d0
  354. bc1 = bits.RotateLeft64(t, 36)
  355. t = a[16] ^ d1
  356. bc2 = bits.RotateLeft64(t, 10)
  357. t = a[17] ^ d2
  358. bc3 = bits.RotateLeft64(t, 15)
  359. t = a[18] ^ d3
  360. bc4 = bits.RotateLeft64(t, 56)
  361. t = a[19] ^ d4
  362. bc0 = bits.RotateLeft64(t, 27)
  363. a[15] = bc0 ^ (bc2 &^ bc1)
  364. a[16] = bc1 ^ (bc3 &^ bc2)
  365. a[17] = bc2 ^ (bc4 &^ bc3)
  366. a[18] = bc3 ^ (bc0 &^ bc4)
  367. a[19] = bc4 ^ (bc1 &^ bc0)
  368. t = a[20] ^ d0
  369. bc3 = bits.RotateLeft64(t, 41)
  370. t = a[21] ^ d1
  371. bc4 = bits.RotateLeft64(t, 2)
  372. t = a[22] ^ d2
  373. bc0 = bits.RotateLeft64(t, 62)
  374. t = a[23] ^ d3
  375. bc1 = bits.RotateLeft64(t, 55)
  376. t = a[24] ^ d4
  377. bc2 = bits.RotateLeft64(t, 39)
  378. a[20] = bc0 ^ (bc2 &^ bc1)
  379. a[21] = bc1 ^ (bc3 &^ bc2)
  380. a[22] = bc2 ^ (bc4 &^ bc3)
  381. a[23] = bc3 ^ (bc0 &^ bc4)
  382. a[24] = bc4 ^ (bc1 &^ bc0)
  383. }
  384. }