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,1666 @@
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
+ ; WARNING: This implementation assumes a little endian CPU with ARMv6M architecture (e.g., Cortex-M0) and the ARMCC compiler.
26
+
27
+ PRESERVE8
28
+ THUMB
29
+ AREA |.text|, CODE, READONLY
30
+
31
+ ; Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
32
+ MACRO
33
+ toBitInterleaving $in0,$in1,$out0,$out1,$t,$tt,$pMask
34
+
35
+ mov $out0, $in0
36
+ ldr $t, [$pMask, #0]
37
+ ands $out0, $out0, $t
38
+ lsrs $t, $out0, #1
39
+ orrs $out0, $out0, $t
40
+ ldr $t, [$pMask, #4]
41
+ ands $out0, $out0, $t
42
+ lsrs $t, $out0, #2
43
+ orrs $out0, $out0, $t
44
+ ldr $t, [$pMask, #8]
45
+ ands $out0, $out0, $t
46
+ lsrs $t, $out0, #4
47
+ orrs $out0, $out0, $t
48
+ ldr $t, [$pMask, #12]
49
+ ands $out0, $out0, $t
50
+ lsrs $t, $out0, #8
51
+ orrs $out0, $out0, $t
52
+
53
+ mov $out1, $in1
54
+ ldr $t, [$pMask, #0]
55
+ ands $out1, $out1, $t
56
+ lsrs $t, $out1, #1
57
+ orrs $out1, $out1, $t
58
+ ldr $t, [$pMask, #4]
59
+ ands $out1, $out1, $t
60
+ lsrs $t, $out1, #2
61
+ orrs $out1, $out1, $t
62
+ ldr $t, [$pMask, #8]
63
+ ands $out1, $out1, $t
64
+ lsrs $t, $out1, #4
65
+ orrs $out1, $out1, $t
66
+ ldr $t, [$pMask, #12]
67
+ ands $out1, $out1, $t
68
+ lsrs $t, $out1, #8
69
+ orrs $out1, $out1, $t
70
+
71
+ lsls $out0, $out0, #16
72
+ lsrs $out0, $out0, #16
73
+ lsls $out1, $out1, #16
74
+ orrs $out0, $out0, $out1
75
+
76
+ mov $out1, $in0
77
+ ldr $t, [$pMask, #16]
78
+ ands $out1, $out1, $t
79
+ lsls $t, $out1, #1
80
+ orrs $out1, $out1, $t
81
+ ldr $t, [$pMask, #20]
82
+ ands $out1, $out1, $t
83
+ lsls $t, $out1, #2
84
+ orrs $out1, $out1, $t
85
+ ldr $t, [$pMask, #24]
86
+ ands $out1, $out1, $t
87
+ lsls $t, $out1, #4
88
+ orrs $out1, $out1, $t
89
+ ldr $t, [$pMask, #28]
90
+ ands $out1, $out1, $t
91
+ lsls $t, $out1, #8
92
+ orrs $out1, $out1, $t
93
+
94
+ mov $tt, $in1
95
+ ldr $t, [$pMask, #16]
96
+ ands $tt, $tt, $t
97
+ lsls $t, $tt, #1
98
+ orrs $tt, $tt, $t
99
+ ldr $t, [$pMask, #20]
100
+ ands $tt, $tt, $t
101
+ lsls $t, $tt, #2
102
+ orrs $tt, $tt, $t
103
+ ldr $t, [$pMask, #24]
104
+ ands $tt, $tt, $t
105
+ lsls $t, $tt, #4
106
+ orrs $tt, $tt, $t
107
+ ldr $t, [$pMask, #28]
108
+ ands $tt, $tt, $t
109
+ lsls $t, $tt, #8
110
+ orrs $tt, $tt, $t
111
+
112
+ lsrs $out1,$out1, #16
113
+ lsrs $tt, $tt, #16
114
+ lsls $tt, $tt, #16
115
+ orrs $out1,$out1,$tt
116
+ MEND
117
+
118
+ ; Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002
119
+ MACRO
120
+ fromBitInterleavingStep $x, $t, $tt, $pMask, $maskofs, $shift
121
+
122
+ ; t = (x ^ (x >> shift)) & mask; x = x ^ t ^ (t << shift);
123
+ lsrs $t, $x, #$shift
124
+ eors $t, $t, $x
125
+ ldr $tt, [$pMask, #$maskofs]
126
+ ands $t, $t, $tt
127
+ eors $x, $x, $t
128
+ lsls $t, $t, #$shift
129
+ eors $x, $x, $t
130
+ MEND
131
+
132
+ MACRO
133
+ fromBitInterleaving $x0, $x1, $t, $tt, $pMask
134
+ movs $t, $x0 ; t = x0
135
+ lsls $x0, $x0, #16 ; x0 = (x0 & 0x0000FFFF) | (x1 << 16);
136
+ lsrs $x0, $x0, #16
137
+ lsls $tt, $x1, #16
138
+ orrs $x0, $x0, $tt
139
+ lsrs $x1, $x1, #16 ; x1 = (t >> 16) | (x1 & 0xFFFF0000);
140
+ lsls $x1, $x1, #16
141
+ lsrs $t, $t, #16
142
+ orrs $x1, $x1, $t
143
+ fromBitInterleavingStep $x0, $t, $tt, $pMask, 0, 8
144
+ fromBitInterleavingStep $x0, $t, $tt, $pMask, 4, 4
145
+ fromBitInterleavingStep $x0, $t, $tt, $pMask, 8, 2
146
+ fromBitInterleavingStep $x0, $t, $tt, $pMask, 12, 1
147
+ fromBitInterleavingStep $x1, $t, $tt, $pMask, 0, 8
148
+ fromBitInterleavingStep $x1, $t, $tt, $pMask, 4, 4
149
+ fromBitInterleavingStep $x1, $t, $tt, $pMask, 8, 2
150
+ fromBitInterleavingStep $x1, $t, $tt, $pMask, 12, 1
151
+ MEND
152
+
153
+ ; --- offsets in state
154
+ Aba0 equ 0*4
155
+ Aba1 equ 1*4
156
+ Abe0 equ 2*4
157
+ Abe1 equ 3*4
158
+ Abi0 equ 4*4
159
+ Abi1 equ 5*4
160
+ Abo0 equ 6*4
161
+ Abo1 equ 7*4
162
+ Abu0 equ 8*4
163
+ Abu1 equ 9*4
164
+ Aga0 equ 10*4
165
+ Aga1 equ 11*4
166
+ Age0 equ 12*4
167
+ Age1 equ 13*4
168
+ Agi0 equ 14*4
169
+ Agi1 equ 15*4
170
+ Ago0 equ 16*4
171
+ Ago1 equ 17*4
172
+ Agu0 equ 18*4
173
+ Agu1 equ 19*4
174
+ Aka0 equ 20*4
175
+ Aka1 equ 21*4
176
+ Ake0 equ 22*4
177
+ Ake1 equ 23*4
178
+ Aki0 equ 24*4
179
+ Aki1 equ 25*4
180
+ Ako0 equ 26*4
181
+ Ako1 equ 27*4
182
+ Aku0 equ 28*4
183
+ Aku1 equ 29*4
184
+ Ama0 equ 30*4
185
+ Ama1 equ 31*4
186
+ Ame0 equ 32*4
187
+ Ame1 equ 33*4
188
+ Ami0 equ 34*4
189
+ Ami1 equ 35*4
190
+ Amo0 equ 36*4
191
+ Amo1 equ 37*4
192
+ Amu0 equ 38*4
193
+ Amu1 equ 39*4
194
+ Asa0 equ 40*4
195
+ Asa1 equ 41*4
196
+ Ase0 equ 42*4
197
+ Ase1 equ 43*4
198
+ Asi0 equ 44*4
199
+ Asi1 equ 45*4
200
+ Aso0 equ 46*4
201
+ Aso1 equ 47*4
202
+ Asu0 equ 48*4
203
+ Asu1 equ 49*4
204
+
205
+ ; --- offsets on stack
206
+ mDa0 equ 0*4
207
+ mDa1 equ 1*4
208
+ mDo0 equ 2*4
209
+ mDo1 equ 3*4
210
+ mDi0 equ 4*4
211
+ mRC equ 5*4
212
+ mSize equ 6*4
213
+
214
+ ; --- macros
215
+
216
+ MACRO
217
+ load $result,$prev,$curr,$last
218
+
219
+ if $prev >= (32*4) :LAND: $curr < (32*4)
220
+ subs r0, #32*4
221
+ elif $prev < (32*4) :LAND: $curr >= (32*4)
222
+ adds r0, #32*4
223
+ endif
224
+ if $curr >= (32*4)
225
+ ldr $result, [r0, #$curr-32*4]
226
+ if $last == 1
227
+ subs r0, #32*4
228
+ endif
229
+ else
230
+ ldr $result, [r0, #$curr]
231
+ endif
232
+ MEND
233
+
234
+ MACRO
235
+ store $result,$prev,$curr,$last
236
+
237
+ if $prev >= (32*4) :LAND: $curr < (32*4)
238
+ subs r0, #32*4
239
+ elif $prev < (32*4) :LAND: $curr >= (32*4)
240
+ adds r0, #32*4
241
+ endif
242
+ if $curr >= (32*4)
243
+ str $result, [r0, #$curr-32*4]
244
+ if $last == 1
245
+ subs r0, #32*4
246
+ endif
247
+ else
248
+ str $result, [r0, #$curr]
249
+ endif
250
+ MEND
251
+
252
+ MACRO
253
+ xor5 $result,$b,$g,$k,$m,$s, $prev, $last
254
+
255
+ load $result, 0, $b, 0
256
+ load r1, $b, $g, 0
257
+ eors $result, $result, r1
258
+ load r1, $g, $k, 0
259
+ eors $result, $result, r1
260
+ load r1, $k, $m, 0
261
+ eors $result, $result, r1
262
+ load r1, $m, $s, 1
263
+ eors $result, $result, r1
264
+ MEND
265
+
266
+ MACRO
267
+ xorrol $result, $aa, $bb
268
+ movs $result, $bb
269
+ rors $result, r2
270
+ eors $result, $result, $aa
271
+ MEND
272
+
273
+ MACRO
274
+ xorrolR2 $aa, $bb
275
+ rors $bb, r2
276
+ eors $bb, $bb, $aa
277
+ MEND
278
+
279
+ MACRO
280
+ xorh $result, $aa, $bb
281
+ mov r1, $bb
282
+ eors r1, r1, $aa
283
+ mov $result, r1
284
+ MEND
285
+
286
+
287
+ MACRO
288
+ xandnot $resofs, $aa, $bb, $cc, $prev, $last
289
+ movs r1, $cc
290
+ bics r1, r1, $bb
291
+ eors r1, r1, $aa
292
+ store r1, $prev, $resofs, $last
293
+ MEND
294
+
295
+ MACRO
296
+ xandnotR4 $resofs, $aa, $bb, $cc, $prev, $last
297
+ bics $cc, $cc, $bb
298
+ eors $cc, $cc, $aa
299
+ store $cc, $prev, $resofs, $last
300
+ MEND
301
+
302
+ MACRO
303
+ KeccakThetaRhoPiChiIota $aA1, $aDax, $aA2, $aDex, $rot2, $aA3, $aDix, $rot3, $aA4, $aDox, $rot4, $aA5, $aDux, $rot5, $offset, $last
304
+ load r3, 0, $aA1, 0
305
+ load r4, $aA1, $aA2, 0
306
+ load r5, $aA2, $aA3, 0
307
+ load r6, $aA3, $aA4, 0
308
+ load r7, $aA4, $aA5, 0
309
+
310
+ mov r1, $aDax
311
+ eors r3, r3, r1
312
+ eors r5, r5, $aDix
313
+ mov r1, $aDex
314
+ eors r4, r4, r1
315
+ mov r1, $aDox
316
+ eors r6, r6, r1
317
+ mov r1, $aDux
318
+ eors r7, r7, r1
319
+ movs r1, #32-$rot2
320
+ rors r4, r1
321
+ movs r1, #32-$rot3
322
+ rors r5, r1
323
+ movs r1, #32-$rot4
324
+ rors r6, r1
325
+ movs r1, #32-$rot5
326
+ rors r7, r1
327
+ xandnot $aA2, r4, r5, r6, $aA5, 0
328
+ xandnot $aA3, r5, r6, r7, $aA2, 0
329
+ xandnot $aA4, r6, r7, r3, $aA3, 0
330
+ xandnot $aA5, r7, r3, r4, $aA4, 1
331
+ ldr r1, [sp, #mRC]
332
+ bics r5, r5, r4
333
+ ldr r4, [r1, #$offset]
334
+ eors r3, r3, r5
335
+ eors r3, r3, r4
336
+ IF $last == 1
337
+ adds r1, #32
338
+ ldr r2, [r1]
339
+ str r1, [sp, #mRC]
340
+ cmp r2, #0xFF
341
+ ENDIF
342
+ str r3, [r0, #$aA1]
343
+ MEND
344
+
345
+ MACRO
346
+ KeccakThetaRhoPiChi $aB1, $aA1, $aDax, $rot1, $aB2, $aA2, $aDex, $rot2, $aB3, $aA3, $aDix, $rot3, $aB4, $aA4, $aDox, $rot4, $aB5, $aA5, $aDux, $rot5
347
+ load $aB1, 0, $aA1, 0
348
+ load $aB2, $aA1, $aA2, 0
349
+ load $aB3, $aA2, $aA3, 0
350
+ load $aB4, $aA3, $aA4, 0
351
+ load $aB5, $aA4, $aA5, 0
352
+
353
+ mov r1, $aDax
354
+ eors $aB1, $aB1, r1
355
+ eors $aB3, $aB3, $aDix
356
+ mov r1, $aDex
357
+ eors $aB2, $aB2, r1
358
+ mov r1, $aDox
359
+ eors $aB4, $aB4, r1
360
+ mov r1, $aDux
361
+ eors $aB5, $aB5, r1
362
+ movs r1, #32-$rot1
363
+ rors $aB1, r1
364
+ IF $rot2 > 0
365
+ movs r1, #32-$rot2
366
+ rors $aB2, r1
367
+ ENDIF
368
+ movs r1, #32-$rot3
369
+ rors $aB3, r1
370
+ movs r1, #32-$rot4
371
+ rors $aB4, r1
372
+ movs r1, #32-$rot5
373
+ rors $aB5, r1
374
+ xandnot $aA1, r3, r4, r5, $aA5, 0
375
+ xandnot $aA2, r4, r5, r6, $aA1, 0
376
+ xandnotR4 $aA5, r7, r3, r4, $aA2, 0
377
+ xandnotR4 $aA4, r6, r7, r3, $aA5, 0
378
+ xandnotR4 $aA3, r5, r6, r7, $aA4, 1
379
+ MEND
380
+
381
+ MACRO
382
+ KeccakRound0
383
+ movs r2, #31
384
+ xor5 r3, Abu0, Agu0, Aku0, Amu0, Asu0, 0, 0
385
+ xor5 r7, Abe1, Age1, Ake1, Ame1, Ase1, Asu0, 0
386
+ xorrol r6, r3, r7
387
+ str r6, [sp, #mDa0]
388
+ xor5 r6, Abu1, Agu1, Aku1, Amu1, Asu1, Ase1, 0
389
+ xor5 r5, Abe0, Age0, Ake0, Ame0, Ase0, Asu1, 0
390
+ xorh r8, r6, r5
391
+ mov lr, r5
392
+ str r1, [sp, #mDa1]
393
+
394
+ xor5 r5, Abi0, Agi0, Aki0, Ami0, Asi0, Ase0, 0
395
+ xorrolR2 r5, r6
396
+ str r6, [sp, #mDo0]
397
+ xor5 r4, Abi1, Agi1, Aki1, Ami1, Asi1, Asi0, 0
398
+ eors r3, r3, r4
399
+ str r3, [sp, #mDo1]
400
+
401
+ xor5 r3, Aba0, Aga0, Aka0, Ama0, Asa0, Asi1, 0
402
+ xorrolR2 r3, r4
403
+ mov r10, r4
404
+ xor5 r6, Aba1, Aga1, Aka1, Ama1, Asa1, Asa0, 0
405
+ xorh r11, r6, r5
406
+
407
+ xor5 r4, Abo1, Ago1, Ako1, Amo1, Aso1, Asa1, 0
408
+ mov r1, lr
409
+ xorrol r5, r1, r4
410
+ str r5, [sp, #mDi0]
411
+ xor5 r5, Abo0, Ago0, Ako0, Amo0, Aso0, Aso1, 1
412
+ eors r7, r7, r5
413
+
414
+ xorrolR2 r5, r6
415
+ mov r12, r6
416
+ eors r4, r4, r3
417
+ mov lr, r4
418
+ movs r2, r7
419
+
420
+ ldr r1, [sp, #mDo0]
421
+ mov r9, r1
422
+ KeccakThetaRhoPiChi r5, Aka1, r8, 2, r6, Ame1, r11, 23, r7, Asi1, r2, 31, r3, Abo0, r9, 14, r4, Agu0, r12, 10
423
+ KeccakThetaRhoPiChi r7, Asa1, r8, 9, r3, Abe0, r10, 0, r4, Agi1, r2, 3, r5, Ako0, r9, 12, r6, Amu1, lr, 4
424
+ ldr r1, [sp, #mDa0]
425
+ mov r8, r1
426
+ KeccakThetaRhoPiChi r4, Aga0, r8, 18, r5, Ake0, r10, 5, r6, Ami1, r2, 8, r7, Aso0, r9, 28, r3, Abu1, lr, 14
427
+ KeccakThetaRhoPiChi r6, Ama0, r8, 20, r7, Ase1, r11, 1, r3, Abi1, r2, 31, r4, Ago0, r9, 27, r5, Aku0, r12, 19
428
+ ldr r1, [sp, #mDo1]
429
+ mov r9, r1
430
+ KeccakThetaRhoPiChiIota Aba0, r8, Age0, r10, 22, Aki1, r2, 22, Amo1, r9, 11, Asu0, r12, 7, 0, 0
431
+
432
+ ldr r2, [sp, #mDi0]
433
+ KeccakThetaRhoPiChi r5, Aka0, r8, 1, r6, Ame0, r10, 22, r7, Asi0, r2, 30, r3, Abo1, r9, 14, r4, Agu1, lr, 10
434
+ KeccakThetaRhoPiChi r7, Asa0, r8, 9, r3, Abe1, r11, 1, r4, Agi0, r2, 3, r5, Ako1, r9, 13, r6, Amu0, r12, 4
435
+ ldr r1, [sp, #mDa1]
436
+ mov r8, r1
437
+ KeccakThetaRhoPiChi r4, Aga1, r8, 18, r5, Ake1, r11, 5, r6, Ami0, r2, 7, r7, Aso1, r9, 28, r3, Abu0, r12, 13
438
+ KeccakThetaRhoPiChi r6, Ama1, r8, 21, r7, Ase0, r10, 1, r3, Abi0, r2, 31, r4, Ago1, r9, 28, r5, Aku1, lr, 20
439
+ ldr r1, [sp, #mDo0]
440
+ mov r9, r1
441
+ KeccakThetaRhoPiChiIota Aba1, r8, Age1, r11, 22, Aki0, r2, 21, Amo0, r9, 10, Asu1, lr, 7, 4, 0
442
+ MEND
443
+
444
+ MACRO
445
+ KeccakRound1
446
+
447
+ movs r2, #31
448
+ xor5 r3, Asu0, Agu0, Amu0, Abu1, Aku1, 0, 0
449
+ xor5 r7, Age1, Ame0, Abe0, Ake1, Ase1, Aku1, 0
450
+ xorrol r6, r3, r7
451
+ str r6, [sp, #mDa0]
452
+ xor5 r6, Asu1, Agu1, Amu1, Abu0, Aku0, Ase1, 0
453
+ xor5 r5, Age0, Ame1, Abe1, Ake0, Ase0, Aku0, 0
454
+ xorh r8, r6, r5
455
+ mov lr, r5
456
+ str r1, [sp, #mDa1]
457
+
458
+ xor5 r5, Aki1, Asi1, Agi0, Ami1, Abi0, Ase0, 0
459
+ xorrolR2 r5, r6
460
+ str r6, [sp, #mDo0]
461
+ xor5 r4, Aki0, Asi0, Agi1, Ami0, Abi1, Abi0, 0
462
+ eors r3, r3, r4
463
+ str r3, [sp, #mDo1]
464
+
465
+ xor5 r3, Aba0, Aka1, Asa0, Aga0, Ama1, Abi1, 0
466
+ xorrolR2 r3, r4
467
+ mov r10, r4
468
+ xor5 r6, Aba1, Aka0, Asa1, Aga1, Ama0, Ama1, 0
469
+ xorh r11, r6, r5
470
+
471
+ xor5 r4, Amo0, Abo1, Ako0, Aso1, Ago0, Ama0, 0
472
+ mov r1, lr
473
+ xorrol r5, r1, r4
474
+ str r5, [sp, #mDi0]
475
+ xor5 r5, Amo1, Abo0, Ako1, Aso0, Ago1, Ago0, 1
476
+ eors r7, r7, r5
477
+
478
+ xorrolR2 r5, r6
479
+ mov r12, r6
480
+ eors r4, r4, r3
481
+ mov lr, r4
482
+ movs r2, r7
483
+
484
+ ldr r1, [sp, #mDo0]
485
+ mov r9, r1
486
+ KeccakThetaRhoPiChi r5, Asa1, r8, 2, r6, Ake1, r11, 23, r7, Abi1, r2, 31, r3, Amo1, r9, 14, r4, Agu0, r12, 10
487
+ KeccakThetaRhoPiChi r7, Ama0, r8, 9, r3, Age0, r10, 0, r4, Asi0, r2, 3, r5, Ako1, r9, 12, r6, Abu0, lr, 4
488
+ ldr r1, [sp, #mDa0]
489
+ mov r8, r1
490
+ KeccakThetaRhoPiChi r4, Aka1, r8, 18, r5, Abe1, r10, 5, r6, Ami0, r2, 8, r7, Ago1, r9, 28, r3, Asu1, lr, 14
491
+ KeccakThetaRhoPiChi r6, Aga0, r8, 20, r7, Ase1, r11, 1, r3, Aki0, r2, 31, r4, Abo0, r9, 27, r5, Amu0, r12, 19
492
+ ldr r1, [sp, #mDo1]
493
+ mov r9, r1
494
+ KeccakThetaRhoPiChiIota Aba0, r8, Ame1, r10, 22, Agi1, r2, 22, Aso1, r9, 11, Aku1, r12, 7, 8, 0
495
+
496
+ ldr r2, [sp, #mDi0]
497
+ KeccakThetaRhoPiChi r5, Asa0, r8, 1, r6, Ake0, r10, 22, r7, Abi0, r2, 30, r3, Amo0, r9, 14, r4, Agu1, lr, 10
498
+ KeccakThetaRhoPiChi r7, Ama1, r8, 9, r3, Age1, r11, 1, r4, Asi1, r2, 3, r5, Ako0, r9, 13, r6, Abu1, r12, 4
499
+ ldr r1, [sp, #mDa1]
500
+ mov r8, r1
501
+ KeccakThetaRhoPiChi r4, Aka0, r8, 18, r5, Abe0, r11, 5, r6, Ami1, r2, 7, r7, Ago0, r9, 28, r3, Asu0, r12, 13
502
+ KeccakThetaRhoPiChi r6, Aga1, r8, 21, r7, Ase0, r10, 1, r3, Aki1, r2, 31, r4, Abo1, r9, 28, r5, Amu1, lr, 20
503
+ ldr r1, [sp, #mDo0]
504
+ mov r9, r1
505
+ KeccakThetaRhoPiChiIota Aba1, r8, Ame0, r11, 22, Agi0, r2, 21, Aso0, r9, 10, Aku0, lr, 7, 12, 0
506
+ MEND
507
+
508
+ MACRO
509
+ KeccakRound2
510
+
511
+ movs r2, #31
512
+ xor5 r3, Aku1, Agu0, Abu1, Asu1, Amu1, 0, 0
513
+ xor5 r7, Ame0, Ake0, Age0, Abe0, Ase1, Amu1, 0
514
+ xorrol r6, r3, r7
515
+ str r6, [sp, #mDa0]
516
+ xor5 r6, Aku0, Agu1, Abu0, Asu0, Amu0, Ase1, 0
517
+ xor5 r5, Ame1, Ake1, Age1, Abe1, Ase0, Amu0, 0
518
+ xorh r8, r6, r5
519
+ mov lr, r5
520
+ str r1, [sp, #mDa1]
521
+
522
+ xor5 r5, Agi1, Abi1, Asi1, Ami0, Aki1, Ase0, 0
523
+ xorrolR2 r5, r6
524
+ str r6, [sp, #mDo0]
525
+ xor5 r4, Agi0, Abi0, Asi0, Ami1, Aki0, Aki1, 0
526
+ eors r3, r3, r4
527
+ str r3, [sp, #mDo1]
528
+
529
+ xor5 r3, Aba0, Asa1, Ama1, Aka1, Aga1, Aki0, 0
530
+ xorrolR2 r3, r4
531
+ mov r10, r4
532
+ xor5 r6, Aba1, Asa0, Ama0, Aka0, Aga0, Aga1, 0
533
+ xorh r11, r6, r5
534
+
535
+ xor5 r4, Aso0, Amo0, Ako1, Ago0, Abo0, Aga0, 0
536
+ mov r1, lr
537
+ xorrol r5, r1, r4
538
+ str r5, [sp, #mDi0]
539
+ xor5 r5, Aso1, Amo1, Ako0, Ago1, Abo1, Abo0, 1
540
+ eors r7, r7, r5
541
+
542
+ xorrolR2 r5, r6
543
+ mov r12, r6
544
+ eors r4, r4, r3
545
+ mov lr, r4
546
+ movs r2, r7
547
+
548
+ ldr r1, [sp, #mDo0]
549
+ mov r9, r1
550
+ KeccakThetaRhoPiChi r5, Ama0, r8, 2, r6, Abe0, r11, 23, r7, Aki0, r2, 31, r3, Aso1, r9, 14, r4, Agu0, r12, 10
551
+ KeccakThetaRhoPiChi r7, Aga0, r8, 9, r3, Ame1, r10, 0, r4, Abi0, r2, 3, r5, Ako0, r9, 12, r6, Asu0, lr, 4
552
+ ldr r1, [sp, #mDa0]
553
+ mov r8, r1
554
+ KeccakThetaRhoPiChi r4, Asa1, r8, 18, r5, Age1, r10, 5, r6, Ami1, r2, 8, r7, Abo1, r9, 28, r3, Aku0, lr, 14
555
+ KeccakThetaRhoPiChi r6, Aka1, r8, 20, r7, Ase1, r11, 1, r3, Agi0, r2, 31, r4, Amo1, r9, 27, r5, Abu1, r12, 19
556
+ ldr r1, [sp, #mDo1]
557
+ mov r9, r1
558
+ KeccakThetaRhoPiChiIota Aba0, r8, Ake1, r10, 22, Asi0, r2, 22, Ago0, r9, 11, Amu1, r12, 7, 16, 0
559
+
560
+ ldr r2, [sp, #mDi0]
561
+ KeccakThetaRhoPiChi r5, Ama1, r8, 1, r6, Abe1, r10, 22, r7, Aki1, r2, 30, r3, Aso0, r9, 14, r4, Agu1, lr, 10
562
+ KeccakThetaRhoPiChi r7, Aga1, r8, 9, r3, Ame0, r11, 1, r4, Abi1, r2, 3, r5, Ako1, r9, 13, r6, Asu1, r12, 4
563
+ ldr r1, [sp, #mDa1]
564
+ mov r8, r1
565
+ KeccakThetaRhoPiChi r4, Asa0, r8, 18, r5, Age0, r11, 5, r6, Ami0, r2, 7, r7, Abo0, r9, 28, r3, Aku1, r12, 13
566
+ KeccakThetaRhoPiChi r6, Aka0, r8, 21, r7, Ase0, r10, 1, r3, Agi1, r2, 31, r4, Amo0, r9, 28, r5, Abu0, lr, 20
567
+ ldr r1, [sp, #mDo0]
568
+ mov r9, r1
569
+ KeccakThetaRhoPiChiIota Aba1, r8, Ake0, r11, 22, Asi1, r2, 21, Ago1, r9, 10, Amu0, lr, 7, 20, 0
570
+ MEND
571
+
572
+ MACRO
573
+ KeccakRound3
574
+
575
+ movs r2, #31
576
+ xor5 r3, Amu1, Agu0, Asu1, Aku0, Abu0, 0, 0
577
+ xor5 r7, Ake0, Abe1, Ame1, Age0, Ase1, Abu0, 0
578
+ xorrol r6, r3, r7
579
+ str r6, [sp, #mDa0]
580
+ xor5 r6, Amu0, Agu1, Asu0, Aku1, Abu1, Ase1, 0
581
+ xor5 r5, Ake1, Abe0, Ame0, Age1, Ase0, Abu1, 0
582
+ xorh r8, r6, r5
583
+ mov lr, r5
584
+ str r1, [sp, #mDa1]
585
+
586
+ xor5 r5, Asi0, Aki0, Abi1, Ami1, Agi1, Ase0, 0
587
+ xorrolR2 r5, r6
588
+ str r6, [sp, #mDo0]
589
+ xor5 r4, Asi1, Aki1, Abi0, Ami0, Agi0, Agi1, 0
590
+ eors r3, r3, r4
591
+ str r3, [sp, #mDo1]
592
+
593
+ xor5 r3, Aba0, Ama0, Aga1, Asa1, Aka0, Agi0, 0
594
+ xorrolR2 r3, r4
595
+ mov r10, r4
596
+ xor5 r6, Aba1, Ama1, Aga0, Asa0, Aka1, Aka0, 0
597
+ xorh r11, r6, r5
598
+
599
+ xor5 r4, Ago1, Aso0, Ako0, Abo0, Amo1, Aka1, 0
600
+ mov r1, lr
601
+ xorrol r5, r1, r4
602
+ str r5, [sp, #mDi0]
603
+ xor5 r5, Ago0, Aso1, Ako1, Abo1, Amo0, Amo1, 1
604
+ eors r7, r7, r5
605
+
606
+ xorrolR2 r5, r6
607
+ mov r12, r6
608
+ eors r4, r4, r3
609
+ mov lr, r4
610
+ movs r2, r7
611
+
612
+ ldr r1, [sp, #mDo0]
613
+ mov r9, r1
614
+ KeccakThetaRhoPiChi r5, Aga0, r8, 2, r6, Age0, r11, 23, r7, Agi0, r2, 31, r3, Ago0, r9, 14, r4, Agu0, r12, 10
615
+ KeccakThetaRhoPiChi r7, Aka1, r8, 9, r3, Ake1, r10, 0, r4, Aki1, r2, 3, r5, Ako1, r9, 12, r6, Aku1, lr, 4
616
+ ldr r1, [sp, #mDa0]
617
+ mov r8, r1
618
+ KeccakThetaRhoPiChi r4, Ama0, r8, 18, r5, Ame0, r10, 5, r6, Ami0, r2, 8, r7, Amo0, r9, 28, r3, Amu0, lr, 14
619
+ KeccakThetaRhoPiChi r6, Asa1, r8, 20, r7, Ase1, r11, 1, r3, Asi1, r2, 31, r4, Aso1, r9, 27, r5, Asu1, r12, 19
620
+ ldr r1, [sp, #mDo1]
621
+ mov r9, r1
622
+ KeccakThetaRhoPiChiIota Aba0, r8, Abe0, r10, 22, Abi0, r2, 22, Abo0, r9, 11, Abu0, r12, 7, 24, 0
623
+
624
+ ldr r2, [sp, #mDi0]
625
+ KeccakThetaRhoPiChi r5, Aga1, r8, 1, r6, Age1, r10, 22, r7, Agi1, r2, 30, r3, Ago1, r9, 14, r4, Agu1, lr, 10
626
+ KeccakThetaRhoPiChi r7, Aka0, r8, 9, r3, Ake0, r11, 1, r4, Aki0, r2, 3, r5, Ako0, r9, 13, r6, Aku0, r12, 4
627
+ ldr r1, [sp, #mDa1]
628
+ mov r8, r1
629
+ KeccakThetaRhoPiChi r4, Ama1, r8, 18, r5, Ame1, r11, 5, r6, Ami1, r2, 7, r7, Amo1, r9, 28, r3, Amu1, r12, 13
630
+ KeccakThetaRhoPiChi r6, Asa0, r8, 21, r7, Ase0, r10, 1, r3, Asi0, r2, 31, r4, Aso0, r9, 28, r5, Asu0, lr, 20
631
+ ldr r1, [sp, #mDo0]
632
+ mov r9, r1
633
+ KeccakThetaRhoPiChiIota Aba1, r8, Abe1, r11, 22, Abi1, r2, 21, Abo1, r9, 10, Abu1, lr, 7, 28, 1
634
+ MEND
635
+
636
+ ;----------------------------------------------------------------------------
637
+ ;
638
+ ; void KeccakP1600_StaticInitialize( void )
639
+ ;
640
+ ALIGN
641
+ EXPORT KeccakP1600_StaticInitialize
642
+ KeccakP1600_StaticInitialize PROC
643
+ bx lr
644
+ ENDP
645
+
646
+ ;----------------------------------------------------------------------------
647
+ ;
648
+ ; void KeccakP1600_Initialize(void *state)
649
+ ;
650
+ ALIGN
651
+ EXPORT KeccakP1600_Initialize
652
+ KeccakP1600_Initialize PROC
653
+ push {r4 - r5}
654
+ movs r1, #0
655
+ movs r2, #0
656
+ movs r3, #0
657
+ movs r4, #0
658
+ movs r5, #0
659
+ stmia r0!, { r1 - r5 }
660
+ stmia r0!, { r1 - r5 }
661
+ stmia r0!, { r1 - r5 }
662
+ stmia r0!, { r1 - r5 }
663
+ stmia r0!, { r1 - r5 }
664
+ stmia r0!, { r1 - r5 }
665
+ stmia r0!, { r1 - r5 }
666
+ stmia r0!, { r1 - r5 }
667
+ stmia r0!, { r1 - r5 }
668
+ stmia r0!, { r1 - r5 }
669
+ pop {r4 - r5}
670
+ bx lr
671
+ ENDP
672
+
673
+ ; ----------------------------------------------------------------------------
674
+ ;
675
+ ; void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
676
+ ;
677
+ ALIGN
678
+ EXPORT KeccakP1600_AddByte
679
+ KeccakP1600_AddByte PROC
680
+ push {r4 - r7}
681
+ mov r4, r8
682
+ mov r5, r9
683
+ push {r4 - r5}
684
+ lsrs r4, r2, #3 ; offset &= ~7
685
+ lsls r4, r4, #3
686
+ adds r0, r0, r4 ; add whole lane offset to state pointer
687
+ lsls r2, r2, #29 ; offset &= 7 (part not lane aligned)
688
+ lsrs r2, r2, #29
689
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
690
+ movs r4, #0
691
+ movs r5, #0
692
+ push { r4 - r5 }
693
+ add r2, r2, sp
694
+ strb r1, [r2]
695
+ pop { r4 - r5 }
696
+ mov r8, r4
697
+ mov r9, r5
698
+ toBitInterleaving r8, r9, r4, r5, r6, r2, r7
699
+ ldr r6, [r0]
700
+ eors r4, r4, r6
701
+ ldr r6, [r0, #4]
702
+ eors r5, r5, r6
703
+ stmia r0!, { r4, r5 }
704
+ pop {r4 - r5}
705
+ mov r8, r4
706
+ mov r9, r5
707
+ pop {r4 - r7}
708
+ bx lr
709
+ ENDP
710
+
711
+ ;----------------------------------------------------------------------------
712
+ ;
713
+ ; void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
714
+ ;
715
+ ALIGN
716
+ EXPORT KeccakP1600_AddBytes
717
+ KeccakP1600_AddBytes PROC
718
+ cmp r3, #0 ; if length != 0
719
+ beq KeccakP1600_AddBytes_Exit1
720
+ push {r4 - r6, lr} ; then
721
+ mov r4, r8
722
+ mov r5, r9
723
+ mov r6, r10
724
+ push {r4 - r7}
725
+ lsrs r4, r2, #3 ; offset &= ~7
726
+ lsls r4, r4, #3
727
+ adds r0, r0, r4 ; add whole lane offset to state pointer
728
+ lsls r2, r2, #29 ; offset &= 7 (part not lane aligned)
729
+ lsrs r2, r2, #29
730
+ beq KeccakP1600_AddBytes_CheckLanes ; if offset != 0
731
+ movs r4, r3 ; then, do remaining bytes in first lane
732
+ movs r5, #8
733
+ subs r5, r2 ; max size in lane = 8 - offset
734
+ cmp r4, r5
735
+ ble KeccakP1600_AddBytes_BytesAlign
736
+ movs r4, r5
737
+ KeccakP1600_AddBytes_BytesAlign
738
+ subs r3, r3, r4 ; size left
739
+ mov r10, r3
740
+ movs r3, r4
741
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
742
+ bl __KeccakP1600_AddBytesInLane
743
+ mov r3, r10
744
+ KeccakP1600_AddBytes_CheckLanes
745
+ lsrs r2, r3, #3 ; if length >= 8
746
+ beq KeccakP1600_AddBytes_Bytes
747
+ mov r10, r3
748
+ adr r3, KeccakP1600_AddBytes_ToBitInterleavingConstants
749
+ bl __KeccakP1600_AddLanes
750
+ mov r3, r10
751
+ lsls r3, r3, #29
752
+ lsrs r3, r3, #29
753
+ KeccakP1600_AddBytes_Bytes
754
+ cmp r3, #0
755
+ beq KeccakP1600_AddBytes_Exit
756
+ movs r2, #0
757
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
758
+ bl __KeccakP1600_AddBytesInLane
759
+ KeccakP1600_AddBytes_Exit
760
+ pop {r4 - r7}
761
+ mov r8, r4
762
+ mov r9, r5
763
+ mov r10, r6
764
+ pop {r4 - r6, pc}
765
+ KeccakP1600_AddBytes_Exit1
766
+ bx lr
767
+ nop
768
+ KeccakP1600_AddBytes_ToBitInterleavingConstants
769
+ dcd 0x55555555
770
+ dcd 0x33333333
771
+ dcd 0x0F0F0F0F
772
+ dcd 0x00FF00FF
773
+ dcd 0xAAAAAAAA
774
+ dcd 0xCCCCCCCC
775
+ dcd 0xF0F0F0F0
776
+ dcd 0xFF00FF00
777
+ ENDP
778
+
779
+ ;----------------------------------------------------------------------------
780
+ ;
781
+ ; __KeccakP1600_AddLanes
782
+ ;
783
+ ; Input:
784
+ ; r0 state pointer
785
+ ; r1 data pointer
786
+ ; r2 laneCount
787
+ ; r3 to bit interleaving constants pointer
788
+ ;
789
+ ; Output:
790
+ ; r0 state pointer next lane
791
+ ; r1 data pointer next byte to input
792
+ ;
793
+ ; Changed: r2-r9
794
+ ;
795
+ ALIGN
796
+ __KeccakP1600_AddLanes PROC
797
+ lsls r4, r1, #30
798
+ bne __KeccakP1600_AddLanes_LoopUnaligned
799
+ __KeccakP1600_AddLanes_LoopAligned
800
+ ldmia r1!, {r6,r7}
801
+ mov r8, r6
802
+ mov r9, r7
803
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
804
+ ldr r5, [r0]
805
+ eors r6, r6, r5
806
+ ldr r5, [r0, #4]
807
+ eors r7, r7, r5
808
+ stmia r0!, {r6,r7}
809
+ subs r2, r2, #1
810
+ bne __KeccakP1600_AddLanes_LoopAligned
811
+ bx lr
812
+ __KeccakP1600_AddLanes_LoopUnaligned
813
+ ldrb r6, [r1, #0]
814
+ ldrb r4, [r1, #1]
815
+ lsls r4, r4, #8
816
+ orrs r6, r6, r4
817
+ ldrb r4, [r1, #2]
818
+ lsls r4, r4, #16
819
+ orrs r6, r6, r4
820
+ ldrb r4, [r1, #3]
821
+ lsls r4, r4, #24
822
+ orrs r6, r6, r4
823
+ ldrb r7, [r1, #4]
824
+ ldrb r4, [r1, #5]
825
+ lsls r4, r4, #8
826
+ orrs r7, r7, r4
827
+ ldrb r4, [r1, #6]
828
+ lsls r4, r4, #16
829
+ orrs r7, r7, r4
830
+ ldrb r4, [r1, #7]
831
+ lsls r4, r4, #24
832
+ orrs r7, r7, r4
833
+ adds r1, r1, #8
834
+ mov r8, r6
835
+ mov r9, r7
836
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
837
+ ldr r5, [r0]
838
+ eors r6, r6, r5
839
+ ldr r5, [r0, #4]
840
+ eors r7, r7, r5
841
+ stmia r0!, {r6, r7}
842
+ subs r2, r2, #1
843
+ bne __KeccakP1600_AddLanes_LoopUnaligned
844
+ bx lr
845
+ ENDP
846
+
847
+ ;----------------------------------------------------------------------------
848
+ ;
849
+ ; __KeccakP1600_AddBytesInLane
850
+ ;
851
+ ; Input:
852
+ ; r0 state pointer
853
+ ; r1 data pointer
854
+ ; r2 offset in lane
855
+ ; r3 length
856
+ ; r7 to bit interleaving constants pointer
857
+ ;
858
+ ; Output:
859
+ ; r0 state pointer next lane
860
+ ; r1 data pointer next byte to input
861
+ ;
862
+ ; Changed: r2-r9
863
+ ;
864
+ ALIGN
865
+ __KeccakP1600_AddBytesInLane PROC
866
+ movs r4, #0
867
+ movs r5, #0
868
+ push { r4 - r5 }
869
+ add r2, r2, sp
870
+ __KeccakP1600_AddBytesInLane_Loop
871
+ ldrb r5, [r1]
872
+ strb r5, [r2]
873
+ adds r1, r1, #1
874
+ adds r2, r2, #1
875
+ subs r3, r3, #1
876
+ bne __KeccakP1600_AddBytesInLane_Loop
877
+ pop { r4 - r5 }
878
+ mov r8, r4
879
+ mov r9, r5
880
+ toBitInterleaving r8, r9, r4, r5, r6, r2, r7
881
+ ldr r6, [r0]
882
+ eors r4, r4, r6
883
+ ldr r6, [r0, #4]
884
+ eors r5, r5, r6
885
+ stmia r0!, { r4, r5 }
886
+ bx lr
887
+ ENDP
888
+
889
+ ;----------------------------------------------------------------------------
890
+ ;
891
+ ; void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
892
+ ;
893
+ ALIGN
894
+ EXPORT KeccakP1600_OverwriteBytes
895
+ KeccakP1600_OverwriteBytes PROC
896
+ cmp r3, #0 ; if length != 0
897
+ beq KeccakP1600_OverwriteBytes_Exit1
898
+ push {r4 - r6, lr} ; then
899
+ mov r4, r8
900
+ mov r5, r9
901
+ mov r6, r10
902
+ push {r4 - r7}
903
+ lsrs r4, r2, #3 ; offset &= ~7
904
+ lsls r4, r4, #3
905
+ adds r0, r0, r4 ; add whole lane offset to state pointer
906
+ lsls r2, r2, #29 ; offset &= 7 (part not lane aligned)
907
+ lsrs r2, r2, #29
908
+ beq KeccakP1600_OverwriteBytes_CheckLanes ; if offset != 0
909
+ movs r4, r3 ; then, do remaining bytes in first lane
910
+ movs r5, #8
911
+ subs r5, r2 ; max size in lane = 8 - offset
912
+ cmp r4, r5
913
+ ble KeccakP1600_OverwriteBytes_BytesAlign
914
+ movs r4, r5
915
+ KeccakP1600_OverwriteBytes_BytesAlign
916
+ subs r3, r3, r4 ; size left
917
+ mov r10, r3
918
+ movs r3, r4
919
+ adr r7, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
920
+ bl __KeccakP1600_OverwriteBytesInLane
921
+ mov r3, r10
922
+ KeccakP1600_OverwriteBytes_CheckLanes
923
+ lsrs r2, r3, #3 ; if length >= 8
924
+ beq KeccakP1600_OverwriteBytes_Bytes
925
+ mov r10, r3
926
+ adr r3, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
927
+ bl __KeccakP1600_OverwriteLanes
928
+ mov r3, r10
929
+ lsls r3, r3, #29
930
+ lsrs r3, r3, #29
931
+ KeccakP1600_OverwriteBytes_Bytes
932
+ cmp r3, #0
933
+ beq KeccakP1600_OverwriteBytes_Exit
934
+ movs r2, #0
935
+ adr r7, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
936
+ bl __KeccakP1600_OverwriteBytesInLane
937
+ KeccakP1600_OverwriteBytes_Exit
938
+ pop {r4 - r7}
939
+ mov r8, r4
940
+ mov r9, r5
941
+ mov r10, r6
942
+ pop {r4 - r6, pc}
943
+ KeccakP1600_OverwriteBytes_Exit1
944
+ bx lr
945
+ nop
946
+ KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
947
+ dcd 0x55555555
948
+ dcd 0x33333333
949
+ dcd 0x0F0F0F0F
950
+ dcd 0x00FF00FF
951
+ dcd 0xAAAAAAAA
952
+ dcd 0xCCCCCCCC
953
+ dcd 0xF0F0F0F0
954
+ dcd 0xFF00FF00
955
+ ENDP
956
+
957
+ ;----------------------------------------------------------------------------
958
+ ;
959
+ ; __KeccakP1600_OverwriteLanes
960
+ ;
961
+ ; Input:
962
+ ; r0 state pointer
963
+ ; r1 data pointer
964
+ ; r2 laneCount
965
+ ; r3 to bit interleaving constants pointer
966
+ ;
967
+ ; Output:
968
+ ; r0 state pointer next lane
969
+ ; r1 data pointer next byte to input
970
+ ;
971
+ ; Changed: r2-r9
972
+ ;
973
+ ALIGN
974
+ __KeccakP1600_OverwriteLanes PROC
975
+ lsls r4, r1, #30
976
+ bne __KeccakP1600_OverwriteLanes_LoopUnaligned
977
+ __KeccakP1600_OverwriteLanes_LoopAligned
978
+ ldmia r1!, {r6,r7}
979
+ mov r8, r6
980
+ mov r9, r7
981
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
982
+ stmia r0!, {r6,r7}
983
+ subs r2, r2, #1
984
+ bne __KeccakP1600_OverwriteLanes_LoopAligned
985
+ bx lr
986
+ __KeccakP1600_OverwriteLanes_LoopUnaligned
987
+ ldrb r6, [r1, #0]
988
+ ldrb r4, [r1, #1]
989
+ lsls r4, r4, #8
990
+ orrs r6, r6, r4
991
+ ldrb r4, [r1, #2]
992
+ lsls r4, r4, #16
993
+ orrs r6, r6, r4
994
+ ldrb r4, [r1, #3]
995
+ lsls r4, r4, #24
996
+ orrs r6, r6, r4
997
+ ldrb r7, [r1, #4]
998
+ ldrb r4, [r1, #5]
999
+ lsls r4, r4, #8
1000
+ orrs r7, r7, r4
1001
+ ldrb r4, [r1, #6]
1002
+ lsls r4, r4, #16
1003
+ orrs r7, r7, r4
1004
+ ldrb r4, [r1, #7]
1005
+ lsls r4, r4, #24
1006
+ orrs r7, r7, r4
1007
+ adds r1, r1, #8
1008
+ mov r8, r6
1009
+ mov r9, r7
1010
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
1011
+ stmia r0!, {r6, r7}
1012
+ subs r2, r2, #1
1013
+ bne __KeccakP1600_OverwriteLanes_LoopUnaligned
1014
+ bx lr
1015
+ ENDP
1016
+
1017
+ ;----------------------------------------------------------------------------
1018
+ ;
1019
+ ; __KeccakP1600_OverwriteBytesInLane
1020
+ ;
1021
+ ; Input:
1022
+ ; r0 state pointer
1023
+ ; r1 data pointer
1024
+ ; r2 offset in lane
1025
+ ; r3 length
1026
+ ; r7 to bit interleaving constants pointer
1027
+ ;
1028
+ ; Output:
1029
+ ; r0 state pointer next lane
1030
+ ; r1 data pointer next byte to input
1031
+ ;
1032
+ ; Changed: r2-r9
1033
+ ;
1034
+ ALIGN
1035
+ __KeccakP1600_OverwriteBytesInLane PROC
1036
+ movs r4, #0
1037
+ movs r5, #0
1038
+ push { r4 - r5 }
1039
+ lsls r6, r2, #2
1040
+ add r2, r2, sp
1041
+ movs r4, #0x0F ;r4 mask to wipe nibbles(bit interleaved bytes) in state
1042
+ lsls r4, r4, r6
1043
+ movs r6, r4
1044
+ __KeccakP1600_OverwriteBytesInLane_Loop
1045
+ orrs r6, r6, r4
1046
+ lsls r4, r4, #4
1047
+ ldrb r5, [r1]
1048
+ strb r5, [r2]
1049
+ adds r1, r1, #1
1050
+ adds r2, r2, #1
1051
+ subs r3, r3, #1
1052
+ bne __KeccakP1600_OverwriteBytesInLane_Loop
1053
+ pop { r4 - r5 }
1054
+ mov r8, r4
1055
+ mov r9, r5
1056
+ toBitInterleaving r8, r9, r4, r5, r3, r2, r7
1057
+ ldr r3, [r0]
1058
+ bics r3, r3, r6
1059
+ eors r4, r4, r3
1060
+ ldr r3, [r0, #4]
1061
+ bics r3, r3, r6
1062
+ eors r5, r5, r3
1063
+ stmia r0!, { r4, r5 }
1064
+ bx lr
1065
+ ENDP
1066
+
1067
+ ;----------------------------------------------------------------------------
1068
+ ;
1069
+ ; void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
1070
+ ;
1071
+ ALIGN
1072
+ EXPORT KeccakP1600_OverwriteWithZeroes
1073
+ KeccakP1600_OverwriteWithZeroes PROC
1074
+ push {r4 - r5}
1075
+ lsrs r2, r1, #3
1076
+ beq KeccakP1600_OverwriteWithZeroes_Bytes
1077
+ movs r4, #0
1078
+ movs r5, #0
1079
+ KeccakP1600_OverwriteWithZeroes_LoopLanes
1080
+ stm r0!, { r4, r5 }
1081
+ subs r2, r2, #1
1082
+ bne KeccakP1600_OverwriteWithZeroes_LoopLanes
1083
+ KeccakP1600_OverwriteWithZeroes_Bytes
1084
+ lsls r1, r1, #32-3
1085
+ beq KeccakP1600_OverwriteWithZeroes_Exit
1086
+ lsrs r1, r1, #32-3
1087
+ movs r3, #0x0F ;r2 already zero, r3 = mask to wipe nibbles(bit interleaved bytes) in state
1088
+ KeccakP1600_OverwriteWithZeroes_LoopBytes
1089
+ orrs r2, r2, r3
1090
+ lsls r3, r3, #4
1091
+ subs r1, r1, #1
1092
+ bne KeccakP1600_OverwriteWithZeroes_LoopBytes
1093
+ ldr r4, [r0]
1094
+ ldr r5, [r0, #4]
1095
+ bics r4, r4, r2
1096
+ bics r5, r5, r2
1097
+ stm r0!, { r4, r5 }
1098
+ KeccakP1600_OverwriteWithZeroes_Exit
1099
+ pop {r4 - r5}
1100
+ bx lr
1101
+ ENDP
1102
+
1103
+ ;----------------------------------------------------------------------------
1104
+ ;
1105
+ ; void KeccakP1600_ExtractBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
1106
+ ;
1107
+ ALIGN
1108
+ EXPORT KeccakP1600_ExtractBytes
1109
+ KeccakP1600_ExtractBytes PROC
1110
+ cmp r3, #0 ; if length != 0
1111
+ beq KeccakP1600_ExtractBytes_Exit1
1112
+ push {r4 - r6, lr} ; then
1113
+ mov r4, r8
1114
+ push {r4, r7}
1115
+ lsrs r4, r2, #3 ; offset &= ~7
1116
+ lsls r4, r4, #3
1117
+ adds r0, r0, r4 ; add whole lane offset to state pointer
1118
+ lsls r2, r2, #29 ; offset &= 7 (part not lane aligned)
1119
+ lsrs r2, r2, #29
1120
+ beq KeccakP1600_ExtractBytes_CheckLanes ; if offset != 0
1121
+ movs r4, r3 ; then, do remaining bytes in first lane
1122
+ movs r5, #8
1123
+ subs r5, r2 ; max size in lane = 8 - offset
1124
+ cmp r4, r5
1125
+ ble KeccakP1600_ExtractBytes_BytesAlign
1126
+ movs r4, r5
1127
+ KeccakP1600_ExtractBytes_BytesAlign
1128
+ subs r3, r3, r4 ; size left
1129
+ mov r8, r3
1130
+ movs r3, r4
1131
+ adr r7, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
1132
+ bl __KeccakP1600_ExtractBytesInLane
1133
+ mov r3, r8
1134
+ KeccakP1600_ExtractBytes_CheckLanes
1135
+ lsrs r2, r3, #3 ; if length >= 8
1136
+ beq KeccakP1600_ExtractBytes_Bytes
1137
+ mov r8, r3
1138
+ adr r3, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
1139
+ bl __KeccakP1600_ExtractLanes
1140
+ mov r3, r8
1141
+ lsls r3, r3, #29
1142
+ lsrs r3, r3, #29
1143
+ KeccakP1600_ExtractBytes_Bytes
1144
+ cmp r3, #0
1145
+ beq KeccakP1600_ExtractBytes_Exit
1146
+ movs r2, #0
1147
+ adr r7, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
1148
+ bl __KeccakP1600_ExtractBytesInLane
1149
+ KeccakP1600_ExtractBytes_Exit
1150
+ pop {r4,r7}
1151
+ mov r8, r4
1152
+ pop {r4 - r6, pc}
1153
+ KeccakP1600_ExtractBytes_Exit1
1154
+ bx lr
1155
+ nop
1156
+ KeccakP1600_ExtractBytes_FromBitInterleavingConstants
1157
+ dcd 0x0000FF00
1158
+ dcd 0x00F000F0
1159
+ dcd 0x0C0C0C0C
1160
+ dcd 0x22222222
1161
+ ENDP
1162
+
1163
+ ;----------------------------------------------------------------------------
1164
+ ;
1165
+ ; __KeccakP1600_ExtractLanes
1166
+ ;
1167
+ ; Input:
1168
+ ; r0 state pointer
1169
+ ; r1 data pointer
1170
+ ; r2 laneCount
1171
+ ; r3 from bit interleaving constants pointer
1172
+ ;
1173
+ ; Output:
1174
+ ; r0 state pointer next lane
1175
+ ; r1 data pointer next byte to output
1176
+ ;
1177
+ ; Changed: r2-r7
1178
+ ;
1179
+ ALIGN
1180
+ __KeccakP1600_ExtractLanes PROC
1181
+ lsls r4, r1, #30
1182
+ bne __KeccakP1600_ExtractLanes_LoopUnaligned
1183
+ __KeccakP1600_ExtractLanes_LoopAligned
1184
+ ldmia r0!, {r6,r7}
1185
+ fromBitInterleaving r6, r7, r5, r4, r3
1186
+ stmia r1!, {r6,r7}
1187
+ subs r2, r2, #1
1188
+ bne __KeccakP1600_ExtractLanes_LoopAligned
1189
+ bx lr
1190
+ __KeccakP1600_ExtractLanes_LoopUnaligned
1191
+ ldmia r0!, {r6,r7}
1192
+ fromBitInterleaving r6, r7, r5, r4, r3
1193
+ strb r6, [r1, #0]
1194
+ lsrs r6, r6, #8
1195
+ strb r6, [r1, #1]
1196
+ lsrs r6, r6, #8
1197
+ strb r6, [r1, #2]
1198
+ lsrs r6, r6, #8
1199
+ strb r6, [r1, #3]
1200
+ strb r7, [r1, #4]
1201
+ lsrs r7, r7, #8
1202
+ strb r7, [r1, #5]
1203
+ lsrs r7, r7, #8
1204
+ strb r7, [r1, #6]
1205
+ lsrs r7, r7, #8
1206
+ strb r7, [r1, #7]
1207
+ adds r1, r1, #8
1208
+ subs r2, r2, #1
1209
+ bne __KeccakP1600_ExtractLanes_LoopUnaligned
1210
+ bx lr
1211
+ ENDP
1212
+
1213
+ ;----------------------------------------------------------------------------
1214
+ ;
1215
+ ; __KeccakP1600_ExtractBytesInLane
1216
+ ;
1217
+ ; Input:
1218
+ ; r0 state pointer
1219
+ ; r1 data pointer
1220
+ ; r2 offset in lane
1221
+ ; r3 length
1222
+ ; r7 from bit interleaving constants pointer
1223
+ ;
1224
+ ; Output:
1225
+ ; r0 state pointer next lane
1226
+ ; r1 data pointer next byte to output
1227
+ ;
1228
+ ; Changed: r2-r7
1229
+ ;
1230
+ ALIGN
1231
+ __KeccakP1600_ExtractBytesInLane PROC
1232
+ ldmia r0!, {r4,r5}
1233
+ push {r0, r3}
1234
+ fromBitInterleaving r4, r5, r0, r3, r7
1235
+ pop {r0, r3}
1236
+ push {r4, r5}
1237
+ mov r4, sp
1238
+ adds r4, r4, r2
1239
+ __KeccakP1600_ExtractBytesInLane_Loop
1240
+ ldrb r2, [r4]
1241
+ adds r4, r4, #1
1242
+ strb r2, [r1]
1243
+ adds r1, r1, #1
1244
+ subs r3, r3, #1
1245
+ bne __KeccakP1600_ExtractBytesInLane_Loop
1246
+ add sp, #8
1247
+ bx lr
1248
+ ENDP
1249
+
1250
+ ;----------------------------------------------------------------------------
1251
+ ;
1252
+ ; void KeccakP1600_ExtractAndAddBytes(void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
1253
+ ;
1254
+ ALIGN
1255
+ EXPORT KeccakP1600_ExtractAndAddBytes
1256
+ KeccakP1600_ExtractAndAddBytes PROC
1257
+ push {r3 - r7, lr}
1258
+ mov r4, r8
1259
+ mov r5, r9
1260
+ push {r4 - r5}
1261
+ mov r9, r2
1262
+ mov r2, r3
1263
+ ldr r3, [sp, #8*4]
1264
+ cmp r3, #0 ; if length != 0
1265
+ beq KeccakP1600_ExtractAndAddBytes_Exit
1266
+ lsrs r4, r2, #3 ; offset &= ~7
1267
+ lsls r4, r4, #3
1268
+ adds r0, r0, r4 ; add whole lane offset to state pointer
1269
+ lsls r2, r2, #29 ; offset &= 7 (part not lane aligned)
1270
+ lsrs r2, r2, #29
1271
+ beq KeccakP1600_ExtractAndAddBytes_CheckLanes ; if offset != 0
1272
+ movs r4, r3 ; then, do remaining bytes in first lane
1273
+ movs r5, #8
1274
+ subs r5, r2 ; max size in lane = 8 - offset
1275
+ cmp r4, r5
1276
+ ble KeccakP1600_ExtractAndAddBytes_BytesAlign
1277
+ movs r4, r5
1278
+ KeccakP1600_ExtractAndAddBytes_BytesAlign
1279
+ subs r3, r3, r4 ; size left
1280
+ mov r8, r3
1281
+ movs r3, r4
1282
+ adr r7, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1283
+ bl __KeccakP1600_ExtractAndAddBytesInLane
1284
+ mov r3, r8
1285
+ KeccakP1600_ExtractAndAddBytes_CheckLanes
1286
+ lsrs r2, r3, #3 ; if length >= 8
1287
+ beq KeccakP1600_ExtractAndAddBytes_Bytes
1288
+ mov r8, r3
1289
+ adr r3, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1290
+ bl __KeccakP1600_ExtractAndAddLanes
1291
+ mov r3, r8
1292
+ lsls r3, r3, #29
1293
+ lsrs r3, r3, #29
1294
+ KeccakP1600_ExtractAndAddBytes_Bytes
1295
+ cmp r3, #0
1296
+ beq KeccakP1600_ExtractAndAddBytes_Exit
1297
+ movs r2, #0
1298
+ adr r7, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1299
+ bl __KeccakP1600_ExtractAndAddBytesInLane
1300
+ KeccakP1600_ExtractAndAddBytes_Exit
1301
+ pop {r4 - r5}
1302
+ mov r8, r4
1303
+ mov r9, r5
1304
+ pop {r3 - r7, pc}
1305
+ ALIGN
1306
+ KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1307
+ dcd 0x0000FF00
1308
+ dcd 0x00F000F0
1309
+ dcd 0x0C0C0C0C
1310
+ dcd 0x22222222
1311
+ ENDP
1312
+
1313
+ ;----------------------------------------------------------------------------
1314
+ ;
1315
+ ; __KeccakP1600_ExtractAndAddLanes
1316
+ ;
1317
+ ; Input:
1318
+ ; r0 state pointer
1319
+ ; r1 in pointer
1320
+ ; r2 laneCount
1321
+ ; r3 from bit interleaving constants pointer
1322
+ ; r9 out pointer
1323
+ ;
1324
+ ; Output:
1325
+ ; r0 state pointer next lane
1326
+ ; r1 in pointer (next lane)
1327
+ ; r9 out pointer (next lane)
1328
+ ;
1329
+ ; Changed: r2-r7
1330
+ ;
1331
+ ALIGN
1332
+ __KeccakP1600_ExtractAndAddLanes PROC
1333
+ lsls r4, r1, #30
1334
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1335
+ mov r4, r9
1336
+ lsls r4, r4, #30
1337
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1338
+ __KeccakP1600_ExtractAndAddLanes_LoopAligned
1339
+ ldmia r0!, {r6,r7}
1340
+ fromBitInterleaving r6, r7, r5, r4, r3
1341
+ mov r4, r9
1342
+ ldm r1!, {r5}
1343
+ eors r6, r6, r5
1344
+ ldm r1!, {r5}
1345
+ eors r7, r7, r5
1346
+ stmia r4!, {r6,r7}
1347
+ mov r9, r4
1348
+ subs r2, r2, #1
1349
+ bne __KeccakP1600_ExtractAndAddLanes_LoopAligned
1350
+ bx lr
1351
+ __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1352
+ ldmia r0!, {r6,r7}
1353
+ fromBitInterleaving r6, r7, r5, r4, r3
1354
+ mov r4, r9
1355
+ ldrb r5, [r1, #0]
1356
+ eors r5, r5, r6
1357
+ strb r5, [r4, #0]
1358
+ lsrs r6, r6, #8
1359
+ ldrb r5, [r1, #1]
1360
+ eors r5, r5, r6
1361
+ strb r5, [r4, #1]
1362
+ lsrs r6, r6, #8
1363
+ ldrb r5, [r1, #2]
1364
+ eors r5, r5, r6
1365
+ strb r5, [r4, #2]
1366
+ lsrs r6, r6, #8
1367
+ ldrb r5, [r1, #3]
1368
+ eors r5, r5, r6
1369
+ strb r5, [r4, #3]
1370
+ ldrb r5, [r1, #4]
1371
+ eors r5, r5, r7
1372
+ strb r5, [r4, #4]
1373
+ lsrs r7, r7, #8
1374
+ ldrb r5, [r1, #5]
1375
+ eors r5, r5, r7
1376
+ strb r5, [r4, #5]
1377
+ lsrs r7, r7, #8
1378
+ ldrb r5, [r1, #6]
1379
+ eors r5, r5, r7
1380
+ strb r5, [r4, #6]
1381
+ lsrs r7, r7, #8
1382
+ ldrb r5, [r1, #7]
1383
+ eors r5, r5, r7
1384
+ strb r5, [r4, #7]
1385
+ adds r1, r1, #8
1386
+ adds r4, r4, #8
1387
+ mov r9, r4
1388
+ subs r2, r2, #1
1389
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1390
+ bx lr
1391
+ ENDP
1392
+
1393
+ ;----------------------------------------------------------------------------
1394
+ ;
1395
+ ; __KeccakP1600_ExtractAndAddBytesInLane
1396
+ ;
1397
+ ; Input:
1398
+ ; r0 state pointer
1399
+ ; r1 data pointer
1400
+ ; r2 offset in lane
1401
+ ; r3 length
1402
+ ; r7 from bit interleaving constants pointer
1403
+ ; r9 out pointer
1404
+ ;
1405
+ ; Output:
1406
+ ; r0 state pointer next lane
1407
+ ; r1 in pointer (next byte)
1408
+ ; r9 out pointer (next byte)
1409
+ ;
1410
+ ; Changed: r2-r7
1411
+ ;
1412
+ ALIGN
1413
+ __KeccakP1600_ExtractAndAddBytesInLane PROC
1414
+ ldmia r0!, {r4,r5}
1415
+ push {r0, r3}
1416
+ fromBitInterleaving r4, r5, r0, r3, r7
1417
+ pop {r0, r3}
1418
+ push {r4, r5}
1419
+ mov r4, sp
1420
+ adds r4, r4, r2
1421
+ mov r6, r9
1422
+ __KeccakP1600_ExtractAndAddBytesInLane_Loop
1423
+ ldrb r2, [r4]
1424
+ adds r4, r4, #1
1425
+ ldrb r5, [r1]
1426
+ eors r2, r2, r5
1427
+ strb r2, [r6]
1428
+ adds r1, r1, #1
1429
+ adds r6, r6, #1
1430
+ subs r3, r3, #1
1431
+ bne __KeccakP1600_ExtractAndAddBytesInLane_Loop
1432
+ add sp, #8
1433
+ mov r9, r6
1434
+ bx lr
1435
+ ENDP
1436
+
1437
+
1438
+ MACRO
1439
+ ldrf $result,$offset
1440
+ if $offset >= 128
1441
+ ldr $result, [r5, #$offset-128]
1442
+ else
1443
+ ldr $result, [r0, #$offset]
1444
+ endif
1445
+ MEND
1446
+
1447
+ MACRO
1448
+ strf $result,$offset
1449
+ if $offset >= 128
1450
+ str $result, [r5, #$offset-128]
1451
+ else
1452
+ str $result, [r0, #$offset]
1453
+ endif
1454
+ MEND
1455
+
1456
+ MACRO
1457
+ SwapPI13 $in0,$in1,$in2,$in3,$eo0,$eo1,$eo2,$eo3
1458
+ ldrf r3, $in0+0
1459
+ ldrf r4, $in0+4
1460
+ ldrf r2, $in1+0
1461
+ ldrf r1, $in1+4
1462
+ strf r2, $in0+$eo0*4
1463
+ strf r1, $in0+($eo0^1)*4
1464
+ ldrf r2, $in2+0
1465
+ ldrf r1, $in2+4
1466
+ strf r2, $in1+$eo1*4
1467
+ strf r1, $in1+($eo1^1)*4
1468
+ ldrf r2, $in3+0
1469
+ ldrf r1, $in3+4
1470
+ strf r2, $in2+$eo2*4
1471
+ strf r1, $in2+($eo2^1)*4
1472
+ strf r3, $in3+$eo3*4
1473
+ strf r4, $in3+($eo3^1)*4
1474
+ MEND
1475
+
1476
+ MACRO
1477
+ SwapPI2 $in0,$in1,$in2,$in3
1478
+ ldrf r3, $in0+0
1479
+ ldrf r4, $in0+4
1480
+ ldrf r2, $in1+0
1481
+ ldrf r1, $in1+4
1482
+ strf r2, $in0+4
1483
+ strf r1, $in0+0
1484
+ strf r3, $in1+4
1485
+ strf r4, $in1+0
1486
+ ldrf r3, $in2+0
1487
+ ldrf r4, $in2+4
1488
+ ldrf r2, $in3+0
1489
+ ldrf r1, $in3+4
1490
+ strf r2, $in2+4
1491
+ strf r1, $in2+0
1492
+ strf r3, $in3+4
1493
+ strf r4, $in3+0
1494
+ MEND
1495
+
1496
+ MACRO
1497
+ SwapEO $even,$odd
1498
+ ldrf r3, $even
1499
+ ldrf r4, $odd
1500
+ strf r3, $odd
1501
+ strf r4, $even
1502
+ MEND
1503
+
1504
+ ; ----------------------------------------------------------------------------
1505
+ ;
1506
+ ; void KeccakP1600_Permute_Nrounds(void *state, unsigned int nrounds)
1507
+ ;
1508
+ ALIGN
1509
+ EXPORT KeccakP1600_Permute_Nrounds
1510
+ KeccakP1600_Permute_Nrounds PROC
1511
+ lsls r2, r1, #30
1512
+ bne KeccakP1600_Permute_NroundsNotMultiple4
1513
+ lsls r2, r1, #3
1514
+ adr r1, KeccakP1600_Permute_RoundConstants0Mod4
1515
+ subs r1, r1, r2
1516
+ b KeccakP1600_Permute
1517
+ KeccakP1600_Permute_NroundsNotMultiple4 ; nrounds not multiple of 4
1518
+ push { r4 - r6, lr }
1519
+ mov r2, r8
1520
+ mov r3, r9
1521
+ mov r4, r10
1522
+ mov r5, r11
1523
+ mov r6, r12
1524
+ push { r2 - r7 }
1525
+ sub sp, #mSize
1526
+ mov r3, r1
1527
+ lsrs r2, r1, #2
1528
+ lsls r2, r2, #3+2
1529
+ adr r1, KeccakP1600_Permute_RoundConstants0
1530
+ subs r1, r1, r2
1531
+ str r1, [sp, #mRC]
1532
+ mov r5, r0
1533
+ adds r5, r5, #128
1534
+ lsls r3, r3, #31
1535
+ bcs KeccakP1600_Permute_Nrounds23Mod4
1536
+ KeccakP1600_Permute_Nrounds1Mod4
1537
+ SwapPI13 Aga0, Aka0, Asa0, Ama0, 1, 0, 1, 0
1538
+ SwapPI13 Abe0, Age0, Ame0, Ake0, 0, 1, 0, 1
1539
+ SwapPI13 Abi0, Aki0, Agi0, Asi0, 1, 0, 1, 0
1540
+ SwapEO Ami0, Ami1
1541
+ SwapPI13 Abo0, Amo0, Aso0, Ago0, 1, 0, 1, 0
1542
+ SwapEO Ako0, Ako1
1543
+ SwapPI13 Abu0, Asu0, Aku0, Amu0, 0, 1, 0, 1
1544
+ ldr r1, =KeccakP1600_Permute_Round1Mod4+1
1545
+ bx r1
1546
+ ALIGN
1547
+ LTORG
1548
+ KeccakP1600_Permute_Nrounds23Mod4
1549
+ bpl KeccakP1600_Permute_Nrounds2Mod4
1550
+ KeccakP1600_Permute_Nrounds3Mod4
1551
+ SwapPI13 Aga0, Ama0, Asa0, Aka0, 0, 1, 0, 1
1552
+ SwapPI13 Abe0, Ake0, Ame0, Age0, 1, 0, 1, 0
1553
+ SwapPI13 Abi0, Asi0, Agi0, Aki0, 0, 1, 0, 1
1554
+ SwapEO Ami0, Ami1
1555
+ SwapPI13 Abo0, Ago0, Aso0, Amo0, 0, 1, 0, 1
1556
+ SwapEO Ako0, Ako1
1557
+ SwapPI13 Abu0, Amu0, Aku0, Asu0, 1, 0, 1, 0
1558
+ ldr r1, =KeccakP1600_Permute_Round3Mod4+1
1559
+ bx r1
1560
+ ALIGN
1561
+ LTORG
1562
+ KeccakP1600_Permute_Nrounds2Mod4
1563
+ SwapPI2 Aga0, Asa0, Aka0, Ama0
1564
+ SwapPI2 Abe0, Ame0, Age0, Ake0
1565
+ SwapPI2 Abi0, Agi0, Aki0, Asi0
1566
+ SwapPI2 Abo0, Aso0, Ago0, Amo0
1567
+ SwapPI2 Abu0, Aku0, Amu0, Asu0
1568
+ ldr r1, =KeccakP1600_Permute_Round2Mod4+1
1569
+ bx r1
1570
+ ALIGN
1571
+ LTORG
1572
+ ENDP
1573
+
1574
+ ; ----------------------------------------------------------------------------
1575
+ ;
1576
+ ; void KeccakP1600_Permute_12rounds( void *state )
1577
+ ;
1578
+ ALIGN
1579
+ EXPORT KeccakP1600_Permute_12rounds
1580
+ KeccakP1600_Permute_12rounds PROC
1581
+ adr r1, KeccakP1600_Permute_RoundConstants12
1582
+ b KeccakP1600_Permute
1583
+ ENDP
1584
+
1585
+ ; ----------------------------------------------------------------------------
1586
+ ;
1587
+ ; void KeccakP1600_Permute_24rounds( void *state )
1588
+ ;
1589
+ ALIGN
1590
+ EXPORT KeccakP1600_Permute_24rounds
1591
+ KeccakP1600_Permute_24rounds PROC
1592
+ adr r1, KeccakP1600_Permute_RoundConstants24
1593
+ b KeccakP1600_Permute
1594
+ ENDP
1595
+
1596
+ ALIGN
1597
+ KeccakP1600_Permute_RoundConstants24
1598
+ ; 0 1
1599
+ dcd 0x00000001, 0x00000000
1600
+ dcd 0x00000000, 0x00000089
1601
+ dcd 0x00000000, 0x8000008b
1602
+ dcd 0x00000000, 0x80008080
1603
+ dcd 0x00000001, 0x0000008b
1604
+ dcd 0x00000001, 0x00008000
1605
+ dcd 0x00000001, 0x80008088
1606
+ dcd 0x00000001, 0x80000082
1607
+ dcd 0x00000000, 0x0000000b
1608
+ dcd 0x00000000, 0x0000000a
1609
+ dcd 0x00000001, 0x00008082
1610
+ dcd 0x00000000, 0x00008003
1611
+ KeccakP1600_Permute_RoundConstants12
1612
+ dcd 0x00000001, 0x0000808b
1613
+ dcd 0x00000001, 0x8000000b
1614
+ dcd 0x00000001, 0x8000008a
1615
+ dcd 0x00000001, 0x80000081
1616
+ dcd 0x00000000, 0x80000081
1617
+ dcd 0x00000000, 0x80000008
1618
+ dcd 0x00000000, 0x00000083
1619
+ dcd 0x00000000, 0x80008003
1620
+ KeccakP1600_Permute_RoundConstants0
1621
+ dcd 0x00000001, 0x80008088
1622
+ dcd 0x00000000, 0x80000088
1623
+ dcd 0x00000001, 0x00008000
1624
+ dcd 0x00000000, 0x80008082
1625
+ KeccakP1600_Permute_RoundConstants0Mod4
1626
+ dcd 0x000000FF ;terminator
1627
+
1628
+ ;----------------------------------------------------------------------------
1629
+ ;
1630
+ ; void KeccakP1600_Permute( void *state, void * rc )
1631
+ ;
1632
+ ALIGN
1633
+ KeccakP1600_Permute PROC
1634
+ push { r4 - r6, lr }
1635
+ mov r2, r8
1636
+ mov r3, r9
1637
+ mov r4, r10
1638
+ mov r5, r11
1639
+ mov r6, r12
1640
+ push { r2 - r7 }
1641
+ sub sp, #mSize
1642
+ str r1, [sp, #mRC]
1643
+ KeccakP1600_Permute_RoundLoop
1644
+ KeccakRound0
1645
+ KeccakP1600_Permute_Round3Mod4
1646
+ KeccakRound1
1647
+ KeccakP1600_Permute_Round2Mod4
1648
+ KeccakRound2
1649
+ KeccakP1600_Permute_Round1Mod4
1650
+ KeccakRound3
1651
+ beq KeccakP1600_Permute_Done
1652
+ ldr r1, =KeccakP1600_Permute_RoundLoop+1
1653
+ bx r1
1654
+ LTORG
1655
+ KeccakP1600_Permute_Done
1656
+ add sp, #mSize
1657
+ pop { r1 - r5, r7 }
1658
+ mov r8, r1
1659
+ mov r9, r2
1660
+ mov r10, r3
1661
+ mov r11, r4
1662
+ mov r12, r5
1663
+ pop { r4 - r6, pc }
1664
+ ENDP
1665
+
1666
+ END