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,533 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ Kravatte, designed by Guido Bertoni, Joan Daemen, Seth Hoffert, 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
+ #if DEBUG
18
+ #include <assert.h>
19
+ #endif
20
+ #include <string.h>
21
+ #include <stdlib.h>
22
+ #include "brg_endian.h"
23
+ #include "Kravatte.h"
24
+
25
+ #ifdef XKCP_has_KeccakP1600times2
26
+ #include "KeccakP-1600-times2-SnP.h"
27
+ #endif
28
+
29
+ #ifdef XKCP_has_KeccakP1600times4
30
+ #include "KeccakP-1600-times4-SnP.h"
31
+ #endif
32
+
33
+ #ifdef XKCP_has_KeccakP1600times8
34
+ #include "KeccakP-1600-times8-SnP.h"
35
+ #endif
36
+
37
+ /*
38
+ ** Uncomment this define if calls to KeccakP1600_Initialize() and
39
+ ** KeccakP1600times##Parallellism##_InitializeAll() are mandatory to make it work,
40
+ ** mostly not needed.
41
+ **
42
+ #define NEED_INITIALIZE
43
+ */
44
+
45
+ /*
46
+ ** Uncomment this define for more debugging dumps.
47
+ **
48
+ #define DEBUG_DUMP
49
+ */
50
+
51
+ #define MaxParallellism 8
52
+ #define laneSize 8
53
+ #define widthInLanes (SnP_widthInBytes/laneSize)
54
+ #define SnP_width (SnP_widthInBytes*8)
55
+
56
+ #define MyMin(a, b) (((a) < (b)) ? (a) : (b))
57
+
58
+ #if defined(_MSC_VER)
59
+ #define ROL64(a, offset) _rotl64(a, offset)
60
+ #elif defined(KeccakP1600_useSHLD)
61
+ #define ROL64(x,N) ({ \
62
+ register uint64_t __out; \
63
+ register uint64_t __in = x; \
64
+ __asm__ ("shld %2,%0,%0" : "=r"(__out) : "0"(__in), "i"(N)); \
65
+ __out; \
66
+ })
67
+ #else
68
+ #define ROL64(a, offset) ((((uint64_t)a) << (offset)) | (((uint64_t)a) >> (64-(offset))))
69
+ #endif
70
+
71
+ #if defined(NEED_INITIALIZE)
72
+ #define mInitialize(argState) KeccakP1600_Initialize(argState)
73
+ #define mInitializePl(argStates, Parallellism) KeccakP1600times##Parallellism##_InitializeAll(argStates)
74
+ #else
75
+ #define mInitialize(argState)
76
+ #define mInitializePl(argStates, Parallellism)
77
+ #endif
78
+
79
+ #if defined(DEBUG_DUMP)
80
+ static void DUMP( const unsigned char * pText, const unsigned char * pData, unsigned int size )
81
+ {
82
+ unsigned int i;
83
+ printf("%s (%u bytes):", pText, size);
84
+ for(i=0; i<size; i++)
85
+ printf(" %02x", (int)pData[i]);
86
+ printf("\n");
87
+ }
88
+
89
+ static void DUMP64( const unsigned char * pText, const unsigned char * pData, unsigned int size )
90
+ {
91
+ unsigned int i;
92
+ size /=8;
93
+ printf("%s (%u lanes):", pText, size);
94
+ for(i=0; i<size; i++)
95
+ printf(" %016lx", ((uint64_t*)pData)[i]);
96
+ printf("\n");
97
+ }
98
+ #else
99
+ #define DUMP(pText, pData, size )
100
+ #define DUMP64(pText, pData, size )
101
+ #endif
102
+
103
+ #define ParallelCompressLoopFast( Parallellism ) \
104
+ if ( messageByteLen >= Parallellism * SnP_widthInBytes ) { \
105
+ size_t processed = KeccakP1600times##Parallellism##_KravatteCompress((uint64_t*)x, (uint64_t*)k, message, messageByteLen); \
106
+ message += processed; \
107
+ messageByteLen -= processed; \
108
+ }
109
+
110
+ #define ParallelExpandLoopFast( Parallellism ) \
111
+ if ( outputByteLen >= Parallellism * SnP_widthInBytes ) { \
112
+ size_t processed = KeccakP1600times##Parallellism##_KravatteExpand((uint64_t*)kv->yAccu.a, (uint64_t*)kv->kRoll.a, output, outputByteLen); \
113
+ output += processed; \
114
+ outputByteLen -= processed; \
115
+ }
116
+
117
+ #define ParallelCompressLoopPlSnP( Parallellism ) \
118
+ if ( messageByteLen >= Parallellism * SnP_widthInBytes ) { \
119
+ ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
120
+ unsigned int i; \
121
+ \
122
+ KeccakP1600times##Parallellism##_StaticInitialize(); \
123
+ mInitializePl(states, Parallellism); \
124
+ do { \
125
+ Kravatte_Rollc( (uint64_t*)k, encbuf, Parallellism ); \
126
+ KeccakP1600times##Parallellism##_OverwriteLanesAll(states, k, Kravatte_RollcOffset/8, 0); \
127
+ i = 0; \
128
+ do { \
129
+ KeccakP1600times##Parallellism##_OverwriteBytes(states, i, encbuf + i * Kravatte_RollcSizeInBytes, Kravatte_RollcOffset, Kravatte_RollcSizeInBytes); \
130
+ } while ( ++i < Parallellism ); \
131
+ KeccakP1600times##Parallellism##_AddLanesAll(states, message, widthInLanes, widthInLanes); \
132
+ DUMP("msg pn", message, Parallellism * SnP_widthInBytes); \
133
+ KeccakP1600times##Parallellism##_PermuteAll_6rounds(states); \
134
+ i = 0; \
135
+ do { \
136
+ KeccakP1600times##Parallellism##_ExtractAndAddBytes(states, i, x, x, 0, SnP_widthInBytes); \
137
+ DUMP("xAc pn", x, SnP_widthInBytes); \
138
+ } while ( ++i < Parallellism ); \
139
+ message += Parallellism * SnP_widthInBytes; \
140
+ messageByteLen -= Parallellism * SnP_widthInBytes; \
141
+ } while ( messageByteLen >= Parallellism * SnP_widthInBytes ); \
142
+ }
143
+
144
+ #define ParallelExpandLoopPlSnP( Parallellism ) \
145
+ if ( outputByteLen >= Parallellism * SnP_widthInBytes ) { \
146
+ ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
147
+ unsigned int i; \
148
+ \
149
+ KeccakP1600times##Parallellism##_StaticInitialize(); \
150
+ mInitializePl(states, Parallellism); \
151
+ do { \
152
+ Kravatte_Rolle( (uint64_t*)kv->yAccu.a, encbuf, Parallellism ); \
153
+ KeccakP1600times##Parallellism##_OverwriteLanesAll(states, kv->yAccu.a, Kravatte_RolleOffset/8, 0); \
154
+ i = 0; \
155
+ do { \
156
+ KeccakP1600times##Parallellism##_OverwriteBytes(states, i, encbuf + i * Kravatte_RolleSizeInBytes, Kravatte_RolleOffset, Kravatte_RolleSizeInBytes); \
157
+ } while ( ++i < Parallellism ); \
158
+ KeccakP1600times##Parallellism##_PermuteAll_6rounds(states); \
159
+ i = 0; \
160
+ do { \
161
+ KeccakP1600times##Parallellism##_ExtractAndAddBytes(states, i, kv->kRoll.a, output, 0, SnP_widthInBytes); \
162
+ DUMP("out n", output, SnP_widthInBytes); \
163
+ output += SnP_widthInBytes; \
164
+ } while ( ++i < Parallellism ); \
165
+ outputByteLen -= Parallellism * SnP_widthInBytes; \
166
+ } while ( outputByteLen >= Parallellism * SnP_widthInBytes ); \
167
+ }
168
+
169
+ static void Kravatte_Rollc( uint64_t *x, unsigned char *encbuf, unsigned int parallellism )
170
+ {
171
+ uint64_t x0 = x[20];
172
+ uint64_t x1 = x[21];
173
+ uint64_t x2 = x[22];
174
+ uint64_t x3 = x[23];
175
+ uint64_t x4 = x[24];
176
+ uint64_t t;
177
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
178
+ uint64_t *pEnc = (uint64_t*)encbuf;
179
+ #endif
180
+
181
+ do {
182
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
183
+ *(pEnc++) = x0;
184
+ *(pEnc++) = x1;
185
+ *(pEnc++) = x2;
186
+ *(pEnc++) = x3;
187
+ *(pEnc++) = x4;
188
+ DUMP("Rollc", pEnc - Kravatte_RollcSizeInBytes/8, Kravatte_RollcSizeInBytes);
189
+ #else
190
+ #error todo
191
+ #endif
192
+
193
+ t = x0;
194
+ x0 = x1;
195
+ x1 = x2;
196
+ x2 = x3;
197
+ x3 = x4;
198
+ x4 = ROL64(t, 7) ^ x0 ^ (x0 >> 3);
199
+ } while(--parallellism != 0);
200
+
201
+ x[20] = x0;
202
+ x[21] = x1;
203
+ x[22] = x2;
204
+ x[23] = x3;
205
+ x[24] = x4;
206
+ DUMP("Rollc state", pEnc - Kravatte_RollcSizeInBytes/8, Kravatte_RollcSizeInBytes);
207
+
208
+ }
209
+
210
+ static void Kravatte_Rolle( uint64_t *x, unsigned char *encbuf, unsigned int parallellism )
211
+ {
212
+ uint64_t x0 = x[15];
213
+ uint64_t x1 = x[16];
214
+ uint64_t x2 = x[17];
215
+ uint64_t x3 = x[18];
216
+ uint64_t x4 = x[19];
217
+ uint64_t x5 = x[20];
218
+ uint64_t x6 = x[21];
219
+ uint64_t x7 = x[22];
220
+ uint64_t x8 = x[23];
221
+ uint64_t x9 = x[24];
222
+ uint64_t t;
223
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
224
+ uint64_t *pEnc = (uint64_t*)encbuf;
225
+ #endif
226
+
227
+ do {
228
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
229
+ *(pEnc++) = x0;
230
+ *(pEnc++) = x1;
231
+ *(pEnc++) = x2;
232
+ *(pEnc++) = x3;
233
+ *(pEnc++) = x4;
234
+ *(pEnc++) = x5;
235
+ *(pEnc++) = x6;
236
+ *(pEnc++) = x7;
237
+ *(pEnc++) = x8;
238
+ *(pEnc++) = x9;
239
+ DUMP("Rolle", pEnc - Kravatte_RolleSizeInBytes/8, Kravatte_RolleSizeInBytes);
240
+ #else
241
+ #error todo
242
+ #endif
243
+
244
+ t = x0;
245
+ x0 = x1;
246
+ x1 = x2;
247
+ x2 = x3;
248
+ x3 = x4;
249
+ x4 = x5;
250
+ x5 = x6;
251
+ x6 = x7;
252
+ x7 = x8;
253
+ x8 = x9;
254
+ x9 = ROL64(t, 7) ^ ROL64(x0, 18) ^ (x1 & (x0 >> 1));
255
+ } while(--parallellism != 0);
256
+
257
+ x[15] = x0;
258
+ x[16] = x1;
259
+ x[17] = x2;
260
+ x[18] = x3;
261
+ x[19] = x4;
262
+ x[20] = x5;
263
+ x[21] = x6;
264
+ x[22] = x7;
265
+ x[23] = x8;
266
+ x[24] = x9;
267
+ DUMP("Rolle state", pEnc - Kravatte_RolleSizeInBytes/8, Kravatte_RolleSizeInBytes);
268
+
269
+ }
270
+
271
+ static const unsigned char * Kra_Compress( unsigned char *k, unsigned char *x, const BitSequence *message, BitLength *messageBitLen, int lastFlag )
272
+ {
273
+ unsigned char encbuf[MaxParallellism*Kravatte_RollcSizeInBytes];
274
+ size_t messageByteLen = *messageBitLen / 8; /* do not include partial last byte */
275
+
276
+ #if defined(KeccakP1600times8_implementation) && !defined(KeccakP1600times8_isFallback)
277
+ #if defined(KeccakF1600times8_FastKravatte_supported)
278
+ ParallelCompressLoopFast( 8 )
279
+ #else
280
+ ParallelCompressLoopPlSnP( 8 )
281
+ #endif
282
+ #endif
283
+ #if defined(KeccakP1600times4_implementation) && !defined(KeccakP1600times4_isFallback)
284
+ #if defined(KeccakF1600times4_FastKravatte_supported)
285
+ ParallelCompressLoopFast( 4 )
286
+ #else
287
+ ParallelCompressLoopPlSnP( 4 )
288
+ #endif
289
+ #endif
290
+ #if defined(KeccakP1600times2_implementation) && !defined(KeccakP1600times2_isFallback)
291
+ #if defined(KeccakF1600times2_FastKravatte_supported)
292
+ ParallelCompressLoopFast( 2 )
293
+ #else
294
+ ParallelCompressLoopPlSnP( 2 )
295
+ #endif
296
+ #endif
297
+
298
+ if (messageByteLen >= SnP_widthInBytes) {
299
+ ALIGN(KeccakP1600_stateAlignment) unsigned char state[KeccakP1600_stateSizeInBytes];
300
+
301
+ KeccakP1600_StaticInitialize();
302
+ mInitialize(state);
303
+ do {
304
+ KeccakP1600_OverwriteBytes(state, k, 0, SnP_widthInBytes);
305
+ Kravatte_Rollc((uint64_t*)k, encbuf, 1);
306
+ KeccakP1600_AddBytes(state, message, 0, SnP_widthInBytes);
307
+ DUMP("msg p1", message, SnP_widthInBytes);
308
+ KeccakP1600_Permute_Nrounds(state, 6);
309
+ KeccakP1600_ExtractAndAddBytes(state, x, x, 0, SnP_widthInBytes);
310
+ DUMP("xAc p1", x, SnP_widthInBytes);
311
+ message += SnP_widthInBytes;
312
+ messageByteLen -= SnP_widthInBytes;
313
+ } while ( messageByteLen >= SnP_widthInBytes );
314
+ }
315
+ *messageBitLen %= SnP_width;
316
+ if ( lastFlag != 0 ) {
317
+ ALIGN(KeccakP1600_stateAlignment) unsigned char state[KeccakP1600_stateSizeInBytes];
318
+
319
+ #if DEBUG
320
+ assert(messageByteLen < SnP_widthInBytes);
321
+ #endif
322
+ KeccakP1600_StaticInitialize();
323
+ mInitialize(state);
324
+ KeccakP1600_OverwriteBytes(state, k, 0, SnP_widthInBytes); /* write k */
325
+ Kravatte_Rollc((uint64_t*)k, encbuf, 1);
326
+ KeccakP1600_AddBytes(state, message, 0, (unsigned int)messageByteLen); /* add message */
327
+ DUMP("msg pL", state, SnP_widthInBytes);
328
+ message += messageByteLen;
329
+ *messageBitLen %= 8;
330
+ if (*messageBitLen != 0) /* padding */
331
+ KeccakP1600_AddByte(state, *message++ | (1 << *messageBitLen), (unsigned int)messageByteLen);
332
+ else
333
+ KeccakP1600_AddByte(state, 1, (unsigned int)messageByteLen);
334
+ KeccakP1600_Permute_Nrounds(state, 6);
335
+ KeccakP1600_ExtractAndAddBytes(state, x, x, 0, SnP_widthInBytes);
336
+ DUMP("xAc pL", x, SnP_widthInBytes);
337
+ Kravatte_Rollc((uint64_t*)k, encbuf, 1);
338
+ *messageBitLen = 0;
339
+ }
340
+ return message;
341
+ }
342
+
343
+ int Kravatte_MaskDerivation(Kravatte_Instance *kv, const BitSequence *Key, BitLength KeyBitLen)
344
+ {
345
+ ALIGN(KeccakP1600_stateAlignment) unsigned char state[KeccakP1600_stateSizeInBytes];
346
+ BitSequence lastByte;
347
+ unsigned int numberOfBits;
348
+
349
+ /* Check max K length (b-1) */
350
+ if (KeyBitLen >= SnP_width)
351
+ return 1;
352
+ /* Compute k from K */
353
+ memset(kv->k.a, 0, SnP_widthInBytes);
354
+ memcpy(kv->k.a, Key, KeyBitLen/8);
355
+ numberOfBits = KeyBitLen & 7;
356
+ if ((numberOfBits) != 0) {
357
+ lastByte = (Key[KeyBitLen/8] & ((1 << numberOfBits) - 1)) | (1 << numberOfBits);
358
+ }
359
+ else {
360
+ lastByte = 1;
361
+ }
362
+ kv->k.a[KeyBitLen/8] = lastByte;
363
+ KeccakP1600_StaticInitialize();
364
+ mInitialize(state);
365
+ KeccakP1600_OverwriteBytes(state, kv->k.a, 0, SnP_widthInBytes);
366
+ KeccakP1600_Permute_Nrounds(state, 6);
367
+ KeccakP1600_ExtractBytes(state, kv->k.a, 0, SnP_widthInBytes);
368
+ memcpy( kv->kRoll.a, kv->k.a, SnP_widthInBytes );
369
+ memset( kv->xAccu.a, 0, SnP_widthInBytes );
370
+ kv->phase = COMPRESSING;
371
+ kv->queueOffset = 0;
372
+
373
+ return 0;
374
+ }
375
+
376
+ int Kra(Kravatte_Instance *kv, const BitSequence *input, BitLength inputBitLen, int flags)
377
+ {
378
+ int finalFlag = flags & KRAVATTE_FLAG_LAST_PART;
379
+
380
+ if ((finalFlag == 0) && ((inputBitLen & 7) != 0))
381
+ return 1;
382
+ if ( (flags & KRAVATTE_FLAG_INIT) != 0 ) {
383
+ memcpy(kv->kRoll.a, kv->k.a, SnP_widthInBytes);
384
+ memset(kv->xAccu.a, 0, SnP_widthInBytes);
385
+ kv->queueOffset = 0;
386
+ }
387
+ if (kv->phase != COMPRESSING) {
388
+ kv->phase = COMPRESSING;
389
+ kv->queueOffset = 0;
390
+ }
391
+ else if ( kv->queueOffset != 0 ) { /* we have already some data queued */
392
+ unsigned int bitlen = (unsigned int)MyMin(inputBitLen, SnP_width - kv->queueOffset);
393
+ unsigned int bytelen = (bitlen + 7) / 8;
394
+
395
+ memcpy(kv->queue.a + kv->queueOffset / 8, input, bytelen);
396
+ input += bytelen;
397
+ inputBitLen -= bitlen;
398
+ kv->queueOffset += bitlen;
399
+ if ( kv->queueOffset == SnP_width ) { /* queue full */
400
+ Kra_Compress(kv->kRoll.a, kv->xAccu.a, kv->queue.a, &kv->queueOffset, 0);
401
+ kv->queueOffset = 0;
402
+ }
403
+ else if ( finalFlag != 0 ) {
404
+ Kra_Compress(kv->kRoll.a, kv->xAccu.a, kv->queue.a, &kv->queueOffset, 1);
405
+ return 0;
406
+ }
407
+ }
408
+ if ( (inputBitLen >= SnP_width) || (finalFlag != 0) ) { /* Compress blocks */
409
+ input = Kra_Compress(kv->kRoll.a, kv->xAccu.a, input, &inputBitLen, finalFlag);
410
+ }
411
+ if ( inputBitLen != 0 ) { /* Queue eventual residual message bytes */
412
+ #if DEBUG
413
+ assert( inputBitLen < SnP_width );
414
+ assert( finalFlag == 0 );
415
+ #endif
416
+ memcpy(kv->queue.a, input, inputBitLen/8);
417
+ kv->queueOffset = inputBitLen;
418
+ }
419
+ return 0;
420
+ }
421
+
422
+ int Vatte(Kravatte_Instance *kv, BitSequence *output, BitLength outputBitLen, int flags)
423
+ {
424
+ size_t outputByteLen;
425
+ unsigned char encbuf[MaxParallellism*Kravatte_RolleSizeInBytes];
426
+ int finalFlag = flags & KRAVATTE_FLAG_LAST_PART;
427
+
428
+ if ((finalFlag == 0) && ((outputBitLen & 7) != 0))
429
+ return 1;
430
+ if ( kv->phase == COMPRESSING) {
431
+ if ( kv->queueOffset != 0 )
432
+ return 1;
433
+ if ((flags & KRAVATTE_FLAG_SHORT) != 0) {
434
+ memcpy(kv->yAccu.a, kv->xAccu.a, SnP_widthInBytes);
435
+ }
436
+ else {
437
+ ALIGN(KeccakP1600_stateAlignment) unsigned char state[KeccakP1600_stateSizeInBytes];
438
+
439
+ KeccakP1600_StaticInitialize();
440
+ mInitialize(state);
441
+ KeccakP1600_OverwriteBytes(state, kv->xAccu.a, 0, SnP_widthInBytes);
442
+ KeccakP1600_Permute_Nrounds(state, 6);
443
+ KeccakP1600_ExtractBytes(state, kv->yAccu.a, 0, SnP_widthInBytes);
444
+ }
445
+ kv->phase = EXPANDING;
446
+ DUMP("yAccu", kv->yAccu.a, SnP_widthInBytes);
447
+ DUMP("key ", kv->k.a, SnP_widthInBytes);
448
+ }
449
+ else if (kv->phase != EXPANDING)
450
+ return 1;
451
+ if ( kv->queueOffset != 0 ) { /* we have already some data for output in stock */
452
+ unsigned int bitlen = (unsigned int)MyMin(outputBitLen, SnP_widthInBytes*8 - kv->queueOffset);
453
+ unsigned int bytelen = (bitlen + 7) / 8;
454
+
455
+ memcpy(output, kv->queue.a + kv->queueOffset / 8, bytelen);
456
+ kv->queueOffset += bitlen;
457
+ if (kv->queueOffset == SnP_widthInBytes*8)
458
+ kv->queueOffset = 0;
459
+ output += bytelen;
460
+ outputBitLen -= bitlen;
461
+ if ((finalFlag != 0) && (outputBitLen == 0)) {
462
+ bitlen &= 7;
463
+ if (bitlen != 0) /* cleanup last incomplete byte */
464
+ *(output - 1) &= (1 << bitlen) - 1;
465
+ kv->phase = EXPANDED;
466
+ return 0;
467
+ }
468
+ }
469
+
470
+ outputByteLen = (outputBitLen + 7) / 8;
471
+ #if defined(KeccakP1600times8_implementation) && !defined(KeccakP1600times8_isFallback)
472
+ #if defined(KeccakF1600times8_FastKravatte_supported)
473
+ ParallelExpandLoopFast( 8 )
474
+ #else
475
+ ParallelExpandLoopPlSnP( 8 )
476
+ #endif
477
+ #endif
478
+ #if defined(KeccakP1600times4_implementation) && !defined(KeccakP1600times4_isFallback)
479
+ #if defined(KeccakF1600times4_FastKravatte_supported)
480
+ ParallelExpandLoopFast( 4 )
481
+ #else
482
+ ParallelExpandLoopPlSnP( 4 )
483
+ #endif
484
+ #endif
485
+ #if defined(KeccakP1600times2_implementation) && !defined(KeccakP1600times2_isFallback)
486
+ #if defined(KeccakF1600times2_FastKravatte_supported)
487
+ ParallelExpandLoopFast( 2 )
488
+ #else
489
+ ParallelExpandLoopPlSnP( 2 )
490
+ #endif
491
+ #endif
492
+ if ( outputByteLen != 0 ) {
493
+ ALIGN(KeccakP1600_stateAlignment) unsigned char state[KeccakP1600_stateSizeInBytes];
494
+ unsigned int len;
495
+
496
+ KeccakP1600_StaticInitialize();
497
+ mInitialize(state);
498
+ do {
499
+ len = (unsigned int)MyMin(outputByteLen, SnP_widthInBytes);
500
+ KeccakP1600_OverwriteBytes(state, kv->yAccu.a, 0, SnP_widthInBytes);
501
+ Kravatte_Rolle((uint64_t*)kv->yAccu.a, encbuf, 1);
502
+ KeccakP1600_Permute_Nrounds(state, 6);
503
+ KeccakP1600_ExtractAndAddBytes(state, kv->kRoll.a, output, 0, len);
504
+ DUMP("out 1", output, len);
505
+ output += len;
506
+ outputByteLen -= len;
507
+ } while ( outputByteLen != 0 );
508
+ if (!finalFlag && (len != SnP_widthInBytes)) { /* Put rest of expanded data into queue */
509
+ unsigned int offset = len;
510
+ len = SnP_widthInBytes - len;
511
+ KeccakP1600_ExtractAndAddBytes(state, kv->kRoll.a + offset, kv->queue.a + offset, offset, len);
512
+ kv->queueOffset = offset * 8; /* current bit offset in queue buffer */
513
+ }
514
+ }
515
+ if (finalFlag != 0) {
516
+ outputBitLen &= 7;
517
+ if (outputBitLen != 0) { /* cleanup last incomplete byte */
518
+ *(output - 1) &= (1 << outputBitLen) - 1;
519
+ DUMP("out L", output - 1, 1);
520
+ }
521
+ kv->phase = EXPANDED;
522
+ }
523
+ return 0;
524
+ }
525
+
526
+ int Kravatte(Kravatte_Instance *kv, const BitSequence *input, BitLength inputBitLen, BitSequence *output, BitLength outputBitLen, int flags)
527
+ {
528
+
529
+ flags |= KRAVATTE_FLAG_LAST_PART;
530
+ if ( Kra(kv, input, inputBitLen, flags) != 0 )
531
+ return 1;
532
+ return Vatte(kv, output, outputBitLen, flags);
533
+ }
@@ -0,0 +1,115 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ Kravatte, designed by Guido Bertoni, Joan Daemen, Seth Hoffert, 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
+ #ifndef _Kravatte_h_
18
+ #define _Kravatte_h_
19
+
20
+ #include "config.h"
21
+ #ifdef XKCP_has_KeccakP1600
22
+
23
+ #include <stddef.h>
24
+ #include <stdint.h>
25
+ #include "align.h"
26
+ #include "KeccakP-1600-SnP.h"
27
+
28
+
29
+ #define SnP_widthInBytes 200
30
+ #define Kravatte_RollcSizeInBytes (5*8)
31
+ #define Kravatte_RollcOffset (SnP_widthInBytes-Kravatte_RollcSizeInBytes)
32
+ #define Kravatte_RolleSizeInBytes (10*8)
33
+ #define Kravatte_RolleOffset (SnP_widthInBytes-Kravatte_RolleSizeInBytes)
34
+
35
+ #define KRAVATTE_FLAG_NONE 0
36
+ #define KRAVATTE_FLAG_INIT 1 /* If set, initialize a new Kra session */
37
+ #define KRAVATTE_FLAG_LAST_PART 2 /* If set, indicates the last part of input/output */
38
+ #define KRAVATTE_FLAG_SHORT 4 /* If set, indicates Short-Kravatte will be performed */
39
+
40
+ #define KRAVATTE_ALIGNMENT KeccakP1600_stateAlignment
41
+
42
+ typedef unsigned char BitSequence;
43
+ typedef size_t BitLength;
44
+
45
+ typedef enum
46
+ {
47
+ NOT_INITIALIZED_YET,
48
+ COMPRESSING,
49
+ EXPANDING,
50
+ EXPANDED,
51
+ } Kravatte_Phases;
52
+
53
+ ALIGN(KRAVATTE_ALIGNMENT) typedef struct
54
+ {
55
+ unsigned char a[SnP_widthInBytes];
56
+ } Kravatte_AlignedArray;
57
+
58
+ typedef struct {
59
+ Kravatte_AlignedArray k;
60
+ Kravatte_AlignedArray kRoll;
61
+ Kravatte_AlignedArray xAccu;
62
+ Kravatte_AlignedArray yAccu;
63
+ Kravatte_AlignedArray queue; /* input/output queue buffer */
64
+ BitLength queueOffset; /* current offset in queue */
65
+ Kravatte_Phases phase;
66
+ } Kravatte_Instance;
67
+
68
+ /**
69
+ * Function to initialize a Kravatte instance with given key.
70
+ * @param kvInstance Pointer to the instance to be initialized.
71
+ * @param Key Pointer to the key (K).
72
+ * @param KeyBitLen The length of the key in bits.
73
+ * @return 0 if successful, 1 otherwise.
74
+ */
75
+ int Kravatte_MaskDerivation(Kravatte_Instance *kvInstance, const BitSequence *Key, BitLength KeyBitLen);
76
+
77
+ /**
78
+ * Function to give input data to be compressed.
79
+ * @param kvInstance Pointer to the instance initialized by Kravatte_MaskDerivation().
80
+ * @param input Pointer to the input message data (M).
81
+ * @param inputBitLen The number of bits provided in the input message data.
82
+ * This must be a multiple of 8 if KRAVATTE_FLAG_LAST_PART flag not set.
83
+ * @param flags Bitwise or combination of KRAVATTE_FLAG_NONE, KRAVATTE_FLAG_INIT, KRAVATTE_FLAG_LAST_PART.
84
+ * @return 0 if successful, 1 otherwise.
85
+ */
86
+ int Kra(Kravatte_Instance *kvInstance, const BitSequence *input, BitLength inputBitLen, int flags);
87
+
88
+ /**
89
+ * Function to expand output data.
90
+ * @param kvInstance Pointer to the hash instance initialized by Kravatte_MaskDerivation().
91
+ * @param output Pointer to the buffer where to store the output data.
92
+ * @param outputBitLen The number of output bits desired.
93
+ * This must be a multiple of 8 if KRAVATTE_FLAG_LAST_PART flag not set.
94
+ * @param flags Bitwise or combination of KRAVATTE_FLAG_NONE, KRAVATTE_FLAG_SHORT, KRAVATTE_FLAG_LAST_PART.
95
+ * @return 0 if successful, 1 otherwise.
96
+ */
97
+ int Vatte(Kravatte_Instance *kvInstance, BitSequence *output, BitLength outputBitLen, int flags);
98
+
99
+ /** Function to compress input data and expand output data.
100
+ * @param kvInstance Pointer to the instance initialized by Kravatte_MaskDerivation().
101
+ * @param input Pointer to the input message (M).
102
+ * @param inputBitLen The number of bits provided in the input message data.
103
+ * @param output Pointer to the output buffer.
104
+ * @param outputBitLen The number of output bits desired.
105
+ * @param flags Bitwise or combination of KRAVATTE_FLAG_NONE, KRAVATTE_FLAG_INIT, KRAVATTE_FLAG_SHORT, KRAVATTE_FLAG_LAST_PART.
106
+ * KRAVATTE_FLAG_LAST_PART is internally forced to true for input and output.
107
+ * @return 0 if successful, 1 otherwise.
108
+ */
109
+ int Kravatte(Kravatte_Instance *kvInstance, const BitSequence *input, BitLength inputBitLen, BitSequence *output, BitLength outputBitLen, int flags);
110
+
111
+ #else
112
+ #error This requires an implementation of Keccak-p[1600]
113
+ #endif
114
+
115
+ #endif