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,332 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ The Xoodoo permutation, designed by Joan Daemen, Seth Hoffert, Gilles Van Assche and Ronny Van Keer.
6
+
7
+ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
8
+
9
+ For more information, feedback or questions, please refer to the Keccak Team website:
10
+ https://keccak.team/
11
+
12
+ To the extent possible under law, the implementer has waived all copyright
13
+ and related or neighboring rights to the source code in this file.
14
+ http://creativecommons.org/publicdomain/zero/1.0/
15
+ */
16
+
17
+ #define VERBOSE 0
18
+
19
+ #include <stdio.h>
20
+ #include <string.h>
21
+ #include <smmintrin.h>
22
+ #include <wmmintrin.h>
23
+ #include <immintrin.h>
24
+ #include <emmintrin.h>
25
+ #include "align.h"
26
+ #include "brg_endian.h"
27
+ #include "Xoodoo.h"
28
+ #include "Xoodyak-parameters.h"
29
+
30
+ #if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
31
+ #error Expecting a little-endian platform
32
+ #endif
33
+
34
+ #if (VERBOSE > 0)
35
+ #define Dump(__t) Vars2State; \
36
+ printf(__t "\n"); \
37
+ printf("a00 %08x, a01 %08x, a02 %08x, a03 %08x\n", state[0+0], state[0+1], state[0+2], state[0+3] ); \
38
+ printf("a10 %08x, a11 %08x, a12 %08x, a13 %08x\n", state[4+0], state[4+1], state[4+2], state[4+3] ); \
39
+ printf("a20 %08x, a21 %08x, a22 %08x, a23 %08x\n\n", state[8+0], state[8+1], state[8+2], state[8+3] );
40
+ #else
41
+ #define Dump(__t)
42
+ #endif
43
+
44
+ #if (VERBOSE >= 1)
45
+ #define Dump1(__t) Dump(__t)
46
+ #else
47
+ #define Dump1(__t)
48
+ #endif
49
+
50
+ #if (VERBOSE >= 2)
51
+ #define Dump2(__t) Dump(__t)
52
+ #else
53
+ #define Dump2(__t)
54
+ #endif
55
+
56
+ #if (VERBOSE >= 3)
57
+ #define Dump3(__t) Dump(__t)
58
+ #else
59
+ #define Dump3(__t)
60
+ #endif
61
+
62
+
63
+ typedef __m128i V128;
64
+
65
+ ALIGN(16) static const uint8_t maskRhoEast2[16] = {
66
+ 11, 8, 9, 10,
67
+ 15, 12, 13, 14,
68
+ 3, 0, 1, 2,
69
+ 7, 4, 5, 6,
70
+ };
71
+
72
+ #define ANDnu128(a, b) _mm_andnot_si128(a, b)
73
+ #define CONST128(a) _mm_load_si128((const V128 *)&(a))
74
+ #define LOAD128(a) _mm_load_si128((const V128 *)&(a))
75
+ #define LOAD128u(a) _mm_loadu_si128((const V128 *)&(a))
76
+ #define ROL32(a, o) _mm_rol_epi32(a, o)
77
+ #define STORE128(a, b) _mm_store_si128((V128 *)&(a), b)
78
+ #define STORE128u(a, b) _mm_storeu_si128((V128 *)&(a), b)
79
+ #define STORE64L(a, b) _mm_storel_epi64((V128 *)&(a), b)
80
+ #define XOR(a, b) _mm_xor_si128(a, b)
81
+ #define XOR3(a,b,c) _mm_ternarylogic_epi32(a,b,c,0x96)
82
+ #define Chi(a,b,c) _mm_ternarylogic_epi32(a,b,c,0xD2)
83
+
84
+ #define DeclareVars V128 a0, a1, a2, p, e; \
85
+ V128 rhoEast2 = CONST128(maskRhoEast2)
86
+
87
+ #define State2Vars(state) a0 = LOAD128(((uint32_t*)state)[0]), a1 = LOAD128(((uint32_t*)state)[4]), a2 = LOAD128(((uint32_t*)state)[8]);
88
+
89
+ #define Vars2State(state) STORE128(((uint32_t*)state)[0], a0), STORE128(((uint32_t*)state)[4], a1), STORE128(((uint32_t*)state)[8], a2);
90
+
91
+ #define Round(__rc) \
92
+ /* Theta: Column Parity Mixer */ \
93
+ p = XOR3( a0, a1, a2 ); \
94
+ p = _mm_shuffle_epi32( p, 0x93); \
95
+ e = ROL32( p, 5 ); \
96
+ p = ROL32( p, 14 ); \
97
+ a0 = XOR3( a0, e, p); \
98
+ a1 = XOR3( a1, e, p); \
99
+ a2 = XOR3( a2, e, p); \
100
+ Dump3("Theta"); \
101
+ \
102
+ /* Rho-west: Plane shift */ \
103
+ a1 = _mm_shuffle_epi32( a1, 0x93); \
104
+ a2 = ROL32(a2, 11); \
105
+ Dump3("Rho-west"); \
106
+ \
107
+ /* Iota: round constants */ \
108
+ a0 = XOR(a0, _mm_set_epi32(0, 0, 0, (__rc))); \
109
+ Dump3("Iota"); \
110
+ \
111
+ /* Chi: non linear step, on colums */ \
112
+ a0 = Chi(a0, a1, a2); \
113
+ a1 = Chi(a1, a2, a0); \
114
+ a2 = Chi(a2, a0, a1); \
115
+ Dump3("Chi"); \
116
+ \
117
+ /* Rho-east: Plane shift */ \
118
+ a1 = ROL32(a1, 1); \
119
+ a2 = _mm_shuffle_epi8( a2, rhoEast2); \
120
+ Dump3("Rho-east")
121
+
122
+ static const uint32_t RC[MAXROUNDS] = {
123
+ _rc12,
124
+ _rc11,
125
+ _rc10,
126
+ _rc9,
127
+ _rc8,
128
+ _rc7,
129
+ _rc6,
130
+ _rc5,
131
+ _rc4,
132
+ _rc3,
133
+ _rc2,
134
+ _rc1
135
+ };
136
+
137
+ size_t Xoodyak_AbsorbKeyedFullBlocks(void *state, const uint8_t *X, size_t XLen)
138
+ {
139
+ size_t initialLength = XLen;
140
+ DeclareVars;
141
+
142
+ State2Vars(state);
143
+ do {
144
+ Round(_rc12); /* Xoodyak_Up(instance, NULL, 0, 0); */
145
+ Round(_rc11);
146
+ Round(_rc10);
147
+ Round(_rc9);
148
+ Round(_rc8);
149
+ Round(_rc7);
150
+ Round(_rc6);
151
+ Round(_rc5);
152
+ Round(_rc4);
153
+ Round(_rc3);
154
+ Round(_rc2);
155
+ Round(_rc1);
156
+ a0 = XOR(a0, LOAD128u(X[0])); /* Xoodyak_Down(instance, X, Xoodyak_Rkin, 0); */
157
+ a1 = XOR(a1, LOAD128u(X[16]));
158
+ a2 = XOR(a2, _mm_set_epi32(1, *(uint32_t*)(&X[40]), *(uint32_t*)(&X[36]), *(uint32_t*)(&X[32])));
159
+ X += Xoodyak_Rkin;
160
+ XLen -= Xoodyak_Rkin;
161
+ } while (XLen >= Xoodyak_Rkin);
162
+ Vars2State(state);
163
+
164
+ return initialLength - XLen;
165
+ }
166
+
167
+ size_t Xoodyak_AbsorbHashFullBlocks(void *state, const uint8_t *X, size_t XLen)
168
+ {
169
+ size_t initialLength = XLen;
170
+ V128 one = _mm_set_epi32(0, 0, 0, 1);
171
+ DeclareVars;
172
+
173
+ State2Vars(state);
174
+ do {
175
+ Round(_rc12); /* Xoodyak_Up(instance, NULL, 0, 0); */
176
+ Round(_rc11);
177
+ Round(_rc10);
178
+ Round(_rc9);
179
+ Round(_rc8);
180
+ Round(_rc7);
181
+ Round(_rc6);
182
+ Round(_rc5);
183
+ Round(_rc4);
184
+ Round(_rc3);
185
+ Round(_rc2);
186
+ Round(_rc1);
187
+ a0 = XOR(a0, LOAD128u(X[0])); /* Xoodyak_Down(instance, X, Xoodyak_Rhash, 0); */
188
+ a1 = XOR(a1, one);
189
+ X += Xoodyak_Rhash;
190
+ XLen -= Xoodyak_Rhash;
191
+ } while (XLen >= Xoodyak_Rhash);
192
+ Vars2State(state);
193
+
194
+ return initialLength - XLen;
195
+ }
196
+
197
+
198
+ size_t Xoodyak_SqueezeKeyedFullBlocks(void *state, uint8_t *Y, size_t YLen)
199
+ {
200
+ size_t initialLength = YLen;
201
+ V128 one = _mm_set_epi32(0, 0, 0, 1);
202
+ DeclareVars;
203
+
204
+ State2Vars(state);
205
+ do {
206
+ a0 = XOR(a0, one); /* Xoodyak_Down(instance, NULL, 0, 0); */
207
+ Round(_rc12); /* Xoodyak_Up(instance, Y, Xoodyak_Rkout, 0); */
208
+ Round(_rc11);
209
+ Round(_rc10);
210
+ Round(_rc9);
211
+ Round(_rc8);
212
+ Round(_rc7);
213
+ Round(_rc6);
214
+ Round(_rc5);
215
+ Round(_rc4);
216
+ Round(_rc3);
217
+ Round(_rc2);
218
+ Round(_rc1);
219
+ STORE128u(Y[0], a0);
220
+ STORE64L(Y[16], a1);
221
+ Y += Xoodyak_Rkout;
222
+ YLen -= Xoodyak_Rkout;
223
+ } while (YLen >= Xoodyak_Rkout);
224
+ Vars2State(state);
225
+
226
+ return initialLength - YLen;
227
+ }
228
+
229
+ size_t Xoodyak_SqueezeHashFullBlocks(void *state, uint8_t *Y, size_t YLen)
230
+ {
231
+ size_t initialLength = YLen;
232
+ V128 one = _mm_set_epi32(0, 0, 0, 1);
233
+ DeclareVars;
234
+
235
+ State2Vars(state);
236
+ do {
237
+ a0 = XOR(a0, one); /* Xoodyak_Down(instance, NULL, 0, 0); */
238
+ Round(_rc12); /* Xoodyak_Up(instance, Y, Xoodyak_Rhash, 0); */
239
+ Round(_rc11);
240
+ Round(_rc10);
241
+ Round(_rc9);
242
+ Round(_rc8);
243
+ Round(_rc7);
244
+ Round(_rc6);
245
+ Round(_rc5);
246
+ Round(_rc4);
247
+ Round(_rc3);
248
+ Round(_rc2);
249
+ Round(_rc1);
250
+ STORE128u(Y[0], a0);
251
+ Y += Xoodyak_Rhash;
252
+ YLen -= Xoodyak_Rhash;
253
+ } while (YLen >= Xoodyak_Rhash);
254
+ Vars2State(state);
255
+
256
+ return initialLength - YLen;
257
+ }
258
+
259
+ size_t Xoodyak_EncryptFullBlocks(void *state, const uint8_t *I, uint8_t *O, size_t IOLen)
260
+ {
261
+ size_t initialLength = IOLen;
262
+ DeclareVars;
263
+
264
+ State2Vars(state);
265
+ do {
266
+ Round(_rc12);
267
+ Round(_rc11);
268
+ Round(_rc10);
269
+ Round(_rc9);
270
+ Round(_rc8);
271
+ Round(_rc7);
272
+ Round(_rc6);
273
+ Round(_rc5);
274
+ Round(_rc4);
275
+ Round(_rc3);
276
+ Round(_rc2);
277
+ Round(_rc1);
278
+ a0 = XOR(a0, LOAD128u(I[0]));
279
+ a1 = XOR(a1, _mm_set_epi32(0, 1, *(uint32_t*)(&I[20]), *(uint32_t*)(&I[16])));
280
+ STORE128u(O[0], a0);
281
+ STORE64L(O[16], a1);
282
+ I += Xoodyak_Rkout;
283
+ O += Xoodyak_Rkout;
284
+ IOLen -= Xoodyak_Rkout;
285
+ } while (IOLen >= Xoodyak_Rkout);
286
+ Vars2State(state);
287
+
288
+ return initialLength - IOLen;
289
+ }
290
+
291
+ size_t Xoodyak_DecryptFullBlocks(void *state, const uint8_t *I, uint8_t *O, size_t IOLen)
292
+ {
293
+ size_t initialLength = IOLen;
294
+ V128 o0;
295
+ V128 one = _mm_set_epi32(0, 1, 0, 0);
296
+ DeclareVars;
297
+
298
+ State2Vars(state);
299
+ do {
300
+ Round(_rc12);
301
+ Round(_rc11);
302
+ Round(_rc10);
303
+ Round(_rc9);
304
+ Round(_rc8);
305
+ Round(_rc7);
306
+ Round(_rc6);
307
+ Round(_rc5);
308
+ Round(_rc4);
309
+ Round(_rc3);
310
+ Round(_rc2);
311
+ Round(_rc1);
312
+ o0 = XOR(a0, LOAD128u(I[0]));
313
+ #if defined(__i386__) || defined(_M_IX86)
314
+ *((uint32_t*)(O+16)) = *((uint32_t*)(I+16)) ^ _mm_extract_epi32(a1, 0);
315
+ *((uint32_t*)(O+20)) = *((uint32_t*)(I+20)) ^ _mm_extract_epi32(a1, 1);
316
+ a1 = _mm_insert_epi32(a1, *((uint32_t*)(I+16)), 0);
317
+ a1 = _mm_insert_epi32(a1, *((uint32_t*)(I+20)), 1);
318
+ #else
319
+ *((uint64_t*)(O+16)) = *((uint64_t*)(I+16)) ^ _mm_extract_epi64(a1, 0);
320
+ a1 = _mm_insert_epi64(a1, *((uint64_t*)(I+16)), 0);
321
+ #endif
322
+ STORE128u(O[0], o0);
323
+ a0 = XOR(a0, o0);
324
+ a1 = XOR(a1, one);
325
+ I += Xoodyak_Rkout;
326
+ O += Xoodyak_Rkout;
327
+ IOLen -= Xoodyak_Rkout;
328
+ } while (IOLen >= Xoodyak_Rkout);
329
+ Vars2State(state);
330
+
331
+ return initialLength - IOLen;
332
+ }
@@ -0,0 +1,329 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ The Xoodoo permutation, designed by Joan Daemen, Seth Hoffert, Gilles Van Assche and Ronny Van Keer.
6
+
7
+ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
8
+
9
+ For more information, feedback or questions, please refer to the Keccak Team website:
10
+ https://keccak.team/
11
+
12
+ To the extent possible under law, the implementer has waived all copyright
13
+ and related or neighboring rights to the source code in this file.
14
+ http://creativecommons.org/publicdomain/zero/1.0/
15
+ */
16
+
17
+ #define VERBOSE 0
18
+
19
+ #include <stdio.h>
20
+ #include <stdlib.h>
21
+ #include <string.h>
22
+ #include <emmintrin.h>
23
+ #include <pmmintrin.h>
24
+ #include <tmmintrin.h>
25
+ #include "align.h"
26
+ #include "Xoodoo.h"
27
+
28
+ #include "brg_endian.h"
29
+ #if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
30
+ #error Expecting a little-endian platform
31
+ #endif
32
+
33
+ #if (VERBOSE > 0)
34
+ #define Dump(__t) Vars2State; \
35
+ printf(__t "\n"); \
36
+ printf("a00 %08x, a01 %08x, a02 %08x, a03 %08x\n", state[0+0], state[0+1], state[0+2], state[0+3] ); \
37
+ printf("a10 %08x, a11 %08x, a12 %08x, a13 %08x\n", state[4+0], state[4+1], state[4+2], state[4+3] ); \
38
+ printf("a20 %08x, a21 %08x, a22 %08x, a23 %08x\n\n", state[8+0], state[8+1], state[8+2], state[8+3] );
39
+ #else
40
+ #define Dump(__t)
41
+ #endif
42
+
43
+ #if (VERBOSE >= 1)
44
+ #define Dump1(__t) Dump(__t)
45
+ #else
46
+ #define Dump1(__t)
47
+ #endif
48
+
49
+ #if (VERBOSE >= 2)
50
+ #define Dump2(__t) Dump(__t)
51
+ #else
52
+ #define Dump2(__t)
53
+ #endif
54
+
55
+ #if (VERBOSE >= 3)
56
+ #define Dump3(__t) Dump(__t)
57
+ #else
58
+ #define Dump3(__t)
59
+ #endif
60
+
61
+
62
+ /* ---------------------------------------------------------------- */
63
+
64
+ void Xoodoo_Initialize(void *state)
65
+ {
66
+ memset(state, 0, NLANES*sizeof(tXoodooLane));
67
+ }
68
+
69
+ /* ---------------------------------------------------------------- */
70
+
71
+ void Xoodoo_AddBytes(void *argState, const unsigned char *data, unsigned int offset, unsigned int length)
72
+ {
73
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
74
+ unsigned int sizeLeft = length;
75
+ unsigned int lanePosition = offset/4;
76
+ unsigned int offsetInLane = offset%4;
77
+ const unsigned char *curData = data;
78
+ uint32_t *state = (uint32_t*)argState;
79
+
80
+ state += lanePosition;
81
+ if ((sizeLeft > 0) && (offsetInLane != 0)) {
82
+ unsigned int bytesInLane = 4 - offsetInLane;
83
+ uint32_t lane = 0;
84
+ if (bytesInLane > sizeLeft)
85
+ bytesInLane = sizeLeft;
86
+ memcpy((unsigned char*)&lane + offsetInLane, curData, bytesInLane);
87
+ *state++ ^= lane;
88
+ sizeLeft -= bytesInLane;
89
+ curData += bytesInLane;
90
+ }
91
+
92
+ while(sizeLeft >= 4) {
93
+ *state++ ^= READ32_UNALIGNED( curData );
94
+ sizeLeft -= 4;
95
+ curData += 4;
96
+ }
97
+
98
+ if (sizeLeft > 0) {
99
+ uint32_t lane = 0;
100
+ memcpy(&lane, curData, sizeLeft);
101
+ *state ^= lane;
102
+ }
103
+ #else
104
+ #error "Not yet implemented"
105
+ #endif
106
+ }
107
+
108
+ /* ---------------------------------------------------------------- */
109
+
110
+ void Xoodoo_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
111
+ {
112
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
113
+ memcpy((unsigned char*)state+offset, data, length);
114
+ #else
115
+ #error "Not yet implemented"
116
+ #endif
117
+ }
118
+
119
+ /* ---------------------------------------------------------------- */
120
+
121
+ void Xoodoo_OverwriteWithZeroes(void *state, unsigned int byteCount)
122
+ {
123
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
124
+ memset(state, 0, byteCount);
125
+ #else
126
+ #error "Not yet implemented"
127
+ #endif
128
+ }
129
+
130
+ /* ---------------------------------------------------------------- */
131
+
132
+ void Xoodoo_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
133
+ {
134
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
135
+ memcpy(data, (unsigned char*)state+offset, length);
136
+ #else
137
+ #error "Not yet implemented"
138
+ #endif
139
+ }
140
+
141
+ /* ---------------------------------------------------------------- */
142
+
143
+ void Xoodoo_ExtractAndAddBytes(const void *argState, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
144
+ {
145
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
146
+ unsigned int sizeLeft = length;
147
+ unsigned int lanePosition = offset/4;
148
+ unsigned int offsetInLane = offset%4;
149
+ const unsigned char *curInput = input;
150
+ unsigned char *curOutput = output;
151
+ const uint32_t *state = (const uint32_t*)argState;
152
+
153
+ state += lanePosition;
154
+ if ((sizeLeft > 0) && (offsetInLane != 0)) {
155
+ unsigned int bytesInLane = 4 - offsetInLane;
156
+ uint32_t lane = *state++ >> (offsetInLane * 8);
157
+ if (bytesInLane > sizeLeft)
158
+ bytesInLane = sizeLeft;
159
+ sizeLeft -= bytesInLane;
160
+ do {
161
+ *curOutput++ = (*curInput++) ^ (unsigned char)lane;
162
+ lane >>= 8;
163
+ }
164
+ while ( --bytesInLane != 0);
165
+ }
166
+
167
+ while(sizeLeft >= 4) {
168
+ WRITE32_UNALIGNED( curOutput, READ32_UNALIGNED( curInput ) ^ *state++ );
169
+ sizeLeft -= 4;
170
+ curInput += 4;
171
+ curOutput += 4;
172
+ }
173
+
174
+ if (sizeLeft > 0) {
175
+ uint32_t lane = *state;
176
+ do {
177
+ *curOutput++ = (*curInput++) ^ (unsigned char)lane;
178
+ lane >>= 8;
179
+ }
180
+ while ( --sizeLeft != 0 );
181
+ }
182
+ #else
183
+ #error "Not yet implemented"
184
+ #endif
185
+ }
186
+
187
+ /* ---------------------------------------------------------------- */
188
+
189
+ typedef __m128i V128;
190
+
191
+ ALIGN(16) static const uint8_t maskRhoEast2[16] = {
192
+ 11, 8, 9, 10,
193
+ 15, 12, 13, 14,
194
+ 3, 0, 1, 2,
195
+ 7, 4, 5, 6,
196
+ };
197
+
198
+ #define ANDnu128(a, b) _mm_andnot_si128(a, b)
199
+ #define CONST128(a) _mm_load_si128((const V128 *)&(a))
200
+ #define LOAD128(a) _mm_load_si128((const V128 *)&(a))
201
+ #if defined(Waffel_useXOP)
202
+ #define ROL32in128(a, o) _mm_roti_epi32(a, o)
203
+ #else
204
+ #define ROL32in128(a, o) _mm_or_si128(_mm_slli_epi32(a, o), _mm_srli_epi32(a, 32-(o)))
205
+ #endif
206
+ #define STORE128(a, b) _mm_store_si128((V128 *)&(a), b)
207
+ #define XOR128(a, b) _mm_xor_si128(a, b)
208
+
209
+ #define DeclareVars V128 a0, a1, a2, p, e; \
210
+ V128 rhoEast2 = CONST128(maskRhoEast2)
211
+
212
+ #define State2Vars a0 = LOAD128(state[0]), a1 = LOAD128(state[4]), a2 = LOAD128(state[8]);
213
+
214
+ #define Vars2State STORE128(state[0], a0), STORE128(state[4], a1), STORE128(state[8], a2);
215
+
216
+ /*
217
+ ** Theta: Column Parity Mixer
218
+ */
219
+ #define Theta() p = XOR128( a0, a1 ); \
220
+ p = XOR128( p, a2 ); \
221
+ p = _mm_shuffle_epi32( p, 0x93); \
222
+ e = ROL32in128( p, 5 ); \
223
+ p = ROL32in128( p, 14 ); \
224
+ e = XOR128( e, p ); \
225
+ a0 = XOR128( a0, e ); \
226
+ a1 = XOR128( a1, e ); \
227
+ a2 = XOR128( a2, e );
228
+
229
+ /*
230
+ ** Rho-west: Plane shift
231
+ */
232
+ #define Rho_west() a1 = _mm_shuffle_epi32( a1, 0x93); \
233
+ a2 = ROL32in128(a2, 11);
234
+
235
+ /*
236
+ ** Iota: round constants
237
+ */
238
+ #define Iota(__rc) a0 = XOR128(a0, _mm_set_epi32(0, 0, 0, (__rc)));
239
+
240
+ /*
241
+ ** Chi: non linear step, on colums
242
+ */
243
+ #define Chi() a0 = XOR128(a0, ANDnu128(a1, a2)); \
244
+ a1 = XOR128(a1, ANDnu128(a2, a0)); \
245
+ a2 = XOR128(a2, ANDnu128(a0, a1));
246
+
247
+ /*
248
+ ** Rho-east: Plane shift
249
+ */
250
+ #define Rho_east() a1 = ROL32in128(a1, 1); \
251
+ a2 = _mm_shuffle_epi8( a2, rhoEast2);
252
+
253
+
254
+ #define Round(__rc) \
255
+ Theta(); \
256
+ Dump3("Theta"); \
257
+ Rho_west(); \
258
+ Dump3("Rho-west"); \
259
+ Iota(__rc); \
260
+ Dump3("Iota"); \
261
+ Chi(); \
262
+ Dump3("Chi"); \
263
+ Rho_east(); \
264
+ Dump3("Rho-east")
265
+
266
+ static const uint32_t RC[MAXROUNDS] = {
267
+ _rc12,
268
+ _rc11,
269
+ _rc10,
270
+ _rc9,
271
+ _rc8,
272
+ _rc7,
273
+ _rc6,
274
+ _rc5,
275
+ _rc4,
276
+ _rc3,
277
+ _rc2,
278
+ _rc1
279
+ };
280
+
281
+ void Xoodoo_Permute_Nrounds( uint32_t * state, uint32_t nr )
282
+ {
283
+ DeclareVars;
284
+ uint32_t i;
285
+
286
+ State2Vars;
287
+ for (i = MAXROUNDS - nr; i < MAXROUNDS; ++i ) {
288
+ Round(RC[i]);
289
+ Dump2("Round");
290
+ }
291
+ Dump1("Permutation");
292
+ Vars2State;
293
+ }
294
+
295
+ void Xoodoo_Permute_6rounds( uint32_t * state)
296
+ {
297
+ DeclareVars;
298
+
299
+ State2Vars;
300
+ Round(_rc6);
301
+ Round(_rc5);
302
+ Round(_rc4);
303
+ Round(_rc3);
304
+ Round(_rc2);
305
+ Round(_rc1);
306
+ Dump1("Permutation");
307
+ Vars2State;
308
+ }
309
+
310
+ void Xoodoo_Permute_12rounds( uint32_t * state)
311
+ {
312
+ DeclareVars;
313
+
314
+ State2Vars;
315
+ Round(_rc12);
316
+ Round(_rc11);
317
+ Round(_rc10);
318
+ Round(_rc9);
319
+ Round(_rc8);
320
+ Round(_rc7);
321
+ Round(_rc6);
322
+ Round(_rc5);
323
+ Round(_rc4);
324
+ Round(_rc3);
325
+ Round(_rc2);
326
+ Round(_rc1);
327
+ Dump1("Permutation");
328
+ Vars2State;
329
+ }
@@ -0,0 +1,53 @@
1
+ /*
2
+ The eXtended Keccak Code Package (XKCP)
3
+ https://github.com/XKCP/XKCP
4
+
5
+ The Xoodoo permutation, designed by Joan Daemen, Seth Hoffert, Gilles Van Assche and Ronny Van Keer.
6
+
7
+ Implementation by Ronny Van Keer, hereby denoted as "the implementer".
8
+
9
+ For more information, feedback or questions, please refer to the Keccak Team website:
10
+ https://keccak.team/
11
+
12
+ To the extent possible under law, the implementer has waived all copyright
13
+ and related or neighboring rights to the source code in this file.
14
+ http://creativecommons.org/publicdomain/zero/1.0/
15
+ */
16
+
17
+ #ifndef _Xoodoo_SnP_h_
18
+ #define _Xoodoo_SnP_h_
19
+
20
+ #include <stddef.h>
21
+ #include <stdint.h>
22
+
23
+ /** For the documentation, see SnP-documentation.h.
24
+ */
25
+
26
+ #define Xoodoo_implementation "SIMD-128 optimized implementation"
27
+ #define Xoodoo_stateSizeInBytes (3*4*4)
28
+ #define Xoodoo_stateAlignment 16
29
+ #define Xoodoo_HasNround
30
+
31
+ /* void Xoodoo_StaticInitialize( void ); */
32
+ #define Xoodoo_StaticInitialize()
33
+ void Xoodoo_Initialize(void *state);
34
+ /* void Xoodoo_AddByte(void *state, uint8_t data, unsigned int offset); */
35
+ #define Xoodoo_AddByte(argS, argData, argOffset) ((uint8_t*)argS)[argOffset] ^= (argData)
36
+ void Xoodoo_AddBytes(void *state, const uint8_t *data, unsigned int offset, unsigned int length);
37
+ void Xoodoo_OverwriteBytes(void *state, const uint8_t *data, unsigned int offset, unsigned int length);
38
+ void Xoodoo_OverwriteWithZeroes(void *state, unsigned int byteCount);
39
+ void Xoodoo_Permute_Nrounds(void *state, unsigned int nrounds);
40
+ void Xoodoo_Permute_6rounds(void *state);
41
+ void Xoodoo_Permute_12rounds(void *state);
42
+ void Xoodoo_ExtractBytes(const void *state, uint8_t *data, unsigned int offset, unsigned int length);
43
+ void Xoodoo_ExtractAndAddBytes(const void *state, const uint8_t *input, uint8_t *output, unsigned int offset, unsigned int length);
44
+
45
+ #define CyclistFullBlocks_supported
46
+ size_t Xoodyak_AbsorbKeyedFullBlocks(void *state, const uint8_t *X, size_t XLen);
47
+ size_t Xoodyak_AbsorbHashFullBlocks(void *state, const uint8_t *X, size_t XLen);
48
+ size_t Xoodyak_SqueezeHashFullBlocks(void *state, uint8_t *Y, size_t YLen);
49
+ size_t Xoodyak_SqueezeKeyedFullBlocks(void *state, uint8_t *Y, size_t YLen);
50
+ size_t Xoodyak_EncryptFullBlocks(void *state, const uint8_t *I, uint8_t *O, size_t IOLen);
51
+ size_t Xoodyak_DecryptFullBlocks(void *state, const uint8_t *I, uint8_t *O, size_t IOLen);
52
+
53
+ #endif