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,1121 @@
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
+ ; INFO: Tested on ATmega1280 simulator
26
+
27
+ ; Registers used in all routines
28
+ #define zero 1
29
+ #define rpState 24
30
+ #define rX 26
31
+ #define rY 28
32
+ #define rZ 30
33
+ #define sp 0x3D
34
+
35
+ ;----------------------------------------------------------------------------
36
+ ;
37
+ ; void KeccakP1600_StaticInitialize( void )
38
+ ;
39
+ .global KeccakP1600_StaticInitialize
40
+
41
+ ;----------------------------------------------------------------------------
42
+ ;
43
+ ; void KeccakP1600_Initialize(void *state)
44
+ ;
45
+ ; argument state is passed in r24:r25
46
+ ;
47
+ .global KeccakP1600_Initialize
48
+ KeccakP1600_Initialize:
49
+ movw rZ, r24
50
+ ldi r23, 5*5 ; clear state (8 bytes/1 lane per iteration)
51
+ KeccakP1600_Initialize_Loop:
52
+ st z+, zero
53
+ st z+, zero
54
+ st z+, zero
55
+ st z+, zero
56
+ st z+, zero
57
+ st z+, zero
58
+ st z+, zero
59
+ st z+, zero
60
+ dec r23
61
+ brne KeccakP1600_Initialize_Loop
62
+ KeccakP1600_StaticInitialize:
63
+ ret
64
+
65
+ ;----------------------------------------------------------------------------
66
+ ;
67
+ ; void KeccakP1600_AddByte(void *state, unsigned char data, unsigned int offset)
68
+ ;
69
+ ; argument state is passed in r24:r25
70
+ ; argument data is passed in r22:r23, only LSB (r22) is used
71
+ ; argument offset is passed in r20:r21, only LSB (r20) is used
72
+ ;
73
+ .global KeccakP1600_AddByte
74
+ KeccakP1600_AddByte:
75
+ movw rZ, r24
76
+ add rZ, r20
77
+ adc rZ+1, zero
78
+ ld r0, Z
79
+ eor r0, r22
80
+ st Z, r0
81
+ ret
82
+
83
+ ;----------------------------------------------------------------------------
84
+ ;
85
+ ; void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
86
+ ;
87
+ ; argument state is passed in r24:r25
88
+ ; argument data is passed in r22:r23
89
+ ; argument offset is passed in r20:r21, only LSB (r20) is used
90
+ ; argument length is passed in r18:r19, only LSB (r18) is used
91
+ ;
92
+ .global KeccakP1600_AddBytes
93
+ KeccakP1600_AddBytes:
94
+ movw rZ, r24
95
+ add rZ, r20
96
+ adc rZ+1, zero
97
+ movw rX, r22
98
+ subi r18, 8
99
+ brcs KeccakP1600_AddBytes_Byte
100
+ ;do 8 bytes per iteration
101
+ KeccakP1600_AddBytes_Loop8:
102
+ ld r21, X+
103
+ ld r0, Z
104
+ eor r0, r21
105
+ st Z+, r0
106
+ ld r21, X+
107
+ ld r0, Z
108
+ eor r0, r21
109
+ st Z+, r0
110
+ ld r21, X+
111
+ ld r0, Z
112
+ eor r0, r21
113
+ st Z+, r0
114
+ ld r21, X+
115
+ ld r0, Z
116
+ eor r0, r21
117
+ st Z+, r0
118
+ ld r21, X+
119
+ ld r0, Z
120
+ eor r0, r21
121
+ st Z+, r0
122
+ ld r21, X+
123
+ ld r0, Z
124
+ eor r0, r21
125
+ st Z+, r0
126
+ ld r21, X+
127
+ ld r0, Z
128
+ eor r0, r21
129
+ st Z+, r0
130
+ ld r21, X+
131
+ ld r0, Z
132
+ eor r0, r21
133
+ st Z+, r0
134
+ subi r18, 8
135
+ brcc KeccakP1600_AddBytes_Loop8
136
+ KeccakP1600_AddBytes_Byte:
137
+ ldi r19, 8
138
+ add r18, r19
139
+ breq KeccakP1600_AddBytes_End
140
+ KeccakP1600_AddBytes_Loop1:
141
+ ld r21, X+
142
+ ld r0, Z
143
+ eor r0, r21
144
+ st Z+, r0
145
+ dec r18
146
+ brne KeccakP1600_AddBytes_Loop1
147
+ KeccakP1600_AddBytes_End:
148
+ ret
149
+
150
+
151
+ ;----------------------------------------------------------------------------
152
+ ;
153
+ ; void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
154
+ ;
155
+ ; argument state is passed in r24:r25
156
+ ; argument data is passed in r22:r23
157
+ ; argument offset is passed in r20:r21, only LSB (r20) is used
158
+ ; argument length is passed in r18:r19, only LSB (r18) is used
159
+ ;
160
+ .global KeccakP1600_OverwriteBytes
161
+ KeccakP1600_OverwriteBytes:
162
+ movw rZ, r24
163
+ add rZ, r20
164
+ adc rZ+1, zero
165
+ movw rX, r22
166
+ subi r18, 8
167
+ brcs KeccakP1600_OverwriteBytes_Byte
168
+ ;do 8 bytes per iteration
169
+ KeccakP1600_OverwriteBytes_Loop8:
170
+ ld r0, X+
171
+ st Z+, r0
172
+ ld r0, X+
173
+ st Z+, r0
174
+ ld r0, X+
175
+ st Z+, r0
176
+ ld r0, X+
177
+ st Z+, r0
178
+ ld r0, X+
179
+ st Z+, r0
180
+ ld r0, X+
181
+ st Z+, r0
182
+ ld r0, X+
183
+ st Z+, r0
184
+ ld r0, X+
185
+ st Z+, r0
186
+ subi r18, 8
187
+ brcc KeccakP1600_OverwriteBytes_Loop8
188
+ KeccakP1600_OverwriteBytes_Byte:
189
+ ldi r19, 8
190
+ add r18, r19
191
+ breq KeccakP1600_OverwriteBytes_End
192
+ KeccakP1600_OverwriteBytes_Loop1:
193
+ ld r0, X+
194
+ st Z+, r0
195
+ dec r18
196
+ brne KeccakP1600_OverwriteBytes_Loop1
197
+ KeccakP1600_OverwriteBytes_End:
198
+ ret
199
+
200
+ ;----------------------------------------------------------------------------
201
+ ;
202
+ ; void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
203
+ ;
204
+ ; argument state is passed in r24:r25
205
+ ; argument byteCount is passed in r22:r23, only LSB (r22) is used
206
+ ;
207
+ .global KeccakP1600_OverwriteWithZeroes
208
+ KeccakP1600_OverwriteWithZeroes:
209
+ movw rZ, r24 ; rZ = state
210
+ mov r23, r22
211
+ lsr r23
212
+ lsr r23
213
+ lsr r23
214
+ breq KeccakP1600_OverwriteWithZeroes_Bytes
215
+ KeccakP1600_OverwriteWithZeroes_LoopLanes:
216
+ st Z+, r1
217
+ st Z+, r1
218
+ st Z+, r1
219
+ st Z+, r1
220
+ st Z+, r1
221
+ st Z+, r1
222
+ st Z+, r1
223
+ st Z+, r1
224
+ dec r23
225
+ brne KeccakP1600_OverwriteWithZeroes_LoopLanes
226
+ KeccakP1600_OverwriteWithZeroes_Bytes:
227
+ andi r22, 7
228
+ breq KeccakP1600_OverwriteWithZeroes_End
229
+ KeccakP1600_OverwriteWithZeroes_LoopBytes:
230
+ st Z+, r1
231
+ dec r22
232
+ brne KeccakP1600_OverwriteWithZeroes_LoopBytes
233
+ KeccakP1600_OverwriteWithZeroes_End:
234
+ ret
235
+
236
+ ;----------------------------------------------------------------------------
237
+ ;
238
+ ; void KeccakP1600_ExtractBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
239
+ ;
240
+ ; argument state is passed in r24:r25
241
+ ; argument data is passed in r22:r23
242
+ ; argument offset is passed in r20:r21, only LSB (r20) is used
243
+ ; argument length is passed in r18:r19, only LSB (r18) is used
244
+ ;
245
+ .global KeccakP1600_ExtractBytes
246
+ KeccakP1600_ExtractBytes:
247
+ movw rZ, r24
248
+ add rZ, r20
249
+ adc rZ+1, zero
250
+ movw rX, r22
251
+ subi r18, 8
252
+ brcs KeccakP1600_ExtractBytes_Byte
253
+ ;do 8 bytes per iteration
254
+ KeccakP1600_ExtractBytes_Loop8:
255
+ ld r0, Z+
256
+ st X+, r0
257
+ ld r0, Z+
258
+ st X+, r0
259
+ ld r0, Z+
260
+ st X+, r0
261
+ ld r0, Z+
262
+ st X+, r0
263
+ ld r0, Z+
264
+ st X+, r0
265
+ ld r0, Z+
266
+ st X+, r0
267
+ ld r0, Z+
268
+ st X+, r0
269
+ ld r0, Z+
270
+ st X+, r0
271
+ subi r18, 8
272
+ brcc KeccakP1600_ExtractBytes_Loop8
273
+ KeccakP1600_ExtractBytes_Byte:
274
+ ldi r19, 8
275
+ add r18, r19
276
+ breq KeccakP1600_ExtractBytes_End
277
+ KeccakP1600_ExtractBytes_Loop1:
278
+ ld r0, Z+
279
+ st X+, r0
280
+ dec r18
281
+ brne KeccakP1600_ExtractBytes_Loop1
282
+ KeccakP1600_ExtractBytes_End:
283
+ ret
284
+
285
+ ;----------------------------------------------------------------------------
286
+ ;
287
+ ; void KeccakP1600_ExtractAndAddBytes(void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
288
+ ;
289
+ ; argument state is passed in r24:r25
290
+ ; argument input is passed in r22:r23
291
+ ; argument output is passed in r20:r21
292
+ ; argument offset is passed in r18:r19, only LSB (r18) is used
293
+ ; argument length is passed in r16:r17, only LSB (r16) is used
294
+ ;
295
+ .global KeccakP1600_ExtractAndAddBytes
296
+ KeccakP1600_ExtractAndAddBytes:
297
+ tst r16
298
+ breq KeccakP1600_ExtractAndAddBytes_End
299
+ push r16
300
+ push r28
301
+ push r29
302
+ movw rZ, r24
303
+ add rZ, r18
304
+ adc rZ+1, zero
305
+ movw rX, r22
306
+ movw rY, r20
307
+ subi r16, 8
308
+ brcs KeccakP1600_ExtractAndAddBytes_Byte
309
+ KeccakP1600_ExtractAndAddBytes_LoopLane:
310
+ ld r21, Z+
311
+ ld r0, X+
312
+ eor r0, r21
313
+ st Y+, r0
314
+ ld r21, Z+
315
+ ld r0, X+
316
+ eor r0, r21
317
+ st Y+, r0
318
+ ld r21, Z+
319
+ ld r0, X+
320
+ eor r0, r21
321
+ st Y+, r0
322
+ ld r21, Z+
323
+ ld r0, X+
324
+ eor r0, r21
325
+ st Y+, r0
326
+ ld r21, Z+
327
+ ld r0, X+
328
+ eor r0, r21
329
+ st Y+, r0
330
+ ld r21, Z+
331
+ ld r0, X+
332
+ eor r0, r21
333
+ st Y+, r0
334
+ ld r21, Z+
335
+ ld r0, X+
336
+ eor r0, r21
337
+ st Y+, r0
338
+ ld r21, Z+
339
+ ld r0, X+
340
+ eor r0, r21
341
+ st Y+, r0
342
+ subi r16, 8
343
+ brcc KeccakP1600_ExtractAndAddBytes_LoopLane
344
+ KeccakP1600_ExtractAndAddBytes_Byte:
345
+ ldi r19, 8
346
+ add r16, r19
347
+ breq KeccakP1600_ExtractAndAddBytes_Done
348
+ KeccakP1600_ExtractAndAddBytes_Loop1:
349
+ ld r21, Z+
350
+ ld r0, X+
351
+ eor r0, r21
352
+ st Y+, r0
353
+ dec r16
354
+ brne KeccakP1600_ExtractAndAddBytes_Loop1
355
+ KeccakP1600_ExtractAndAddBytes_Done:
356
+ pop r29
357
+ pop r28
358
+ pop r16
359
+ KeccakP1600_ExtractAndAddBytes_End:
360
+ ret
361
+
362
+
363
+ #define ROT_BIT(a) ((a) & 7)
364
+ #define ROT_BYTE(a) ((((a)/8 + !!(((a)%8) > 4)) & 7) * 9)
365
+
366
+ KeccakP1600_RhoPiConstants:
367
+ .BYTE ROT_BIT( 1), ROT_BYTE( 3), 10 * 8
368
+ .BYTE ROT_BIT( 3), ROT_BYTE( 6), 7 * 8
369
+ .BYTE ROT_BIT( 6), ROT_BYTE(10), 11 * 8
370
+ .BYTE ROT_BIT(10), ROT_BYTE(15), 17 * 8
371
+ .BYTE ROT_BIT(15), ROT_BYTE(21), 18 * 8
372
+ .BYTE ROT_BIT(21), ROT_BYTE(28), 3 * 8
373
+ .BYTE ROT_BIT(28), ROT_BYTE(36), 5 * 8
374
+ .BYTE ROT_BIT(36), ROT_BYTE(45), 16 * 8
375
+ .BYTE ROT_BIT(45), ROT_BYTE(55), 8 * 8
376
+ .BYTE ROT_BIT(55), ROT_BYTE( 2), 21 * 8
377
+ .BYTE ROT_BIT( 2), ROT_BYTE(14), 24 * 8
378
+ .BYTE ROT_BIT(14), ROT_BYTE(27), 4 * 8
379
+ .BYTE ROT_BIT(27), ROT_BYTE(41), 15 * 8
380
+ .BYTE ROT_BIT(41), ROT_BYTE(56), 23 * 8
381
+ .BYTE ROT_BIT(56), ROT_BYTE( 8), 19 * 8
382
+ .BYTE ROT_BIT( 8), ROT_BYTE(25), 13 * 8
383
+ .BYTE ROT_BIT(25), ROT_BYTE(43), 12 * 8
384
+ .BYTE ROT_BIT(43), ROT_BYTE(62), 2 * 8
385
+ .BYTE ROT_BIT(62), ROT_BYTE(18), 20 * 8
386
+ .BYTE ROT_BIT(18), ROT_BYTE(39), 14 * 8
387
+ .BYTE ROT_BIT(39), ROT_BYTE(61), 22 * 8
388
+ .BYTE ROT_BIT(61), ROT_BYTE(20), 9 * 8
389
+ .BYTE ROT_BIT(20), ROT_BYTE(44), 6 * 8
390
+ .BYTE ROT_BIT(44), ROT_BYTE( 1), 1 * 8
391
+
392
+ KeccakP1600_RoundConstants_24:
393
+ .BYTE 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
394
+ .BYTE 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
395
+ .BYTE 0x8a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
396
+ .BYTE 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
397
+ .BYTE 0x8b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
398
+ .BYTE 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00
399
+ .BYTE 0x81, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
400
+ .BYTE 0x09, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
401
+ .BYTE 0x8a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
402
+ .BYTE 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
403
+ .BYTE 0x09, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00
404
+ .BYTE 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00
405
+ KeccakP1600_RoundConstants_12:
406
+ .BYTE 0x8b, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00
407
+ .BYTE 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
408
+ .BYTE 0x89, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
409
+ .BYTE 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
410
+ .BYTE 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
411
+ .BYTE 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
412
+ .BYTE 0x0a, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
413
+ .BYTE 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
414
+ .BYTE 0x81, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
415
+ .BYTE 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80
416
+ .BYTE 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00
417
+ .BYTE 0x08, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80
418
+ KeccakP1600_RoundConstants_0:
419
+ .BYTE 0xFF, 0 ; terminator
420
+
421
+ .text
422
+
423
+ #define pRound 22 // 2 regs (22-23)
424
+
425
+ ;----------------------------------------------------------------------------
426
+ ;
427
+ ; void KeccakP1600_Permute_Nrounds( void *state, unsigned int nrounds )
428
+ ;
429
+ ; argument state is passed in r24:r25
430
+ ; argument nrounds is passed in r22:r23 (only LSB (r22) is used)
431
+ ;
432
+ .global KeccakP1600_Permute_Nrounds
433
+ KeccakP1600_Permute_Nrounds:
434
+ mov r26, r22
435
+ ldi pRound, lo8(KeccakP1600_RoundConstants_0)
436
+ ldi pRound+1, hi8(KeccakP1600_RoundConstants_0)
437
+ lsl r26
438
+ lsl r26
439
+ lsl r26
440
+ sub pRound, r26
441
+ sbc pRound+1, zero
442
+ rjmp KeccakP1600_Permute
443
+
444
+ ;----------------------------------------------------------------------------
445
+ ;
446
+ ; void KeccakP1600_Permute_24rounds( void *state )
447
+ ;
448
+ .global KeccakP1600_Permute_24rounds
449
+ KeccakP1600_Permute_24rounds:
450
+ ldi pRound, lo8(KeccakP1600_RoundConstants_24)
451
+ ldi pRound+1, hi8(KeccakP1600_RoundConstants_24)
452
+ rjmp KeccakP1600_Permute
453
+
454
+ ;----------------------------------------------------------------------------
455
+ ;
456
+ ; void KeccakP1600_Permute_12rounds( void *state )
457
+ ;
458
+ .global KeccakP1600_Permute_12rounds
459
+ KeccakP1600_Permute_12rounds:
460
+ ldi pRound, lo8(KeccakP1600_RoundConstants_12)
461
+ ldi pRound+1, hi8(KeccakP1600_RoundConstants_12)
462
+ KeccakP1600_Permute:
463
+ push r2
464
+ push r3
465
+ push r4
466
+ push r5
467
+ push r6
468
+ push r7
469
+ push r8
470
+ push r9
471
+ push r10
472
+ push r11
473
+ push r12
474
+ push r13
475
+ push r14
476
+ push r15
477
+ push r16
478
+ push r17
479
+ push r28
480
+ push r29
481
+
482
+ ; Allocate C variables (5*8)
483
+ in rZ, sp
484
+ in rZ+1, sp+1
485
+ sbiw rZ, 40
486
+ in r0, 0x3F
487
+ cli
488
+ out sp+1, rZ+1
489
+ out sp, rZ ; Z points to 5 C lanes
490
+ out 0x3F, r0
491
+
492
+ ; Variables used in multiple operations
493
+ #define rTemp 2 // 8 regs (2-9)
494
+ #define rTempBis 10 // 8 regs (10-17)
495
+ #define rTempTer 18 // 4 regs (18-21)
496
+
497
+ ; Initial Prepare Theta
498
+ #define TCIPx rTempTer
499
+
500
+ ldi TCIPx, 5
501
+ movw rY, rpState
502
+ KeccakInitialPrepTheta_Loop:
503
+ ld rTemp+0, Y+ ; state[x]
504
+ ld rTemp+1, Y+
505
+ ld rTemp+2, Y+
506
+ ld rTemp+3, Y+
507
+ ld rTemp+4, Y+
508
+ ld rTemp+5, Y+
509
+ ld rTemp+6, Y+
510
+ ld rTemp+7, Y+
511
+
512
+ adiw rY, 32
513
+ ld r0, Y+ ; state[5+x]
514
+ eor rTemp+0, r0
515
+ ld r0, Y+
516
+ eor rTemp+1, r0
517
+ ld r0, Y+
518
+ eor rTemp+2, r0
519
+ ld r0, Y+
520
+ eor rTemp+3, r0
521
+ ld r0, Y+
522
+ eor rTemp+4, r0
523
+ ld r0, Y+
524
+ eor rTemp+5, r0
525
+ ld r0, Y+
526
+ eor rTemp+6, r0
527
+ ld r0, Y+
528
+ eor rTemp+7, r0
529
+
530
+ adiw rY, 32
531
+ ld r0, Y+ ; state[10+x]
532
+ eor rTemp+0, r0
533
+ ld r0, Y+
534
+ eor rTemp+1, r0
535
+ ld r0, Y+
536
+ eor rTemp+2, r0
537
+ ld r0, Y+
538
+ eor rTemp+3, r0
539
+ ld r0, Y+
540
+ eor rTemp+4, r0
541
+ ld r0, Y+
542
+ eor rTemp+5, r0
543
+ ld r0, Y+
544
+ eor rTemp+6, r0
545
+ ld r0, Y+
546
+ eor rTemp+7, r0
547
+
548
+ adiw rY, 32
549
+ ld r0, Y+ ; state[15+x]
550
+ eor rTemp+0, r0
551
+ ld r0, Y+
552
+ eor rTemp+1, r0
553
+ ld r0, Y+
554
+ eor rTemp+2, r0
555
+ ld r0, Y+
556
+ eor rTemp+3, r0
557
+ ld r0, Y+
558
+ eor rTemp+4, r0
559
+ ld r0, Y+
560
+ eor rTemp+5, r0
561
+ ld r0, Y+
562
+ eor rTemp+6, r0
563
+ ld r0, Y+
564
+ eor rTemp+7, r0
565
+
566
+ adiw rY, 32
567
+ ld r0, Y+ ; state[20+x]
568
+ eor rTemp+0, r0
569
+ ld r0, Y+
570
+ eor rTemp+1, r0
571
+ ld r0, Y+
572
+ eor rTemp+2, r0
573
+ ld r0, Y+
574
+ eor rTemp+3, r0
575
+ ld r0, Y+
576
+ eor rTemp+4, r0
577
+ ld r0, Y+
578
+ eor rTemp+5, r0
579
+ ld r0, Y+
580
+ eor rTemp+6, r0
581
+ ld r0, Y+
582
+ eor rTemp+7, r0
583
+
584
+ st Z+, rTemp+0
585
+ st Z+, rTemp+1
586
+ st Z+, rTemp+2
587
+ st Z+, rTemp+3
588
+ st Z+, rTemp+4
589
+ st Z+, rTemp+5
590
+ st Z+, rTemp+6
591
+ st Z+, rTemp+7
592
+
593
+ subi rY, 160
594
+ sbc rY+1, zero
595
+
596
+ subi TCIPx, 1
597
+ breq KeccakInitialPrepTheta_Done
598
+ rjmp KeccakInitialPrepTheta_Loop
599
+ KeccakInitialPrepTheta_Done:
600
+ #undef TCIPx
601
+
602
+ Keccak_RoundLoop:
603
+
604
+ ; Theta
605
+ #define TCplus rX
606
+ #define TCminus rZ
607
+ #define TCcoordX rTempTer
608
+ #define TCcoordY rTempTer+1
609
+
610
+ in TCminus, sp
611
+ in TCminus+1, sp+1
612
+ movw TCplus, TCminus
613
+ adiw TCminus, 4*8
614
+ adiw TCplus, 1*8
615
+ movw rY, rpState
616
+
617
+ ldi TCcoordX, 0x16
618
+ KeccakTheta_Loop1:
619
+ ld rTemp+0, X+
620
+ ld rTemp+1, X+
621
+ ld rTemp+2, X+
622
+ ld rTemp+3, X+
623
+ ld rTemp+4, X+
624
+ ld rTemp+5, X+
625
+ ld rTemp+6, X+
626
+ ld rTemp+7, X+
627
+
628
+ lsl rTemp+0
629
+ rol rTemp+1
630
+ rol rTemp+2
631
+ rol rTemp+3
632
+ rol rTemp+4
633
+ rol rTemp+5
634
+ rol rTemp+6
635
+ rol rTemp+7
636
+ adc rTemp+0, zero
637
+
638
+ ld r0, Z+
639
+ eor rTemp+0, r0
640
+ ld r0, Z+
641
+ eor rTemp+1, r0
642
+ ld r0, Z+
643
+ eor rTemp+2, r0
644
+ ld r0, Z+
645
+ eor rTemp+3, r0
646
+ ld r0, Z+
647
+ eor rTemp+4, r0
648
+ ld r0, Z+
649
+ eor rTemp+5, r0
650
+ ld r0, Z+
651
+ eor rTemp+6, r0
652
+ ld r0, Z+
653
+ eor rTemp+7, r0
654
+
655
+ ldi TCcoordY, 5
656
+ KeccakTheta_Loop2:
657
+ ld r0, Y
658
+ eor r0, rTemp+0
659
+ st Y+, r0
660
+ ld r0, Y
661
+ eor r0, rTemp+1
662
+ st Y+, r0
663
+ ld r0, Y
664
+ eor r0, rTemp+2
665
+ st Y+, r0
666
+ ld r0, Y
667
+ eor r0, rTemp+3
668
+ st Y+, r0
669
+ ld r0, Y
670
+ eor r0, rTemp+4
671
+ st Y+, r0
672
+ ld r0, Y
673
+ eor r0, rTemp+5
674
+ st Y+, r0
675
+ ld r0, Y
676
+ eor r0, rTemp+6
677
+ st Y+, r0
678
+ ld r0, Y
679
+ eor r0, rTemp+7
680
+ st Y+, r0
681
+ adiw rY, 32
682
+
683
+ dec TCcoordY
684
+ brne KeccakTheta_Loop2
685
+
686
+ subi rY, 200-8
687
+ sbc rY+1, zero
688
+
689
+ lsr TCcoordX
690
+ brcc 1f
691
+ breq KeccakTheta_End
692
+ rjmp KeccakTheta_Loop1
693
+ 1:
694
+ cpi TCcoordX, 0x0B
695
+ brne 2f
696
+ sbiw TCminus, 40
697
+ rjmp KeccakTheta_Loop1
698
+ 2:
699
+ sbiw TCplus, 40
700
+ rjmp KeccakTheta_Loop1
701
+
702
+ KeccakTheta_End:
703
+ #undef TCplus
704
+ #undef TCminus
705
+ #undef TCcoordX
706
+ #undef TCcoordY
707
+
708
+ ; Rho Pi
709
+ #define RPpConst rTempTer // 2 regs
710
+ #define RPindex rTempTer+2
711
+ #define RPpBitRot rX
712
+ #define RPpByteRot pRound
713
+
714
+ sbiw rY, 32
715
+
716
+ ld rTemp+0, Y+
717
+ ld rTemp+1, Y+
718
+ ld rTemp+2, Y+
719
+ ld rTemp+3, Y+
720
+ ld rTemp+4, Y+
721
+ ld rTemp+5, Y+
722
+ ld rTemp+6, Y+
723
+ ld rTemp+7, Y+
724
+
725
+ push pRound
726
+ push pRound+1
727
+ ldi RPpConst, lo8(KeccakP1600_RhoPiConstants)
728
+ ldi RPpConst+1, hi8(KeccakP1600_RhoPiConstants)
729
+ ldi RPpBitRot, pm_lo8(bit_rot_jmp_table)
730
+ ldi RPpBitRot+1, pm_hi8(bit_rot_jmp_table)
731
+ ldi RPpByteRot, pm_lo8(rotate64_0byte_left)
732
+ ldi RPpByteRot+1, pm_hi8(rotate64_0byte_left)
733
+
734
+ KeccakRhoPi_Loop:
735
+ ; get rotation codes and state index
736
+ movw rZ, RPpConst
737
+ lpm r0, Z+ ; bits
738
+ lpm rTempBis, Z+ ; bytes
739
+ lpm RPindex, Z+
740
+ movw RPpConst, rZ
741
+
742
+ ; do bit rotation
743
+ movw rZ, RPpBitRot
744
+ add rZ, r0
745
+ adc rZ+1, zero
746
+ ijmp
747
+
748
+ KeccakRhoPi_RhoBitRotateDone:
749
+ movw rY, rpState
750
+ add rY, RPindex
751
+ adc rY+1, zero
752
+
753
+ movw rZ, RPpByteRot
754
+ add rZ, rTempBis
755
+ adc rZ+1, zero
756
+ ijmp
757
+
758
+ KeccakRhoPi_PiStore:
759
+ sbiw rY, 8
760
+ st Y+, rTemp+0
761
+ st Y+, rTemp+1
762
+ st Y+, rTemp+2
763
+ st Y+, rTemp+3
764
+ st Y+, rTemp+4
765
+ st Y+, rTemp+5
766
+ st Y+, rTemp+6
767
+ st Y+, rTemp+7
768
+
769
+ movw rTemp+0, rTempBis+0
770
+ movw rTemp+2, rTempBis+2
771
+ movw rTemp+4, rTempBis+4
772
+ movw rTemp+6, rTempBis+6
773
+ KeccakRhoPi_RhoDone:
774
+ subi RPindex, 8
775
+ brne KeccakRhoPi_Loop
776
+ pop pRound+1
777
+ pop pRound
778
+
779
+ #undef RPpConst
780
+ #undef RPindex
781
+ #undef RPpBitrot
782
+ #undef RPpByteRot
783
+
784
+
785
+ ; Chi Iota prepare Theta
786
+ #define CIPTa0 rTemp
787
+ #define CIPTa1 rTemp+1
788
+ #define CIPTa2 rTemp+2
789
+ #define CIPTa3 rTemp+3
790
+ #define CIPTa4 rTemp+4
791
+ #define CIPTc0 rTempBis
792
+ #define CIPTc1 rTempBis+1
793
+ #define CIPTc2 rTempBis+2
794
+ #define CIPTc3 rTempBis+3
795
+ #define CIPTc4 rTempBis+4
796
+ #define CIPTz rTempBis+6
797
+ #define CIPTy rTempBis+7
798
+
799
+ in rX, sp ; 5 * C
800
+ in rX+1, sp+1
801
+ movw rY, rpState
802
+ movw rZ, pRound
803
+
804
+ ldi CIPTz, 8
805
+ KeccakChiIotaPrepareTheta_zLoop:
806
+ mov CIPTc0, zero
807
+ mov CIPTc1, zero
808
+ movw CIPTc2, CIPTc0
809
+ mov CIPTc4, zero
810
+
811
+ ldi CIPTy, 5
812
+ KeccakChiIotaPrepareTheta_yLoop:
813
+ ld CIPTa0, Y
814
+ ldd CIPTa1, Y+8
815
+ ldd CIPTa2, Y+16
816
+ ldd CIPTa3, Y+24
817
+ ldd CIPTa4, Y+32
818
+
819
+ ;*p = t = a0 ^ ((~a1) & a2); c0 ^= t;
820
+ mov r0, CIPTa1
821
+ com r0
822
+ and r0, CIPTa2
823
+ eor r0, CIPTa0
824
+ eor CIPTc0, r0
825
+ st Y, r0
826
+
827
+ ;*(p+8) = t = a1 ^ ((~a2) & a3); c1 ^= t;
828
+ mov r0, CIPTa2
829
+ com r0
830
+ and r0, CIPTa3
831
+ eor r0, CIPTa1
832
+ eor CIPTc1, r0
833
+ std Y+8, r0
834
+
835
+ ;*(p+16) = a2 ^= ((~a3) & a4); c2 ^= a2;
836
+ mov r0, CIPTa3
837
+ com r0
838
+ and r0, CIPTa4
839
+ eor r0, CIPTa2
840
+ eor CIPTc2, r0
841
+ std Y+16, r0
842
+
843
+ ;*(p+24) = a3 ^= ((~a4) & a0); c3 ^= a3;
844
+ mov r0, CIPTa4
845
+ com r0
846
+ and r0, CIPTa0
847
+ eor r0, CIPTa3
848
+ eor CIPTc3, r0
849
+ std Y+24, r0
850
+
851
+ ;*(p+32) = a4 ^= ((~a0) & a1); c4 ^= a4;
852
+ com CIPTa0
853
+ and CIPTa0, CIPTa1
854
+ eor CIPTa0, CIPTa4
855
+ eor CIPTc4, CIPTa0
856
+ std Y+32, CIPTa0
857
+
858
+ adiw rY, 40
859
+ dec CIPTy
860
+ brne KeccakChiIotaPrepareTheta_yLoop
861
+
862
+ subi rY, 200
863
+ sbc rY+1, zero
864
+
865
+ lpm r0, Z+ ;Round Constant
866
+ ld CIPTa0, Y
867
+ eor CIPTa0, r0
868
+ st Y+, CIPTa0
869
+
870
+ movw pRound, rZ
871
+ movw rZ, rX
872
+ eor CIPTc0, r0
873
+ st Z+, CIPTc0
874
+ std Z+7, CIPTc1
875
+ std Z+15, CIPTc2
876
+ std Z+23, CIPTc3
877
+ std Z+31, CIPTc4
878
+ movw rX, rZ
879
+ movw rZ, pRound
880
+
881
+ dec CIPTz
882
+ brne KeccakChiIotaPrepareTheta_zLoop
883
+
884
+ #undef CIPTa0
885
+ #undef CIPTa1
886
+ #undef CIPTa2
887
+ #undef CIPTa3
888
+ #undef CIPTa4
889
+ #undef CIPTc0
890
+ #undef CIPTc1
891
+ #undef CIPTc2
892
+ #undef CIPTc3
893
+ #undef CIPTc4
894
+ #undef CIPTz
895
+ #undef CIPTy
896
+
897
+ ;Check for terminator
898
+ lpm r0, Z
899
+ inc r0
900
+ breq Keccak_Done
901
+ rjmp Keccak_RoundLoop
902
+ Keccak_Done:
903
+
904
+ ; Free C(on stack) and registers
905
+ in rX, sp ; free 5 C lanes
906
+ in rX+1, sp+1
907
+ adiw rX, 40
908
+ in r0, 0x3F
909
+ cli
910
+ out sp+1, rX+1
911
+ out sp, rX
912
+ out 0x3F, r0
913
+
914
+ pop r29
915
+ pop r28
916
+ pop r17
917
+ pop r16
918
+ pop r15
919
+ pop r14
920
+ pop r13
921
+ pop r12
922
+ pop r11
923
+ pop r10
924
+ pop r9
925
+ pop r8
926
+ pop r7
927
+ pop r6
928
+ pop r5
929
+ pop r4
930
+ pop r3
931
+ pop r2
932
+ ret
933
+
934
+ bit_rot_jmp_table:
935
+ rjmp KeccakRhoPi_RhoBitRotateDone
936
+ rjmp rotate64_1bit_left
937
+ rjmp rotate64_2bit_left
938
+ rjmp rotate64_3bit_left
939
+ rjmp rotate64_4bit_left
940
+ rjmp rotate64_3bit_right
941
+ rjmp rotate64_2bit_right
942
+ rjmp rotate64_1bit_right
943
+
944
+ rotate64_4bit_left:
945
+ lsl rTemp
946
+ rol rTemp+1
947
+ rol rTemp+2
948
+ rol rTemp+3
949
+ rol rTemp+4
950
+ rol rTemp+5
951
+ rol rTemp+6
952
+ rol rTemp+7
953
+ adc rTemp, r1
954
+ rotate64_3bit_left:
955
+ lsl rTemp
956
+ rol rTemp+1
957
+ rol rTemp+2
958
+ rol rTemp+3
959
+ rol rTemp+4
960
+ rol rTemp+5
961
+ rol rTemp+6
962
+ rol rTemp+7
963
+ adc rTemp, r1
964
+ rotate64_2bit_left:
965
+ lsl rTemp
966
+ rol rTemp+1
967
+ rol rTemp+2
968
+ rol rTemp+3
969
+ rol rTemp+4
970
+ rol rTemp+5
971
+ rol rTemp+6
972
+ rol rTemp+7
973
+ adc rTemp, r1
974
+ rotate64_1bit_left:
975
+ lsl rTemp
976
+ rol rTemp+1
977
+ rol rTemp+2
978
+ rol rTemp+3
979
+ rol rTemp+4
980
+ rol rTemp+5
981
+ rol rTemp+6
982
+ rol rTemp+7
983
+ adc rTemp, r1
984
+ rjmp KeccakRhoPi_RhoBitRotateDone
985
+
986
+ rotate64_3bit_right:
987
+ bst rTemp, 0
988
+ ror rTemp+7
989
+ ror rTemp+6
990
+ ror rTemp+5
991
+ ror rTemp+4
992
+ ror rTemp+3
993
+ ror rTemp+2
994
+ ror rTemp+1
995
+ ror rTemp
996
+ bld rTemp+7, 7
997
+ rotate64_2bit_right:
998
+ bst rTemp, 0
999
+ ror rTemp+7
1000
+ ror rTemp+6
1001
+ ror rTemp+5
1002
+ ror rTemp+4
1003
+ ror rTemp+3
1004
+ ror rTemp+2
1005
+ ror rTemp+1
1006
+ ror rTemp
1007
+ bld rTemp+7, 7
1008
+ rotate64_1bit_right:
1009
+ bst rTemp, 0
1010
+ ror rTemp+7
1011
+ ror rTemp+6
1012
+ ror rTemp+5
1013
+ ror rTemp+4
1014
+ ror rTemp+3
1015
+ ror rTemp+2
1016
+ ror rTemp+1
1017
+ ror rTemp
1018
+ bld rTemp+7, 7
1019
+ rjmp KeccakRhoPi_RhoBitRotateDone
1020
+
1021
+ ; Each byte rotate routine must be 9 instructions long.
1022
+
1023
+ rotate64_0byte_left:
1024
+ ld rTempBis+0, Y+
1025
+ ld rTempBis+1, Y+
1026
+ ld rTempBis+2, Y+
1027
+ ld rTempBis+3, Y+
1028
+ ld rTempBis+4, Y+
1029
+ ld rTempBis+5, Y+
1030
+ ld rTempBis+6, Y+
1031
+ ld rTempBis+7, Y+
1032
+ rjmp KeccakRhoPi_PiStore
1033
+
1034
+ rotate64_1byte_left:
1035
+ ld rTempBis+1, Y+
1036
+ ld rTempBis+2, Y+
1037
+ ld rTempBis+3, Y+
1038
+ ld rTempBis+4, Y+
1039
+ ld rTempBis+5, Y+
1040
+ ld rTempBis+6, Y+
1041
+ ld rTempBis+7, Y+
1042
+ ld rTempBis+0, Y+
1043
+ rjmp KeccakRhoPi_PiStore
1044
+
1045
+ rotate64_2byte_left:
1046
+ ld rTempBis+2, Y+
1047
+ ld rTempBis+3, Y+
1048
+ ld rTempBis+4, Y+
1049
+ ld rTempBis+5, Y+
1050
+ ld rTempBis+6, Y+
1051
+ ld rTempBis+7, Y+
1052
+ ld rTempBis+0, Y+
1053
+ ld rTempBis+1, Y+
1054
+ rjmp KeccakRhoPi_PiStore
1055
+
1056
+ rotate64_3byte_left:
1057
+ ld rTempBis+3, Y+
1058
+ ld rTempBis+4, Y+
1059
+ ld rTempBis+5, Y+
1060
+ ld rTempBis+6, Y+
1061
+ ld rTempBis+7, Y+
1062
+ ld rTempBis+0, Y+
1063
+ ld rTempBis+1, Y+
1064
+ ld rTempBis+2, Y+
1065
+ rjmp KeccakRhoPi_PiStore
1066
+
1067
+ rotate64_4byte_left:
1068
+ ld rTempBis+4, Y+
1069
+ ld rTempBis+5, Y+
1070
+ ld rTempBis+6, Y+
1071
+ ld rTempBis+7, Y+
1072
+ ld rTempBis+0, Y+
1073
+ ld rTempBis+1, Y+
1074
+ ld rTempBis+2, Y+
1075
+ ld rTempBis+3, Y+
1076
+ rjmp KeccakRhoPi_PiStore
1077
+
1078
+ rotate64_5byte_left:
1079
+ ld rTempBis+5, Y+
1080
+ ld rTempBis+6, Y+
1081
+ ld rTempBis+7, Y+
1082
+ ld rTempBis+0, Y+
1083
+ ld rTempBis+1, Y+
1084
+ ld rTempBis+2, Y+
1085
+ ld rTempBis+3, Y+
1086
+ ld rTempBis+4, Y+
1087
+ rjmp KeccakRhoPi_PiStore
1088
+
1089
+ rotate64_6byte_left:
1090
+ ld rTempBis+6, Y+
1091
+ ld rTempBis+7, Y+
1092
+ ld rTempBis+0, Y+
1093
+ ld rTempBis+1, Y+
1094
+ ld rTempBis+2, Y+
1095
+ ld rTempBis+3, Y+
1096
+ ld rTempBis+4, Y+
1097
+ ld rTempBis+5, Y+
1098
+ rjmp KeccakRhoPi_PiStore
1099
+
1100
+ rotate64_7byte_left:
1101
+ ld rTempBis+7, Y+
1102
+ ld rTempBis+0, Y+
1103
+ ld rTempBis+1, Y+
1104
+ ld rTempBis+2, Y+
1105
+ ld rTempBis+3, Y+
1106
+ ld rTempBis+4, Y+
1107
+ ld rTempBis+5, Y+
1108
+ ld rTempBis+6, Y+
1109
+ rjmp KeccakRhoPi_PiStore
1110
+
1111
+ #undef rTemp
1112
+ #undef rTempBis
1113
+ #undef rTempTer
1114
+ #undef pRound
1115
+
1116
+ #undef rpState
1117
+ #undef zero
1118
+ #undef rX
1119
+ #undef rY
1120
+ #undef rZ
1121
+ #undef sp