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