sleeping_kangaroo12 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +127 -0
  3. data/ext/Rakefile +73 -0
  4. data/ext/binding/sleeping_kangaroo12.c +39 -0
  5. data/ext/config/xkcp.build +17 -0
  6. data/ext/xkcp/LICENSE +1 -0
  7. data/ext/xkcp/Makefile +15 -0
  8. data/ext/xkcp/Makefile.build +200 -0
  9. data/ext/xkcp/README.markdown +296 -0
  10. data/ext/xkcp/lib/HighLevel.build +143 -0
  11. data/ext/xkcp/lib/LowLevel.build +757 -0
  12. data/ext/xkcp/lib/common/align.h +33 -0
  13. data/ext/xkcp/lib/common/brg_endian.h +143 -0
  14. data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.c +301 -0
  15. data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.h +97 -0
  16. data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.c +81 -0
  17. data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.h +125 -0
  18. data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.c +48 -0
  19. data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.h +79 -0
  20. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.c +81 -0
  21. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.h +73 -0
  22. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.inc +195 -0
  23. data/ext/xkcp/lib/high/Keccak/KeccakSponge.c +111 -0
  24. data/ext/xkcp/lib/high/Keccak/KeccakSponge.h +76 -0
  25. data/ext/xkcp/lib/high/Keccak/KeccakSponge.inc +314 -0
  26. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.c +61 -0
  27. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.h +67 -0
  28. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.inc +128 -0
  29. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.c +93 -0
  30. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.h +599 -0
  31. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.inc +573 -0
  32. data/ext/xkcp/lib/high/Ketje/Ketjev2.c +87 -0
  33. data/ext/xkcp/lib/high/Ketje/Ketjev2.h +88 -0
  34. data/ext/xkcp/lib/high/Ketje/Ketjev2.inc +274 -0
  35. data/ext/xkcp/lib/high/Keyak/Keyakv2.c +132 -0
  36. data/ext/xkcp/lib/high/Keyak/Keyakv2.h +217 -0
  37. data/ext/xkcp/lib/high/Keyak/Keyakv2.inc +81 -0
  38. data/ext/xkcp/lib/high/Keyak/Motorist.inc +953 -0
  39. data/ext/xkcp/lib/high/Kravatte/Kravatte.c +533 -0
  40. data/ext/xkcp/lib/high/Kravatte/Kravatte.h +115 -0
  41. data/ext/xkcp/lib/high/Kravatte/KravatteModes.c +557 -0
  42. data/ext/xkcp/lib/high/Kravatte/KravatteModes.h +247 -0
  43. data/ext/xkcp/lib/high/Xoodyak/Cyclist.h +66 -0
  44. data/ext/xkcp/lib/high/Xoodyak/Cyclist.inc +336 -0
  45. data/ext/xkcp/lib/high/Xoodyak/Xoodyak-parameters.h +26 -0
  46. data/ext/xkcp/lib/high/Xoodyak/Xoodyak.c +55 -0
  47. data/ext/xkcp/lib/high/Xoodyak/Xoodyak.h +35 -0
  48. data/ext/xkcp/lib/high/Xoofff/Xoofff.c +634 -0
  49. data/ext/xkcp/lib/high/Xoofff/Xoofff.h +147 -0
  50. data/ext/xkcp/lib/high/Xoofff/XoofffModes.c +483 -0
  51. data/ext/xkcp/lib/high/Xoofff/XoofffModes.h +241 -0
  52. data/ext/xkcp/lib/high/common/Phases.h +25 -0
  53. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-SnP.h +41 -0
  54. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-armcc.s +1666 -0
  55. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-gcc.s +1655 -0
  56. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-armcc.s +1268 -0
  57. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-gcc.s +1264 -0
  58. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-armcc.s +1178 -0
  59. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-gcc.s +1175 -0
  60. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-armcc.s +1338 -0
  61. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-gcc.s +1336 -0
  62. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-armcc.s +1343 -0
  63. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-gcc.s +1339 -0
  64. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-SnP.h +42 -0
  65. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-armcc.s +823 -0
  66. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-gcc.s +831 -0
  67. data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-SnP.h +31 -0
  68. data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-armv8a-neon.s +540 -0
  69. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-SnP.h +42 -0
  70. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-compact.s +733 -0
  71. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-fast.s +1121 -0
  72. data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-AVX2.s +1100 -0
  73. data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-SnP.h +52 -0
  74. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-AVX512.c +623 -0
  75. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-SnP.h +47 -0
  76. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u12/KeccakP-1600-AVX512-config.h +6 -0
  77. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u6/KeccakP-1600-AVX512-config.h +6 -0
  78. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/ua/KeccakP-1600-AVX512-config.h +6 -0
  79. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-AVX512.s +1031 -0
  80. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-SnP.h +53 -0
  81. data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-SnP.h +44 -0
  82. data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-XOP.c +476 -0
  83. data/ext/xkcp/lib/low/KeccakP-1600/XOP/u6/KeccakP-1600-XOP-config.h +6 -0
  84. data/ext/xkcp/lib/low/KeccakP-1600/XOP/ua/KeccakP-1600-XOP-config.h +6 -0
  85. data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-64.macros +748 -0
  86. data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-unrolling.macros +305 -0
  87. data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-SnP.h +40 -0
  88. data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-compact64.c +420 -0
  89. data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-SnP.h +43 -0
  90. data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-inplace32BI.c +1163 -0
  91. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-SnP.h +54 -0
  92. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-opt64.c +565 -0
  93. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcu6/KeccakP-1600-opt64-config.h +7 -0
  94. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua/KeccakP-1600-opt64-config.h +7 -0
  95. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua-shld/KeccakP-1600-opt64-config.h +8 -0
  96. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/u6/KeccakP-1600-opt64-config.h +6 -0
  97. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/ua/KeccakP-1600-opt64-config.h +6 -0
  98. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-SnP.h +44 -0
  99. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference.h +23 -0
  100. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference32BI.c +625 -0
  101. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-SnP.h +44 -0
  102. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.c +440 -0
  103. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.h +23 -0
  104. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-SnP.h +42 -0
  105. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas.s +1196 -0
  106. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas_Apple.s +1124 -0
  107. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-shld-gas.s +1196 -0
  108. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-armcc.s +1392 -0
  109. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-gcc.s +1394 -0
  110. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-times2-SnP.h +42 -0
  111. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u12/SIMD512-2-config.h +7 -0
  112. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u4/SIMD512-2-config.h +7 -0
  113. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512ufull/SIMD512-2-config.h +7 -0
  114. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SIMD512.c +850 -0
  115. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SnP.h +51 -0
  116. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c +957 -0
  117. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SnP.h +49 -0
  118. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-u2/SIMD128-config.h +8 -0
  119. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-ua/SIMD128-config.h +8 -0
  120. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-u2/SIMD128-config.h +9 -0
  121. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-ua/SIMD128-config.h +9 -0
  122. data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-SnP.h +45 -0
  123. data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-on1.c +37 -0
  124. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SIMD256.c +1321 -0
  125. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SnP.h +55 -0
  126. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u12/SIMD256-config.h +7 -0
  127. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u6/SIMD256-config.h +7 -0
  128. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/ua/SIMD256-config.h +7 -0
  129. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u12/SIMD512-4-config.h +7 -0
  130. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u4/SIMD512-4-config.h +7 -0
  131. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512ufull/SIMD512-4-config.h +7 -0
  132. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SIMD512.c +881 -0
  133. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SnP.h +51 -0
  134. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-SnP.h +45 -0
  135. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-on1.c +37 -0
  136. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-SnP.h +45 -0
  137. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-on2.c +38 -0
  138. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SIMD512.c +1615 -0
  139. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SnP.h +57 -0
  140. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u12/SIMD512-config.h +7 -0
  141. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u4/SIMD512-config.h +7 -0
  142. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/ua/SIMD512-config.h +7 -0
  143. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-SnP.h +45 -0
  144. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-on1.c +37 -0
  145. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-SnP.h +45 -0
  146. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-on2.c +38 -0
  147. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-SnP.h +45 -0
  148. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-on4.c +38 -0
  149. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-SnP.h +41 -0
  150. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-armcc.s +442 -0
  151. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-gcc.s +446 -0
  152. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-armcc.s +419 -0
  153. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-gcc.s +427 -0
  154. data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-SnP.h +41 -0
  155. data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-avr8-fast.s +647 -0
  156. data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-SnP.h +39 -0
  157. data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-compact.c +190 -0
  158. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-SnP.h +43 -0
  159. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.c +412 -0
  160. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.h +23 -0
  161. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-SnP.h +41 -0
  162. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-armcc.s +454 -0
  163. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-gcc.s +458 -0
  164. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-armcc.s +455 -0
  165. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-gcc.s +458 -0
  166. data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-SnP.h +41 -0
  167. data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-avr8-fast.s +728 -0
  168. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-SnP.h +43 -0
  169. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.c +414 -0
  170. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.h +23 -0
  171. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-SnP.h +42 -0
  172. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-armcc.s +527 -0
  173. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-gcc.s +533 -0
  174. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-armcc.s +528 -0
  175. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-gcc.s +534 -0
  176. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-armcc.s +521 -0
  177. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-gcc.s +527 -0
  178. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-armcc.s +517 -0
  179. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-gcc.s +523 -0
  180. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-armcc.s +550 -0
  181. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-gcc.s +556 -0
  182. data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-SnP.h +32 -0
  183. data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-armv8a-neon.s +432 -0
  184. data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-SnP.h +42 -0
  185. data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-avr8-fast.s +929 -0
  186. data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-SnP.h +40 -0
  187. data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-compact.c +244 -0
  188. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-SnP.h +46 -0
  189. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32-bis.macros +184 -0
  190. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.c +454 -0
  191. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.macros +459 -0
  192. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling-bis.macros +83 -0
  193. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling.macros +88 -0
  194. data/ext/xkcp/lib/low/KeccakP-800/plain/lcu2/KeccakP-800-opt32-config.h +7 -0
  195. data/ext/xkcp/lib/low/KeccakP-800/plain/lcua/KeccakP-800-opt32-config.h +7 -0
  196. data/ext/xkcp/lib/low/KeccakP-800/plain/u2/KeccakP-800-opt32-config.h +7 -0
  197. data/ext/xkcp/lib/low/KeccakP-800/plain/ua/KeccakP-800-opt32-config.h +7 -0
  198. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-SnP.h +44 -0
  199. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.c +437 -0
  200. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.h +23 -0
  201. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/Ket.h +57 -0
  202. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-armcc.s +475 -0
  203. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-gcc.s +480 -0
  204. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-armcc.s +590 -0
  205. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-gcc.s +590 -0
  206. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.c +126 -0
  207. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.h +68 -0
  208. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.inc +174 -0
  209. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.c +80 -0
  210. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.h +68 -0
  211. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.inc +142 -0
  212. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-SnP.h +55 -0
  213. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-armcc.s +1086 -0
  214. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-gcc.s +1092 -0
  215. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-armcc.s +721 -0
  216. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-gcc.s +726 -0
  217. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-armcc.s +723 -0
  218. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-gcc.s +729 -0
  219. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-armcc.s +1164 -0
  220. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-gcc.s +1165 -0
  221. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-armcc.s +562 -0
  222. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-gcc.s +563 -0
  223. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-armcc.s +563 -0
  224. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-gcc.s +565 -0
  225. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-SnP.h +55 -0
  226. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-armcc.s +476 -0
  227. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-gcc.s +485 -0
  228. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-armcc.s +362 -0
  229. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-gcc.s +367 -0
  230. data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-SnP.h +43 -0
  231. data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-avr8-u1.s +1341 -0
  232. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SIMD512.c +581 -0
  233. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SnP.h +58 -0
  234. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodyak-full-block-SIMD512.c +332 -0
  235. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SIMD128.c +329 -0
  236. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SnP.h +53 -0
  237. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodyak-full-block-SIMD128.c +355 -0
  238. data/ext/xkcp/lib/low/Xoodoo/Xoodoo.h +79 -0
  239. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-SnP.h +56 -0
  240. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-optimized.c +399 -0
  241. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodyak-full-blocks.c +127 -0
  242. data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-SnP.h +43 -0
  243. data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-reference.c +253 -0
  244. data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SIMD512.c +1044 -0
  245. data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SnP.h +49 -0
  246. data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-SnP.h +45 -0
  247. data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-on1.c +37 -0
  248. data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-ARMv7A.s +1587 -0
  249. data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-SnP.h +48 -0
  250. data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SIMD512.c +1202 -0
  251. data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SnP.h +48 -0
  252. data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SIMD128.c +484 -0
  253. data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SnP.h +44 -0
  254. data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-SnP.h +45 -0
  255. data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-on1.c +37 -0
  256. data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SIMD256.c +939 -0
  257. data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SnP.h +49 -0
  258. data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SIMD512.c +1216 -0
  259. data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SnP.h +48 -0
  260. data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-SnP.h +45 -0
  261. data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-on1.c +37 -0
  262. data/ext/xkcp/lib/low/common/PlSnP-Fallback.inc +290 -0
  263. data/ext/xkcp/lib/low/common/SnP-Relaned.h +141 -0
  264. data/ext/xkcp/support/Build/ExpandProducts.xsl +79 -0
  265. data/ext/xkcp/support/Build/ToGlobalMakefile.xsl +206 -0
  266. data/ext/xkcp/support/Build/ToOneTarget.xsl +89 -0
  267. data/ext/xkcp/support/Build/ToTargetConfigFile.xsl +37 -0
  268. data/ext/xkcp/support/Build/ToTargetMakefile.xsl +298 -0
  269. data/ext/xkcp/support/Build/ToVCXProj.xsl +198 -0
  270. data/ext/xkcp/support/Kernel-PMU/Kernel-pmu.md +133 -0
  271. data/ext/xkcp/support/Kernel-PMU/Makefile +8 -0
  272. data/ext/xkcp/support/Kernel-PMU/enable_arm_pmu.c +129 -0
  273. data/ext/xkcp/support/Kernel-PMU/load-module +1 -0
  274. data/ext/xkcp/util/KeccakSum/KeccakSum.c +394 -0
  275. data/ext/xkcp/util/KeccakSum/base64.c +86 -0
  276. data/ext/xkcp/util/KeccakSum/base64.h +12 -0
  277. data/lib/sleeping_kangaroo12/binding.rb +15 -0
  278. data/lib/sleeping_kangaroo12/build/loader.rb +40 -0
  279. data/lib/sleeping_kangaroo12/build/platform.rb +37 -0
  280. data/lib/sleeping_kangaroo12/build.rb +4 -0
  281. data/lib/sleeping_kangaroo12/digest.rb +103 -0
  282. data/lib/sleeping_kangaroo12/version.rb +5 -0
  283. data/lib/sleeping_kangaroo12.rb +7 -0
  284. metadata +372 -0
@@ -0,0 +1,1163 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ The Keccak-p permutations, designed by Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche.
6
+
7
+ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
8
+
9
+ For more information, feedback or questions, please refer to the Keccak Team website:
10
+ https://keccak.team/
11
+
12
+ To the extent possible under law, the implementer has waived all copyright
13
+ and related or neighboring rights to the source code in this file.
14
+ http://creativecommons.org/publicdomain/zero/1.0/
15
+
16
+ ---
17
+
18
+ This file implements Keccak-p[1600] in a SnP-compatible way.
19
+ Please refer to SnP-documentation.h for more details.
20
+
21
+ This implementation comes with KeccakP-1600-SnP.h in the same folder.
22
+ Please refer to LowLevel.build for the exact list of other files it must be combined with.
23
+ */
24
+
25
+ #include <stdint.h>
26
+ #include <string.h>
27
+ #include "brg_endian.h"
28
+ #include "KeccakP-1600-SnP.h"
29
+ #include "SnP-Relaned.h"
30
+
31
+ #define ROL32(a, offset) ((((uint32_t)a) << (offset)) ^ (((uint32_t)a) >> (32-(offset))))
32
+
33
+ /* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
34
+ #define prepareToBitInterleaving(low, high, temp, temp0, temp1) \
35
+ temp0 = (low); \
36
+ temp = (temp0 ^ (temp0 >> 1)) & 0x22222222UL; temp0 = temp0 ^ temp ^ (temp << 1); \
37
+ temp = (temp0 ^ (temp0 >> 2)) & 0x0C0C0C0CUL; temp0 = temp0 ^ temp ^ (temp << 2); \
38
+ temp = (temp0 ^ (temp0 >> 4)) & 0x00F000F0UL; temp0 = temp0 ^ temp ^ (temp << 4); \
39
+ temp = (temp0 ^ (temp0 >> 8)) & 0x0000FF00UL; temp0 = temp0 ^ temp ^ (temp << 8); \
40
+ temp1 = (high); \
41
+ temp = (temp1 ^ (temp1 >> 1)) & 0x22222222UL; temp1 = temp1 ^ temp ^ (temp << 1); \
42
+ temp = (temp1 ^ (temp1 >> 2)) & 0x0C0C0C0CUL; temp1 = temp1 ^ temp ^ (temp << 2); \
43
+ temp = (temp1 ^ (temp1 >> 4)) & 0x00F000F0UL; temp1 = temp1 ^ temp ^ (temp << 4); \
44
+ temp = (temp1 ^ (temp1 >> 8)) & 0x0000FF00UL; temp1 = temp1 ^ temp ^ (temp << 8);
45
+
46
+ #define toBitInterleavingAndXOR(low, high, even, odd, temp, temp0, temp1) \
47
+ prepareToBitInterleaving(low, high, temp, temp0, temp1) \
48
+ even ^= (temp0 & 0x0000FFFF) | (temp1 << 16); \
49
+ odd ^= (temp0 >> 16) | (temp1 & 0xFFFF0000);
50
+
51
+ #define toBitInterleavingAndAND(low, high, even, odd, temp, temp0, temp1) \
52
+ prepareToBitInterleaving(low, high, temp, temp0, temp1) \
53
+ even &= (temp0 & 0x0000FFFF) | (temp1 << 16); \
54
+ odd &= (temp0 >> 16) | (temp1 & 0xFFFF0000);
55
+
56
+ #define toBitInterleavingAndSet(low, high, even, odd, temp, temp0, temp1) \
57
+ prepareToBitInterleaving(low, high, temp, temp0, temp1) \
58
+ even = (temp0 & 0x0000FFFF) | (temp1 << 16); \
59
+ odd = (temp0 >> 16) | (temp1 & 0xFFFF0000);
60
+
61
+ /* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
62
+ #define prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
63
+ temp0 = (even); \
64
+ temp1 = (odd); \
65
+ temp = (temp0 & 0x0000FFFF) | (temp1 << 16); \
66
+ temp1 = (temp0 >> 16) | (temp1 & 0xFFFF0000); \
67
+ temp0 = temp; \
68
+ temp = (temp0 ^ (temp0 >> 8)) & 0x0000FF00UL; temp0 = temp0 ^ temp ^ (temp << 8); \
69
+ temp = (temp0 ^ (temp0 >> 4)) & 0x00F000F0UL; temp0 = temp0 ^ temp ^ (temp << 4); \
70
+ temp = (temp0 ^ (temp0 >> 2)) & 0x0C0C0C0CUL; temp0 = temp0 ^ temp ^ (temp << 2); \
71
+ temp = (temp0 ^ (temp0 >> 1)) & 0x22222222UL; temp0 = temp0 ^ temp ^ (temp << 1); \
72
+ temp = (temp1 ^ (temp1 >> 8)) & 0x0000FF00UL; temp1 = temp1 ^ temp ^ (temp << 8); \
73
+ temp = (temp1 ^ (temp1 >> 4)) & 0x00F000F0UL; temp1 = temp1 ^ temp ^ (temp << 4); \
74
+ temp = (temp1 ^ (temp1 >> 2)) & 0x0C0C0C0CUL; temp1 = temp1 ^ temp ^ (temp << 2); \
75
+ temp = (temp1 ^ (temp1 >> 1)) & 0x22222222UL; temp1 = temp1 ^ temp ^ (temp << 1);
76
+
77
+ #define fromBitInterleaving(even, odd, low, high, temp, temp0, temp1) \
78
+ prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
79
+ low = temp0; \
80
+ high = temp1;
81
+
82
+ #define fromBitInterleavingAndXOR(even, odd, lowIn, highIn, lowOut, highOut, temp, temp0, temp1) \
83
+ prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
84
+ lowOut = lowIn ^ temp0; \
85
+ highOut = highIn ^ temp1;
86
+
87
+ void KeccakP1600_SetBytesInLaneToZero(void *state, unsigned int lanePosition, unsigned int offset, unsigned int length)
88
+ {
89
+ uint8_t laneAsBytes[8];
90
+ uint32_t low, high;
91
+ uint32_t temp, temp0, temp1;
92
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
93
+
94
+ memset(laneAsBytes, 0xFF, offset);
95
+ memset(laneAsBytes+offset, 0x00, length);
96
+ memset(laneAsBytes+offset+length, 0xFF, 8-offset-length);
97
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
98
+ low = *((uint32_t*)(laneAsBytes+0));
99
+ high = *((uint32_t*)(laneAsBytes+4));
100
+ #else
101
+ low = laneAsBytes[0]
102
+ | ((uint32_t)(laneAsBytes[1]) << 8)
103
+ | ((uint32_t)(laneAsBytes[2]) << 16)
104
+ | ((uint32_t)(laneAsBytes[3]) << 24);
105
+ high = laneAsBytes[4]
106
+ | ((uint32_t)(laneAsBytes[5]) << 8)
107
+ | ((uint32_t)(laneAsBytes[6]) << 16)
108
+ | ((uint32_t)(laneAsBytes[7]) << 24);
109
+ #endif
110
+ toBitInterleavingAndAND(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
111
+ }
112
+
113
+ /* ---------------------------------------------------------------- */
114
+
115
+ void KeccakP1600_Initialize(void *state)
116
+ {
117
+ memset(state, 0, 200);
118
+ }
119
+
120
+ /* ---------------------------------------------------------------- */
121
+
122
+ void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
123
+ {
124
+ unsigned int lanePosition = offset/8;
125
+ unsigned int offsetInLane = offset%8;
126
+ uint32_t low, high;
127
+ uint32_t temp, temp0, temp1;
128
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
129
+
130
+ if (offsetInLane < 4) {
131
+ low = (uint32_t)byte << (offsetInLane*8);
132
+ high = 0;
133
+ }
134
+ else {
135
+ low = 0;
136
+ high = (uint32_t)byte << ((offsetInLane-4)*8);
137
+ }
138
+ toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
139
+ }
140
+
141
+ /* ---------------------------------------------------------------- */
142
+
143
+ void KeccakP1600_AddBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
144
+ {
145
+ uint8_t laneAsBytes[8];
146
+ uint32_t low, high;
147
+ uint32_t temp, temp0, temp1;
148
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
149
+
150
+ memset(laneAsBytes, 0, 8);
151
+ memcpy(laneAsBytes+offset, data, length);
152
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
153
+ low = *((uint32_t*)(laneAsBytes+0));
154
+ high = *((uint32_t*)(laneAsBytes+4));
155
+ #else
156
+ low = laneAsBytes[0]
157
+ | ((uint32_t)(laneAsBytes[1]) << 8)
158
+ | ((uint32_t)(laneAsBytes[2]) << 16)
159
+ | ((uint32_t)(laneAsBytes[3]) << 24);
160
+ high = laneAsBytes[4]
161
+ | ((uint32_t)(laneAsBytes[5]) << 8)
162
+ | ((uint32_t)(laneAsBytes[6]) << 16)
163
+ | ((uint32_t)(laneAsBytes[7]) << 24);
164
+ #endif
165
+ toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
166
+ }
167
+
168
+ /* ---------------------------------------------------------------- */
169
+
170
+ void KeccakP1600_AddLanes(void *state, const unsigned char *data, unsigned int laneCount)
171
+ {
172
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
173
+ const uint32_t * pI = (const uint32_t *)data;
174
+ uint32_t * pS = (uint32_t*)state;
175
+ uint32_t t, x0, x1;
176
+ int i;
177
+ for (i = laneCount-1; i >= 0; --i) {
178
+ #ifdef NO_MISALIGNED_ACCESSES
179
+ uint32_t low;
180
+ uint32_t high;
181
+ memcpy(&low, pI++, 4);
182
+ memcpy(&high, pI++, 4);
183
+ toBitInterleavingAndXOR(low, high, *(pS++), *(pS++), t, x0, x1);
184
+ #else
185
+ toBitInterleavingAndXOR(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
186
+ #endif
187
+ }
188
+ #else
189
+ unsigned int lanePosition;
190
+ for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
191
+ uint8_t laneAsBytes[8];
192
+ memcpy(laneAsBytes, data+lanePosition*8, 8);
193
+ uint32_t low = laneAsBytes[0]
194
+ | ((uint32_t)(laneAsBytes[1]) << 8)
195
+ | ((uint32_t)(laneAsBytes[2]) << 16)
196
+ | ((uint32_t)(laneAsBytes[3]) << 24);
197
+ uint32_t high = laneAsBytes[4]
198
+ | ((uint32_t)(laneAsBytes[5]) << 8)
199
+ | ((uint32_t)(laneAsBytes[6]) << 16)
200
+ | ((uint32_t)(laneAsBytes[7]) << 24);
201
+ uint32_t even, odd, temp, temp0, temp1;
202
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
203
+ toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
204
+ }
205
+ #endif
206
+ }
207
+
208
+ /* ---------------------------------------------------------------- */
209
+
210
+ void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
211
+ {
212
+ SnP_AddBytes(state, data, offset, length, KeccakP1600_AddLanes, KeccakP1600_AddBytesInLane, 8);
213
+ }
214
+
215
+ /* ---------------------------------------------------------------- */
216
+
217
+ void KeccakP1600_OverwriteBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
218
+ {
219
+ KeccakP1600_SetBytesInLaneToZero(state, lanePosition, offset, length);
220
+ KeccakP1600_AddBytesInLane(state, lanePosition, data, offset, length);
221
+ }
222
+
223
+ /* ---------------------------------------------------------------- */
224
+
225
+ void KeccakP1600_OverwriteLanes(void *state, const unsigned char *data, unsigned int laneCount)
226
+ {
227
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
228
+ const uint32_t * pI = (const uint32_t *)data;
229
+ uint32_t * pS = (uint32_t *)state;
230
+ uint32_t t, x0, x1;
231
+ int i;
232
+ for (i = laneCount-1; i >= 0; --i) {
233
+ #ifdef NO_MISALIGNED_ACCESSES
234
+ uint32_t low;
235
+ uint32_t high;
236
+ memcpy(&low, pI++, 4);
237
+ memcpy(&high, pI++, 4);
238
+ toBitInterleavingAndSet(low, high, *(pS++), *(pS++), t, x0, x1);
239
+ #else
240
+ toBitInterleavingAndSet(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
241
+ #endif
242
+ }
243
+ #else
244
+ unsigned int lanePosition;
245
+ for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
246
+ uint8_t laneAsBytes[8];
247
+ memcpy(laneAsBytes, data+lanePosition*8, 8);
248
+ uint32_t low = laneAsBytes[0]
249
+ | ((uint32_t)(laneAsBytes[1]) << 8)
250
+ | ((uint32_t)(laneAsBytes[2]) << 16)
251
+ | ((uint32_t)(laneAsBytes[3]) << 24);
252
+ uint32_t high = laneAsBytes[4]
253
+ | ((uint32_t)(laneAsBytes[5]) << 8)
254
+ | ((uint32_t)(laneAsBytes[6]) << 16)
255
+ | ((uint32_t)(laneAsBytes[7]) << 24);
256
+ uint32_t even, odd, temp, temp0, temp1;
257
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
258
+ toBitInterleavingAndSet(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
259
+ }
260
+ #endif
261
+ }
262
+
263
+ /* ---------------------------------------------------------------- */
264
+
265
+ void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
266
+ {
267
+ SnP_OverwriteBytes(state, data, offset, length, KeccakP1600_OverwriteLanes, KeccakP1600_OverwriteBytesInLane, 8);
268
+ }
269
+
270
+ /* ---------------------------------------------------------------- */
271
+
272
+ void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
273
+ {
274
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
275
+ unsigned int i;
276
+
277
+ for(i=0; i<byteCount/8; i++) {
278
+ stateAsHalfLanes[i*2+0] = 0;
279
+ stateAsHalfLanes[i*2+1] = 0;
280
+ }
281
+ if (byteCount%8 != 0)
282
+ KeccakP1600_SetBytesInLaneToZero(state, byteCount/8, 0, byteCount%8);
283
+ }
284
+
285
+ /* ---------------------------------------------------------------- */
286
+
287
+ void KeccakP1600_ExtractBytesInLane(const void *state, unsigned int lanePosition, unsigned char *data, unsigned int offset, unsigned int length)
288
+ {
289
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
290
+ uint32_t low, high, temp, temp0, temp1;
291
+ uint8_t laneAsBytes[8];
292
+
293
+ fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
294
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
295
+ *((uint32_t*)(laneAsBytes+0)) = low;
296
+ *((uint32_t*)(laneAsBytes+4)) = high;
297
+ #else
298
+ laneAsBytes[0] = low & 0xFF;
299
+ laneAsBytes[1] = (low >> 8) & 0xFF;
300
+ laneAsBytes[2] = (low >> 16) & 0xFF;
301
+ laneAsBytes[3] = (low >> 24) & 0xFF;
302
+ laneAsBytes[4] = high & 0xFF;
303
+ laneAsBytes[5] = (high >> 8) & 0xFF;
304
+ laneAsBytes[6] = (high >> 16) & 0xFF;
305
+ laneAsBytes[7] = (high >> 24) & 0xFF;
306
+ #endif
307
+ memcpy(data, laneAsBytes+offset, length);
308
+ }
309
+
310
+ /* ---------------------------------------------------------------- */
311
+
312
+ void KeccakP1600_ExtractLanes(const void *state, unsigned char *data, unsigned int laneCount)
313
+ {
314
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
315
+ uint32_t * pI = (uint32_t *)data;
316
+ const uint32_t * pS = ( const uint32_t *)state;
317
+ uint32_t t, x0, x1;
318
+ int i;
319
+ for (i = laneCount-1; i >= 0; --i) {
320
+ #ifdef NO_MISALIGNED_ACCESSES
321
+ uint32_t low;
322
+ uint32_t high;
323
+ fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
324
+ memcpy(pI++, &low, 4);
325
+ memcpy(pI++, &high, 4);
326
+ #else
327
+ fromBitInterleaving(*(pS++), *(pS++), *(pI++), *(pI++), t, x0, x1)
328
+ #endif
329
+ }
330
+ #else
331
+ unsigned int lanePosition;
332
+ for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
333
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
334
+ uint32_t low, high, temp, temp0, temp1;
335
+ fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
336
+ uint8_t laneAsBytes[8];
337
+ laneAsBytes[0] = low & 0xFF;
338
+ laneAsBytes[1] = (low >> 8) & 0xFF;
339
+ laneAsBytes[2] = (low >> 16) & 0xFF;
340
+ laneAsBytes[3] = (low >> 24) & 0xFF;
341
+ laneAsBytes[4] = high & 0xFF;
342
+ laneAsBytes[5] = (high >> 8) & 0xFF;
343
+ laneAsBytes[6] = (high >> 16) & 0xFF;
344
+ laneAsBytes[7] = (high >> 24) & 0xFF;
345
+ memcpy(data+lanePosition*8, laneAsBytes, 8);
346
+ }
347
+ #endif
348
+ }
349
+
350
+ /* ---------------------------------------------------------------- */
351
+
352
+ void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
353
+ {
354
+ SnP_ExtractBytes(state, data, offset, length, KeccakP1600_ExtractLanes, KeccakP1600_ExtractBytesInLane, 8);
355
+ }
356
+
357
+ /* ---------------------------------------------------------------- */
358
+
359
+ void KeccakP1600_ExtractAndAddBytesInLane(const void *state, unsigned int lanePosition, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
360
+ {
361
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
362
+ uint32_t low, high, temp, temp0, temp1;
363
+ uint8_t laneAsBytes[8];
364
+ unsigned int i;
365
+
366
+ fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
367
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
368
+ *((uint32_t*)(laneAsBytes+0)) = low;
369
+ *((uint32_t*)(laneAsBytes+4)) = high;
370
+ #else
371
+ laneAsBytes[0] = low & 0xFF;
372
+ laneAsBytes[1] = (low >> 8) & 0xFF;
373
+ laneAsBytes[2] = (low >> 16) & 0xFF;
374
+ laneAsBytes[3] = (low >> 24) & 0xFF;
375
+ laneAsBytes[4] = high & 0xFF;
376
+ laneAsBytes[5] = (high >> 8) & 0xFF;
377
+ laneAsBytes[6] = (high >> 16) & 0xFF;
378
+ laneAsBytes[7] = (high >> 24) & 0xFF;
379
+ #endif
380
+ for(i=0; i<length; i++)
381
+ output[i] = input[i] ^ laneAsBytes[offset+i];
382
+ }
383
+
384
+ /* ---------------------------------------------------------------- */
385
+
386
+ void KeccakP1600_ExtractAndAddLanes(const void *state, const unsigned char *input, unsigned char *output, unsigned int laneCount)
387
+ {
388
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
389
+ const uint32_t * pI = (const uint32_t *)input;
390
+ uint32_t * pO = (uint32_t *)output;
391
+ const uint32_t * pS = (const uint32_t *)state;
392
+ uint32_t t, x0, x1;
393
+ int i;
394
+ for (i = laneCount-1; i >= 0; --i) {
395
+ #ifdef NO_MISALIGNED_ACCESSES
396
+ uint32_t low;
397
+ uint32_t high;
398
+ fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
399
+ *(pO++) = *(pI++) ^ low;
400
+ *(pO++) = *(pI++) ^ high;
401
+ #else
402
+ fromBitInterleavingAndXOR(*(pS++), *(pS++), *(pI++), *(pI++), *(pO++), *(pO++), t, x0, x1)
403
+ #endif
404
+ }
405
+ #else
406
+ unsigned int lanePosition;
407
+ for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
408
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
409
+ uint32_t low, high, temp, temp0, temp1;
410
+ fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
411
+ uint8_t laneAsBytes[8];
412
+ laneAsBytes[0] = low & 0xFF;
413
+ laneAsBytes[1] = (low >> 8) & 0xFF;
414
+ laneAsBytes[2] = (low >> 16) & 0xFF;
415
+ laneAsBytes[3] = (low >> 24) & 0xFF;
416
+ laneAsBytes[4] = high & 0xFF;
417
+ laneAsBytes[5] = (high >> 8) & 0xFF;
418
+ laneAsBytes[6] = (high >> 16) & 0xFF;
419
+ laneAsBytes[7] = (high >> 24) & 0xFF;
420
+ ((uint32_t*)(output+lanePosition*8))[0] = ((uint32_t*)(input+lanePosition*8))[0] ^ (*(const uint32_t*)(laneAsBytes+0));
421
+ ((uint32_t*)(output+lanePosition*8))[1] = ((uint32_t*)(input+lanePosition*8))[0] ^ (*(const uint32_t*)(laneAsBytes+4));
422
+ }
423
+ #endif
424
+ }
425
+ /* ---------------------------------------------------------------- */
426
+
427
+ void KeccakP1600_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
428
+ {
429
+ SnP_ExtractAndAddBytes(state, input, output, offset, length, KeccakP1600_ExtractAndAddLanes, KeccakP1600_ExtractAndAddBytesInLane, 8);
430
+ }
431
+
432
+ /* ---------------------------------------------------------------- */
433
+
434
+ static const uint32_t KeccakF1600RoundConstants_int2[2*24+1] =
435
+ {
436
+ 0x00000001UL, 0x00000000UL,
437
+ 0x00000000UL, 0x00000089UL,
438
+ 0x00000000UL, 0x8000008bUL,
439
+ 0x00000000UL, 0x80008080UL,
440
+ 0x00000001UL, 0x0000008bUL,
441
+ 0x00000001UL, 0x00008000UL,
442
+ 0x00000001UL, 0x80008088UL,
443
+ 0x00000001UL, 0x80000082UL,
444
+ 0x00000000UL, 0x0000000bUL,
445
+ 0x00000000UL, 0x0000000aUL,
446
+ 0x00000001UL, 0x00008082UL,
447
+ 0x00000000UL, 0x00008003UL,
448
+ 0x00000001UL, 0x0000808bUL,
449
+ 0x00000001UL, 0x8000000bUL,
450
+ 0x00000001UL, 0x8000008aUL,
451
+ 0x00000001UL, 0x80000081UL,
452
+ 0x00000000UL, 0x80000081UL,
453
+ 0x00000000UL, 0x80000008UL,
454
+ 0x00000000UL, 0x00000083UL,
455
+ 0x00000000UL, 0x80008003UL,
456
+ 0x00000001UL, 0x80008088UL,
457
+ 0x00000000UL, 0x80000088UL,
458
+ 0x00000001UL, 0x00008000UL,
459
+ 0x00000000UL, 0x80008082UL,
460
+ 0x000000FFUL
461
+ };
462
+
463
+ #define KeccakRound0() \
464
+ Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
465
+ Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
466
+ Da0 = Cx^ROL32(Du1, 1); \
467
+ Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
468
+ Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
469
+ Da1 = Cz^Du0; \
470
+ Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
471
+ Do0 = Cw^ROL32(Cz, 1); \
472
+ Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
473
+ Do1 = Cy^Cx; \
474
+ Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
475
+ De0 = Cx^ROL32(Cy, 1); \
476
+ Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
477
+ De1 = Cz^Cw; \
478
+ Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
479
+ Di0 = Du0^ROL32(Cy, 1); \
480
+ Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
481
+ Di1 = Du1^Cw; \
482
+ Du0 = Cw^ROL32(Cz, 1); \
483
+ Du1 = Cy^Cx; \
484
+ \
485
+ Ba = (Aba0^Da0); \
486
+ Be = ROL32((Age0^De0), 22); \
487
+ Bi = ROL32((Aki1^Di1), 22); \
488
+ Bo = ROL32((Amo1^Do1), 11); \
489
+ Bu = ROL32((Asu0^Du0), 7); \
490
+ Aba0 = Ba ^((~Be)& Bi ); \
491
+ Aba0 ^= *(pRoundConstants++); \
492
+ Age0 = Be ^((~Bi)& Bo ); \
493
+ Aki1 = Bi ^((~Bo)& Bu ); \
494
+ Amo1 = Bo ^((~Bu)& Ba ); \
495
+ Asu0 = Bu ^((~Ba)& Be ); \
496
+ Ba = (Aba1^Da1); \
497
+ Be = ROL32((Age1^De1), 22); \
498
+ Bi = ROL32((Aki0^Di0), 21); \
499
+ Bo = ROL32((Amo0^Do0), 10); \
500
+ Bu = ROL32((Asu1^Du1), 7); \
501
+ Aba1 = Ba ^((~Be)& Bi ); \
502
+ Aba1 ^= *(pRoundConstants++); \
503
+ Age1 = Be ^((~Bi)& Bo ); \
504
+ Aki0 = Bi ^((~Bo)& Bu ); \
505
+ Amo0 = Bo ^((~Bu)& Ba ); \
506
+ Asu1 = Bu ^((~Ba)& Be ); \
507
+ Bi = ROL32((Aka1^Da1), 2); \
508
+ Bo = ROL32((Ame1^De1), 23); \
509
+ Bu = ROL32((Asi1^Di1), 31); \
510
+ Ba = ROL32((Abo0^Do0), 14); \
511
+ Be = ROL32((Agu0^Du0), 10); \
512
+ Aka1 = Ba ^((~Be)& Bi ); \
513
+ Ame1 = Be ^((~Bi)& Bo ); \
514
+ Asi1 = Bi ^((~Bo)& Bu ); \
515
+ Abo0 = Bo ^((~Bu)& Ba ); \
516
+ Agu0 = Bu ^((~Ba)& Be ); \
517
+ Bi = ROL32((Aka0^Da0), 1); \
518
+ Bo = ROL32((Ame0^De0), 22); \
519
+ Bu = ROL32((Asi0^Di0), 30); \
520
+ Ba = ROL32((Abo1^Do1), 14); \
521
+ Be = ROL32((Agu1^Du1), 10); \
522
+ Aka0 = Ba ^((~Be)& Bi ); \
523
+ Ame0 = Be ^((~Bi)& Bo ); \
524
+ Asi0 = Bi ^((~Bo)& Bu ); \
525
+ Abo1 = Bo ^((~Bu)& Ba ); \
526
+ Agu1 = Bu ^((~Ba)& Be ); \
527
+ Bu = ROL32((Asa0^Da0), 9); \
528
+ Ba = ROL32((Abe1^De1), 1); \
529
+ Be = ROL32((Agi0^Di0), 3); \
530
+ Bi = ROL32((Ako1^Do1), 13); \
531
+ Bo = ROL32((Amu0^Du0), 4); \
532
+ Asa0 = Ba ^((~Be)& Bi ); \
533
+ Abe1 = Be ^((~Bi)& Bo ); \
534
+ Agi0 = Bi ^((~Bo)& Bu ); \
535
+ Ako1 = Bo ^((~Bu)& Ba ); \
536
+ Amu0 = Bu ^((~Ba)& Be ); \
537
+ Bu = ROL32((Asa1^Da1), 9); \
538
+ Ba = (Abe0^De0); \
539
+ Be = ROL32((Agi1^Di1), 3); \
540
+ Bi = ROL32((Ako0^Do0), 12); \
541
+ Bo = ROL32((Amu1^Du1), 4); \
542
+ Asa1 = Ba ^((~Be)& Bi ); \
543
+ Abe0 = Be ^((~Bi)& Bo ); \
544
+ Agi1 = Bi ^((~Bo)& Bu ); \
545
+ Ako0 = Bo ^((~Bu)& Ba ); \
546
+ Amu1 = Bu ^((~Ba)& Be ); \
547
+ Be = ROL32((Aga0^Da0), 18); \
548
+ Bi = ROL32((Ake0^De0), 5); \
549
+ Bo = ROL32((Ami1^Di1), 8); \
550
+ Bu = ROL32((Aso0^Do0), 28); \
551
+ Ba = ROL32((Abu1^Du1), 14); \
552
+ Aga0 = Ba ^((~Be)& Bi ); \
553
+ Ake0 = Be ^((~Bi)& Bo ); \
554
+ Ami1 = Bi ^((~Bo)& Bu ); \
555
+ Aso0 = Bo ^((~Bu)& Ba ); \
556
+ Abu1 = Bu ^((~Ba)& Be ); \
557
+ Be = ROL32((Aga1^Da1), 18); \
558
+ Bi = ROL32((Ake1^De1), 5); \
559
+ Bo = ROL32((Ami0^Di0), 7); \
560
+ Bu = ROL32((Aso1^Do1), 28); \
561
+ Ba = ROL32((Abu0^Du0), 13); \
562
+ Aga1 = Ba ^((~Be)& Bi ); \
563
+ Ake1 = Be ^((~Bi)& Bo ); \
564
+ Ami0 = Bi ^((~Bo)& Bu ); \
565
+ Aso1 = Bo ^((~Bu)& Ba ); \
566
+ Abu0 = Bu ^((~Ba)& Be ); \
567
+ Bo = ROL32((Ama1^Da1), 21); \
568
+ Bu = ROL32((Ase0^De0), 1); \
569
+ Ba = ROL32((Abi0^Di0), 31); \
570
+ Be = ROL32((Ago1^Do1), 28); \
571
+ Bi = ROL32((Aku1^Du1), 20); \
572
+ Ama1 = Ba ^((~Be)& Bi ); \
573
+ Ase0 = Be ^((~Bi)& Bo ); \
574
+ Abi0 = Bi ^((~Bo)& Bu ); \
575
+ Ago1 = Bo ^((~Bu)& Ba ); \
576
+ Aku1 = Bu ^((~Ba)& Be ); \
577
+ Bo = ROL32((Ama0^Da0), 20); \
578
+ Bu = ROL32((Ase1^De1), 1); \
579
+ Ba = ROL32((Abi1^Di1), 31); \
580
+ Be = ROL32((Ago0^Do0), 27); \
581
+ Bi = ROL32((Aku0^Du0), 19); \
582
+ Ama0 = Ba ^((~Be)& Bi ); \
583
+ Ase1 = Be ^((~Bi)& Bo ); \
584
+ Abi1 = Bi ^((~Bo)& Bu ); \
585
+ Ago0 = Bo ^((~Bu)& Ba ); \
586
+ Aku0 = Bu ^((~Ba)& Be )
587
+
588
+ #define KeccakRound1() \
589
+ Cx = Asu0^Agu0^Amu0^Abu1^Aku1; \
590
+ Du1 = Age1^Ame0^Abe0^Ake1^Ase1; \
591
+ Da0 = Cx^ROL32(Du1, 1); \
592
+ Cz = Asu1^Agu1^Amu1^Abu0^Aku0; \
593
+ Du0 = Age0^Ame1^Abe1^Ake0^Ase0; \
594
+ Da1 = Cz^Du0; \
595
+ Cw = Aki1^Asi1^Agi0^Ami1^Abi0; \
596
+ Do0 = Cw^ROL32(Cz, 1); \
597
+ Cy = Aki0^Asi0^Agi1^Ami0^Abi1; \
598
+ Do1 = Cy^Cx; \
599
+ Cx = Aba0^Aka1^Asa0^Aga0^Ama1; \
600
+ De0 = Cx^ROL32(Cy, 1); \
601
+ Cz = Aba1^Aka0^Asa1^Aga1^Ama0; \
602
+ De1 = Cz^Cw; \
603
+ Cy = Amo0^Abo1^Ako0^Aso1^Ago0; \
604
+ Di0 = Du0^ROL32(Cy, 1); \
605
+ Cw = Amo1^Abo0^Ako1^Aso0^Ago1; \
606
+ Di1 = Du1^Cw; \
607
+ Du0 = Cw^ROL32(Cz, 1); \
608
+ Du1 = Cy^Cx; \
609
+ \
610
+ Ba = (Aba0^Da0); \
611
+ Be = ROL32((Ame1^De0), 22); \
612
+ Bi = ROL32((Agi1^Di1), 22); \
613
+ Bo = ROL32((Aso1^Do1), 11); \
614
+ Bu = ROL32((Aku1^Du0), 7); \
615
+ Aba0 = Ba ^((~Be)& Bi ); \
616
+ Aba0 ^= *(pRoundConstants++); \
617
+ Ame1 = Be ^((~Bi)& Bo ); \
618
+ Agi1 = Bi ^((~Bo)& Bu ); \
619
+ Aso1 = Bo ^((~Bu)& Ba ); \
620
+ Aku1 = Bu ^((~Ba)& Be ); \
621
+ Ba = (Aba1^Da1); \
622
+ Be = ROL32((Ame0^De1), 22); \
623
+ Bi = ROL32((Agi0^Di0), 21); \
624
+ Bo = ROL32((Aso0^Do0), 10); \
625
+ Bu = ROL32((Aku0^Du1), 7); \
626
+ Aba1 = Ba ^((~Be)& Bi ); \
627
+ Aba1 ^= *(pRoundConstants++); \
628
+ Ame0 = Be ^((~Bi)& Bo ); \
629
+ Agi0 = Bi ^((~Bo)& Bu ); \
630
+ Aso0 = Bo ^((~Bu)& Ba ); \
631
+ Aku0 = Bu ^((~Ba)& Be ); \
632
+ Bi = ROL32((Asa1^Da1), 2); \
633
+ Bo = ROL32((Ake1^De1), 23); \
634
+ Bu = ROL32((Abi1^Di1), 31); \
635
+ Ba = ROL32((Amo1^Do0), 14); \
636
+ Be = ROL32((Agu0^Du0), 10); \
637
+ Asa1 = Ba ^((~Be)& Bi ); \
638
+ Ake1 = Be ^((~Bi)& Bo ); \
639
+ Abi1 = Bi ^((~Bo)& Bu ); \
640
+ Amo1 = Bo ^((~Bu)& Ba ); \
641
+ Agu0 = Bu ^((~Ba)& Be ); \
642
+ Bi = ROL32((Asa0^Da0), 1); \
643
+ Bo = ROL32((Ake0^De0), 22); \
644
+ Bu = ROL32((Abi0^Di0), 30); \
645
+ Ba = ROL32((Amo0^Do1), 14); \
646
+ Be = ROL32((Agu1^Du1), 10); \
647
+ Asa0 = Ba ^((~Be)& Bi ); \
648
+ Ake0 = Be ^((~Bi)& Bo ); \
649
+ Abi0 = Bi ^((~Bo)& Bu ); \
650
+ Amo0 = Bo ^((~Bu)& Ba ); \
651
+ Agu1 = Bu ^((~Ba)& Be ); \
652
+ Bu = ROL32((Ama1^Da0), 9); \
653
+ Ba = ROL32((Age1^De1), 1); \
654
+ Be = ROL32((Asi1^Di0), 3); \
655
+ Bi = ROL32((Ako0^Do1), 13); \
656
+ Bo = ROL32((Abu1^Du0), 4); \
657
+ Ama1 = Ba ^((~Be)& Bi ); \
658
+ Age1 = Be ^((~Bi)& Bo ); \
659
+ Asi1 = Bi ^((~Bo)& Bu ); \
660
+ Ako0 = Bo ^((~Bu)& Ba ); \
661
+ Abu1 = Bu ^((~Ba)& Be ); \
662
+ Bu = ROL32((Ama0^Da1), 9); \
663
+ Ba = (Age0^De0); \
664
+ Be = ROL32((Asi0^Di1), 3); \
665
+ Bi = ROL32((Ako1^Do0), 12); \
666
+ Bo = ROL32((Abu0^Du1), 4); \
667
+ Ama0 = Ba ^((~Be)& Bi ); \
668
+ Age0 = Be ^((~Bi)& Bo ); \
669
+ Asi0 = Bi ^((~Bo)& Bu ); \
670
+ Ako1 = Bo ^((~Bu)& Ba ); \
671
+ Abu0 = Bu ^((~Ba)& Be ); \
672
+ Be = ROL32((Aka1^Da0), 18); \
673
+ Bi = ROL32((Abe1^De0), 5); \
674
+ Bo = ROL32((Ami0^Di1), 8); \
675
+ Bu = ROL32((Ago1^Do0), 28); \
676
+ Ba = ROL32((Asu1^Du1), 14); \
677
+ Aka1 = Ba ^((~Be)& Bi ); \
678
+ Abe1 = Be ^((~Bi)& Bo ); \
679
+ Ami0 = Bi ^((~Bo)& Bu ); \
680
+ Ago1 = Bo ^((~Bu)& Ba ); \
681
+ Asu1 = Bu ^((~Ba)& Be ); \
682
+ Be = ROL32((Aka0^Da1), 18); \
683
+ Bi = ROL32((Abe0^De1), 5); \
684
+ Bo = ROL32((Ami1^Di0), 7); \
685
+ Bu = ROL32((Ago0^Do1), 28); \
686
+ Ba = ROL32((Asu0^Du0), 13); \
687
+ Aka0 = Ba ^((~Be)& Bi ); \
688
+ Abe0 = Be ^((~Bi)& Bo ); \
689
+ Ami1 = Bi ^((~Bo)& Bu ); \
690
+ Ago0 = Bo ^((~Bu)& Ba ); \
691
+ Asu0 = Bu ^((~Ba)& Be ); \
692
+ Bo = ROL32((Aga1^Da1), 21); \
693
+ Bu = ROL32((Ase0^De0), 1); \
694
+ Ba = ROL32((Aki1^Di0), 31); \
695
+ Be = ROL32((Abo1^Do1), 28); \
696
+ Bi = ROL32((Amu1^Du1), 20); \
697
+ Aga1 = Ba ^((~Be)& Bi ); \
698
+ Ase0 = Be ^((~Bi)& Bo ); \
699
+ Aki1 = Bi ^((~Bo)& Bu ); \
700
+ Abo1 = Bo ^((~Bu)& Ba ); \
701
+ Amu1 = Bu ^((~Ba)& Be ); \
702
+ Bo = ROL32((Aga0^Da0), 20); \
703
+ Bu = ROL32((Ase1^De1), 1); \
704
+ Ba = ROL32((Aki0^Di1), 31); \
705
+ Be = ROL32((Abo0^Do0), 27); \
706
+ Bi = ROL32((Amu0^Du0), 19); \
707
+ Aga0 = Ba ^((~Be)& Bi ); \
708
+ Ase1 = Be ^((~Bi)& Bo ); \
709
+ Aki0 = Bi ^((~Bo)& Bu ); \
710
+ Abo0 = Bo ^((~Bu)& Ba ); \
711
+ Amu0 = Bu ^((~Ba)& Be );
712
+
713
+ #define KeccakRound2() \
714
+ Cx = Aku1^Agu0^Abu1^Asu1^Amu1; \
715
+ Du1 = Ame0^Ake0^Age0^Abe0^Ase1; \
716
+ Da0 = Cx^ROL32(Du1, 1); \
717
+ Cz = Aku0^Agu1^Abu0^Asu0^Amu0; \
718
+ Du0 = Ame1^Ake1^Age1^Abe1^Ase0; \
719
+ Da1 = Cz^Du0; \
720
+ Cw = Agi1^Abi1^Asi1^Ami0^Aki1; \
721
+ Do0 = Cw^ROL32(Cz, 1); \
722
+ Cy = Agi0^Abi0^Asi0^Ami1^Aki0; \
723
+ Do1 = Cy^Cx; \
724
+ Cx = Aba0^Asa1^Ama1^Aka1^Aga1; \
725
+ De0 = Cx^ROL32(Cy, 1); \
726
+ Cz = Aba1^Asa0^Ama0^Aka0^Aga0; \
727
+ De1 = Cz^Cw; \
728
+ Cy = Aso0^Amo0^Ako1^Ago0^Abo0; \
729
+ Di0 = Du0^ROL32(Cy, 1); \
730
+ Cw = Aso1^Amo1^Ako0^Ago1^Abo1; \
731
+ Di1 = Du1^Cw; \
732
+ Du0 = Cw^ROL32(Cz, 1); \
733
+ Du1 = Cy^Cx; \
734
+ \
735
+ Ba = (Aba0^Da0); \
736
+ Be = ROL32((Ake1^De0), 22); \
737
+ Bi = ROL32((Asi0^Di1), 22); \
738
+ Bo = ROL32((Ago0^Do1), 11); \
739
+ Bu = ROL32((Amu1^Du0), 7); \
740
+ Aba0 = Ba ^((~Be)& Bi ); \
741
+ Aba0 ^= *(pRoundConstants++); \
742
+ Ake1 = Be ^((~Bi)& Bo ); \
743
+ Asi0 = Bi ^((~Bo)& Bu ); \
744
+ Ago0 = Bo ^((~Bu)& Ba ); \
745
+ Amu1 = Bu ^((~Ba)& Be ); \
746
+ Ba = (Aba1^Da1); \
747
+ Be = ROL32((Ake0^De1), 22); \
748
+ Bi = ROL32((Asi1^Di0), 21); \
749
+ Bo = ROL32((Ago1^Do0), 10); \
750
+ Bu = ROL32((Amu0^Du1), 7); \
751
+ Aba1 = Ba ^((~Be)& Bi ); \
752
+ Aba1 ^= *(pRoundConstants++); \
753
+ Ake0 = Be ^((~Bi)& Bo ); \
754
+ Asi1 = Bi ^((~Bo)& Bu ); \
755
+ Ago1 = Bo ^((~Bu)& Ba ); \
756
+ Amu0 = Bu ^((~Ba)& Be ); \
757
+ Bi = ROL32((Ama0^Da1), 2); \
758
+ Bo = ROL32((Abe0^De1), 23); \
759
+ Bu = ROL32((Aki0^Di1), 31); \
760
+ Ba = ROL32((Aso1^Do0), 14); \
761
+ Be = ROL32((Agu0^Du0), 10); \
762
+ Ama0 = Ba ^((~Be)& Bi ); \
763
+ Abe0 = Be ^((~Bi)& Bo ); \
764
+ Aki0 = Bi ^((~Bo)& Bu ); \
765
+ Aso1 = Bo ^((~Bu)& Ba ); \
766
+ Agu0 = Bu ^((~Ba)& Be ); \
767
+ Bi = ROL32((Ama1^Da0), 1); \
768
+ Bo = ROL32((Abe1^De0), 22); \
769
+ Bu = ROL32((Aki1^Di0), 30); \
770
+ Ba = ROL32((Aso0^Do1), 14); \
771
+ Be = ROL32((Agu1^Du1), 10); \
772
+ Ama1 = Ba ^((~Be)& Bi ); \
773
+ Abe1 = Be ^((~Bi)& Bo ); \
774
+ Aki1 = Bi ^((~Bo)& Bu ); \
775
+ Aso0 = Bo ^((~Bu)& Ba ); \
776
+ Agu1 = Bu ^((~Ba)& Be ); \
777
+ Bu = ROL32((Aga1^Da0), 9); \
778
+ Ba = ROL32((Ame0^De1), 1); \
779
+ Be = ROL32((Abi1^Di0), 3); \
780
+ Bi = ROL32((Ako1^Do1), 13); \
781
+ Bo = ROL32((Asu1^Du0), 4); \
782
+ Aga1 = Ba ^((~Be)& Bi ); \
783
+ Ame0 = Be ^((~Bi)& Bo ); \
784
+ Abi1 = Bi ^((~Bo)& Bu ); \
785
+ Ako1 = Bo ^((~Bu)& Ba ); \
786
+ Asu1 = Bu ^((~Ba)& Be ); \
787
+ Bu = ROL32((Aga0^Da1), 9); \
788
+ Ba = (Ame1^De0); \
789
+ Be = ROL32((Abi0^Di1), 3); \
790
+ Bi = ROL32((Ako0^Do0), 12); \
791
+ Bo = ROL32((Asu0^Du1), 4); \
792
+ Aga0 = Ba ^((~Be)& Bi ); \
793
+ Ame1 = Be ^((~Bi)& Bo ); \
794
+ Abi0 = Bi ^((~Bo)& Bu ); \
795
+ Ako0 = Bo ^((~Bu)& Ba ); \
796
+ Asu0 = Bu ^((~Ba)& Be ); \
797
+ Be = ROL32((Asa1^Da0), 18); \
798
+ Bi = ROL32((Age1^De0), 5); \
799
+ Bo = ROL32((Ami1^Di1), 8); \
800
+ Bu = ROL32((Abo1^Do0), 28); \
801
+ Ba = ROL32((Aku0^Du1), 14); \
802
+ Asa1 = Ba ^((~Be)& Bi ); \
803
+ Age1 = Be ^((~Bi)& Bo ); \
804
+ Ami1 = Bi ^((~Bo)& Bu ); \
805
+ Abo1 = Bo ^((~Bu)& Ba ); \
806
+ Aku0 = Bu ^((~Ba)& Be ); \
807
+ Be = ROL32((Asa0^Da1), 18); \
808
+ Bi = ROL32((Age0^De1), 5); \
809
+ Bo = ROL32((Ami0^Di0), 7); \
810
+ Bu = ROL32((Abo0^Do1), 28); \
811
+ Ba = ROL32((Aku1^Du0), 13); \
812
+ Asa0 = Ba ^((~Be)& Bi ); \
813
+ Age0 = Be ^((~Bi)& Bo ); \
814
+ Ami0 = Bi ^((~Bo)& Bu ); \
815
+ Abo0 = Bo ^((~Bu)& Ba ); \
816
+ Aku1 = Bu ^((~Ba)& Be ); \
817
+ Bo = ROL32((Aka0^Da1), 21); \
818
+ Bu = ROL32((Ase0^De0), 1); \
819
+ Ba = ROL32((Agi1^Di0), 31); \
820
+ Be = ROL32((Amo0^Do1), 28); \
821
+ Bi = ROL32((Abu0^Du1), 20); \
822
+ Aka0 = Ba ^((~Be)& Bi ); \
823
+ Ase0 = Be ^((~Bi)& Bo ); \
824
+ Agi1 = Bi ^((~Bo)& Bu ); \
825
+ Amo0 = Bo ^((~Bu)& Ba ); \
826
+ Abu0 = Bu ^((~Ba)& Be ); \
827
+ Bo = ROL32((Aka1^Da0), 20); \
828
+ Bu = ROL32((Ase1^De1), 1); \
829
+ Ba = ROL32((Agi0^Di1), 31); \
830
+ Be = ROL32((Amo1^Do0), 27); \
831
+ Bi = ROL32((Abu1^Du0), 19); \
832
+ Aka1 = Ba ^((~Be)& Bi ); \
833
+ Ase1 = Be ^((~Bi)& Bo ); \
834
+ Agi0 = Bi ^((~Bo)& Bu ); \
835
+ Amo1 = Bo ^((~Bu)& Ba ); \
836
+ Abu1 = Bu ^((~Ba)& Be );
837
+
838
+ #define KeccakRound3() \
839
+ Cx = Amu1^Agu0^Asu1^Aku0^Abu0; \
840
+ Du1 = Ake0^Abe1^Ame1^Age0^Ase1; \
841
+ Da0 = Cx^ROL32(Du1, 1); \
842
+ Cz = Amu0^Agu1^Asu0^Aku1^Abu1; \
843
+ Du0 = Ake1^Abe0^Ame0^Age1^Ase0; \
844
+ Da1 = Cz^Du0; \
845
+ Cw = Asi0^Aki0^Abi1^Ami1^Agi1; \
846
+ Do0 = Cw^ROL32(Cz, 1); \
847
+ Cy = Asi1^Aki1^Abi0^Ami0^Agi0; \
848
+ Do1 = Cy^Cx; \
849
+ Cx = Aba0^Ama0^Aga1^Asa1^Aka0; \
850
+ De0 = Cx^ROL32(Cy, 1); \
851
+ Cz = Aba1^Ama1^Aga0^Asa0^Aka1; \
852
+ De1 = Cz^Cw; \
853
+ Cy = Ago1^Aso0^Ako0^Abo0^Amo1; \
854
+ Di0 = Du0^ROL32(Cy, 1); \
855
+ Cw = Ago0^Aso1^Ako1^Abo1^Amo0; \
856
+ Di1 = Du1^Cw; \
857
+ Du0 = Cw^ROL32(Cz, 1); \
858
+ Du1 = Cy^Cx; \
859
+ \
860
+ Ba = (Aba0^Da0); \
861
+ Be = ROL32((Abe0^De0), 22); \
862
+ Bi = ROL32((Abi0^Di1), 22); \
863
+ Bo = ROL32((Abo0^Do1), 11); \
864
+ Bu = ROL32((Abu0^Du0), 7); \
865
+ Aba0 = Ba ^((~Be)& Bi ); \
866
+ Aba0 ^= *(pRoundConstants++); \
867
+ Abe0 = Be ^((~Bi)& Bo ); \
868
+ Abi0 = Bi ^((~Bo)& Bu ); \
869
+ Abo0 = Bo ^((~Bu)& Ba ); \
870
+ Abu0 = Bu ^((~Ba)& Be ); \
871
+ Ba = (Aba1^Da1); \
872
+ Be = ROL32((Abe1^De1), 22); \
873
+ Bi = ROL32((Abi1^Di0), 21); \
874
+ Bo = ROL32((Abo1^Do0), 10); \
875
+ Bu = ROL32((Abu1^Du1), 7); \
876
+ Aba1 = Ba ^((~Be)& Bi ); \
877
+ Aba1 ^= *(pRoundConstants++); \
878
+ Abe1 = Be ^((~Bi)& Bo ); \
879
+ Abi1 = Bi ^((~Bo)& Bu ); \
880
+ Abo1 = Bo ^((~Bu)& Ba ); \
881
+ Abu1 = Bu ^((~Ba)& Be ); \
882
+ Bi = ROL32((Aga0^Da1), 2); \
883
+ Bo = ROL32((Age0^De1), 23); \
884
+ Bu = ROL32((Agi0^Di1), 31); \
885
+ Ba = ROL32((Ago0^Do0), 14); \
886
+ Be = ROL32((Agu0^Du0), 10); \
887
+ Aga0 = Ba ^((~Be)& Bi ); \
888
+ Age0 = Be ^((~Bi)& Bo ); \
889
+ Agi0 = Bi ^((~Bo)& Bu ); \
890
+ Ago0 = Bo ^((~Bu)& Ba ); \
891
+ Agu0 = Bu ^((~Ba)& Be ); \
892
+ Bi = ROL32((Aga1^Da0), 1); \
893
+ Bo = ROL32((Age1^De0), 22); \
894
+ Bu = ROL32((Agi1^Di0), 30); \
895
+ Ba = ROL32((Ago1^Do1), 14); \
896
+ Be = ROL32((Agu1^Du1), 10); \
897
+ Aga1 = Ba ^((~Be)& Bi ); \
898
+ Age1 = Be ^((~Bi)& Bo ); \
899
+ Agi1 = Bi ^((~Bo)& Bu ); \
900
+ Ago1 = Bo ^((~Bu)& Ba ); \
901
+ Agu1 = Bu ^((~Ba)& Be ); \
902
+ Bu = ROL32((Aka0^Da0), 9); \
903
+ Ba = ROL32((Ake0^De1), 1); \
904
+ Be = ROL32((Aki0^Di0), 3); \
905
+ Bi = ROL32((Ako0^Do1), 13); \
906
+ Bo = ROL32((Aku0^Du0), 4); \
907
+ Aka0 = Ba ^((~Be)& Bi ); \
908
+ Ake0 = Be ^((~Bi)& Bo ); \
909
+ Aki0 = Bi ^((~Bo)& Bu ); \
910
+ Ako0 = Bo ^((~Bu)& Ba ); \
911
+ Aku0 = Bu ^((~Ba)& Be ); \
912
+ Bu = ROL32((Aka1^Da1), 9); \
913
+ Ba = (Ake1^De0); \
914
+ Be = ROL32((Aki1^Di1), 3); \
915
+ Bi = ROL32((Ako1^Do0), 12); \
916
+ Bo = ROL32((Aku1^Du1), 4); \
917
+ Aka1 = Ba ^((~Be)& Bi ); \
918
+ Ake1 = Be ^((~Bi)& Bo ); \
919
+ Aki1 = Bi ^((~Bo)& Bu ); \
920
+ Ako1 = Bo ^((~Bu)& Ba ); \
921
+ Aku1 = Bu ^((~Ba)& Be ); \
922
+ Be = ROL32((Ama0^Da0), 18); \
923
+ Bi = ROL32((Ame0^De0), 5); \
924
+ Bo = ROL32((Ami0^Di1), 8); \
925
+ Bu = ROL32((Amo0^Do0), 28); \
926
+ Ba = ROL32((Amu0^Du1), 14); \
927
+ Ama0 = Ba ^((~Be)& Bi ); \
928
+ Ame0 = Be ^((~Bi)& Bo ); \
929
+ Ami0 = Bi ^((~Bo)& Bu ); \
930
+ Amo0 = Bo ^((~Bu)& Ba ); \
931
+ Amu0 = Bu ^((~Ba)& Be ); \
932
+ Be = ROL32((Ama1^Da1), 18); \
933
+ Bi = ROL32((Ame1^De1), 5); \
934
+ Bo = ROL32((Ami1^Di0), 7); \
935
+ Bu = ROL32((Amo1^Do1), 28); \
936
+ Ba = ROL32((Amu1^Du0), 13); \
937
+ Ama1 = Ba ^((~Be)& Bi ); \
938
+ Ame1 = Be ^((~Bi)& Bo ); \
939
+ Ami1 = Bi ^((~Bo)& Bu ); \
940
+ Amo1 = Bo ^((~Bu)& Ba ); \
941
+ Amu1 = Bu ^((~Ba)& Be ); \
942
+ Bo = ROL32((Asa0^Da1), 21); \
943
+ Bu = ROL32((Ase0^De0), 1); \
944
+ Ba = ROL32((Asi0^Di0), 31); \
945
+ Be = ROL32((Aso0^Do1), 28); \
946
+ Bi = ROL32((Asu0^Du1), 20); \
947
+ Asa0 = Ba ^((~Be)& Bi ); \
948
+ Ase0 = Be ^((~Bi)& Bo ); \
949
+ Asi0 = Bi ^((~Bo)& Bu ); \
950
+ Aso0 = Bo ^((~Bu)& Ba ); \
951
+ Asu0 = Bu ^((~Ba)& Be ); \
952
+ Bo = ROL32((Asa1^Da0), 20); \
953
+ Bu = ROL32((Ase1^De1), 1); \
954
+ Ba = ROL32((Asi1^Di1), 31); \
955
+ Be = ROL32((Aso1^Do0), 27); \
956
+ Bi = ROL32((Asu1^Du0), 19); \
957
+ Asa1 = Ba ^((~Be)& Bi ); \
958
+ Ase1 = Be ^((~Bi)& Bo ); \
959
+ Asi1 = Bi ^((~Bo)& Bu ); \
960
+ Aso1 = Bo ^((~Bu)& Ba ); \
961
+ Asu1 = Bu ^((~Ba)& Be );
962
+
963
+ void KeccakP1600_Permute_Nrounds(void *state, unsigned int nRounds)
964
+ {
965
+ uint32_t Da0, De0, Di0, Do0, Du0;
966
+ uint32_t Da1, De1, Di1, Do1, Du1;
967
+ uint32_t Ba, Be, Bi, Bo, Bu;
968
+ uint32_t Cx, Cy, Cz, Cw;
969
+ const uint32_t *pRoundConstants = KeccakF1600RoundConstants_int2+(24-nRounds)*2;
970
+ uint32_t *stateAsHalfLanes = (uint32_t*)state;
971
+ #define Aba0 stateAsHalfLanes[ 0]
972
+ #define Aba1 stateAsHalfLanes[ 1]
973
+ #define Abe0 stateAsHalfLanes[ 2]
974
+ #define Abe1 stateAsHalfLanes[ 3]
975
+ #define Abi0 stateAsHalfLanes[ 4]
976
+ #define Abi1 stateAsHalfLanes[ 5]
977
+ #define Abo0 stateAsHalfLanes[ 6]
978
+ #define Abo1 stateAsHalfLanes[ 7]
979
+ #define Abu0 stateAsHalfLanes[ 8]
980
+ #define Abu1 stateAsHalfLanes[ 9]
981
+ #define Aga0 stateAsHalfLanes[10]
982
+ #define Aga1 stateAsHalfLanes[11]
983
+ #define Age0 stateAsHalfLanes[12]
984
+ #define Age1 stateAsHalfLanes[13]
985
+ #define Agi0 stateAsHalfLanes[14]
986
+ #define Agi1 stateAsHalfLanes[15]
987
+ #define Ago0 stateAsHalfLanes[16]
988
+ #define Ago1 stateAsHalfLanes[17]
989
+ #define Agu0 stateAsHalfLanes[18]
990
+ #define Agu1 stateAsHalfLanes[19]
991
+ #define Aka0 stateAsHalfLanes[20]
992
+ #define Aka1 stateAsHalfLanes[21]
993
+ #define Ake0 stateAsHalfLanes[22]
994
+ #define Ake1 stateAsHalfLanes[23]
995
+ #define Aki0 stateAsHalfLanes[24]
996
+ #define Aki1 stateAsHalfLanes[25]
997
+ #define Ako0 stateAsHalfLanes[26]
998
+ #define Ako1 stateAsHalfLanes[27]
999
+ #define Aku0 stateAsHalfLanes[28]
1000
+ #define Aku1 stateAsHalfLanes[29]
1001
+ #define Ama0 stateAsHalfLanes[30]
1002
+ #define Ama1 stateAsHalfLanes[31]
1003
+ #define Ame0 stateAsHalfLanes[32]
1004
+ #define Ame1 stateAsHalfLanes[33]
1005
+ #define Ami0 stateAsHalfLanes[34]
1006
+ #define Ami1 stateAsHalfLanes[35]
1007
+ #define Amo0 stateAsHalfLanes[36]
1008
+ #define Amo1 stateAsHalfLanes[37]
1009
+ #define Amu0 stateAsHalfLanes[38]
1010
+ #define Amu1 stateAsHalfLanes[39]
1011
+ #define Asa0 stateAsHalfLanes[40]
1012
+ #define Asa1 stateAsHalfLanes[41]
1013
+ #define Ase0 stateAsHalfLanes[42]
1014
+ #define Ase1 stateAsHalfLanes[43]
1015
+ #define Asi0 stateAsHalfLanes[44]
1016
+ #define Asi1 stateAsHalfLanes[45]
1017
+ #define Aso0 stateAsHalfLanes[46]
1018
+ #define Aso1 stateAsHalfLanes[47]
1019
+ #define Asu0 stateAsHalfLanes[48]
1020
+ #define Asu1 stateAsHalfLanes[49]
1021
+
1022
+ nRounds &= 3;
1023
+ switch ( nRounds )
1024
+ {
1025
+ #define I0 Ba
1026
+ #define I1 Be
1027
+ #define T0 Bi
1028
+ #define T1 Bo
1029
+ #define SwapPI13( in0,in1,in2,in3,eo0,eo1,eo2,eo3 ) \
1030
+ I0 = (in0)[0]; I1 = (in0)[1]; \
1031
+ T0 = (in1)[0]; T1 = (in1)[1]; \
1032
+ (in0)[eo0] = T0; (in0)[eo0^1] = T1; \
1033
+ T0 = (in2)[0]; T1 = (in2)[1]; \
1034
+ (in1)[eo1] = T0; (in1)[eo1^1] = T1; \
1035
+ T0 = (in3)[0]; T1 = (in3)[1]; \
1036
+ (in2)[eo2] = T0; (in2)[eo2^1] = T1; \
1037
+ (in3)[eo3] = I0; (in3)[eo3^1] = I1
1038
+ #define SwapPI2( in0,in1,in2,in3 ) \
1039
+ I0 = (in0)[0]; I1 = (in0)[1]; \
1040
+ T0 = (in1)[0]; T1 = (in1)[1]; \
1041
+ (in0)[1] = T0; (in0)[0] = T1; \
1042
+ (in1)[1] = I0; (in1)[0] = I1; \
1043
+ I0 = (in2)[0]; I1 = (in2)[1]; \
1044
+ T0 = (in3)[0]; T1 = (in3)[1]; \
1045
+ (in2)[1] = T0; (in2)[0] = T1; \
1046
+ (in3)[1] = I0; (in3)[0] = I1
1047
+ #define SwapEO( even,odd ) T0 = even; even = odd; odd = T0
1048
+
1049
+ case 1:
1050
+ SwapPI13( &Aga0, &Aka0, &Asa0, &Ama0, 1, 0, 1, 0 );
1051
+ SwapPI13( &Abe0, &Age0, &Ame0, &Ake0, 0, 1, 0, 1 );
1052
+ SwapPI13( &Abi0, &Aki0, &Agi0, &Asi0, 1, 0, 1, 0 );
1053
+ SwapEO( Ami0, Ami1 );
1054
+ SwapPI13( &Abo0, &Amo0, &Aso0, &Ago0, 1, 0, 1, 0 );
1055
+ SwapEO( Ako0, Ako1 );
1056
+ SwapPI13( &Abu0, &Asu0, &Aku0, &Amu0, 0, 1, 0, 1 );
1057
+ break;
1058
+
1059
+ case 2:
1060
+ SwapPI2( &Aga0, &Asa0, &Aka0, &Ama0 );
1061
+ SwapPI2( &Abe0, &Ame0, &Age0, &Ake0 );
1062
+ SwapPI2( &Abi0, &Agi0, &Aki0, &Asi0 );
1063
+ SwapPI2( &Abo0, &Aso0, &Ago0, &Amo0 );
1064
+ SwapPI2( &Abu0, &Aku0, &Amu0, &Asu0 );
1065
+ break;
1066
+
1067
+ case 3:
1068
+ SwapPI13( &Aga0, &Ama0, &Asa0, &Aka0, 0, 1, 0, 1 );
1069
+ SwapPI13( &Abe0, &Ake0, &Ame0, &Age0, 1, 0, 1, 0 );
1070
+ SwapPI13( &Abi0, &Asi0, &Agi0, &Aki0, 0, 1, 0, 1 );
1071
+ SwapEO( Ami0, Ami1 );
1072
+ SwapPI13( &Abo0, &Ago0, &Aso0, &Amo0, 0, 1, 0, 1 );
1073
+ SwapEO( Ako0, Ako1 );
1074
+ SwapPI13( &Abu0, &Amu0, &Aku0, &Asu0, 1, 0, 1, 0 );
1075
+ break;
1076
+ #undef I0
1077
+ #undef I1
1078
+ #undef T0
1079
+ #undef T1
1080
+ #undef SwapPI13
1081
+ #undef SwapPI2
1082
+ #undef SwapEO
1083
+ }
1084
+
1085
+ do
1086
+ {
1087
+ /* Code for 4 rounds, using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
1088
+ switch ( nRounds )
1089
+ {
1090
+ case 0: KeccakRound0(); /* fall through */
1091
+ case 3: KeccakRound1();
1092
+ case 2: KeccakRound2();
1093
+ case 1: KeccakRound3();
1094
+ }
1095
+ nRounds = 0;
1096
+ }
1097
+ while ( *pRoundConstants != 0xFF );
1098
+
1099
+ #undef Aba0
1100
+ #undef Aba1
1101
+ #undef Abe0
1102
+ #undef Abe1
1103
+ #undef Abi0
1104
+ #undef Abi1
1105
+ #undef Abo0
1106
+ #undef Abo1
1107
+ #undef Abu0
1108
+ #undef Abu1
1109
+ #undef Aga0
1110
+ #undef Aga1
1111
+ #undef Age0
1112
+ #undef Age1
1113
+ #undef Agi0
1114
+ #undef Agi1
1115
+ #undef Ago0
1116
+ #undef Ago1
1117
+ #undef Agu0
1118
+ #undef Agu1
1119
+ #undef Aka0
1120
+ #undef Aka1
1121
+ #undef Ake0
1122
+ #undef Ake1
1123
+ #undef Aki0
1124
+ #undef Aki1
1125
+ #undef Ako0
1126
+ #undef Ako1
1127
+ #undef Aku0
1128
+ #undef Aku1
1129
+ #undef Ama0
1130
+ #undef Ama1
1131
+ #undef Ame0
1132
+ #undef Ame1
1133
+ #undef Ami0
1134
+ #undef Ami1
1135
+ #undef Amo0
1136
+ #undef Amo1
1137
+ #undef Amu0
1138
+ #undef Amu1
1139
+ #undef Asa0
1140
+ #undef Asa1
1141
+ #undef Ase0
1142
+ #undef Ase1
1143
+ #undef Asi0
1144
+ #undef Asi1
1145
+ #undef Aso0
1146
+ #undef Aso1
1147
+ #undef Asu0
1148
+ #undef Asu1
1149
+ }
1150
+
1151
+ /* ---------------------------------------------------------------- */
1152
+
1153
+ void KeccakP1600_Permute_12rounds(void *state)
1154
+ {
1155
+ KeccakP1600_Permute_Nrounds(state, 12);
1156
+ }
1157
+
1158
+ /* ---------------------------------------------------------------- */
1159
+
1160
+ void KeccakP1600_Permute_24rounds(void *state)
1161
+ {
1162
+ KeccakP1600_Permute_Nrounds(state, 24);
1163
+ }