keccakf.go 9.7 KB

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