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