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,573 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ Keccak, designed by Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche.
6
+
7
+ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
8
+
9
+ For more information, feedback or questions, please refer to the Keccak Team website:
10
+ https://keccak.team/
11
+
12
+ To the extent possible under law, the implementer has waived all copyright
13
+ and related or neighboring rights to the source code in this file.
14
+ http://creativecommons.org/publicdomain/zero/1.0/
15
+ */
16
+
17
+ #define JOIN0(a, b) a ## b
18
+ #define JOIN(a, b) JOIN0(a, b)
19
+
20
+ #define capacity (2*security)
21
+ #define capacityInBytes (capacity/8)
22
+ #define capacityInLanes (capacityInBytes/laneSize)
23
+ #define rate (1600-capacity)
24
+ #define rateInBytes (rate/8)
25
+ #define rateInLanes (rateInBytes/laneSize)
26
+
27
+
28
+ #define cSHAKE JOIN(cSHAKE,security)
29
+ #define cSHAKE_Initialize JOIN(cSHAKE,_Initialize)
30
+ #define cSHAKE_Update JOIN(cSHAKE,_Update)
31
+ #define cSHAKE_Final JOIN(cSHAKE,_Final)
32
+ #define cSHAKE_Squeeze JOIN(cSHAKE,_Squeeze)
33
+
34
+ int cSHAKE_Initialize(cSHAKE_Instance *csk, BitLength outputBitLen, const BitSequence *name, BitLength nameBitLen, const BitSequence *customization, BitLength customBitLen)
35
+ {
36
+ unsigned char encbuf[sizeof(BitLength)+1];
37
+
38
+ /* Only full bytes are supported for 'name', otherwise customization string would have to be shifted before absorbing */
39
+ if ((nameBitLen & 7) != 0)
40
+ return 1;
41
+ if (KeccakWidth1600_SpongeInitialize(&csk->sponge, rate, capacity) != 0)
42
+ return 1;
43
+ csk->lastByteBitLen = 0;
44
+ csk->lastByteValue = 0;
45
+ csk->fixedOutputLength = outputBitLen;
46
+ csk->phase = ABSORBING;
47
+
48
+ if ((nameBitLen == 0) && (customBitLen == 0))
49
+ csk->emptyNameCustom = 1;
50
+ else
51
+ {
52
+ csk->emptyNameCustom = 0;
53
+
54
+ /* Absorb bytepad(.., rate) */
55
+ if (KeccakWidth1600_SpongeAbsorb(&csk->sponge, encbuf, left_encode(encbuf, rateInBytes)) != 0)
56
+ return 1;
57
+
58
+ /* Absorb encode_string(name) */
59
+ if (KeccakWidth1600_SpongeAbsorb(&csk->sponge, encbuf, left_encode(encbuf, nameBitLen)) != 0)
60
+ return 1;
61
+ if (KeccakWidth1600_SpongeAbsorb(&csk->sponge, name, nameBitLen / 8) != 0)
62
+ return 1;
63
+
64
+ /* Absorb encode_string(customization) */
65
+ if (KeccakWidth1600_SpongeAbsorb(&csk->sponge, encbuf, left_encode(encbuf, customBitLen)) != 0)
66
+ return 1;
67
+ if (KeccakWidth1600_SpongeAbsorb(&csk->sponge, customization, (customBitLen + 7) / 8) != 0) /* allowed to be a bit string, as zero padding is following */
68
+ return 1;
69
+
70
+ /* Zero padding up to rate */
71
+ if ( csk->sponge.byteIOIndex != 0 ) {
72
+ csk->sponge.byteIOIndex = rateInBytes - 1;
73
+ encbuf[0] = 0;
74
+ return KeccakWidth1600_SpongeAbsorb(&csk->sponge, encbuf, 1);
75
+ }
76
+ }
77
+ return 0;
78
+ }
79
+
80
+ int cSHAKE_Update(cSHAKE_Instance *csk, const BitSequence *input, BitLength inputBitLen)
81
+ {
82
+
83
+ if (csk->phase != ABSORBING)
84
+ return 1;
85
+ if (csk->lastByteBitLen != 0) /* check if previous call input were full bytes */
86
+ return 1;
87
+ csk->lastByteBitLen = inputBitLen & 7;
88
+ if(csk->lastByteBitLen != 0)
89
+ csk->lastByteValue = input[inputBitLen / 8] & ((1 << csk->lastByteBitLen) - 1); /* strip unwanted bits */
90
+ return KeccakWidth1600_SpongeAbsorb(&csk->sponge, input, inputBitLen / 8);
91
+ }
92
+
93
+ int cSHAKE_Final(cSHAKE_Instance *csk, BitSequence *output)
94
+ {
95
+ unsigned short delimitedLastBytes;
96
+ unsigned char delimitedSuffix;
97
+
98
+ if (csk->phase != ABSORBING)
99
+ return 1;
100
+
101
+ /* Concatenate the last few input bits with those of the suffix */
102
+ if (csk->emptyNameCustom != 0)
103
+ delimitedLastBytes = (unsigned short)(csk->lastByteValue | (0x1F << csk->lastByteBitLen));
104
+ else
105
+ delimitedLastBytes = (unsigned short)(csk->lastByteValue | (0x04 << csk->lastByteBitLen)); /* Suffix '04': 2 zero bits '00' */
106
+ if ((delimitedLastBytes >> 8) == 0) {
107
+ delimitedSuffix = (unsigned char)delimitedLastBytes;
108
+ }
109
+ else {
110
+ unsigned char oneByte[1];
111
+ oneByte[0] = (unsigned char)delimitedLastBytes;
112
+ if(KeccakWidth1600_SpongeAbsorb(&csk->sponge, oneByte, 1) != 0)
113
+ return 1;
114
+ delimitedSuffix = (unsigned char)(delimitedLastBytes >> 8);
115
+ }
116
+ if (KeccakWidth1600_SpongeAbsorbLastFewBits(&csk->sponge, delimitedSuffix) != 0)
117
+ return 1;
118
+ csk->phase = SQUEEZING;
119
+ if ( csk->fixedOutputLength != 0 ) {
120
+ if(cSHAKE_Squeeze(csk, output, csk->fixedOutputLength) != 0)
121
+ return 1;
122
+ csk->phase = FINAL;
123
+ }
124
+ return 0;
125
+ }
126
+
127
+ int cSHAKE_Squeeze(cSHAKE_Instance *csk, BitSequence *output, BitLength outputBitLen)
128
+ {
129
+ if (csk->phase != SQUEEZING)
130
+ return 1;
131
+ if(KeccakWidth1600_SpongeSqueeze(&csk->sponge, output, (outputBitLen + 7) / 8) != 0)
132
+ return 1;
133
+ if ((outputBitLen & 7) !=0) {
134
+ output[outputBitLen / 8] &= (1 << (outputBitLen & 7)) - 1; /* clear unwanted bits */
135
+ csk->phase = FINAL; /* only last output can have an non complete byte, block nexts calls */
136
+ }
137
+ return 0;
138
+ }
139
+
140
+ int cSHAKE( const BitSequence *input, BitLength inputBitLen, BitSequence *output, BitLength outputBitLen,
141
+ const BitSequence *name, BitLength nameBitLen, const BitSequence *customization, BitLength customBitLen )
142
+ {
143
+ cSHAKE_Instance csk;
144
+
145
+ if (outputBitLen == 0)
146
+ return 1;
147
+ if (cSHAKE_Initialize(&csk, outputBitLen, name, nameBitLen, customization, customBitLen) != 0)
148
+ return 1;
149
+ if (cSHAKE_Update(&csk, input, inputBitLen) != 0)
150
+ return 1;
151
+ return cSHAKE_Final(&csk, output);
152
+ }
153
+
154
+ /* ------------------------------------------------------------------------- */
155
+
156
+ #define KMAC JOIN(KMAC,security)
157
+ #define KMAC_Initialize JOIN(KMAC,_Initialize)
158
+ #define KMAC_Update JOIN(KMAC,_Update)
159
+ #define KMAC_Final JOIN(KMAC,_Final)
160
+ #define KMAC_Squeeze JOIN(KMAC,_Squeeze)
161
+
162
+ int KMAC_Initialize(KMAC_Instance *km, const BitSequence *key, BitLength keyBitLen, BitLength outputBitLen, const BitSequence *customization, BitLength customBitLen)
163
+ {
164
+ BitLength bufferLen;
165
+ BitLength keyByteLen;
166
+ BitSequence buffer[rateInBytes];
167
+
168
+ if (cSHAKE_Initialize(&km->csi, outputBitLen, (const BitSequence*)"KMAC", 4*8, customization, customBitLen) != 0)
169
+ return 1;
170
+ km->outputBitLen = outputBitLen;
171
+
172
+ /* bytepad(encode_string(k)) */
173
+ bufferLen = left_encode(buffer, rateInBytes);
174
+ bufferLen += left_encode(buffer + bufferLen, keyBitLen);
175
+ if (cSHAKE_Update(&km->csi, buffer, bufferLen*8) != 0)
176
+ return 1;
177
+ keyByteLen = (keyBitLen + 7) / 8;
178
+ if (cSHAKE_Update(&km->csi, key, keyByteLen*8) != 0)
179
+ return 1;
180
+ bufferLen = (bufferLen + keyByteLen) % rateInBytes; /* zero padding */
181
+ if (bufferLen != 0) {
182
+ bufferLen = rateInBytes - bufferLen;
183
+ memset(buffer, 0, bufferLen);
184
+ if (cSHAKE_Update(&km->csi, buffer, bufferLen*8) != 0)
185
+ return 1;
186
+ }
187
+ return 0;
188
+ }
189
+
190
+ int KMAC_Update(KMAC_Instance *km, const BitSequence *input, BitLength inputBitLen)
191
+ {
192
+ if ((inputBitLen & 7) != 0) /* Only full bytes are supported */
193
+ return 1;
194
+ return cSHAKE_Update(&km->csi, input, inputBitLen);
195
+ }
196
+
197
+ int KMAC_Final(KMAC_Instance *km, BitSequence *output)
198
+ {
199
+ unsigned char encbuf[sizeof(BitLength)+1];
200
+
201
+ if (cSHAKE_Update(&km->csi, encbuf, right_encode(encbuf, km->outputBitLen)*8) != 0)
202
+ return 1;
203
+ return cSHAKE_Final(&km->csi, output);
204
+ }
205
+
206
+ int KMAC_Squeeze(KMAC_Instance *km, BitSequence *output, BitLength outputBitLen)
207
+ {
208
+ return cSHAKE_Squeeze(&km->csi, output, outputBitLen);
209
+ }
210
+
211
+ int KMAC(const BitSequence *key, BitLength keyBitLen, const BitSequence *input, BitLength inputBitLen,
212
+ BitSequence *output, BitLength outputBitLen, const BitSequence *customization, BitLength customBitLen)
213
+ {
214
+ KMAC_Instance km;
215
+
216
+ if (outputBitLen == 0)
217
+ return 1;
218
+ if (KMAC_Initialize(&km, key, keyBitLen, outputBitLen, customization, customBitLen) != 0)
219
+ return 1;
220
+ if (KMAC_Update(&km, input, inputBitLen) != 0)
221
+ return 1;
222
+ return KMAC_Final(&km, output);
223
+ }
224
+
225
+ #undef KMAC_Initialize
226
+ #undef KMAC_Update
227
+ #undef KMAC_Final
228
+ #undef KMAC_Squeeze
229
+ #undef KMAC
230
+
231
+ /* ------------------------------------------------------------------------- */
232
+
233
+ #define ParallelHash JOIN(ParallelHash,security)
234
+ #define ParallelHash_Initialize JOIN(ParallelHash,_Initialize)
235
+ #define ParallelHash_Update JOIN(ParallelHash,_Update)
236
+ #define ParallelHash_Final JOIN(ParallelHash,_Final)
237
+ #define ParallelHash_Squeeze JOIN(ParallelHash,_Squeeze)
238
+
239
+ #define ParallelSpongeFastLoop( Parallellism ) \
240
+ while ( inputByteLen >= Parallellism * phi->blockLen ) { \
241
+ ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
242
+ unsigned char intermediate[Parallellism*capacityInBytes]; \
243
+ size_t localBlockLen = phi->blockLen; \
244
+ const unsigned char * localInput = input; \
245
+ unsigned int i; \
246
+ size_t fastLoopOffset; \
247
+ \
248
+ KeccakP1600times##Parallellism##_StaticInitialize(); \
249
+ KeccakP1600times##Parallellism##_InitializeAll(states); \
250
+ fastLoopOffset = KeccakF1600times##Parallellism##_FastLoop_Absorb(states, rateInLanes, phi->blockLen / laneSize, rateInLanes, localInput, Parallellism * phi->blockLen); \
251
+ localBlockLen -= fastLoopOffset; \
252
+ localInput += fastLoopOffset; \
253
+ for ( i = 0; i < Parallellism; ++i, localInput += phi->blockLen ) { \
254
+ KeccakP1600times##Parallellism##_AddBytes(states, i, localInput, 0, localBlockLen); \
255
+ KeccakP1600times##Parallellism##_AddByte(states, i, suffix, localBlockLen); \
256
+ KeccakP1600times##Parallellism##_AddByte(states, i, 0x80, rateInBytes-1); \
257
+ } \
258
+ KeccakP1600times##Parallellism##_PermuteAll_24rounds(states); \
259
+ input += Parallellism * phi->blockLen; \
260
+ inputByteLen -= Parallellism * phi->blockLen; \
261
+ KeccakP1600times##Parallellism##_ExtractLanesAll(states, intermediate, capacityInLanes, capacityInLanes ); \
262
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, intermediate, Parallellism * capacityInBytes) != 0) return 1; \
263
+ }
264
+
265
+ #define ParallelSpongeLoop( Parallellism ) \
266
+ while ( inputByteLen >= Parallellism * phi->blockLen ) { \
267
+ ALIGN(KeccakP1600times##Parallellism##_statesAlignment) unsigned char states[KeccakP1600times##Parallellism##_statesSizeInBytes]; \
268
+ unsigned char intermediate[Parallellism*capacityInBytes]; \
269
+ size_t localBlockLen = phi->blockLen; \
270
+ const unsigned char * localInput = input; \
271
+ unsigned int i; \
272
+ \
273
+ KeccakP1600times##Parallellism##_StaticInitialize(); \
274
+ KeccakP1600times##Parallellism##_InitializeAll(states); \
275
+ while(localBlockLen >= rateInBytes) { \
276
+ KeccakP1600times##Parallellism##_AddLanesAll(states, localInput, rateInLanes, phi->blockLen / laneSize); \
277
+ KeccakP1600times##Parallellism##_PermuteAll_24rounds(states); \
278
+ localBlockLen -= rateInBytes; \
279
+ localInput += rateInBytes; \
280
+ } \
281
+ for ( i = 0; i < Parallellism; ++i, localInput += phi->blockLen ) { \
282
+ KeccakP1600times##Parallellism##_AddBytes(states, i, localInput, 0, localBlockLen); \
283
+ KeccakP1600times##Parallellism##_AddByte(states, i, suffix, localBlockLen); \
284
+ KeccakP1600times##Parallellism##_AddByte(states, i, 0x80, rateInBytes-1); \
285
+ } \
286
+ KeccakP1600times##Parallellism##_PermuteAll_24rounds(states); \
287
+ input += Parallellism * phi->blockLen; \
288
+ inputByteLen -= Parallellism * phi->blockLen; \
289
+ KeccakP1600times##Parallellism##_ExtractLanesAll(states, intermediate, capacityInLanes, capacityInLanes ); \
290
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, intermediate, Parallellism * capacityInBytes) != 0) return 1; \
291
+ }
292
+
293
+ int ParallelHash_Initialize(ParallelHash_Instance *phi, size_t blockByteLen,
294
+ BitLength outputBitLen, const BitSequence *customization, BitLength customBitLen)
295
+ {
296
+ size_t t;
297
+ unsigned char encbuf[sizeof(size_t)+1];
298
+
299
+ if ( blockByteLen < laneSize) /* blockLen must be greater than or equal to lane size */
300
+ return 1;
301
+ for ( t = blockByteLen; t > 1; t >>= 1 ) /* blockLen (in bytes) must be a power of two */
302
+ if ( (t & 1) && (t != 1) ) /* bit0 set and other bits unset */
303
+ return 1;
304
+ if (KeccakWidth1600_SpongeInitialize(&phi->finalNode, rate, capacity) != 0)
305
+ return 1;
306
+ phi->fixedOutputLength = outputBitLen;
307
+ phi->blockLen = blockByteLen;
308
+ phi->queueAbsorbedLen = 0;
309
+ phi->totalInputSize = 0;
310
+ phi->phase = ABSORBING;
311
+
312
+ /* Absorb bytepad(.., rate) */
313
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, left_encode(encbuf, rateInBytes)) != 0)
314
+ return 1;
315
+
316
+ /* Absorb string_encode("ParallelHash") */
317
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, (const BitSequence*)"\x01\x60" "ParallelHash", 14) != 0)
318
+ return 1;
319
+
320
+ /* Absorb string_encode(customization) */
321
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, left_encode(encbuf, customBitLen)) != 0)
322
+ return 1;
323
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, customization, (customBitLen + 7) / 8) != 0)
324
+ return 1;
325
+
326
+ /* Zero padding up to rate */
327
+ if ( phi->finalNode.byteIOIndex != 0 ) {
328
+ phi->finalNode.byteIOIndex = rateInBytes - 1;
329
+ encbuf[0] = 0;
330
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, 1) != 0)
331
+ return 1;
332
+ }
333
+
334
+ /* Absorb B */
335
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, left_encode(encbuf, blockByteLen)) != 0)
336
+ return 1;
337
+ return 0;
338
+ }
339
+
340
+ int ParallelHash_Update(ParallelHash_Instance *phi, const BitSequence *input, BitLength inputBitLen)
341
+ {
342
+ size_t inputByteLen;
343
+
344
+ if (phi->phase != ABSORBING)
345
+ return 1;
346
+ if ((inputBitLen & 7) != 0) /* Only full bytes are supported */
347
+ return 1;
348
+ phi->totalInputSize += inputBitLen;
349
+ inputByteLen = inputBitLen / 8;
350
+ if ( phi->queueAbsorbedLen != 0 ) {
351
+ /* There is data in the queue, absorb further in queue until full */
352
+ size_t len = (inputByteLen < (phi->blockLen - phi->queueAbsorbedLen)) ? inputByteLen : (phi->blockLen - phi->queueAbsorbedLen);
353
+ if (KeccakWidth1600_SpongeAbsorb(&phi->queueNode, input, len) != 0)
354
+ return 1;
355
+ input += len;
356
+ inputByteLen -= len;
357
+ phi->queueAbsorbedLen += len;
358
+ if ( phi->queueAbsorbedLen == phi->blockLen ) {
359
+ unsigned char intermediate[capacityInBytes];
360
+ phi->queueAbsorbedLen = 0;
361
+ if (KeccakWidth1600_SpongeAbsorbLastFewBits(&phi->queueNode, suffix) != 0)
362
+ return 1;
363
+ if (KeccakWidth1600_SpongeSqueeze(&phi->queueNode, intermediate, capacityInBytes) != 0)
364
+ return 1;
365
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, intermediate, capacityInBytes) != 0)
366
+ return 1;
367
+ }
368
+ }
369
+
370
+ #if defined(KeccakP1600times8_implementation) && !defined(KeccakP1600times8_isFallback)
371
+ #if defined(KeccakF1600times8_FastLoop_supported)
372
+ ParallelSpongeFastLoop( 8 )
373
+ #else
374
+ ParallelSpongeLoop( 8 )
375
+ #endif
376
+ #endif
377
+
378
+ #if defined(KeccakP1600times4_implementation) && !defined(KeccakP1600times4_isFallback)
379
+ #if defined(KeccakF1600times4_FastLoop_supported)
380
+ ParallelSpongeFastLoop( 4 )
381
+ #else
382
+ ParallelSpongeLoop( 4 )
383
+ #endif
384
+ #endif
385
+
386
+ #if defined(KeccakP1600times2_implementation) && !defined(KeccakP1600times2_isFallback)
387
+ #if defined(KeccakF1600times2_FastLoop_supported)
388
+ ParallelSpongeFastLoop( 2 )
389
+ #else
390
+ ParallelSpongeLoop( 2 )
391
+ #endif
392
+ #endif
393
+
394
+ while ( inputByteLen > 0 ) {
395
+ size_t len = (inputByteLen < phi->blockLen) ? inputByteLen : phi->blockLen;
396
+ if (KeccakWidth1600_SpongeInitialize(&phi->queueNode, rate, capacity) != 0)
397
+ return 1;
398
+ if (KeccakWidth1600_SpongeAbsorb(&phi->queueNode, input, len) != 0)
399
+ return 1;
400
+ input += len;
401
+ inputByteLen -= len;
402
+ if ( len == phi->blockLen ) {
403
+ unsigned char intermediate[capacityInBytes];
404
+ if (KeccakWidth1600_SpongeAbsorbLastFewBits(&phi->queueNode, suffix) != 0)
405
+ return 1;
406
+ if (KeccakWidth1600_SpongeSqueeze(&phi->queueNode, intermediate, capacityInBytes) != 0)
407
+ return 1;
408
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, intermediate, capacityInBytes) != 0)
409
+ return 1;
410
+ }
411
+ else
412
+ phi->queueAbsorbedLen = len;
413
+ }
414
+
415
+ return 0;
416
+ }
417
+
418
+ int ParallelHash_Final(ParallelHash_Instance *phi, BitSequence * output)
419
+ {
420
+ unsigned char encbuf[sizeof(size_t)+1];
421
+ size_t nBlocks;
422
+
423
+ if (phi->phase != ABSORBING)
424
+ return 1;
425
+ if ( phi->queueAbsorbedLen != 0 ) {
426
+ /* There is data in the queue */
427
+ unsigned char intermediate[capacityInBytes];
428
+ if (KeccakWidth1600_SpongeAbsorbLastFewBits(&phi->queueNode, suffix) != 0)
429
+ return 1;
430
+ if (KeccakWidth1600_SpongeSqueeze(&phi->queueNode, intermediate, capacityInBytes) != 0)
431
+ return 1;
432
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, intermediate, capacityInBytes) != 0)
433
+ return 1;
434
+ }
435
+
436
+ nBlocks = (phi->totalInputSize / 8 + phi->blockLen - 1) / phi->blockLen;
437
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, right_encode(encbuf, nBlocks)) != 0) /* Absorb number of blocks */
438
+ return 1;
439
+
440
+ if (KeccakWidth1600_SpongeAbsorb(&phi->finalNode, encbuf, right_encode(encbuf, phi->fixedOutputLength)) != 0) /* Absorb output length in bits */
441
+ return 1;
442
+
443
+ if (KeccakWidth1600_SpongeAbsorbLastFewBits(&phi->finalNode, 0x04) != 0) /* Absorb 2 zero bits '00' */
444
+ return 1;
445
+ phi->phase = SQUEEZING;
446
+ if ( phi->fixedOutputLength != 0 ) {
447
+ if (ParallelHash_Squeeze(phi, output, phi->fixedOutputLength) != 0)
448
+ return 1;
449
+ phi->phase = FINAL;
450
+ }
451
+ return 0;
452
+ }
453
+
454
+ int ParallelHash_Squeeze(ParallelHash_Instance *phi, BitSequence *output, BitLength outputBitLen)
455
+ {
456
+ if (phi->phase != SQUEEZING)
457
+ return 1;
458
+ if (KeccakWidth1600_SpongeSqueeze(&phi->finalNode, output, (outputBitLen + 7) / 8) != 0)
459
+ return 1;
460
+ if ((outputBitLen & 7) !=0) {
461
+ output[outputBitLen / 8] &= (1 << (outputBitLen & 7)) - 1; /* clear unwanted bits */
462
+ phi->phase = FINAL; /* only last output can have an non complete byte, block nexts calls */
463
+ }
464
+ return 0;
465
+ }
466
+
467
+ int ParallelHash( const BitSequence *input, BitLength inputBitLen, size_t blockByteLen,
468
+ BitSequence *output, BitLength outputBitLen, const BitSequence *customization, BitLength customBitLen)
469
+ {
470
+ ParallelHash_Instance phi;
471
+
472
+ if (outputBitLen == 0)
473
+ return 1;
474
+ if (ParallelHash_Initialize(&phi, blockByteLen, outputBitLen, customization, customBitLen) != 0)
475
+ return 1;
476
+ if (ParallelHash_Update(&phi, input, inputBitLen) != 0)
477
+ return 1;
478
+ return ParallelHash_Final(&phi, output);
479
+ }
480
+
481
+ #undef ParallelHash_Initialize
482
+ #undef ParallelHash_Update
483
+ #undef ParallelHash_Final
484
+ #undef ParallelHash_Squeeze
485
+ #undef ParallelHash
486
+
487
+ #undef ParallelSpongeFastLoop
488
+ #undef ParallelSpongeLoop
489
+
490
+ /* ------------------------------------------------------------------------- */
491
+
492
+ #define TupleHash JOIN(TupleHash,security)
493
+ #define TupleHash_Initialize JOIN(TupleHash,_Initialize)
494
+ #define TupleHash_Update JOIN(TupleHash,_Update)
495
+ #define TupleHash_Final JOIN(TupleHash,_Final)
496
+ #define TupleHash_Squeeze JOIN(TupleHash,_Squeeze)
497
+
498
+ int TupleHash_Initialize(TupleHash_Instance *thi, BitLength outputBitLen,
499
+ const BitSequence *customization, BitLength customBitLen)
500
+ {
501
+ if (cSHAKE_Initialize(&thi->csi, outputBitLen, (const BitSequence*)"TupleHash", 9*8, customization, customBitLen) != 0)
502
+ return 1;
503
+ thi->outputBitLen = outputBitLen;
504
+ return 0;
505
+ }
506
+
507
+ int TupleHash_Update(TupleHash_Instance *thi, const TupleElement *tuple, size_t numberOfElements)
508
+ {
509
+ unsigned char encbuf[sizeof(BitLength)+1];
510
+
511
+ while (numberOfElements-- != 0) {
512
+ if ((tuple->inputBitLen & 7) != 0) /* Only full bytes are supported */
513
+ return 1;
514
+ if (cSHAKE_Update(&thi->csi, encbuf, left_encode(encbuf, tuple->inputBitLen)*8) != 0)
515
+ return 1;
516
+ if (cSHAKE_Update(&thi->csi, tuple->input, tuple->inputBitLen) != 0)
517
+ return 1;
518
+ ++tuple;
519
+ }
520
+ return 0;
521
+ }
522
+
523
+ int TupleHash_Final(TupleHash_Instance *thi, BitSequence * output)
524
+ {
525
+ unsigned char encbuf[sizeof(BitLength)+1];
526
+
527
+ if (cSHAKE_Update(&thi->csi, encbuf, right_encode(encbuf, thi->outputBitLen)*8) != 0)
528
+ return 1;
529
+ return cSHAKE_Final(&thi->csi, output);
530
+ }
531
+
532
+ int TupleHash_Squeeze(TupleHash_Instance *thi, BitSequence *output, BitLength outputBitLen)
533
+ {
534
+ return cSHAKE_Squeeze(&thi->csi, output, outputBitLen);
535
+ }
536
+
537
+ int TupleHash( const TupleElement *tuple, size_t numberOfElements,
538
+ BitSequence *output, BitLength outputBitLen, const BitSequence *customization, BitLength customBitLen)
539
+ {
540
+ TupleHash_Instance thi;
541
+
542
+ if (outputBitLen == 0)
543
+ return 1;
544
+ if (TupleHash_Initialize(&thi, outputBitLen, customization, customBitLen) != 0)
545
+ return 1;
546
+ if (TupleHash_Update(&thi, tuple, numberOfElements) != 0)
547
+ return 1;
548
+ return TupleHash_Final(&thi, output);
549
+ }
550
+
551
+ #undef TupleHash_Initialize
552
+ #undef TupleHash_Update
553
+ #undef TupleHash_Final
554
+ #undef TupleHash_Squeeze
555
+ #undef TupleHash
556
+
557
+ /* ------------------------------------------------------------------------- */
558
+
559
+ #undef JOIN0
560
+ #undef JOIN
561
+
562
+ #undef capacity
563
+ #undef capacityInBytes
564
+ #undef capacityInLanes
565
+ #undef rate
566
+ #undef rateInBytes
567
+ #undef rateInLanes
568
+
569
+ #undef cSHAKE_Initialize
570
+ #undef cSHAKE_Update
571
+ #undef cSHAKE_Final
572
+ #undef cSHAKE_Squeeze
573
+ #undef cSHAKE
@@ -0,0 +1,87 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ Ketje, 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
+ #ifdef KeccakReference
18
+ #include "displayIntermediateValues.h"
19
+ #endif
20
+
21
+ #include "config.h"
22
+ #include "Ket.h"
23
+ #include "Ketjev2.h"
24
+
25
+ #ifdef XKCP_has_KeccakP200
26
+ #include "KeccakP-200-SnP.h"
27
+
28
+ #define prefix KetjeJr
29
+ #define prefixKet KetJr
30
+ #define SnP KeccakP200
31
+ #define SnP_width 200
32
+ #define SnP_PermuteRounds KeccakP200_Permute_Nrounds
33
+ #include "Ketjev2.inc"
34
+ #undef prefix
35
+ #undef prefixKet
36
+ #undef SnP
37
+ #undef SnP_width
38
+ #undef SnP_PermuteRounds
39
+ #endif
40
+
41
+ #ifdef XKCP_has_KeccakP400
42
+ #include "KeccakP-400-SnP.h"
43
+
44
+ #define prefix KetjeSr
45
+ #define prefixKet KetSr
46
+ #define SnP KeccakP400
47
+ #define SnP_width 400
48
+ #define SnP_PermuteRounds KeccakP400_Permute_Nrounds
49
+ #include "Ketjev2.inc"
50
+ #undef prefix
51
+ #undef prefixKet
52
+ #undef SnP
53
+ #undef SnP_width
54
+ #undef SnP_PermuteRounds
55
+ #endif
56
+
57
+ #ifdef XKCP_has_KeccakP800
58
+ #include "KeccakP-800-SnP.h"
59
+
60
+ #define prefix KetjeMn
61
+ #define prefixKet KetMn
62
+ #define SnP KeccakP800
63
+ #define SnP_width 800
64
+ #define SnP_PermuteRounds KeccakP800_Permute_Nrounds
65
+ #include "Ketjev2.inc"
66
+ #undef prefix
67
+ #undef prefixKet
68
+ #undef SnP
69
+ #undef SnP_width
70
+ #undef SnP_PermuteRounds
71
+ #endif
72
+
73
+ #ifdef XKCP_has_KeccakP1600
74
+ #include "KeccakP-1600-SnP.h"
75
+
76
+ #define prefix KetjeMj
77
+ #define prefixKet KetMj
78
+ #define SnP KeccakP1600
79
+ #define SnP_width 1600
80
+ #define SnP_PermuteRounds KeccakP1600_Permute_Nrounds
81
+ #include "Ketjev2.inc"
82
+ #undef prefix
83
+ #undef prefixKet
84
+ #undef SnP
85
+ #undef SnP_width
86
+ #undef SnP_PermuteRounds
87
+ #endif