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,953 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ Keyak, designed by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer.
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
+ #define W (SnP_width/8/25)
18
+ #define Ra (SnP_width/8 - W)
19
+ #define Rs (SnP_width/8 - Capacity)
20
+ #define Cprime Capacity
21
+
22
+ #define OffsetEOM (Ra+0)
23
+ #define OffsetCryptEnd (Ra+1)
24
+ #define OffsetInjectStart (Ra+2)
25
+ #define OffsetInjectEnd (Ra+3)
26
+
27
+ #define JOIN0(a, b) a ## b
28
+ #define JOIN(a, b) JOIN0(a, b)
29
+
30
+ #define Engine_Instance JOIN(prefix, _Engine_Instance)
31
+ #define Engine_Spark JOIN(prefix, _Engine_Spark)
32
+ #define Engine_Initialize JOIN(prefix, _Engine_Initialize)
33
+ #define Engine_Crypt JOIN(prefix, _Engine_Crypt)
34
+ #define Engine_Inject JOIN(prefix, _Engine_Inject)
35
+ #define Engine_InjectCollectiveStreamer JOIN(prefix, _Engine_InjectCollectiveStreamer)
36
+ #define Engine_InjectCollective JOIN(prefix, _Engine_InjectCollective)
37
+ #define Engine_GetTags JOIN(prefix, _Engine_GetTags)
38
+ #define Engine_FastWrapCryptOnly JOIN(prefix, _Engine_FastWrapCryptOnly)
39
+ #define Engine_FastWrapInjectOnly JOIN(prefix, _Engine_FastWrapInjectOnly)
40
+ #define Engine_FastWrapCryptAndInject JOIN(prefix, _Engine_FastWrapCryptAndInject)
41
+
42
+ #define Motorist_Instance JOIN(prefix, _Motorist_Instance)
43
+ #define Motorist_MakeKnot JOIN(prefix, _Motorist_MakeKnot)
44
+ #define Motorist_HandleTag JOIN(prefix, _Motorist_HandleTag)
45
+ #define Motorist_Initialize JOIN(prefix, _Motorist_Initialize)
46
+ #define Motorist_StartEngine JOIN(prefix, _Motorist_StartEngine)
47
+ #define Motorist_Wrap JOIN(prefix, _Motorist_Wrap)
48
+
49
+
50
+ #if PlSnP_parallelism > 1
51
+
52
+ #define DeclarePistonIndex unsigned int indexP;
53
+ #define ForEveryPiston(argStart) for ( indexP = argStart; indexP < PlSnP_parallelism; ++indexP )
54
+
55
+ #define State_StaticInitialize() JOIN(PlSnP, _StaticInitialize)()
56
+ #define State_Initialize( argS ) JOIN(PlSnP, _InitializeAll)(argS)
57
+ #define State_Permute( argS ) PlSnP_PermuteAll( argS )
58
+ #define State_AddBytes( argS, argI, argO, argL ) JOIN(PlSnP, _AddBytes)(argS, indexP, argI, argO, argL)
59
+ #define State_AddByte( argS, argV, argO ) JOIN(PlSnP, _AddByte)(argS, indexP, argV, argO)
60
+ #define State_OverwriteBytes( argS, argI, argO, argL ) JOIN(PlSnP, _OverwriteBytes)(argS, indexP, argI, argO, argL)
61
+ #define State_ExtractBytes( argS, argI, argO, argL ) JOIN(PlSnP, _ExtractBytes)(argS, indexP, argI, argO, argL)
62
+ #define State_ExtractAndAddBytes( argS, argI, argO, argOfs, argL ) JOIN(PlSnP, _ExtractAndAddBytes)(argS, indexP, argI, argO, argOfs, argL)
63
+ #define PlSnP_AddLanesAll JOIN(PlSnP, _AddLanesAll)
64
+ #define PlSnP_ExtractLanesAll JOIN(PlSnP, _ExtractLanesAll)
65
+ #define PlSnP_ExtractAndAddLanesAll JOIN(PlSnP, _ExtractAndAddLanesAll)
66
+
67
+ #if PlSnP_parallelism == 2
68
+ #define State_AddByteU( argS, argV, argO ) JOIN(PlSnP, _AddByte)(argS, 0, argV, argO); \
69
+ JOIN(PlSnP, _AddByte)(argS, 1, argV, argO)
70
+ #elif PlSnP_parallelism == 4
71
+ #define State_AddByteU( argS, argV, argO ) JOIN(PlSnP, _AddByte)(argS, 0, argV, argO); \
72
+ JOIN(PlSnP, _AddByte)(argS, 1, argV, argO); \
73
+ JOIN(PlSnP, _AddByte)(argS, 2, argV, argO); \
74
+ JOIN(PlSnP, _AddByte)(argS, 3, argV, argO)
75
+ #else
76
+ #define State_AddByteU( argS, argV, argO ) JOIN(PlSnP, _AddByte)(argS, 0, argV, argO); \
77
+ JOIN(PlSnP, _AddByte)(argS, 1, argV, argO); \
78
+ JOIN(PlSnP, _AddByte)(argS, 2, argV, argO); \
79
+ JOIN(PlSnP, _AddByte)(argS, 3, argV, argO); \
80
+ JOIN(PlSnP, _AddByte)(argS, 4, argV, argO); \
81
+ JOIN(PlSnP, _AddByte)(argS, 5, argV, argO); \
82
+ JOIN(PlSnP, _AddByte)(argS, 6, argV, argO); \
83
+ JOIN(PlSnP, _AddByte)(argS, 7, argV, argO)
84
+ #endif
85
+
86
+ #if PlSnP_parallelism == 2
87
+ #define State_AddBytesU( argS, argI, argO, argL ) JOIN(PlSnP, _AddBytes)(argS, 0, (argI)+0*(argL), argO, argL); \
88
+ JOIN(PlSnP, _AddBytes)(argS, 1, (argI)+1*(argL), argO, argL)
89
+ #elif PlSnP_parallelism == 4
90
+ #define State_AddBytesU( argS, argI, argO, argL ) JOIN(PlSnP, _AddBytes)(argS, 0, (argI)+0*(argL), argO, argL); \
91
+ JOIN(PlSnP, _AddBytes)(argS, 1, (argI)+1*(argL), argO, argL); \
92
+ JOIN(PlSnP, _AddBytes)(argS, 2, (argI)+2*(argL), argO, argL); \
93
+ JOIN(PlSnP, _AddBytes)(argS, 3, (argI)+3*(argL), argO, argL)
94
+ #else
95
+ #define State_AddBytesU( argS, argI, argO, argL ) JOIN(PlSnP, _AddBytes)(argS, 0, (argI)+0*(argL), argO, argL); \
96
+ JOIN(PlSnP, _AddBytes)(argS, 1, (argI)+1*(argL), argO, argL); \
97
+ JOIN(PlSnP, _AddBytes)(argS, 2, (argI)+2*(argL), argO, argL); \
98
+ JOIN(PlSnP, _AddBytes)(argS, 3, (argI)+3*(argL), argO, argL); \
99
+ JOIN(PlSnP, _AddBytes)(argS, 4, (argI)+4*(argL), argO, argL); \
100
+ JOIN(PlSnP, _AddBytes)(argS, 5, (argI)+5*(argL), argO, argL); \
101
+ JOIN(PlSnP, _AddBytes)(argS, 6, (argI)+6*(argL), argO, argL); \
102
+ JOIN(PlSnP, _AddBytes)(argS, 7, (argI)+7*(argL), argO, argL)
103
+ #endif
104
+
105
+
106
+ #else
107
+
108
+ #define DeclarePistonIndex
109
+ #define indexP 0
110
+ #define ForEveryPiston(argStart)
111
+
112
+ #define State_StaticInitialize() JOIN(SnP, _StaticInitialize)()
113
+ #define State_Initialize( argS ) JOIN(SnP, _Initialize)( argS )
114
+ #define State_Permute( argS ) SnP_Permute( argS )
115
+ #define State_AddBytes( argS, argI, argO, argL ) JOIN(SnP, _AddBytes)(argS, argI, argO, argL)
116
+ #define State_AddByte( argS, argV, argO ) JOIN(SnP, _AddByte)(argS, argV, argO)
117
+ #define State_OverwriteBytes( argS, argI, argO, argL ) JOIN(SnP, _OverwriteBytes)(argS, argI, argO, argL)
118
+ #define State_ExtractBytes( argS, argI, argO, argL ) JOIN(SnP, _ExtractBytes)(argS, argI, argO, argL)
119
+ #define State_ExtractAndAddBytes( argS, argI, argO, argOfs, argL ) JOIN(SnP, _ExtractAndAddBytes)(argS, argI, argO, argOfs, argL)
120
+
121
+ #define State_AddByteU( argS, argV, argO ) JOIN(SnP, _AddByte)(argS, argV, argO)
122
+ #define State_AddBytesU( argS, argI, argO, argL ) JOIN(SnP, _AddBytes)(argS, argI, argO, argL);
123
+
124
+ #endif
125
+
126
+ /* ------------------------------------------------------------------------ */
127
+
128
+ /**
129
+ * Function that calls the permutation.
130
+ *
131
+ * @param instance Pointer to the Engine instance structure.
132
+ * @param EOMFlag
133
+ * @param length The length of the tag for first Piston (zero if no tag).
134
+ * @param lengthNext The length of the tag for next Pistons.
135
+ *
136
+ * @pre phase == readyForIgnition
137
+ *
138
+ * @post phase == fresh
139
+ *
140
+ * @return 0 if successful, 1 otherwise.
141
+ */
142
+ static int Engine_Spark(Engine_Instance *instance, int EOMFlag, unsigned char length, unsigned char lengthNext );
143
+ static int Engine_Spark(Engine_Instance *instance, int EOMFlag, unsigned char length, unsigned char lengthNext )
144
+ {
145
+ DeclarePistonIndex
146
+ #ifdef UT_OUTPUT
147
+ unsigned char s[PlSnP_parallelism][SnP_width/8];
148
+ #endif
149
+
150
+ instance->tagEndIndex = length;
151
+ #if PlSnP_parallelism > 1
152
+ instance->tagEndIndexNext = lengthNext;
153
+ #endif
154
+ if ( EOMFlag != 0 )
155
+ {
156
+ ForEveryPiston(0)
157
+ {
158
+ if ( length == 0 )
159
+ length = 0xFF;
160
+ State_AddByte(instance->pistons.state, length, OffsetEOM );
161
+ #if PlSnP_parallelism > 1
162
+ length = lengthNext;
163
+ #endif
164
+ }
165
+ }
166
+ #ifdef UT_OUTPUT
167
+ if ( instance->pistons.file )
168
+ {
169
+ ForEveryPiston(0)
170
+ {
171
+ State_ExtractBytes( instance->pistons.stateShadow, s[indexP], 0, SnP_width/8 );
172
+ State_ExtractAndAddBytes( instance->pistons.state, s[indexP], s[indexP], 0, SnP_width/8 );
173
+ }
174
+ }
175
+ #endif
176
+ State_Permute( instance->pistons.state );
177
+ #ifdef UT_OUTPUT
178
+ if ( instance->pistons.file )
179
+ {
180
+ memcpy( instance->pistons.stateShadow, instance->pistons.state, sizeof(instance->pistons.state) );
181
+ ForEveryPiston(0)
182
+ {
183
+ fprintf( instance->pistons.file, "motWrap#%u XORed since last time", indexP );
184
+ UT_displayByteString( instance->pistons.file, "", s[indexP], SnP_width/8 );
185
+ State_ExtractBytes( instance->pistons.stateShadow, s[indexP], 0, SnP_width/8 );
186
+ fprintf( instance->pistons.file, "motWrap#%u after f()", indexP );
187
+ UT_displayByteString( instance->pistons.file, "", s[indexP], SnP_width/8 );
188
+ }
189
+ }
190
+ #endif
191
+ instance->pistons.phaseCrypt = Pistons_Phase_Fresh;
192
+ instance->pistons.phaseInject = Pistons_Phase_Fresh;
193
+
194
+ return ( Atom_Success );
195
+ }
196
+
197
+ static int Engine_Initialize(Engine_Instance *instance )
198
+ {
199
+ State_StaticInitialize();
200
+ State_Initialize( instance->pistons.state );
201
+ #ifdef UT_OUTPUT
202
+ instance->pistons.file = 0;
203
+ State_Initialize( instance->pistons.stateShadow );
204
+ #endif
205
+ instance->tagEndIndex = 0;
206
+ #if PlSnP_parallelism > 1
207
+ instance->tagEndIndexNext = 0;
208
+ #endif
209
+ instance->phase = Engine_Phase_Fresh;
210
+ instance->pistons.phaseCrypt = Pistons_Phase_Fresh;
211
+ instance->pistons.phaseInject = Pistons_Phase_Fresh;
212
+ return ( Atom_Success );
213
+ }
214
+
215
+ static size_t Engine_FastWrapCryptOnly(Engine_Instance *instance, const unsigned char *I, size_t Ilen, unsigned char *O, int unwrapFlag)
216
+ {
217
+ size_t initialIlen = Ilen;
218
+
219
+ if (unwrapFlag == Atom_False) {
220
+ do {
221
+ #if PlSnP_parallelism > 1
222
+ PlSnP_AddLanesAll(instance->pistons.state, I, Rs/W, Rs/W);
223
+ PlSnP_ExtractLanesAll(instance->pistons.state, O, Rs/W, Rs/W);
224
+ #else
225
+ State_AddBytes(instance->pistons.state, I, 0, Rs);
226
+ State_ExtractBytes(instance->pistons.state, O, 0, Rs);
227
+ #endif
228
+ State_AddByteU(instance->pistons.state, Rs, OffsetCryptEnd);
229
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectStart);
230
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectEnd);
231
+ State_Permute( instance->pistons.state );
232
+ I += (Rs*PlSnP_parallelism);
233
+ O += (Rs*PlSnP_parallelism);
234
+ Ilen -= (Rs*PlSnP_parallelism);
235
+ }
236
+ while(Ilen > (Rs*PlSnP_parallelism));
237
+ }
238
+ else {
239
+ do {
240
+ #if PlSnP_parallelism > 1
241
+ PlSnP_ExtractAndAddLanesAll(instance->pistons.state, I, O, Rs/W, Rs/W);
242
+ PlSnP_AddLanesAll(instance->pistons.state, O, Rs/W, Rs/W);
243
+ #else
244
+ State_ExtractAndAddBytes(instance->pistons.state, I, O, 0, Rs);
245
+ State_AddBytes(instance->pistons.state, O, 0, Rs);
246
+ #endif
247
+ State_AddByteU(instance->pistons.state, Rs, OffsetCryptEnd);
248
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectStart);
249
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectEnd);
250
+ State_Permute(instance->pistons.state);
251
+ I += (Rs*PlSnP_parallelism);
252
+ O += (Rs*PlSnP_parallelism);
253
+ Ilen -= (Rs*PlSnP_parallelism);
254
+ }
255
+ while(Ilen > (Rs*PlSnP_parallelism));
256
+ }
257
+ return (initialIlen - Ilen); /* number of bytes processed */
258
+ }
259
+
260
+ static size_t Engine_FastWrapInjectOnly(Engine_Instance *instance, const unsigned char *A, size_t Alen)
261
+ {
262
+ size_t initialAlen = Alen;
263
+
264
+ do
265
+ {
266
+ #if PlSnP_parallelism > 1
267
+ PlSnP_AddLanesAll(instance->pistons.state, A, Ra/W, Ra/W);
268
+ #else
269
+ State_AddBytes(instance->pistons.state, A, 0, Ra);
270
+ #endif
271
+ State_AddByteU(instance->pistons.state, Ra, OffsetInjectEnd);
272
+ State_Permute( instance->pistons.state );
273
+ A += (Ra*PlSnP_parallelism);
274
+ Alen -= (Ra*PlSnP_parallelism);
275
+ }
276
+ while(Alen > (Ra*PlSnP_parallelism));
277
+ return (initialAlen - Alen); /* number of bytes processed */
278
+ }
279
+
280
+ static size_t Engine_FastWrapCryptAndInject(Engine_Instance *instance, const unsigned char *I, size_t Ilen, size_t *ptrIprocessed, unsigned char *O, const unsigned char *A, size_t Alen, int unwrapFlag)
281
+ {
282
+ size_t initialIlen = Ilen;
283
+ size_t initialAlen = Alen;
284
+
285
+ if (unwrapFlag == Atom_False) {
286
+ do {
287
+ #if PlSnP_parallelism > 1
288
+ PlSnP_AddLanesAll(instance->pistons.state, I, Rs/W, Rs/W);
289
+ PlSnP_ExtractLanesAll(instance->pistons.state, O, Rs/W, Rs/W);
290
+ #else
291
+ State_AddBytes(instance->pistons.state, I, 0, Rs);
292
+ State_ExtractBytes(instance->pistons.state, O, 0, Rs);
293
+ #endif
294
+ State_AddBytesU(instance->pistons.state, A, Rs, Ra-Rs );
295
+ State_AddByteU(instance->pistons.state, Rs, OffsetCryptEnd);
296
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectStart);
297
+ State_AddByteU(instance->pistons.state, Ra, OffsetInjectEnd);
298
+ State_Permute( instance->pistons.state );
299
+ I += (Rs*PlSnP_parallelism);
300
+ O += (Rs*PlSnP_parallelism);
301
+ A += (Ra-Rs)*PlSnP_parallelism;
302
+ Ilen -= (Rs*PlSnP_parallelism);
303
+ Alen -= (Ra-Rs)*PlSnP_parallelism;
304
+ }
305
+ while( (Ilen > (Rs*PlSnP_parallelism)) && (Alen > ((Ra-Rs)*PlSnP_parallelism)) );
306
+ }
307
+ else {
308
+ do {
309
+ #if PlSnP_parallelism > 1
310
+ PlSnP_ExtractAndAddLanesAll(instance->pistons.state, I, O, Rs/W, Rs/W);
311
+ PlSnP_AddLanesAll(instance->pistons.state, O, Rs/W, Rs/W);
312
+ #else
313
+ State_ExtractAndAddBytes(instance->pistons.state, I, O, 0, Rs);
314
+ State_AddBytes(instance->pistons.state, O, 0, Rs);
315
+ #endif
316
+ State_AddBytesU(instance->pistons.state, A, Rs, Ra-Rs );
317
+ State_AddByteU(instance->pistons.state, Rs, OffsetCryptEnd);
318
+ State_AddByteU(instance->pistons.state, Rs, OffsetInjectStart);
319
+ State_AddByteU(instance->pistons.state, Ra, OffsetInjectEnd);
320
+ State_Permute( instance->pistons.state );
321
+ I += (Rs*PlSnP_parallelism);
322
+ O += (Rs*PlSnP_parallelism);
323
+ A += (Ra-Rs)*PlSnP_parallelism;
324
+ Ilen -= (Rs*PlSnP_parallelism);
325
+ Alen -= (Ra-Rs)*PlSnP_parallelism;
326
+ }
327
+ while( (Ilen > (Rs*PlSnP_parallelism)) && (Alen > ((Ra-Rs)*PlSnP_parallelism)) );
328
+ }
329
+ *ptrIprocessed = initialIlen - Ilen;
330
+ return (initialAlen - Alen); /* number of bytes processed */
331
+ }
332
+
333
+ static int Engine_Crypt(Engine_Instance *instance, const unsigned char *I, size_t Ilen, unsigned char *O, int unwrapFlag, int lastFlag )
334
+ {
335
+ DeclarePistonIndex
336
+ unsigned char offset;
337
+ unsigned int length;
338
+ #if PlSnP_parallelism > 1
339
+ int processed;
340
+ #endif
341
+
342
+ if ( instance->pistons.phaseCrypt != Pistons_Phase_Running)
343
+ {
344
+ if ( instance->pistons.phaseCrypt != Pistons_Phase_Fresh )
345
+ {
346
+ return ( Atom_Error );
347
+ }
348
+ #if PlSnP_parallelism > 1
349
+ instance->pistons.indexCrypt = 0;
350
+ #endif
351
+ instance->pistons.offsetCrypt = instance->tagEndIndex;
352
+ instance->pistons.phaseCrypt = Pistons_Phase_Running;
353
+ }
354
+
355
+ #if PlSnP_parallelism > 1
356
+ processed = 0;
357
+ #endif
358
+ offset = instance->pistons.offsetCrypt;
359
+ if ( unwrapFlag == Atom_False )
360
+ {
361
+ /* Wrap */
362
+ ForEveryPiston(instance->pistons.indexCrypt)
363
+ {
364
+ length = Rs - offset;
365
+ if (length > Ilen)
366
+ length = (unsigned int)Ilen;
367
+ State_AddBytes(instance->pistons.state, I, offset, length );
368
+ State_ExtractBytes(instance->pistons.state, O, offset, length );
369
+ #if PlSnP_parallelism > 1
370
+ I += length;
371
+ O += length;
372
+ processed += length;
373
+ #endif
374
+ Ilen -= length;
375
+ offset += (unsigned char)length;
376
+ if ( offset == Rs )
377
+ {
378
+ State_AddByte(instance->pistons.state, offset, OffsetCryptEnd);
379
+ #if PlSnP_parallelism > 1
380
+ offset = instance->tagEndIndexNext;
381
+ ++instance->pistons.indexCrypt;
382
+ #else
383
+ instance->pistons.phaseCrypt = Pistons_Phase_Full;
384
+ #endif
385
+ }
386
+ }
387
+ }
388
+ else
389
+ {
390
+ /* Unwrap */
391
+ ForEveryPiston(instance->pistons.indexCrypt)
392
+ {
393
+ length = Rs - offset;
394
+ if (length > Ilen)
395
+ length = (unsigned int)Ilen;
396
+ State_ExtractAndAddBytes(instance->pistons.state, I, O, offset, length);
397
+ State_AddBytes(instance->pistons.state, O, offset, length);
398
+ #if PlSnP_parallelism > 1
399
+ I += length;
400
+ O += length;
401
+ processed += length;
402
+ #endif
403
+ Ilen -= length;
404
+ offset += (unsigned char)length;
405
+ if ( offset == Rs )
406
+ {
407
+ State_AddByte(instance->pistons.state, offset, OffsetCryptEnd);
408
+ #if PlSnP_parallelism > 1
409
+ offset = instance->tagEndIndexNext;
410
+ ++instance->pistons.indexCrypt;
411
+ #else
412
+ instance->pistons.phaseCrypt = Pistons_Phase_Full;
413
+ #endif
414
+ }
415
+ }
416
+ }
417
+ instance->pistons.offsetCrypt = offset;
418
+
419
+ #if PlSnP_parallelism > 1
420
+ if ( instance->pistons.indexCrypt == PlSnP_parallelism )
421
+ {
422
+ instance->pistons.phaseCrypt = Pistons_Phase_Full;
423
+ }
424
+ #endif
425
+ if ( (Ilen == 0) && ((lastFlag & Motorist_Wrap_LastCryptData) != 0) )
426
+ {
427
+ /* Done with crypting (out of fuel) */
428
+ if ( instance->pistons.phaseCrypt != Pistons_Phase_Full )
429
+ {
430
+ ForEveryPiston(instance->pistons.indexCrypt)
431
+ {
432
+ State_AddByte(instance->pistons.state, offset, OffsetCryptEnd);
433
+ #if PlSnP_parallelism > 1
434
+ offset = instance->tagEndIndexNext;
435
+ #endif
436
+ }
437
+ }
438
+ instance->pistons.phaseCrypt = Pistons_Phase_Done;
439
+ instance->phase = Engine_Phase_Crypted;
440
+ }
441
+ #if PlSnP_parallelism > 1
442
+ return ( processed );
443
+ #else
444
+ return ( length );
445
+ #endif
446
+ }
447
+
448
+ int Engine_Inject(Engine_Instance *instance, const unsigned char * A, size_t Alen, int lastFlag)
449
+ {
450
+ DeclarePistonIndex
451
+ unsigned int length;
452
+ #if PlSnP_parallelism > 1
453
+ int processed;
454
+ #endif
455
+
456
+ if ( instance->pistons.phaseInject != Pistons_Phase_Running )
457
+ {
458
+ if ( instance->pistons.phaseInject != Engine_Phase_Fresh )
459
+ {
460
+ return ( Atom_Error );
461
+ }
462
+ #if PlSnP_parallelism > 1
463
+ instance->pistons.indexInject = 0;
464
+ #endif
465
+ if ( instance->pistons.phaseCrypt == Pistons_Phase_Fresh )
466
+ {
467
+ instance->pistons.offsetInject = 0;
468
+ }
469
+ else
470
+ {
471
+ instance->pistons.offsetInject = Rs;
472
+ ForEveryPiston(0)
473
+ {
474
+ State_AddByte(instance->pistons.state, instance->pistons.offsetInject, OffsetInjectStart);
475
+ }
476
+ }
477
+ instance->pistons.phaseInject = Pistons_Phase_Running;
478
+ }
479
+
480
+ #if PlSnP_parallelism > 1
481
+ processed = 0;
482
+ #endif
483
+ ForEveryPiston(instance->pistons.indexInject)
484
+ {
485
+ length = Ra - instance->pistons.offsetInject;
486
+ if (length > Alen)
487
+ length = (unsigned int)Alen;
488
+ State_AddBytes(instance->pistons.state, A, instance->pistons.offsetInject, length );
489
+ #if PlSnP_parallelism > 1
490
+ A += length;
491
+ processed += (int)length;
492
+ #endif
493
+ Alen -= length;
494
+ instance->pistons.offsetInject += (unsigned char)length;
495
+ if ( instance->pistons.offsetInject == Ra )
496
+ {
497
+ State_AddByte(instance->pistons.state, instance->pistons.offsetInject, OffsetInjectEnd);
498
+ #if PlSnP_parallelism > 1
499
+ instance->pistons.offsetInject = (instance->pistons.phaseCrypt == Pistons_Phase_Fresh) ? 0 : Rs;
500
+ ++instance->pistons.indexInject;
501
+ #else
502
+ instance->pistons.phaseInject = Pistons_Phase_Full;
503
+ #endif
504
+ }
505
+ }
506
+
507
+ #if PlSnP_parallelism > 1
508
+ if ( instance->pistons.indexInject == PlSnP_parallelism )
509
+ {
510
+ instance->pistons.phaseInject = Pistons_Phase_Full;
511
+ }
512
+ #endif
513
+ if ( (Alen == 0) && ((lastFlag & Motorist_Wrap_LastMetaData) != 0) )
514
+ {
515
+ /* Done injecting */
516
+ if ( (instance->pistons.phaseInject != Pistons_Phase_Full) && (instance->pistons.offsetInject != 0) ) /* Optimization: don't xor zeroes */
517
+ {
518
+ ForEveryPiston(instance->pistons.indexInject)
519
+ {
520
+ State_AddByte(instance->pistons.state, instance->pistons.offsetInject, OffsetInjectEnd);
521
+ #if PlSnP_parallelism > 1
522
+ if ( instance->pistons.phaseCrypt == Pistons_Phase_Fresh )
523
+ break;
524
+ instance->pistons.offsetInject = Rs;
525
+ #endif
526
+ }
527
+ }
528
+ instance->pistons.phaseInject = Pistons_Phase_Done;
529
+ }
530
+ #if PlSnP_parallelism > 1
531
+ return ( processed );
532
+ #else
533
+ return ( length );
534
+ #endif
535
+ }
536
+
537
+ static int Engine_InjectCollectiveStreamer(Engine_Instance *instance, unsigned char *X, unsigned int sizeX, unsigned char * pOffset, int diversifyFlag);
538
+ static int Engine_InjectCollectiveStreamer(Engine_Instance *instance, unsigned char *X, unsigned int sizeX, unsigned char * pOffset, int diversifyFlag)
539
+ {
540
+ DeclarePistonIndex
541
+ unsigned char partSize;
542
+ unsigned char offset;
543
+
544
+ offset = *pOffset;
545
+ partSize = Ra - offset;
546
+ if ( partSize > sizeX )
547
+ partSize = (unsigned char)sizeX;
548
+ *pOffset += partSize;
549
+
550
+ ForEveryPiston(0)
551
+ {
552
+ State_AddByte(instance->pistons.state, offset, OffsetInjectEnd); /* remove previous OffsetInjectEnd */
553
+ State_AddBytes(instance->pistons.state, X, offset, partSize );
554
+ State_AddByte(instance->pistons.state, *pOffset, OffsetInjectEnd);
555
+ if ( (diversifyFlag != Atom_False) && (partSize == sizeX) )
556
+ X[sizeX-1]++;
557
+ }
558
+ sizeX -= partSize;
559
+
560
+ /* Check block full and more data to follow */
561
+ if ( *pOffset == Ra )
562
+ {
563
+ *pOffset = 0;
564
+ if ( sizeX != 0 )
565
+ {
566
+ Engine_Spark(instance, 0, 0, 0 );
567
+ }
568
+ }
569
+ return ( partSize );
570
+ }
571
+
572
+ int Engine_InjectCollective(Engine_Instance *instance, const unsigned char *X, unsigned int sizeX, int diversifyFlag)
573
+ {
574
+ unsigned char offset;
575
+ int result;
576
+ unsigned char diversifier[2];
577
+ int dataAvailableFlag = 0;
578
+
579
+ if ( instance->phase != Engine_Phase_Fresh )
580
+ return ( Atom_Error );
581
+ offset = 0;
582
+
583
+ /* Inject X and spark while full blocks and more X available */
584
+ if ( sizeX != 0 )
585
+ {
586
+ dataAvailableFlag = 1;
587
+ do
588
+ {
589
+ result = Engine_InjectCollectiveStreamer(instance, (unsigned char *)X, sizeX, &offset, 0 );
590
+ if ( result < 0 )
591
+ return ( Atom_Error );
592
+ X += result;
593
+ }
594
+ while ( (sizeX -= result) != 0 );
595
+ }
596
+ if ( diversifyFlag != Atom_False )
597
+ {
598
+ if ( (offset == 0) && (dataAvailableFlag != 0) ) /* spark the last full block */
599
+ Engine_Spark(instance, 0, 0, 0 );
600
+ diversifier[0] = PlSnP_parallelism;
601
+ diversifier[1] = 0;
602
+ for ( result = 0, sizeX = 2; sizeX != 0; sizeX -= result )
603
+ {
604
+ result = Engine_InjectCollectiveStreamer(instance, diversifier + result, sizeX, &offset, 1 );
605
+ if ( result < 0 )
606
+ return ( Atom_Error );
607
+ }
608
+ }
609
+ instance->phase = Engine_Phase_EndOfMessage;
610
+ return ( Atom_Success );
611
+ }
612
+
613
+ int Engine_GetTags(Engine_Instance *instance, unsigned char *tag, unsigned char length, unsigned char lengthNext)
614
+ {
615
+ DeclarePistonIndex
616
+
617
+ if ( instance->phase != Engine_Phase_EndOfMessage )
618
+ return ( Atom_Error );
619
+ if ( Engine_Spark(instance, 1, length, lengthNext) != 0 )
620
+ return ( Atom_Error );
621
+ if ( length > Rs )
622
+ return ( Atom_Error );
623
+ #if PlSnP_parallelism != 1
624
+ if ( lengthNext > Rs )
625
+ return ( Atom_Error );
626
+ #endif
627
+
628
+ ForEveryPiston(0)
629
+ {
630
+ State_ExtractBytes(instance->pistons.state, tag, 0, length );
631
+ #if PlSnP_parallelism != 1
632
+ tag += length;
633
+ length = lengthNext;
634
+ #endif
635
+ }
636
+ instance->phase = Engine_Phase_Fresh;
637
+ return ( Atom_Success );
638
+ }
639
+
640
+ /* ------------------------------------------------------------------------ */
641
+
642
+ static int Motorist_MakeKnot(Motorist_Instance *instance );
643
+ static int Motorist_MakeKnot(Motorist_Instance *instance )
644
+ {
645
+ unsigned char tempTags[PlSnP_parallelism*Cprime];
646
+
647
+ if ( Engine_GetTags(&instance->engine, tempTags, Cprime, Cprime ) < 0 )
648
+ return ( Atom_Error );
649
+ return ( Engine_InjectCollective(&instance->engine, tempTags, PlSnP_parallelism * Cprime, 0) );
650
+ }
651
+
652
+ static int Motorist_HandleTag(Motorist_Instance *instance, int tagFlag, unsigned char * tag, int unwrapFlag );
653
+ static int Motorist_HandleTag(Motorist_Instance *instance, int tagFlag, unsigned char * tag, int unwrapFlag )
654
+ {
655
+ unsigned char tempTag[TagLength];
656
+
657
+ if ( tagFlag == Atom_False )
658
+ {
659
+ if ( Engine_GetTags(&instance->engine, tempTag, 0, 0 ) < 0 )
660
+ return ( Atom_Error );
661
+ }
662
+ else
663
+ {
664
+ if ( Engine_GetTags(&instance->engine, tempTag, TagLength, 0) < 0 )
665
+ return ( Atom_Error );
666
+ if ( unwrapFlag == Atom_False )
667
+ {
668
+ memcpy( tag, tempTag, TagLength );
669
+ }
670
+ else if ( memcmp( tempTag, tag, TagLength ) != 0 )
671
+ {
672
+ instance->phase = Motorist_Phase_Failed;
673
+ return ( Atom_False );
674
+ }
675
+ }
676
+ return ( Atom_True );
677
+ }
678
+
679
+ int Motorist_Initialize(Motorist_Instance *instance)
680
+ {
681
+ if ( Engine_Initialize(&instance->engine) != 0 )
682
+ return ( Atom_Error );
683
+ instance->phase = Motorist_Phase_Ready;
684
+ instance->lastFlag = 0;
685
+ return ( Atom_Success );
686
+ }
687
+
688
+ int Motorist_StartEngine(Motorist_Instance *instance, const unsigned char * SUV, size_t SUVlen, int tagFlag, unsigned char * tag, int unwrapFlag, int forgetFlag )
689
+ {
690
+ int result = Atom_False;
691
+
692
+ if ( instance->phase != Motorist_Phase_Ready )
693
+ return ( Atom_Error );
694
+ if ( Engine_InjectCollective(&instance->engine, SUV, (unsigned int)SUVlen, 1) != 0 )
695
+ return ( Atom_Error );
696
+ if ( forgetFlag != Atom_False )
697
+ if ( Motorist_MakeKnot(instance) < 0 )
698
+ return ( Atom_Error );
699
+ result = Motorist_HandleTag(instance, tagFlag, tag, unwrapFlag );
700
+ if ( result == Atom_True )
701
+ instance->phase = Motorist_Phase_Riding;
702
+ return ( result );
703
+ }
704
+
705
+
706
+ int Motorist_Wrap(Motorist_Instance *instance, const unsigned char * I, size_t Ilen, unsigned char *O,
707
+ const unsigned char * A, size_t Alen, unsigned char * tag, int unwrapFlag, int forgetFlag,
708
+ int lastFlag, size_t *processedIlen, size_t *processedAlen)
709
+ {
710
+ int resultI;
711
+ int resultA;
712
+ unsigned char *initialO;
713
+ size_t initialOlen;
714
+
715
+ initialO = O;
716
+ initialOlen = Ilen;
717
+ *processedIlen = 0;
718
+ *processedAlen = 0;
719
+ if ( instance->phase != Motorist_Phase_Riding )
720
+ return ( Atom_Error );
721
+
722
+ /* Once a lastFlag has been set, it must remain set during the session */
723
+ if ( ((instance->lastFlag & Motorist_Wrap_LastCryptData) != 0) && ((lastFlag & Motorist_Wrap_LastCryptData) == 0) )
724
+ return ( Atom_Error );
725
+ if ( ((instance->lastFlag & Motorist_Wrap_LastMetaData) != 0) && ((lastFlag & Motorist_Wrap_LastMetaData) == 0) )
726
+ return ( Atom_Error );
727
+ instance->lastFlag = (unsigned char)lastFlag;
728
+ if ( ((lastFlag & Motorist_Wrap_LastCryptData) == 0) && (Ilen != 0) )
729
+ --Ilen;
730
+ if ( ((lastFlag & Motorist_Wrap_LastMetaData) == 0) && (Alen != 0) )
731
+ --Alen;
732
+
733
+ if ( instance->engine.phase == Engine_Phase_Fresh )
734
+ {
735
+ if ( Ilen != 0 )
736
+ {
737
+ /* Caller wants to crypt. */
738
+ instance->engine.phase = Engine_Phase_Crypting;
739
+ }
740
+ else if ( (lastFlag & Motorist_Wrap_LastCryptData) == 0 )
741
+ {
742
+ /* Caller does not give input, but does not set lastCrypt flag,
743
+ ** so we don't know how the phase will evolve, do nothing.
744
+ */
745
+ return ( Atom_True );
746
+ }
747
+ else
748
+ {
749
+ /* Only metadata can follow (input is empty) */
750
+ instance->engine.phase = Engine_Phase_InjectOnly;
751
+ if ( (Alen == 0) && ((lastFlag & Motorist_Wrap_LastMetaData) != 0) )
752
+ {
753
+ /* Nothing to inject either, perform empty inject */
754
+ if ( Engine_Inject(&instance->engine, A, 0, Motorist_Wrap_LastMetaData ) != 0 )
755
+ return ( Atom_Error );
756
+ instance->engine.phase = Engine_Phase_EndOfMessage;
757
+ }
758
+ }
759
+ }
760
+
761
+ if ( instance->engine.phase == Engine_Phase_Crypting )
762
+ {
763
+ while ( Ilen != 0 )
764
+ {
765
+ /* If more data available and Crypter and Injector are full, then spark */
766
+ if ( ((Ilen | Alen) != 0) && (instance->engine.pistons.phaseCrypt == Pistons_Phase_Full) )
767
+ {
768
+ if ( instance->engine.pistons.phaseInject >= Pistons_Phase_Full ) /* Full or Done */
769
+ {
770
+ Engine_Spark(&instance->engine, 0, 0, 0 );
771
+ }
772
+ else if ( (Alen == 0) && ((lastFlag & Motorist_Wrap_LastMetaData) != 0) ) /* AD done, but Pistons not aware */
773
+ {
774
+ resultA = Engine_Inject(&instance->engine, 0, 0, Motorist_Wrap_LastMetaData );
775
+ if ( resultA < 0 )
776
+ return ( Atom_Error );
777
+ Engine_Spark(&instance->engine, 0, 0, 0 );
778
+ }
779
+ }
780
+
781
+ if ( (Ilen > (Rs*PlSnP_parallelism)) && (instance->engine.pistons.phaseCrypt == Pistons_Phase_Fresh) && (instance->engine.tagEndIndex == 0) )
782
+ {
783
+ if ( Alen > ((Ra-Rs)*PlSnP_parallelism) )
784
+ {
785
+ size_t processedI;
786
+ size_t processedA = Engine_FastWrapCryptAndInject(&instance->engine, I, Ilen, &processedI, O, A, Alen, unwrapFlag);
787
+ Alen -= processedA;
788
+ A += processedA;
789
+ *processedAlen += processedA;
790
+ Ilen -= processedI;
791
+ I += processedI;
792
+ O += processedI;
793
+ *processedIlen += processedI;
794
+ }
795
+ else if ( (Alen == 0) && ((lastFlag & Motorist_Wrap_LastMetaData) != 0) )
796
+ {
797
+ size_t processedI = Engine_FastWrapCryptOnly(&instance->engine, I, Ilen, O, unwrapFlag);
798
+ Ilen -= processedI;
799
+ I += processedI;
800
+ O += processedI;
801
+ *processedIlen += processedI;
802
+ }
803
+ }
804
+
805
+ if ( instance->engine.pistons.phaseCrypt == Pistons_Phase_Full )
806
+ resultI = 0;
807
+ else
808
+ {
809
+ resultI = Engine_Crypt(&instance->engine, I, Ilen, O, unwrapFlag, lastFlag & Motorist_Wrap_LastCryptData );
810
+ if ( resultI < 0 )
811
+ return ( Atom_Error );
812
+ *processedIlen += resultI;
813
+ Ilen -= resultI;
814
+ I += resultI;
815
+ O += resultI;
816
+ }
817
+
818
+ if ( instance->engine.pistons.phaseInject >= Pistons_Phase_Full ) /* Full or Done */
819
+ resultA = 0;
820
+ else
821
+ {
822
+ resultA = Engine_Inject(&instance->engine, A, Alen, lastFlag & Motorist_Wrap_LastMetaData );
823
+ if ( resultA < 0 )
824
+ return ( Atom_Error );
825
+ *processedAlen += resultA;
826
+ Alen -= resultA;
827
+ A += resultA;
828
+ }
829
+
830
+ if ( (instance->engine.pistons.phaseCrypt == Pistons_Phase_Done)
831
+ && (instance->engine.pistons.phaseInject == Pistons_Phase_Done))
832
+ {
833
+ instance->engine.phase = Engine_Phase_EndOfMessage;
834
+ break;
835
+ }
836
+
837
+ if ( (resultI | resultA) == 0 )
838
+ {
839
+ /* Can't do more than that */
840
+ return ( Atom_True );
841
+ }
842
+ }
843
+ }
844
+
845
+ /* Input all done, continue injecting */
846
+ if ( (instance->engine.phase == Engine_Phase_Crypted)
847
+ || (instance->engine.phase == Engine_Phase_InjectOnly) )
848
+ {
849
+ while ( (Alen != 0) || ((lastFlag & Motorist_Wrap_LastMetaData) != 0) )
850
+ {
851
+ /* If more data available and Injector is full, then spark */
852
+ if ( instance->engine.pistons.phaseInject == Pistons_Phase_Full )
853
+ {
854
+ Engine_Spark(&instance->engine, 0, 0, 0 );
855
+ }
856
+
857
+ if ((Alen > (Ra*PlSnP_parallelism))
858
+ && (instance->engine.pistons.phaseInject == Pistons_Phase_Fresh)
859
+ && (instance->engine.pistons.phaseCrypt == Pistons_Phase_Fresh) )
860
+ {
861
+ size_t processed = Engine_FastWrapInjectOnly(&instance->engine, A, Alen);
862
+ Alen -= processed;
863
+ A += processed;
864
+ *processedAlen += processed;
865
+ instance->engine.pistons.offsetInject = 0;
866
+ #if PlSnP_parallelism > 1
867
+ instance->engine.pistons.indexInject = 0;
868
+ #endif
869
+ }
870
+
871
+ resultA = Engine_Inject(&instance->engine, A, Alen, lastFlag & Motorist_Wrap_LastMetaData );
872
+ if ( resultA < 0 )
873
+ return ( Atom_Error );
874
+ *processedAlen += resultA;
875
+ Alen -= resultA;
876
+ A += resultA;
877
+
878
+ if ( instance->engine.pistons.phaseInject == Pistons_Phase_Done )
879
+ {
880
+ instance->engine.phase = Engine_Phase_EndOfMessage;
881
+ break;
882
+ }
883
+ }
884
+ }
885
+
886
+ if ( instance->engine.phase == Engine_Phase_EndOfMessage )
887
+ {
888
+ instance->lastFlag = 0;
889
+
890
+ /* Everything is processed */
891
+ #if PlSnP_parallelism == 1
892
+ if ( forgetFlag != Atom_False )
893
+ #endif
894
+ if ( Motorist_MakeKnot(instance) < 0 )
895
+ return ( Atom_Error );
896
+ resultI = Motorist_HandleTag(instance, Atom_True, tag, unwrapFlag );
897
+ if ( resultI != Atom_True )
898
+ memset( initialO, 0, initialOlen );
899
+ return ( resultI );
900
+ }
901
+ return ( Atom_True );
902
+ }
903
+
904
+ #undef W
905
+ #undef Ra
906
+ #undef Rs
907
+ #undef Cprime
908
+
909
+ #undef OffsetEOM
910
+ #undef OffsetCryptEnd
911
+ #undef OffsetInjectStart
912
+ #undef OffsetInjectEnd
913
+
914
+ #undef Engine_Instance
915
+ #undef Engine_Spark
916
+ #undef Engine_Initialize
917
+ #undef Engine_Crypt
918
+ #undef Engine_Inject
919
+ #undef Engine_InjectCollectiveStreamer
920
+ #undef Engine_InjectCollective
921
+ #undef Engine_GetTags
922
+ #undef Engine_FastWrapCryptOnly
923
+ #undef Engine_FastWrapInjectOnly
924
+ #undef Engine_FastWrapCryptAndInject
925
+
926
+ #undef Motorist_Instance
927
+ #undef Motorist_MakeKnot
928
+ #undef Motorist_HandleTag
929
+ #undef Motorist_Initialize
930
+ #undef Motorist_StartEngine
931
+ #undef Motorist_Wrap
932
+
933
+ #undef DeclarePistonIndex
934
+ #if PlSnP_parallelism == 1
935
+ #undef indexP
936
+ #endif
937
+ #undef ForEveryPiston
938
+
939
+ #undef State_StaticInitialize
940
+ #undef State_Initialize
941
+ #undef State_Permute
942
+ #undef State_AddBytes
943
+ #undef State_AddByte
944
+ #undef State_OverwriteBytes
945
+ #undef State_ExtractBytes
946
+ #undef State_ExtractAndAddBytes
947
+ #if PlSnP_parallelism > 1
948
+ #undef PlSnP_AddLanesAll
949
+ #undef PlSnP_ExtractLanesAll
950
+ #undef PlSnP_ExtractAndAddLanesAll
951
+ #endif
952
+ #undef State_AddByteU
953
+ #undef State_AddBytesU