sleeping_kangaroo12 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +127 -0
  3. data/ext/Rakefile +73 -0
  4. data/ext/binding/sleeping_kangaroo12.c +39 -0
  5. data/ext/config/xkcp.build +17 -0
  6. data/ext/xkcp/LICENSE +1 -0
  7. data/ext/xkcp/Makefile +15 -0
  8. data/ext/xkcp/Makefile.build +200 -0
  9. data/ext/xkcp/README.markdown +296 -0
  10. data/ext/xkcp/lib/HighLevel.build +143 -0
  11. data/ext/xkcp/lib/LowLevel.build +757 -0
  12. data/ext/xkcp/lib/common/align.h +33 -0
  13. data/ext/xkcp/lib/common/brg_endian.h +143 -0
  14. data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.c +301 -0
  15. data/ext/xkcp/lib/high/KangarooTwelve/KangarooTwelve.h +97 -0
  16. data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.c +81 -0
  17. data/ext/xkcp/lib/high/Keccak/FIPS202/KeccakHash.h +125 -0
  18. data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.c +48 -0
  19. data/ext/xkcp/lib/high/Keccak/FIPS202/SimpleFIPS202.h +79 -0
  20. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.c +81 -0
  21. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.h +73 -0
  22. data/ext/xkcp/lib/high/Keccak/KeccakDuplex.inc +195 -0
  23. data/ext/xkcp/lib/high/Keccak/KeccakSponge.c +111 -0
  24. data/ext/xkcp/lib/high/Keccak/KeccakSponge.h +76 -0
  25. data/ext/xkcp/lib/high/Keccak/KeccakSponge.inc +314 -0
  26. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.c +61 -0
  27. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.h +67 -0
  28. data/ext/xkcp/lib/high/Keccak/PRG/KeccakPRG.inc +128 -0
  29. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.c +93 -0
  30. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.h +599 -0
  31. data/ext/xkcp/lib/high/Keccak/SP800-185/SP800-185.inc +573 -0
  32. data/ext/xkcp/lib/high/Ketje/Ketjev2.c +87 -0
  33. data/ext/xkcp/lib/high/Ketje/Ketjev2.h +88 -0
  34. data/ext/xkcp/lib/high/Ketje/Ketjev2.inc +274 -0
  35. data/ext/xkcp/lib/high/Keyak/Keyakv2.c +132 -0
  36. data/ext/xkcp/lib/high/Keyak/Keyakv2.h +217 -0
  37. data/ext/xkcp/lib/high/Keyak/Keyakv2.inc +81 -0
  38. data/ext/xkcp/lib/high/Keyak/Motorist.inc +953 -0
  39. data/ext/xkcp/lib/high/Kravatte/Kravatte.c +533 -0
  40. data/ext/xkcp/lib/high/Kravatte/Kravatte.h +115 -0
  41. data/ext/xkcp/lib/high/Kravatte/KravatteModes.c +557 -0
  42. data/ext/xkcp/lib/high/Kravatte/KravatteModes.h +247 -0
  43. data/ext/xkcp/lib/high/Xoodyak/Cyclist.h +66 -0
  44. data/ext/xkcp/lib/high/Xoodyak/Cyclist.inc +336 -0
  45. data/ext/xkcp/lib/high/Xoodyak/Xoodyak-parameters.h +26 -0
  46. data/ext/xkcp/lib/high/Xoodyak/Xoodyak.c +55 -0
  47. data/ext/xkcp/lib/high/Xoodyak/Xoodyak.h +35 -0
  48. data/ext/xkcp/lib/high/Xoofff/Xoofff.c +634 -0
  49. data/ext/xkcp/lib/high/Xoofff/Xoofff.h +147 -0
  50. data/ext/xkcp/lib/high/Xoofff/XoofffModes.c +483 -0
  51. data/ext/xkcp/lib/high/Xoofff/XoofffModes.h +241 -0
  52. data/ext/xkcp/lib/high/common/Phases.h +25 -0
  53. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-SnP.h +41 -0
  54. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-armcc.s +1666 -0
  55. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv6m-le-gcc.s +1655 -0
  56. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-armcc.s +1268 -0
  57. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7a-le-gcc.s +1264 -0
  58. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-armcc.s +1178 -0
  59. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-inplace-32bi-armv7m-le-gcc.s +1175 -0
  60. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-armcc.s +1338 -0
  61. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u1-32bi-armv6m-le-gcc.s +1336 -0
  62. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-armcc.s +1343 -0
  63. data/ext/xkcp/lib/low/KeccakP-1600/ARM/KeccakP-1600-u2-32bi-armv6m-le-gcc.s +1339 -0
  64. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-SnP.h +42 -0
  65. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-armcc.s +823 -0
  66. data/ext/xkcp/lib/low/KeccakP-1600/ARMv7A-NEON/KeccakP-1600-armv7a-le-neon-gcc.s +831 -0
  67. data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-SnP.h +31 -0
  68. data/ext/xkcp/lib/low/KeccakP-1600/ARMv8A/KeccakP-1600-armv8a-neon.s +540 -0
  69. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-SnP.h +42 -0
  70. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-compact.s +733 -0
  71. data/ext/xkcp/lib/low/KeccakP-1600/AVR8/KeccakP-1600-avr8-fast.s +1121 -0
  72. data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-AVX2.s +1100 -0
  73. data/ext/xkcp/lib/low/KeccakP-1600/AVX2/KeccakP-1600-SnP.h +52 -0
  74. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-AVX512.c +623 -0
  75. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/KeccakP-1600-SnP.h +47 -0
  76. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u12/KeccakP-1600-AVX512-config.h +6 -0
  77. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/u6/KeccakP-1600-AVX512-config.h +6 -0
  78. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/C/ua/KeccakP-1600-AVX512-config.h +6 -0
  79. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-AVX512.s +1031 -0
  80. data/ext/xkcp/lib/low/KeccakP-1600/AVX512/KeccakP-1600-SnP.h +53 -0
  81. data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-SnP.h +44 -0
  82. data/ext/xkcp/lib/low/KeccakP-1600/XOP/KeccakP-1600-XOP.c +476 -0
  83. data/ext/xkcp/lib/low/KeccakP-1600/XOP/u6/KeccakP-1600-XOP-config.h +6 -0
  84. data/ext/xkcp/lib/low/KeccakP-1600/XOP/ua/KeccakP-1600-XOP-config.h +6 -0
  85. data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-64.macros +748 -0
  86. data/ext/xkcp/lib/low/KeccakP-1600/common/KeccakP-1600-unrolling.macros +305 -0
  87. data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-SnP.h +40 -0
  88. data/ext/xkcp/lib/low/KeccakP-1600/compact/KeccakP-1600-compact64.c +420 -0
  89. data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-SnP.h +43 -0
  90. data/ext/xkcp/lib/low/KeccakP-1600/plain-32bits-inplace/KeccakP-1600-inplace32BI.c +1163 -0
  91. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-SnP.h +54 -0
  92. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/KeccakP-1600-opt64.c +565 -0
  93. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcu6/KeccakP-1600-opt64-config.h +7 -0
  94. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua/KeccakP-1600-opt64-config.h +7 -0
  95. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/lcua-shld/KeccakP-1600-opt64-config.h +8 -0
  96. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/u6/KeccakP-1600-opt64-config.h +6 -0
  97. data/ext/xkcp/lib/low/KeccakP-1600/plain-64bits/ua/KeccakP-1600-opt64-config.h +6 -0
  98. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-SnP.h +44 -0
  99. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference.h +23 -0
  100. data/ext/xkcp/lib/low/KeccakP-1600/ref-32bits/KeccakP-1600-reference32BI.c +625 -0
  101. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-SnP.h +44 -0
  102. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.c +440 -0
  103. data/ext/xkcp/lib/low/KeccakP-1600/ref-64bits/KeccakP-1600-reference.h +23 -0
  104. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-SnP.h +42 -0
  105. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas.s +1196 -0
  106. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-gas_Apple.s +1124 -0
  107. data/ext/xkcp/lib/low/KeccakP-1600/x86-64/KeccakP-1600-x86-64-shld-gas.s +1196 -0
  108. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-armcc.s +1392 -0
  109. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-inplace-pl2-armv7a-neon-le-gcc.s +1394 -0
  110. data/ext/xkcp/lib/low/KeccakP-1600-times2/ARMv7A-NEON/KeccakP-1600-times2-SnP.h +42 -0
  111. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u12/SIMD512-2-config.h +7 -0
  112. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512u4/SIMD512-2-config.h +7 -0
  113. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/AVX512ufull/SIMD512-2-config.h +7 -0
  114. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SIMD512.c +850 -0
  115. data/ext/xkcp/lib/low/KeccakP-1600-times2/AVX512/KeccakP-1600-times2-SnP.h +51 -0
  116. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SIMD128.c +957 -0
  117. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/KeccakP-1600-times2-SnP.h +49 -0
  118. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-u2/SIMD128-config.h +8 -0
  119. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/SSSE3-ua/SIMD128-config.h +8 -0
  120. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-u2/SIMD128-config.h +9 -0
  121. data/ext/xkcp/lib/low/KeccakP-1600-times2/SIMD128/XOP-ua/SIMD128-config.h +9 -0
  122. data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-SnP.h +45 -0
  123. data/ext/xkcp/lib/low/KeccakP-1600-times2/fallback-on1/KeccakP-1600-times2-on1.c +37 -0
  124. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SIMD256.c +1321 -0
  125. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/KeccakP-1600-times4-SnP.h +55 -0
  126. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u12/SIMD256-config.h +7 -0
  127. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/u6/SIMD256-config.h +7 -0
  128. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX2/ua/SIMD256-config.h +7 -0
  129. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u12/SIMD512-4-config.h +7 -0
  130. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512u4/SIMD512-4-config.h +7 -0
  131. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/AVX512ufull/SIMD512-4-config.h +7 -0
  132. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SIMD512.c +881 -0
  133. data/ext/xkcp/lib/low/KeccakP-1600-times4/AVX512/KeccakP-1600-times4-SnP.h +51 -0
  134. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-SnP.h +45 -0
  135. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on1/KeccakP-1600-times4-on1.c +37 -0
  136. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-SnP.h +45 -0
  137. data/ext/xkcp/lib/low/KeccakP-1600-times4/fallback-on2/KeccakP-1600-times4-on2.c +38 -0
  138. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SIMD512.c +1615 -0
  139. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/KeccakP-1600-times8-SnP.h +57 -0
  140. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u12/SIMD512-config.h +7 -0
  141. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/u4/SIMD512-config.h +7 -0
  142. data/ext/xkcp/lib/low/KeccakP-1600-times8/AVX512/ua/SIMD512-config.h +7 -0
  143. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-SnP.h +45 -0
  144. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on1/KeccakP-1600-times8-on1.c +37 -0
  145. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-SnP.h +45 -0
  146. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on2/KeccakP-1600-times8-on2.c +38 -0
  147. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-SnP.h +45 -0
  148. data/ext/xkcp/lib/low/KeccakP-1600-times8/fallback-on4/KeccakP-1600-times8-on4.c +38 -0
  149. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-SnP.h +41 -0
  150. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-armcc.s +442 -0
  151. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv6m-le-gcc.s +446 -0
  152. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-armcc.s +419 -0
  153. data/ext/xkcp/lib/low/KeccakP-200/ARM/KeccakP-200-armv7m-le-gcc.s +427 -0
  154. data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-SnP.h +41 -0
  155. data/ext/xkcp/lib/low/KeccakP-200/AVR8/KeccakP-200-avr8-fast.s +647 -0
  156. data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-SnP.h +39 -0
  157. data/ext/xkcp/lib/low/KeccakP-200/compact/KeccakP-200-compact.c +190 -0
  158. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-SnP.h +43 -0
  159. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.c +412 -0
  160. data/ext/xkcp/lib/low/KeccakP-200/ref/KeccakP-200-reference.h +23 -0
  161. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-SnP.h +41 -0
  162. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-armcc.s +454 -0
  163. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv6m-le-gcc.s +458 -0
  164. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-armcc.s +455 -0
  165. data/ext/xkcp/lib/low/KeccakP-400/ARM/KeccakP-400-armv7m-le-gcc.s +458 -0
  166. data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-SnP.h +41 -0
  167. data/ext/xkcp/lib/low/KeccakP-400/AVR8/KeccakP-400-avr8-fast.s +728 -0
  168. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-SnP.h +43 -0
  169. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.c +414 -0
  170. data/ext/xkcp/lib/low/KeccakP-400/ref/KeccakP-400-reference.h +23 -0
  171. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-SnP.h +42 -0
  172. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-armcc.s +527 -0
  173. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u1-armv6m-le-gcc.s +533 -0
  174. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-armcc.s +528 -0
  175. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv6m-le-gcc.s +534 -0
  176. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-armcc.s +521 -0
  177. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7a-le-gcc.s +527 -0
  178. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-armcc.s +517 -0
  179. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-u2-armv7m-le-gcc.s +523 -0
  180. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-armcc.s +550 -0
  181. data/ext/xkcp/lib/low/KeccakP-800/ARM/KeccakP-800-uf-armv7m-le-gcc.s +556 -0
  182. data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-SnP.h +32 -0
  183. data/ext/xkcp/lib/low/KeccakP-800/ARMv8A/KeccakP-800-armv8a-neon.s +432 -0
  184. data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-SnP.h +42 -0
  185. data/ext/xkcp/lib/low/KeccakP-800/AVR8/KeccakP-800-avr8-fast.s +929 -0
  186. data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-SnP.h +40 -0
  187. data/ext/xkcp/lib/low/KeccakP-800/compact/KeccakP-800-compact.c +244 -0
  188. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-SnP.h +46 -0
  189. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32-bis.macros +184 -0
  190. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.c +454 -0
  191. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-opt32.macros +459 -0
  192. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling-bis.macros +83 -0
  193. data/ext/xkcp/lib/low/KeccakP-800/plain/KeccakP-800-unrolling.macros +88 -0
  194. data/ext/xkcp/lib/low/KeccakP-800/plain/lcu2/KeccakP-800-opt32-config.h +7 -0
  195. data/ext/xkcp/lib/low/KeccakP-800/plain/lcua/KeccakP-800-opt32-config.h +7 -0
  196. data/ext/xkcp/lib/low/KeccakP-800/plain/u2/KeccakP-800-opt32-config.h +7 -0
  197. data/ext/xkcp/lib/low/KeccakP-800/plain/ua/KeccakP-800-opt32-config.h +7 -0
  198. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-SnP.h +44 -0
  199. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.c +437 -0
  200. data/ext/xkcp/lib/low/KeccakP-800/ref/KeccakP-800-reference.h +23 -0
  201. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/Ket.h +57 -0
  202. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-armcc.s +475 -0
  203. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeJr-armv7m-le-gcc.s +480 -0
  204. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-armcc.s +590 -0
  205. data/ext/xkcp/lib/low/Ketje/OptimizedAsmARM/KetjeSr-armv7m-le-gcc.s +590 -0
  206. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.c +126 -0
  207. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.h +68 -0
  208. data/ext/xkcp/lib/low/Ketje/OptimizedLE/Ket.inc +174 -0
  209. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.c +80 -0
  210. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.h +68 -0
  211. data/ext/xkcp/lib/low/Ketje/SnP-compliant/Ket.inc +142 -0
  212. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-SnP.h +55 -0
  213. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-armcc.s +1086 -0
  214. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-u1-armv6m-le-gcc.s +1092 -0
  215. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-armcc.s +721 -0
  216. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv6-le-gcc.s +726 -0
  217. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-armcc.s +723 -0
  218. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodoo-uf-armv7m-le-gcc.s +729 -0
  219. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-armcc.s +1164 -0
  220. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-u1-armv6m-le-gcc.s +1165 -0
  221. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-armcc.s +562 -0
  222. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv6-le-gcc.s +563 -0
  223. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-armcc.s +563 -0
  224. data/ext/xkcp/lib/low/Xoodoo/ARM/Xoodyak-uf-armv7m-le-gcc.s +565 -0
  225. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-SnP.h +55 -0
  226. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-armcc.s +476 -0
  227. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodoo-uf-armv7a-neon-le-gcc.s +485 -0
  228. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-armcc.s +362 -0
  229. data/ext/xkcp/lib/low/Xoodoo/ARMv7A-NEON/Xoodyak-uf-armv7a-neon-le-gcc.s +367 -0
  230. data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-SnP.h +43 -0
  231. data/ext/xkcp/lib/low/Xoodoo/AVR8/Xoodoo-avr8-u1.s +1341 -0
  232. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SIMD512.c +581 -0
  233. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodoo-SnP.h +58 -0
  234. data/ext/xkcp/lib/low/Xoodoo/AVX512/Xoodyak-full-block-SIMD512.c +332 -0
  235. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SIMD128.c +329 -0
  236. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodoo-SnP.h +53 -0
  237. data/ext/xkcp/lib/low/Xoodoo/SSE2/Xoodyak-full-block-SIMD128.c +355 -0
  238. data/ext/xkcp/lib/low/Xoodoo/Xoodoo.h +79 -0
  239. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-SnP.h +56 -0
  240. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodoo-optimized.c +399 -0
  241. data/ext/xkcp/lib/low/Xoodoo/plain/Xoodyak-full-blocks.c +127 -0
  242. data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-SnP.h +43 -0
  243. data/ext/xkcp/lib/low/Xoodoo/ref/Xoodoo-reference.c +253 -0
  244. data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SIMD512.c +1044 -0
  245. data/ext/xkcp/lib/low/Xoodoo-times16/AVX512/Xoodoo-times16-SnP.h +49 -0
  246. data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-SnP.h +45 -0
  247. data/ext/xkcp/lib/low/Xoodoo-times16/fallback-on1/Xoodoo-times16-on1.c +37 -0
  248. data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-ARMv7A.s +1587 -0
  249. data/ext/xkcp/lib/low/Xoodoo-times4/ARMv7A-NEON/Xoodoo-times4-SnP.h +48 -0
  250. data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SIMD512.c +1202 -0
  251. data/ext/xkcp/lib/low/Xoodoo-times4/AVX512/Xoodoo-times4-SnP.h +48 -0
  252. data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SIMD128.c +484 -0
  253. data/ext/xkcp/lib/low/Xoodoo-times4/SSSE3/Xoodoo-times4-SnP.h +44 -0
  254. data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-SnP.h +45 -0
  255. data/ext/xkcp/lib/low/Xoodoo-times4/fallback-on1/Xoodoo-times4-on1.c +37 -0
  256. data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SIMD256.c +939 -0
  257. data/ext/xkcp/lib/low/Xoodoo-times8/AVX2/Xoodoo-times8-SnP.h +49 -0
  258. data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SIMD512.c +1216 -0
  259. data/ext/xkcp/lib/low/Xoodoo-times8/AVX512/Xoodoo-times8-SnP.h +48 -0
  260. data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-SnP.h +45 -0
  261. data/ext/xkcp/lib/low/Xoodoo-times8/fallback-on1/Xoodoo-times8-on1.c +37 -0
  262. data/ext/xkcp/lib/low/common/PlSnP-Fallback.inc +290 -0
  263. data/ext/xkcp/lib/low/common/SnP-Relaned.h +141 -0
  264. data/ext/xkcp/support/Build/ExpandProducts.xsl +79 -0
  265. data/ext/xkcp/support/Build/ToGlobalMakefile.xsl +206 -0
  266. data/ext/xkcp/support/Build/ToOneTarget.xsl +89 -0
  267. data/ext/xkcp/support/Build/ToTargetConfigFile.xsl +37 -0
  268. data/ext/xkcp/support/Build/ToTargetMakefile.xsl +298 -0
  269. data/ext/xkcp/support/Build/ToVCXProj.xsl +198 -0
  270. data/ext/xkcp/support/Kernel-PMU/Kernel-pmu.md +133 -0
  271. data/ext/xkcp/support/Kernel-PMU/Makefile +8 -0
  272. data/ext/xkcp/support/Kernel-PMU/enable_arm_pmu.c +129 -0
  273. data/ext/xkcp/support/Kernel-PMU/load-module +1 -0
  274. data/ext/xkcp/util/KeccakSum/KeccakSum.c +394 -0
  275. data/ext/xkcp/util/KeccakSum/base64.c +86 -0
  276. data/ext/xkcp/util/KeccakSum/base64.h +12 -0
  277. data/lib/sleeping_kangaroo12/binding.rb +15 -0
  278. data/lib/sleeping_kangaroo12/build/loader.rb +40 -0
  279. data/lib/sleeping_kangaroo12/build/platform.rb +37 -0
  280. data/lib/sleeping_kangaroo12/build.rb +4 -0
  281. data/lib/sleeping_kangaroo12/digest.rb +103 -0
  282. data/lib/sleeping_kangaroo12/version.rb +5 -0
  283. data/lib/sleeping_kangaroo12.rb +7 -0
  284. metadata +372 -0
@@ -0,0 +1,1339 @@
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 _ba0 , 0*4
153
+ .equ _ba1 , 1*4
154
+ .equ _be0 , 2*4
155
+ .equ _be1 , 3*4
156
+ .equ _bi0 , 4*4
157
+ .equ _bi1 , 5*4
158
+ .equ _bo0 , 6*4
159
+ .equ _bo1 , 7*4
160
+ .equ _bu0 , 8*4
161
+ .equ _bu1 , 9*4
162
+ .equ _ga0 , 10*4
163
+ .equ _ga1 , 11*4
164
+ .equ _ge0 , 12*4
165
+ .equ _ge1 , 13*4
166
+ .equ _gi0 , 14*4
167
+ .equ _gi1 , 15*4
168
+ .equ _go0 , 16*4
169
+ .equ _go1 , 17*4
170
+ .equ _gu0 , 18*4
171
+ .equ _gu1 , 19*4
172
+ .equ _ka0 , 20*4
173
+ .equ _ka1 , 21*4
174
+ .equ _ke0 , 22*4
175
+ .equ _ke1 , 23*4
176
+ .equ _ki0 , 24*4
177
+ .equ _ki1 , 25*4
178
+ .equ _ko0 , 26*4
179
+ .equ _ko1 , 27*4
180
+ .equ _ku0 , 28*4
181
+ .equ _ku1 , 29*4
182
+ .equ _ma0 , 30*4
183
+ .equ _ma1 , 31*4
184
+ .equ _me0 , 32*4
185
+ .equ _me1 , 33*4
186
+ .equ _mi0 , 34*4
187
+ .equ _mi1 , 35*4
188
+ .equ _mo0 , 36*4
189
+ .equ _mo1 , 37*4
190
+ .equ _mu0 , 38*4
191
+ .equ _mu1 , 39*4
192
+ .equ _sa0 , 40*4
193
+ .equ _sa1 , 41*4
194
+ .equ _se0 , 42*4
195
+ .equ _se1 , 43*4
196
+ .equ _si0 , 44*4
197
+ .equ _si1 , 45*4
198
+ .equ _so0 , 46*4
199
+ .equ _so1 , 47*4
200
+ .equ _su0 , 48*4
201
+ .equ _su1 , 49*4
202
+
203
+ @ --- offsets on stack
204
+ .equ mEs , 0 @ Secondary state
205
+ .equ mD , 25*2*4
206
+ .equ mDo0 , mD+0*4
207
+ .equ mDo1 , mD+1*4
208
+ .equ mDu0 , mD+2*4
209
+ .equ mDu1 , mD+3*4
210
+ .equ mRC , mD+4*4
211
+ .equ mRFU , mD+5*4
212
+ .equ mSize , mD+6*4
213
+
214
+ @ --- macros
215
+
216
+ .macro load reg, stkIn, offset
217
+ .if \stkIn == 1
218
+ ldr \reg, [sp, #\offset]
219
+ .else
220
+ .if \offset >= _ma0
221
+ ldr \reg, [r7, #\offset-_ma0]
222
+ .else
223
+ ldr \reg, [r0, #\offset]
224
+ .endif
225
+ .endif
226
+ .endm
227
+
228
+ .macro store reg, stkIn, offset
229
+ .if \stkIn == 0
230
+ str \reg, [sp, #\offset]
231
+ .else
232
+ .if \offset >= _ma0
233
+ str \reg, [r7, #\offset-_ma0]
234
+ .else
235
+ str \reg, [r0, #\offset]
236
+ .endif
237
+ .endif
238
+ .endm
239
+
240
+ .macro xor5 stkIn, result,b,g,k,m,s
241
+ load \result, \stkIn, \b
242
+ load r6, \stkIn, \g
243
+ eors \result, \result, r6
244
+ load r6, \stkIn, \k
245
+ eors \result, \result, r6
246
+ load r6, \stkIn, \m
247
+ eors \result, \result, r6
248
+ load r6, \stkIn, \s
249
+ eors \result, \result, r6
250
+ .endm
251
+
252
+ .macro te0m oD, rCp0, rCn1
253
+ rors \rCn1, \rCn1, r4
254
+ eors \rCn1, \rCn1, \rCp0
255
+ str \rCn1, [sp, #\oD]
256
+ .endm
257
+
258
+ .macro te1m oD, rCp1, rCn0
259
+ eors \rCn0, \rCn0, \rCp1
260
+ str \rCn0, [sp, #\oD]
261
+ .endm
262
+
263
+ .macro te0r rD, rCp0, rCn1
264
+ rors \rCn1, \rCn1, r4
265
+ eors \rCn1, \rCn1, \rCp0
266
+ mov \rD, \rCn1
267
+ .endm
268
+
269
+ .macro te1r rD, rCp1, rCn0
270
+ eors \rCn0, \rCn0, \rCp1
271
+ mov \rD, \rCn0
272
+ .endm
273
+
274
+ .macro trp1 stkIn, b, ofS, orD, fD, rot
275
+ load \b, \stkIn, \ofS
276
+ .if \fD != 0
277
+ mov r6, \orD
278
+ .else
279
+ ldr r6, [sp, #\orD]
280
+ .endif
281
+ eors \b, \b, r6
282
+ .if \rot != 0
283
+ movs r6, #32-\rot
284
+ rors \b, \b, r6
285
+ .endif
286
+ .endm
287
+
288
+ .macro trp5 stkIn, oS0, orD0, fD0, oR0, oS1, orD1, fD1, oR1, oS2, orD2, fD2, oR2, oS3, orD3, fD3, oR3, oS4, orD4, fD4, oR4
289
+ trp1 \stkIn, r1, \oS0, \orD0, \fD0, \oR0
290
+ trp1 \stkIn, r2, \oS1, \orD1, \fD1, \oR1
291
+ trp1 \stkIn, r3, \oS2, \orD2, \fD2, \oR2
292
+ trp1 \stkIn, r4, \oS3, \orD3, \fD3, \oR3
293
+ trp1 \stkIn, r5, \oS4, \orD4, \fD4, \oR4
294
+ .endm
295
+
296
+ .macro chio1 stkIn, oOut, ax0, ax1, ax2, iota, useax2
297
+ .if \useax2 != 0
298
+ bics \ax2, \ax2, \ax1 @ A[x+2] = A[x+2] & ~A[x+1]
299
+ eors \ax2, \ax2, \ax0 @ A[x+2] = A[x+2] ^ A[x]
300
+ .if \iota != 0xFF
301
+ ldr r1, [sp, #mRC]
302
+ ldr r4, [r1, #\iota]
303
+ eors \ax2, \ax2, r4
304
+ .endif
305
+ store \ax2, \stkIn, \oOut
306
+ .else
307
+ mov r6, \ax2 @ T1 = A[x+2]
308
+ bics r6, r6, \ax1 @ T1 = T1 & ~A[x+1]
309
+ eors r6, r6, \ax0 @ T1 = T1 ^ A[x]
310
+ store r6, \stkIn, \oOut
311
+ .endif
312
+ .endm
313
+
314
+ .macro chio5 stkIn, oOut, iota
315
+ chio1 \stkIn, \oOut+8*4, r5, r1, r2, 0xFF, 0
316
+ chio1 \stkIn, \oOut+6*4, r4, r5, r1, 0xFF, 0
317
+ chio1 \stkIn, \oOut+4*4, r3, r4, r5, 0xFF, 1
318
+ chio1 \stkIn, \oOut+2*4, r2, r3, r4, 0xFF, 1
319
+ chio1 \stkIn, \oOut+0*4, r1, r2, r3, \iota, 1
320
+ .endm
321
+
322
+ .macro Kround stkIn, iota
323
+
324
+ @ prepare Theta
325
+ movs r4, #31
326
+
327
+ xor5 \stkIn, r1, _be1, _ge1, _ke1, _me1, _se1
328
+ xor5 \stkIn, r2, _bu0, _gu0, _ku0, _mu0, _su0
329
+ mov r6, r1
330
+ te0r r8, r2, r6
331
+
332
+ xor5 \stkIn, r3, _bi1, _gi1, _ki1, _mi1, _si1
333
+ te1m mDo1, r3, r2
334
+
335
+ xor5 \stkIn, r2, _ba0, _ga0, _ka0, _ma0, _sa0
336
+ te0r r10, r2, r3
337
+
338
+ xor5 \stkIn, r3, _bo1, _go1, _ko1, _mo1, _so1
339
+ te1m mDu1, r3, r2
340
+
341
+ xor5 \stkIn, r2, _be0, _ge0, _ke0, _me0, _se0
342
+ te0r r12, r2, r3
343
+
344
+ xor5 \stkIn, r3, _bu1, _gu1, _ku1, _mu1, _su1
345
+ te1r r9, r3, r2
346
+
347
+ xor5 \stkIn, r2, _bi0, _gi0, _ki0, _mi0, _si0
348
+ te0m mDo0, r2, r3
349
+
350
+ xor5 \stkIn, r3, _ba1, _ga1, _ka1, _ma1, _sa1
351
+ te1r r11, r3, r2
352
+
353
+ xor5 \stkIn, r2, _bo0, _go0, _ko0, _mo0, _so0
354
+ te0m mDu0, r2, r3
355
+ te1r lr, r1, r2
356
+
357
+ trp5 \stkIn, _bi0, r12, 1, 31, _go1, mDo1, 0, 28, _ku1, mDu1, 0, 20, _ma1, r9, 1, 21, _se0, r10, 1, 1
358
+ chio5 \stkIn, _sa0, 0xFF
359
+ trp5 \stkIn, _bi1, lr, 1, 31, _go0, mDo0, 0, 27, _ku0, mDu0, 0, 19, _ma0, r8, 1, 20, _se1, r11, 1, 1
360
+ chio5 \stkIn, _sa1, 0xFF
361
+
362
+ trp5 \stkIn, _bu1, mDu1, 0, 14, _ga0, r8, 1, 18, _ke0, r10, 1, 5, _mi1, lr, 1, 8, _so0, mDo0, 0, 28
363
+ chio5 \stkIn, _ma0, 0xFF
364
+ trp5 \stkIn, _bu0, mDu0, 0, 13, _ga1, r9, 1, 18, _ke1, r11, 1, 5, _mi0, r12, 1, 7, _so1, mDo1, 0, 28
365
+ chio5 \stkIn, _ma1, 0xFF
366
+
367
+ trp5 \stkIn, _be1, r11, 1, 1, _gi0, r12, 1, 3, _ko1, mDo1, 0, 13, _mu0, mDu0, 0, 4, _sa0, r8, 1, 9
368
+ chio5 \stkIn, _ka0, 0xFF
369
+ trp5 \stkIn, _be0, r10, 1, 0, _gi1, lr, 1, 3, _ko0, mDo0, 0, 12, _mu1, mDu1, 0, 4, _sa1, r9, 1, 9
370
+ chio5 \stkIn, _ka1, 0xFF
371
+
372
+ trp5 \stkIn, _bo0, mDo0, 0, 14, _gu0, mDu0, 0, 10, _ka1, r9, 1, 2, _me1, r11, 1, 23, _si1, lr, 1, 31
373
+ chio5 \stkIn, _ga0, 0xFF
374
+ trp5 \stkIn, _bo1, mDo1, 0, 14, _gu1, mDu1, 0, 10, _ka0, r8, 1, 1, _me0, r10, 1, 22, _si0, r12, 1, 30
375
+ chio5 \stkIn, _ga1, 0xFF
376
+
377
+ trp5 \stkIn, _ba0, r8, 1, 0, _ge0, r10, 1, 22, _ki1, lr, 1, 22, _mo1, mDo1, 0, 11, _su0, mDu0, 0, 7
378
+ chio5 \stkIn, _ba0, \iota+0
379
+ trp5 \stkIn, _ba1, r9, 1, 0, _ge1, r11, 1, 22, _ki0, r12, 1, 21, _mo0, mDo0, 0, 10, _su1, mDu1, 0, 7
380
+ chio5 \stkIn, _ba1, \iota+4
381
+ .endm
382
+
383
+ @----------------------------------------------------------------------------
384
+ @
385
+ @ void KeccakP1600_StaticInitialize( void )
386
+ @
387
+ .align 8
388
+ .global KeccakP1600_StaticInitialize
389
+ .type KeccakP1600_StaticInitialize, %function;
390
+ KeccakP1600_StaticInitialize:
391
+ bx lr
392
+
393
+
394
+ @----------------------------------------------------------------------------
395
+ @
396
+ @ void KeccakP1600_Initialize(void *state)
397
+ @
398
+ .align 8
399
+ .global KeccakP1600_Initialize
400
+ .type KeccakP1600_Initialize, %function;
401
+ KeccakP1600_Initialize:
402
+ push {r4 - r5}
403
+ movs r1, #0
404
+ movs r2, #0
405
+ movs r3, #0
406
+ movs r4, #0
407
+ movs r5, #0
408
+ stmia r0!, { r1 - r5 }
409
+ stmia r0!, { r1 - r5 }
410
+ stmia r0!, { r1 - r5 }
411
+ stmia r0!, { r1 - r5 }
412
+ stmia r0!, { r1 - r5 }
413
+ stmia r0!, { r1 - r5 }
414
+ stmia r0!, { r1 - r5 }
415
+ stmia r0!, { r1 - r5 }
416
+ stmia r0!, { r1 - r5 }
417
+ stmia r0!, { r1 - r5 }
418
+ pop {r4 - r5}
419
+ bx lr
420
+
421
+
422
+ @ ----------------------------------------------------------------------------
423
+ @
424
+ @ void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
425
+ @
426
+ .align 8
427
+ .global KeccakP1600_AddByte
428
+ .type KeccakP1600_AddByte, %function;
429
+ KeccakP1600_AddByte:
430
+ push {r4 - r7}
431
+ mov r4, r8
432
+ mov r5, r9
433
+ push {r4 - r5}
434
+ lsrs r4, r2, #3 @ offset &= ~7
435
+ lsls r4, r4, #3
436
+ adds r0, r0, r4 @ add whole lane offset to state pointer
437
+ lsls r2, r2, #29 @ offset &= 7 (part not lane aligned)
438
+ lsrs r2, r2, #29
439
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
440
+ movs r4, #0
441
+ movs r5, #0
442
+ push { r4 - r5 }
443
+ add r2, r2, sp
444
+ strb r1, [r2]
445
+ pop { r4 - r5 }
446
+ mov r8, r4
447
+ mov r9, r5
448
+ toBitInterleaving r8, r9, r4, r5, r6, r2, r7
449
+ ldr r6, [r0]
450
+ eors r4, r4, r6
451
+ ldr r6, [r0, #4]
452
+ eors r5, r5, r6
453
+ stmia r0!, { r4, r5 }
454
+ pop {r4 - r5}
455
+ mov r8, r4
456
+ mov r9, r5
457
+ pop {r4 - r7}
458
+ bx lr
459
+
460
+
461
+ @----------------------------------------------------------------------------
462
+ @
463
+ @ void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
464
+ @
465
+ .align 8
466
+ .global KeccakP1600_AddBytes
467
+ .type KeccakP1600_AddBytes, %function;
468
+ KeccakP1600_AddBytes:
469
+ cmp r3, #0 @ .if length != 0
470
+ beq KeccakP1600_AddBytes_Exit1
471
+ push {r4 - r6, lr} @ then
472
+ mov r4, r8
473
+ mov r5, r9
474
+ mov r6, r10
475
+ push {r4 - r7}
476
+ lsrs r4, r2, #3 @ offset &= ~7
477
+ lsls r4, r4, #3
478
+ adds r0, r0, r4 @ add whole lane offset to state pointer
479
+ lsls r2, r2, #29 @ offset &= 7 (part not lane aligned)
480
+ lsrs r2, r2, #29
481
+ beq KeccakP1600_AddBytes_CheckLanes @ .if offset != 0
482
+ movs r4, r3 @ then, do remaining bytes in first lane
483
+ movs r5, #8
484
+ subs r5, r2 @ max size in lane = 8 - offset
485
+ cmp r4, r5
486
+ ble KeccakP1600_AddBytes_BytesAlign
487
+ movs r4, r5
488
+ KeccakP1600_AddBytes_BytesAlign:
489
+ subs r3, r3, r4 @ size left
490
+ mov r10, r3
491
+ movs r3, r4
492
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
493
+ bl __KeccakP1600_AddBytesInLane
494
+ mov r3, r10
495
+ KeccakP1600_AddBytes_CheckLanes:
496
+ lsrs r2, r3, #3 @ .if length >= 8
497
+ beq KeccakP1600_AddBytes_Bytes
498
+ mov r10, r3
499
+ adr r3, KeccakP1600_AddBytes_ToBitInterleavingConstants
500
+ bl __KeccakP1600_AddLanes
501
+ mov r3, r10
502
+ lsls r3, r3, #29
503
+ lsrs r3, r3, #29
504
+ KeccakP1600_AddBytes_Bytes:
505
+ cmp r3, #0
506
+ beq KeccakP1600_AddBytes_Exit
507
+ movs r2, #0
508
+ adr r7, KeccakP1600_AddBytes_ToBitInterleavingConstants
509
+ bl __KeccakP1600_AddBytesInLane
510
+ KeccakP1600_AddBytes_Exit:
511
+ pop {r4 - r7}
512
+ mov r8, r4
513
+ mov r9, r5
514
+ mov r10, r6
515
+ pop {r4 - r6, pc}
516
+ KeccakP1600_AddBytes_Exit1:
517
+ bx lr
518
+ nop
519
+ KeccakP1600_AddBytes_ToBitInterleavingConstants:
520
+ .long 0x55555555
521
+ .long 0x33333333
522
+ .long 0x0F0F0F0F
523
+ .long 0x00FF00FF
524
+ .long 0xAAAAAAAA
525
+ .long 0xCCCCCCCC
526
+ .long 0xF0F0F0F0
527
+ .long 0xFF00FF00
528
+
529
+
530
+ @----------------------------------------------------------------------------
531
+ @
532
+ @ __KeccakP1600_AddLanes
533
+ @
534
+ @ Input:
535
+ @ r0 state pointer
536
+ @ r1 data pointer
537
+ @ r2 laneCount
538
+ @ r3 to bit interleaving constants pointer
539
+ @
540
+ @ Output:
541
+ @ r0 state pointer next lane
542
+ @ r1 data pointer next byte to input
543
+ @
544
+ @ Changed: r2-r9
545
+ @
546
+ .align 8
547
+ __KeccakP1600_AddLanes:
548
+ lsls r4, r1, #30
549
+ bne __KeccakP1600_AddLanes_LoopUnaligned
550
+ __KeccakP1600_AddLanes_LoopAligned:
551
+ ldmia r1!, {r6,r7}
552
+ mov r8, r6
553
+ mov r9, r7
554
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
555
+ ldr r5, [r0]
556
+ eors r6, r6, r5
557
+ ldr r5, [r0, #4]
558
+ eors r7, r7, r5
559
+ stmia r0!, {r6,r7}
560
+ subs r2, r2, #1
561
+ bne __KeccakP1600_AddLanes_LoopAligned
562
+ bx lr
563
+ __KeccakP1600_AddLanes_LoopUnaligned:
564
+ ldrb r6, [r1, #0]
565
+ ldrb r4, [r1, #1]
566
+ lsls r4, r4, #8
567
+ orrs r6, r6, r4
568
+ ldrb r4, [r1, #2]
569
+ lsls r4, r4, #16
570
+ orrs r6, r6, r4
571
+ ldrb r4, [r1, #3]
572
+ lsls r4, r4, #24
573
+ orrs r6, r6, r4
574
+ ldrb r7, [r1, #4]
575
+ ldrb r4, [r1, #5]
576
+ lsls r4, r4, #8
577
+ orrs r7, r7, r4
578
+ ldrb r4, [r1, #6]
579
+ lsls r4, r4, #16
580
+ orrs r7, r7, r4
581
+ ldrb r4, [r1, #7]
582
+ lsls r4, r4, #24
583
+ orrs r7, r7, r4
584
+ adds r1, r1, #8
585
+ mov r8, r6
586
+ mov r9, r7
587
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
588
+ ldr r5, [r0]
589
+ eors r6, r6, r5
590
+ ldr r5, [r0, #4]
591
+ eors r7, r7, r5
592
+ stmia r0!, {r6, r7}
593
+ subs r2, r2, #1
594
+ bne __KeccakP1600_AddLanes_LoopUnaligned
595
+ bx lr
596
+
597
+
598
+ @----------------------------------------------------------------------------
599
+ @
600
+ @ __KeccakP1600_AddBytesInLane
601
+ @
602
+ @ Input:
603
+ @ r0 state pointer
604
+ @ r1 data pointer
605
+ @ r2 offset in lane
606
+ @ r3 length
607
+ @ r7 to bit interleaving constants pointer
608
+ @
609
+ @ Output:
610
+ @ r0 state pointer next lane
611
+ @ r1 data pointer next byte to input
612
+ @
613
+ @ Changed: r2-r9
614
+ @
615
+ .align 8
616
+ __KeccakP1600_AddBytesInLane:
617
+ movs r4, #0
618
+ movs r5, #0
619
+ push { r4 - r5 }
620
+ add r2, r2, sp
621
+ __KeccakP1600_AddBytesInLane_Loop:
622
+ ldrb r5, [r1]
623
+ strb r5, [r2]
624
+ adds r1, r1, #1
625
+ adds r2, r2, #1
626
+ subs r3, r3, #1
627
+ bne __KeccakP1600_AddBytesInLane_Loop
628
+ pop { r4 - r5 }
629
+ mov r8, r4
630
+ mov r9, r5
631
+ toBitInterleaving r8, r9, r4, r5, r6, r2, r7
632
+ ldr r6, [r0]
633
+ eors r4, r4, r6
634
+ ldr r6, [r0, #4]
635
+ eors r5, r5, r6
636
+ stmia r0!, { r4, r5 }
637
+ bx lr
638
+
639
+
640
+ @----------------------------------------------------------------------------
641
+ @
642
+ @ void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
643
+ @
644
+ .align 8
645
+ .global KeccakP1600_OverwriteBytes
646
+ .type KeccakP1600_OverwriteBytes, %function;
647
+ KeccakP1600_OverwriteBytes:
648
+ cmp r3, #0 @ .if length != 0
649
+ beq KeccakP1600_OverwriteBytes_Exit1
650
+ push {r4 - r6, lr} @ then
651
+ mov r4, r8
652
+ mov r5, r9
653
+ mov r6, r10
654
+ push {r4 - r7}
655
+ lsrs r4, r2, #3 @ offset &= ~7
656
+ lsls r4, r4, #3
657
+ adds r0, r0, r4 @ add whole lane offset to state pointer
658
+ lsls r2, r2, #29 @ offset &= 7 (part not lane aligned)
659
+ lsrs r2, r2, #29
660
+ beq KeccakP1600_OverwriteBytes_CheckLanes @ .if offset != 0
661
+ movs r4, r3 @ then, do remaining bytes in first lane
662
+ movs r5, #8
663
+ subs r5, r2 @ max size in lane = 8 - offset
664
+ cmp r4, r5
665
+ ble KeccakP1600_OverwriteBytes_BytesAlign
666
+ movs r4, r5
667
+ KeccakP1600_OverwriteBytes_BytesAlign:
668
+ subs r3, r3, r4 @ size left
669
+ mov r10, r3
670
+ movs r3, r4
671
+ adr r7, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
672
+ bl __KeccakP1600_OverwriteBytesInLane
673
+ mov r3, r10
674
+ KeccakP1600_OverwriteBytes_CheckLanes:
675
+ lsrs r2, r3, #3 @ .if length >= 8
676
+ beq KeccakP1600_OverwriteBytes_Bytes
677
+ mov r10, r3
678
+ adr r3, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
679
+ bl __KeccakP1600_OverwriteLanes
680
+ mov r3, r10
681
+ lsls r3, r3, #29
682
+ lsrs r3, r3, #29
683
+ KeccakP1600_OverwriteBytes_Bytes:
684
+ cmp r3, #0
685
+ beq KeccakP1600_OverwriteBytes_Exit
686
+ movs r2, #0
687
+ adr r7, KeccakP1600_OverwriteBytes_ToBitInterleavingConstants
688
+ bl __KeccakP1600_OverwriteBytesInLane
689
+ KeccakP1600_OverwriteBytes_Exit:
690
+ pop {r4 - r7}
691
+ mov r8, r4
692
+ mov r9, r5
693
+ mov r10, r6
694
+ pop {r4 - r6, pc}
695
+ KeccakP1600_OverwriteBytes_Exit1:
696
+ bx lr
697
+ nop
698
+ KeccakP1600_OverwriteBytes_ToBitInterleavingConstants:
699
+ .long 0x55555555
700
+ .long 0x33333333
701
+ .long 0x0F0F0F0F
702
+ .long 0x00FF00FF
703
+ .long 0xAAAAAAAA
704
+ .long 0xCCCCCCCC
705
+ .long 0xF0F0F0F0
706
+ .long 0xFF00FF00
707
+
708
+
709
+ @----------------------------------------------------------------------------
710
+ @
711
+ @ __KeccakP1600_OverwriteLanes
712
+ @
713
+ @ Input:
714
+ @ r0 state pointer
715
+ @ r1 data pointer
716
+ @ r2 laneCount
717
+ @ r3 to bit interleaving constants pointer
718
+ @
719
+ @ Output:
720
+ @ r0 state pointer next lane
721
+ @ r1 data pointer next byte to input
722
+ @
723
+ @ Changed: r2-r9
724
+ @
725
+ .align 8
726
+ __KeccakP1600_OverwriteLanes:
727
+ lsls r4, r1, #30
728
+ bne __KeccakP1600_OverwriteLanes_LoopUnaligned
729
+ __KeccakP1600_OverwriteLanes_LoopAligned:
730
+ ldmia r1!, {r6,r7}
731
+ mov r8, r6
732
+ mov r9, r7
733
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
734
+ stmia r0!, {r6,r7}
735
+ subs r2, r2, #1
736
+ bne __KeccakP1600_OverwriteLanes_LoopAligned
737
+ bx lr
738
+ __KeccakP1600_OverwriteLanes_LoopUnaligned:
739
+ ldrb r6, [r1, #0]
740
+ ldrb r4, [r1, #1]
741
+ lsls r4, r4, #8
742
+ orrs r6, r6, r4
743
+ ldrb r4, [r1, #2]
744
+ lsls r4, r4, #16
745
+ orrs r6, r6, r4
746
+ ldrb r4, [r1, #3]
747
+ lsls r4, r4, #24
748
+ orrs r6, r6, r4
749
+ ldrb r7, [r1, #4]
750
+ ldrb r4, [r1, #5]
751
+ lsls r4, r4, #8
752
+ orrs r7, r7, r4
753
+ ldrb r4, [r1, #6]
754
+ lsls r4, r4, #16
755
+ orrs r7, r7, r4
756
+ ldrb r4, [r1, #7]
757
+ lsls r4, r4, #24
758
+ orrs r7, r7, r4
759
+ adds r1, r1, #8
760
+ mov r8, r6
761
+ mov r9, r7
762
+ toBitInterleaving r8, r9, r6, r7, r5, r4, r3
763
+ stmia r0!, {r6, r7}
764
+ subs r2, r2, #1
765
+ bne __KeccakP1600_OverwriteLanes_LoopUnaligned
766
+ bx lr
767
+
768
+
769
+ @----------------------------------------------------------------------------
770
+ @
771
+ @ __KeccakP1600_OverwriteBytesInLane
772
+ @
773
+ @ Input:
774
+ @ r0 state pointer
775
+ @ r1 data pointer
776
+ @ r2 offset in lane
777
+ @ r3 length
778
+ @ r7 to bit interleaving constants pointer
779
+ @
780
+ @ Output:
781
+ @ r0 state pointer next lane
782
+ @ r1 data pointer next byte to input
783
+ @
784
+ @ Changed: r2-r9
785
+ @
786
+ .align 8
787
+ __KeccakP1600_OverwriteBytesInLane:
788
+ movs r4, #0
789
+ movs r5, #0
790
+ push { r4 - r5 }
791
+ lsls r6, r2, #2
792
+ add r2, r2, sp
793
+ movs r4, #0x0F @r4 mask to wipe nibbles(bit interleaved bytes) in state
794
+ lsls r4, r4, r6
795
+ movs r6, r4
796
+ __KeccakP1600_OverwriteBytesInLane_Loop:
797
+ orrs r6, r6, r4
798
+ lsls r4, r4, #4
799
+ ldrb r5, [r1]
800
+ strb r5, [r2]
801
+ adds r1, r1, #1
802
+ adds r2, r2, #1
803
+ subs r3, r3, #1
804
+ bne __KeccakP1600_OverwriteBytesInLane_Loop
805
+ pop { r4 - r5 }
806
+ mov r8, r4
807
+ mov r9, r5
808
+ toBitInterleaving r8, r9, r4, r5, r3, r2, r7
809
+ ldr r3, [r0]
810
+ bics r3, r3, r6
811
+ eors r4, r4, r3
812
+ ldr r3, [r0, #4]
813
+ bics r3, r3, r6
814
+ eors r5, r5, r3
815
+ stmia r0!, { r4, r5 }
816
+ bx lr
817
+
818
+
819
+ @----------------------------------------------------------------------------
820
+ @
821
+ @ void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
822
+ @
823
+ .align 8
824
+ .global KeccakP1600_OverwriteWithZeroes
825
+ .type KeccakP1600_OverwriteWithZeroes, %function;
826
+ KeccakP1600_OverwriteWithZeroes:
827
+ push {r4 - r5}
828
+ lsrs r2, r1, #3
829
+ beq KeccakP1600_OverwriteWithZeroes_Bytes
830
+ movs r4, #0
831
+ movs r5, #0
832
+ KeccakP1600_OverwriteWithZeroes_LoopLanes:
833
+ stm r0!, { r4, r5 }
834
+ subs r2, r2, #1
835
+ bne KeccakP1600_OverwriteWithZeroes_LoopLanes
836
+ KeccakP1600_OverwriteWithZeroes_Bytes:
837
+ lsls r1, r1, #32-3
838
+ beq KeccakP1600_OverwriteWithZeroes_Exit
839
+ lsrs r1, r1, #32-3
840
+ movs r3, #0x0F @r2 already zero, r3 = mask to wipe nibbles(bit interleaved bytes) in state
841
+ KeccakP1600_OverwriteWithZeroes_LoopBytes:
842
+ orrs r2, r2, r3
843
+ lsls r3, r3, #4
844
+ subs r1, r1, #1
845
+ bne KeccakP1600_OverwriteWithZeroes_LoopBytes
846
+ ldr r4, [r0]
847
+ ldr r5, [r0, #4]
848
+ bics r4, r4, r2
849
+ bics r5, r5, r2
850
+ stm r0!, { r4, r5 }
851
+ KeccakP1600_OverwriteWithZeroes_Exit:
852
+ pop {r4 - r5}
853
+ bx lr
854
+
855
+
856
+ @----------------------------------------------------------------------------
857
+ @
858
+ @ void KeccakP1600_ExtractBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
859
+ @
860
+ .align 8
861
+ .global KeccakP1600_ExtractBytes
862
+ .type KeccakP1600_ExtractBytes, %function;
863
+ KeccakP1600_ExtractBytes:
864
+ cmp r3, #0 @ .if length != 0
865
+ beq KeccakP1600_ExtractBytes_Exit1
866
+ push {r4 - r6, lr} @ then
867
+ mov r4, r8
868
+ push {r4, r7}
869
+ lsrs r4, r2, #3 @ offset &= ~7
870
+ lsls r4, r4, #3
871
+ adds r0, r0, r4 @ add whole lane offset to state pointer
872
+ lsls r2, r2, #29 @ offset &= 7 (part not lane aligned)
873
+ lsrs r2, r2, #29
874
+ beq KeccakP1600_ExtractBytes_CheckLanes @ .if offset != 0
875
+ movs r4, r3 @ then, do remaining bytes in first lane
876
+ movs r5, #8
877
+ subs r5, r2 @ max size in lane = 8 - offset
878
+ cmp r4, r5
879
+ ble KeccakP1600_ExtractBytes_BytesAlign
880
+ movs r4, r5
881
+ KeccakP1600_ExtractBytes_BytesAlign:
882
+ subs r3, r3, r4 @ size left
883
+ mov r8, r3
884
+ movs r3, r4
885
+ adr r7, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
886
+ bl __KeccakP1600_ExtractBytesInLane
887
+ mov r3, r8
888
+ KeccakP1600_ExtractBytes_CheckLanes:
889
+ lsrs r2, r3, #3 @ .if length >= 8
890
+ beq KeccakP1600_ExtractBytes_Bytes
891
+ mov r8, r3
892
+ adr r3, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
893
+ bl __KeccakP1600_ExtractLanes
894
+ mov r3, r8
895
+ lsls r3, r3, #29
896
+ lsrs r3, r3, #29
897
+ KeccakP1600_ExtractBytes_Bytes:
898
+ cmp r3, #0
899
+ beq KeccakP1600_ExtractBytes_Exit
900
+ movs r2, #0
901
+ adr r7, KeccakP1600_ExtractBytes_FromBitInterleavingConstants
902
+ bl __KeccakP1600_ExtractBytesInLane
903
+ KeccakP1600_ExtractBytes_Exit:
904
+ pop {r4,r7}
905
+ mov r8, r4
906
+ pop {r4 - r6, pc}
907
+ KeccakP1600_ExtractBytes_Exit1:
908
+ bx lr
909
+ nop
910
+ KeccakP1600_ExtractBytes_FromBitInterleavingConstants:
911
+ .long 0x0000FF00
912
+ .long 0x00F000F0
913
+ .long 0x0C0C0C0C
914
+ .long 0x22222222
915
+
916
+
917
+ @----------------------------------------------------------------------------
918
+ @
919
+ @ __KeccakP1600_ExtractLanes
920
+ @
921
+ @ Input:
922
+ @ r0 state pointer
923
+ @ r1 data pointer
924
+ @ r2 laneCount
925
+ @ r3 from bit interleaving constants pointer
926
+ @
927
+ @ Output:
928
+ @ r0 state pointer next lane
929
+ @ r1 data pointer next byte to output
930
+ @
931
+ @ Changed: r2-r7
932
+ @
933
+ .align 8
934
+ __KeccakP1600_ExtractLanes:
935
+ lsls r4, r1, #30
936
+ bne __KeccakP1600_ExtractLanes_LoopUnaligned
937
+ __KeccakP1600_ExtractLanes_LoopAligned:
938
+ ldmia r0!, {r6,r7}
939
+ fromBitInterleaving r6, r7, r5, r4, r3
940
+ stmia r1!, {r6,r7}
941
+ subs r2, r2, #1
942
+ bne __KeccakP1600_ExtractLanes_LoopAligned
943
+ bx lr
944
+ __KeccakP1600_ExtractLanes_LoopUnaligned:
945
+ ldmia r0!, {r6,r7}
946
+ fromBitInterleaving r6, r7, r5, r4, r3
947
+ strb r6, [r1, #0]
948
+ lsrs r6, r6, #8
949
+ strb r6, [r1, #1]
950
+ lsrs r6, r6, #8
951
+ strb r6, [r1, #2]
952
+ lsrs r6, r6, #8
953
+ strb r6, [r1, #3]
954
+ strb r7, [r1, #4]
955
+ lsrs r7, r7, #8
956
+ strb r7, [r1, #5]
957
+ lsrs r7, r7, #8
958
+ strb r7, [r1, #6]
959
+ lsrs r7, r7, #8
960
+ strb r7, [r1, #7]
961
+ adds r1, r1, #8
962
+ subs r2, r2, #1
963
+ bne __KeccakP1600_ExtractLanes_LoopUnaligned
964
+ bx lr
965
+
966
+
967
+ @----------------------------------------------------------------------------
968
+ @
969
+ @ __KeccakP1600_ExtractBytesInLane
970
+ @
971
+ @ Input:
972
+ @ r0 state pointer
973
+ @ r1 data pointer
974
+ @ r2 offset in lane
975
+ @ r3 length
976
+ @ r7 from bit interleaving constants pointer
977
+ @
978
+ @ Output:
979
+ @ r0 state pointer next lane
980
+ @ r1 data pointer next byte to output
981
+ @
982
+ @ Changed: r2-r7
983
+ @
984
+ .align 8
985
+ __KeccakP1600_ExtractBytesInLane:
986
+ ldmia r0!, {r4,r5}
987
+ push {r0, r3}
988
+ fromBitInterleaving r4, r5, r0, r3, r7
989
+ pop {r0, r3}
990
+ push {r4, r5}
991
+ mov r4, sp
992
+ adds r4, r4, r2
993
+ __KeccakP1600_ExtractBytesInLane_Loop:
994
+ ldrb r2, [r4]
995
+ adds r4, r4, #1
996
+ strb r2, [r1]
997
+ adds r1, r1, #1
998
+ subs r3, r3, #1
999
+ bne __KeccakP1600_ExtractBytesInLane_Loop
1000
+ add sp, #8
1001
+ bx lr
1002
+
1003
+
1004
+ @----------------------------------------------------------------------------
1005
+ @
1006
+ @ void KeccakP1600_ExtractAndAddBytes(void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
1007
+ @
1008
+ .align 8
1009
+ .global KeccakP1600_ExtractAndAddBytes
1010
+ .type KeccakP1600_ExtractAndAddBytes, %function;
1011
+ KeccakP1600_ExtractAndAddBytes:
1012
+ push {r3 - r7, lr}
1013
+ mov r4, r8
1014
+ mov r5, r9
1015
+ push {r4 - r5}
1016
+ mov r9, r2
1017
+ mov r2, r3
1018
+ ldr r3, [sp, #8*4]
1019
+ cmp r3, #0 @ .if length != 0
1020
+ beq KeccakP1600_ExtractAndAddBytes_Exit
1021
+ lsrs r4, r2, #3 @ offset &= ~7
1022
+ lsls r4, r4, #3
1023
+ adds r0, r0, r4 @ add whole lane offset to state pointer
1024
+ lsls r2, r2, #29 @ offset &= 7 (part not lane aligned)
1025
+ lsrs r2, r2, #29
1026
+ beq KeccakP1600_ExtractAndAddBytes_CheckLanes @ .if offset != 0
1027
+ movs r4, r3 @ then, do remaining bytes in first lane
1028
+ movs r5, #8
1029
+ subs r5, r2 @ max size in lane = 8 - offset
1030
+ cmp r4, r5
1031
+ ble KeccakP1600_ExtractAndAddBytes_BytesAlign
1032
+ movs r4, r5
1033
+ KeccakP1600_ExtractAndAddBytes_BytesAlign:
1034
+ subs r3, r3, r4 @ size left
1035
+ mov r8, r3
1036
+ movs r3, r4
1037
+ adr r7, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1038
+ bl __KeccakP1600_ExtractAndAddBytesInLane
1039
+ mov r3, r8
1040
+ KeccakP1600_ExtractAndAddBytes_CheckLanes:
1041
+ lsrs r2, r3, #3 @ .if length >= 8
1042
+ beq KeccakP1600_ExtractAndAddBytes_Bytes
1043
+ mov r8, r3
1044
+ adr r3, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1045
+ bl __KeccakP1600_ExtractAndAddLanes
1046
+ mov r3, r8
1047
+ lsls r3, r3, #29
1048
+ lsrs r3, r3, #29
1049
+ KeccakP1600_ExtractAndAddBytes_Bytes:
1050
+ cmp r3, #0
1051
+ beq KeccakP1600_ExtractAndAddBytes_Exit
1052
+ movs r2, #0
1053
+ adr r7, KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants
1054
+ bl __KeccakP1600_ExtractAndAddBytesInLane
1055
+ KeccakP1600_ExtractAndAddBytes_Exit:
1056
+ pop {r4 - r5}
1057
+ mov r8, r4
1058
+ mov r9, r5
1059
+ pop {r3 - r7, pc}
1060
+ .align 8
1061
+ KeccakP1600_ExtractAndAddBytes_FromBitInterleavingConstants:
1062
+ .long 0x0000FF00
1063
+ .long 0x00F000F0
1064
+ .long 0x0C0C0C0C
1065
+ .long 0x22222222
1066
+
1067
+
1068
+ @----------------------------------------------------------------------------
1069
+ @
1070
+ @ __KeccakP1600_ExtractAndAddLanes
1071
+ @
1072
+ @ Input:
1073
+ @ r0 state pointer
1074
+ @ r1 in pointer
1075
+ @ r2 laneCount
1076
+ @ r3 from bit interleaving constants pointer
1077
+ @ r9 out pointer
1078
+ @
1079
+ @ Output:
1080
+ @ r0 state pointer next lane
1081
+ @ r1 in pointer (next lane)
1082
+ @ r9 out pointer (next lane)
1083
+ @
1084
+ @ Changed: r2-r7
1085
+ @
1086
+ .align 8
1087
+ __KeccakP1600_ExtractAndAddLanes:
1088
+ lsls r4, r1, #30
1089
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1090
+ mov r4, r9
1091
+ lsls r4, r4, #30
1092
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1093
+ __KeccakP1600_ExtractAndAddLanes_LoopAligned:
1094
+ ldmia r0!, {r6,r7}
1095
+ fromBitInterleaving r6, r7, r5, r4, r3
1096
+ mov r4, r9
1097
+ ldm r1!, {r5}
1098
+ eors r6, r6, r5
1099
+ ldm r1!, {r5}
1100
+ eors r7, r7, r5
1101
+ stmia r4!, {r6,r7}
1102
+ mov r9, r4
1103
+ subs r2, r2, #1
1104
+ bne __KeccakP1600_ExtractAndAddLanes_LoopAligned
1105
+ bx lr
1106
+ __KeccakP1600_ExtractAndAddLanes_LoopUnaligned:
1107
+ ldmia r0!, {r6,r7}
1108
+ fromBitInterleaving r6, r7, r5, r4, r3
1109
+ mov r4, r9
1110
+ ldrb r5, [r1, #0]
1111
+ eors r5, r5, r6
1112
+ strb r5, [r4, #0]
1113
+ lsrs r6, r6, #8
1114
+ ldrb r5, [r1, #1]
1115
+ eors r5, r5, r6
1116
+ strb r5, [r4, #1]
1117
+ lsrs r6, r6, #8
1118
+ ldrb r5, [r1, #2]
1119
+ eors r5, r5, r6
1120
+ strb r5, [r4, #2]
1121
+ lsrs r6, r6, #8
1122
+ ldrb r5, [r1, #3]
1123
+ eors r5, r5, r6
1124
+ strb r5, [r4, #3]
1125
+ ldrb r5, [r1, #4]
1126
+ eors r5, r5, r7
1127
+ strb r5, [r4, #4]
1128
+ lsrs r7, r7, #8
1129
+ ldrb r5, [r1, #5]
1130
+ eors r5, r5, r7
1131
+ strb r5, [r4, #5]
1132
+ lsrs r7, r7, #8
1133
+ ldrb r5, [r1, #6]
1134
+ eors r5, r5, r7
1135
+ strb r5, [r4, #6]
1136
+ lsrs r7, r7, #8
1137
+ ldrb r5, [r1, #7]
1138
+ eors r5, r5, r7
1139
+ strb r5, [r4, #7]
1140
+ adds r1, r1, #8
1141
+ adds r4, r4, #8
1142
+ mov r9, r4
1143
+ subs r2, r2, #1
1144
+ bne __KeccakP1600_ExtractAndAddLanes_LoopUnaligned
1145
+ bx lr
1146
+
1147
+
1148
+ @----------------------------------------------------------------------------
1149
+ @
1150
+ @ __KeccakP1600_ExtractAndAddBytesInLane
1151
+ @
1152
+ @ Input:
1153
+ @ r0 state pointer
1154
+ @ r1 data pointer
1155
+ @ r2 offset in lane
1156
+ @ r3 length
1157
+ @ r7 from bit interleaving constants pointer
1158
+ @ r9 out pointer
1159
+ @
1160
+ @ Output:
1161
+ @ r0 state pointer next lane
1162
+ @ r1 in pointer (next byte)
1163
+ @ r9 out pointer (next byte)
1164
+ @
1165
+ @ Changed: r2-r7
1166
+ @
1167
+ .align 8
1168
+ __KeccakP1600_ExtractAndAddBytesInLane:
1169
+ ldmia r0!, {r4,r5}
1170
+ push {r0, r3}
1171
+ fromBitInterleaving r4, r5, r0, r3, r7
1172
+ pop {r0, r3}
1173
+ push {r4, r5}
1174
+ mov r4, sp
1175
+ adds r4, r4, r2
1176
+ mov r6, r9
1177
+ __KeccakP1600_ExtractAndAddBytesInLane_Loop:
1178
+ ldrb r2, [r4]
1179
+ adds r4, r4, #1
1180
+ ldrb r5, [r1]
1181
+ eors r2, r2, r5
1182
+ strb r2, [r6]
1183
+ adds r1, r1, #1
1184
+ adds r6, r6, #1
1185
+ subs r3, r3, #1
1186
+ bne __KeccakP1600_ExtractAndAddBytesInLane_Loop
1187
+ add sp, #8
1188
+ mov r9, r6
1189
+ bx lr
1190
+
1191
+
1192
+ @ ----------------------------------------------------------------------------
1193
+ @
1194
+ @ void KeccakP1600_Permute_Nrounds(void *state, unsigned int nrounds)
1195
+ @
1196
+ .align 8
1197
+ .global KeccakP1600_Permute_Nrounds
1198
+ .type KeccakP1600_Permute_Nrounds, %function;
1199
+ KeccakP1600_Permute_Nrounds:
1200
+ movs r2, r1
1201
+ lsls r3, r2, #3
1202
+ adr r1, KeccakP1600_Permute_RoundConstants0
1203
+ subs r1, r1, r3
1204
+ lsls r2, r2, #31
1205
+ bne KeccakP1600_Permute_NroundsOdd
1206
+ b KeccakP1600_Permute
1207
+ KeccakP1600_Permute_NroundsOdd:
1208
+ push { r4 - r6, lr }
1209
+ mov r2, r8
1210
+ mov r3, r9
1211
+ mov r4, r10
1212
+ mov r5, r11
1213
+ mov r6, r12
1214
+ push { r2 - r7 }
1215
+ sub sp, #mSize
1216
+ subs r1, r1, #8
1217
+ str r1, [sp, #mRC]
1218
+ mov r7, sp
1219
+ ldm r0!, {r1-r5}
1220
+ stm r7!, {r1-r5}
1221
+ ldm r0!, {r1-r5}
1222
+ stm r7!, {r1-r5}
1223
+ ldm r0!, {r1-r5}
1224
+ stm r7!, {r1-r5}
1225
+ ldm r0!, {r1-r5}
1226
+ stm r7!, {r1-r5}
1227
+ ldm r0!, {r1-r5}
1228
+ stm r7!, {r1-r5}
1229
+ ldm r0!, {r1-r5}
1230
+ stm r7!, {r1-r5}
1231
+ ldm r0!, {r1-r5}
1232
+ stm r7!, {r1-r5}
1233
+ ldm r0!, {r1-r5}
1234
+ stm r7!, {r1-r5}
1235
+ ldm r0!, {r1-r5}
1236
+ stm r7!, {r1-r5}
1237
+ ldm r0!, {r1-r5}
1238
+ stm r7!, {r1-r5}
1239
+ subs r0, r0, #25*2*4
1240
+ movs r7, #_ma0
1241
+ adds r7, r7, r0
1242
+ b KeccakP1600_Permute_RoundOdd
1243
+
1244
+
1245
+ @ ----------------------------------------------------------------------------
1246
+ @
1247
+ @ void KeccakP1600_Permute_12rounds( void *state )
1248
+ @
1249
+ .align 8
1250
+ .global KeccakP1600_Permute_12rounds
1251
+ .type KeccakP1600_Permute_12rounds, %function;
1252
+ KeccakP1600_Permute_12rounds:
1253
+ adr r1, KeccakP1600_Permute_RoundConstants12
1254
+ b KeccakP1600_Permute
1255
+
1256
+
1257
+ @ ----------------------------------------------------------------------------
1258
+ @
1259
+ @ void KeccakP1600_Permute_24rounds( void *state )
1260
+ @
1261
+ .align 8
1262
+ .global KeccakP1600_Permute_24rounds
1263
+ .type KeccakP1600_Permute_24rounds, %function;
1264
+ KeccakP1600_Permute_24rounds:
1265
+ adr r1, KeccakP1600_Permute_RoundConstants24
1266
+ b KeccakP1600_Permute
1267
+
1268
+
1269
+ .align 8
1270
+ KeccakP1600_Permute_RoundConstants24:
1271
+ @ 0 1
1272
+ .long 0x00000001, 0x00000000
1273
+ .long 0x00000000, 0x00000089
1274
+ .long 0x00000000, 0x8000008b
1275
+ .long 0x00000000, 0x80008080
1276
+ .long 0x00000001, 0x0000008b
1277
+ .long 0x00000001, 0x00008000
1278
+ .long 0x00000001, 0x80008088
1279
+ .long 0x00000001, 0x80000082
1280
+ .long 0x00000000, 0x0000000b
1281
+ .long 0x00000000, 0x0000000a
1282
+ .long 0x00000001, 0x00008082
1283
+ .long 0x00000000, 0x00008003
1284
+ KeccakP1600_Permute_RoundConstants12:
1285
+ .long 0x00000001, 0x0000808b
1286
+ .long 0x00000001, 0x8000000b
1287
+ .long 0x00000001, 0x8000008a
1288
+ .long 0x00000001, 0x80000081
1289
+ .long 0x00000000, 0x80000081
1290
+ .long 0x00000000, 0x80000008
1291
+ .long 0x00000000, 0x00000083
1292
+ .long 0x00000000, 0x80008003
1293
+ .long 0x00000001, 0x80008088
1294
+ .long 0x00000000, 0x80000088
1295
+ .long 0x00000001, 0x00008000
1296
+ .long 0x00000000, 0x80008082
1297
+ KeccakP1600_Permute_RoundConstants0:
1298
+ .long 0x000000FF @terminator
1299
+
1300
+ @----------------------------------------------------------------------------
1301
+ @
1302
+ @ void KeccakP1600_Permute( void *state, void * rc )
1303
+ @
1304
+ .align 8
1305
+ KeccakP1600_Permute:
1306
+ push { r4 - r6, lr }
1307
+ mov r2, r8
1308
+ mov r3, r9
1309
+ mov r4, r10
1310
+ mov r5, r11
1311
+ mov r6, r12
1312
+ push { r2 - r7 }
1313
+ sub sp, #mSize
1314
+ movs r7, #_ma0
1315
+ adds r7, r7, r0
1316
+ KeccakP1600_Permute_RoundLoop:
1317
+ str r1, [sp, #mRC]
1318
+ Kround 0, 0
1319
+ KeccakP1600_Permute_RoundOdd:
1320
+ Kround 1, 8
1321
+ adds r1, r1, #2*8 @ Update pointer RC
1322
+ ldr r6, [r1] @ Check terminator
1323
+ cmp r6, #0xFF
1324
+ beq KeccakP1600_Permute_Done
1325
+ ldr r6, =KeccakP1600_Permute_RoundLoop+1
1326
+ bx r6
1327
+ .align 8
1328
+ .ltorg
1329
+ KeccakP1600_Permute_Done:
1330
+ add sp, #mSize
1331
+ pop { r1 - r5, r7 }
1332
+ mov r8, r1
1333
+ mov r9, r2
1334
+ mov r10, r3
1335
+ mov r11, r4
1336
+ mov r12, r5
1337
+ pop { r4 - r6, pc }
1338
+
1339
+