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