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,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