sleeping_kangaroo12 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+