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