sleeping_kangaroo12 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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