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