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,394 @@
1
+ /*
2
+ Implementation by Gilles Van Assche and Ronny Van Keer, hereby denoted as "the implementer".
3
+
4
+ For more information, feedback or questions, please refer to our website:
5
+ https://keccak.team/
6
+
7
+ To the extent possible under law, the implementer has waived all copyright
8
+ and related or neighboring rights to the source code in this file.
9
+ http://creativecommons.org/publicdomain/zero/1.0/
10
+ */
11
+
12
+ #include <stdint.h>
13
+ #include <stdio.h>
14
+ #include <stdlib.h>
15
+ #include <string.h>
16
+ #include "base64.h"
17
+ #include "KeccakHash.h"
18
+ #include "KangarooTwelve.h"
19
+ #include "SP800-185.h"
20
+
21
+ int hexencode(const void* data_buf, size_t dataLength, char* result, size_t resultSize)
22
+ {
23
+ const char hexchars[] = "0123456789abcdef";
24
+ const uint8_t *data = (const uint8_t *)data_buf;
25
+ size_t resultIndex = 0;
26
+ size_t x;
27
+
28
+ for(x=0; x<dataLength; x++) {
29
+ if (resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
30
+ result[resultIndex++] = hexchars[(data[x] / 16) % 16];
31
+ if (resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
32
+ result[resultIndex++] = hexchars[data[x] % 16];
33
+ }
34
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
35
+ result[resultIndex] = 0;
36
+ return 0; /* indicate success */
37
+ }
38
+
39
+ #define bufferSize 65536
40
+ #define algorithm_Keccak 0
41
+ #define algorithm_K12 1
42
+ #define algorithm_ParallelHash 2
43
+
44
+ typedef struct {
45
+ unsigned int algorithm;
46
+ unsigned int rate;
47
+ unsigned int capacity;
48
+ unsigned int hashbitlen;
49
+ unsigned char delimitedSuffix;
50
+ unsigned int blockByteLen;
51
+ } Specifications;
52
+
53
+ typedef union {
54
+ Keccak_HashInstance keccak;
55
+ KangarooTwelve_Instance k12;
56
+ ParallelHash_Instance ph;
57
+ } Instance;
58
+
59
+ int hashInitialize(Instance *instance, const Specifications *specs)
60
+ {
61
+ if (specs->algorithm == algorithm_Keccak) {
62
+ if (Keccak_HashInitialize(&instance->keccak, specs->rate, specs->capacity, specs->hashbitlen, specs->delimitedSuffix)) {
63
+ printf("Incorrect Keccak parameters (%d, %d, %d, 0x%02x).\n", specs->rate, specs->capacity, specs->hashbitlen, specs->delimitedSuffix);
64
+ return -1;
65
+ }
66
+ else
67
+ return 0;
68
+ }
69
+ else if (specs->algorithm == algorithm_K12) {
70
+ if (KangarooTwelve_Initialize(&instance->k12, specs->hashbitlen/8)) {
71
+ printf("Incorrect KangarooTwelve parameters.\n");
72
+ return -1;
73
+ }
74
+ else
75
+ return 0;
76
+ }
77
+ else if (specs->algorithm == algorithm_ParallelHash) {
78
+ if (specs->capacity == 256) {
79
+ if (ParallelHash128_Initialize(&instance->ph, specs->blockByteLen, specs->hashbitlen, "", 0)) {
80
+ printf("Incorrect ParallelHash128 parameters.\n");
81
+ return -1;
82
+ }
83
+ else
84
+ return 0;
85
+ }
86
+ else if (specs->capacity == 512) {
87
+ if (ParallelHash256_Initialize(&instance->ph, specs->blockByteLen, specs->hashbitlen, "", 0)) {
88
+ printf("Incorrect ParallelHash256 parameters.\n");
89
+ return -1;
90
+ }
91
+ else
92
+ return 0;
93
+ }
94
+ else {
95
+ printf("Incorrect ParallelHash parameters.\n");
96
+ return -1;
97
+ }
98
+ }
99
+ else
100
+ return -1;
101
+ }
102
+
103
+ int hashUpdate(Instance *instance, const Specifications *specs, const unsigned char *buffer, size_t size)
104
+ {
105
+ if (specs->algorithm == algorithm_Keccak)
106
+ Keccak_HashUpdate(&instance->keccak, buffer, size*8);
107
+ else if (specs->algorithm == algorithm_K12)
108
+ KangarooTwelve_Update(&instance->k12, buffer, size);
109
+ else if ((specs->algorithm == algorithm_ParallelHash) && (specs->capacity == 256))
110
+ ParallelHash128_Update(&instance->ph, buffer, size*8);
111
+ else if ((specs->algorithm == algorithm_ParallelHash) && (specs->capacity == 512))
112
+ ParallelHash256_Update(&instance->ph, buffer, size*8);
113
+ return 0;
114
+ }
115
+
116
+ int hashFinal(Instance *instance, const Specifications *specs, unsigned char *buffer)
117
+ {
118
+ if (specs->algorithm == algorithm_Keccak)
119
+ Keccak_HashFinal(&instance->keccak, buffer);
120
+ else if (specs->algorithm == algorithm_K12)
121
+ KangarooTwelve_Final(&instance->k12, buffer, "", 0);
122
+ else if ((specs->algorithm == algorithm_ParallelHash) && (specs->capacity == 256))
123
+ ParallelHash128_Final(&instance->ph, buffer);
124
+ else if ((specs->algorithm == algorithm_ParallelHash) && (specs->capacity == 512))
125
+ ParallelHash256_Final(&instance->ph, buffer);
126
+ return 0;
127
+ }
128
+
129
+ int processFile(const char *fileName, const Specifications *specs, int base64)
130
+ {
131
+ FILE *fp;
132
+ Instance instance;
133
+ size_t read;
134
+ unsigned char buffer[bufferSize];
135
+ char display[bufferSize*2+1];
136
+
137
+ if (specs->hashbitlen > (bufferSize*8)) {
138
+ printf("The requested digest length (%d bits) does not fit in the buffer.\n", specs->hashbitlen);
139
+ return -1;
140
+ }
141
+ if (strcmp("-", fileName) == 0) {
142
+ fp = stdin;
143
+ }
144
+ else {
145
+ fp = fopen(fileName, "rb");
146
+ if (fp == NULL) {
147
+ printf("File '%s' could not be opened.\n", fileName);
148
+ return -1;
149
+ }
150
+ }
151
+ if (hashInitialize(&instance, specs)) {
152
+ fclose(fp);
153
+ return -1;
154
+ }
155
+ do {
156
+ read = fread(buffer, 1, bufferSize, fp);
157
+ if (read > 0)
158
+ hashUpdate(&instance, specs, buffer, read);
159
+ } while(read>0);
160
+ if (fp != stdin) {
161
+ fclose(fp);
162
+ }
163
+ hashFinal(&instance, specs, buffer);
164
+ if (base64) {
165
+ if (base64encode(buffer, (specs->hashbitlen+7)/8, display, bufferSize*2)) {
166
+ printf("Error while converting to base64.\n");
167
+ return -1;
168
+ }
169
+ }
170
+ else {
171
+ if (hexencode(buffer, (specs->hashbitlen+7)/8, display, bufferSize*2)) {
172
+ printf("Error while converting to hex.\n");
173
+ return -1;
174
+ }
175
+ }
176
+ printf("%s ", display);
177
+ printf("%s\n", fileName);
178
+ return 0;
179
+ }
180
+
181
+ int processString(const char *input, const Specifications *specs, int base64)
182
+ {
183
+ Instance instance;
184
+ unsigned char buffer[bufferSize];
185
+ char display[bufferSize*2+1];
186
+
187
+ if (specs->hashbitlen > (bufferSize*8)) {
188
+ printf("The requested digest length (%d bits) does not fit in the buffer.\n", specs->hashbitlen);
189
+ return -1;
190
+ }
191
+ if (hashInitialize(&instance, specs)) {
192
+ return -1;
193
+ }
194
+ hashUpdate(&instance, specs, input, strlen(input));
195
+ hashFinal(&instance, specs, buffer);
196
+ if (base64) {
197
+ if (base64encode(buffer, (specs->hashbitlen+7)/8, display, bufferSize*2)) {
198
+ printf("Error while converting to base64.\n");
199
+ return -1;
200
+ }
201
+ }
202
+ else {
203
+ if (hexencode(buffer, (specs->hashbitlen+7)/8, display, bufferSize*2)) {
204
+ printf("Error while converting to hex.\n");
205
+ return -1;
206
+ }
207
+ }
208
+ printf("%s ", display);
209
+ printf("\"%s\"\n", input);
210
+ return 0;
211
+ }
212
+
213
+ void printHelp()
214
+ {
215
+ printf("Usage: KeccakSum [options] [file names] [options] [file names] ...\n\n");
216
+ printf(" --help or -h To display this page\n");
217
+ printf(" --base64 Print in base64\n");
218
+ printf(" --hex Print in hexadecimal\n");
219
+ printf(" --outputbits <numberOfBits> Number of bits as output\n");
220
+ printf(" --shake128 Use SHAKE128\n");
221
+ printf(" --shake256 Use SHAKE256\n");
222
+ printf(" --sha3-224 Use SHA3-224\n");
223
+ printf(" --sha3-256 Use SHA3-256\n");
224
+ printf(" --sha3-384 Use SHA3-384\n");
225
+ printf(" --sha3-512 Use SHA3-512\n");
226
+ printf(" --no-suffix Use 0x01 as delimited suffix (pure Keccak)\n");
227
+ printf(" --ethereum Equivalent to --sha3-256 --no-suffix\n");
228
+ printf(" --kangarootwelve or --k12 Use KangarooTwelve\n");
229
+ printf(" --ph128 Use ParallelHash128\n");
230
+ printf(" --ph256 Use ParallelHash256\n");
231
+ printf(" -B <block size in bytes> ParallelHash's B parameter\n");
232
+ printf(" --string <string> String to hash\n");
233
+ printf(" <file name> File to hash\n\n");
234
+ printf("The options are processed in order.\nBy default, it uses SHAKE128 and base64 display.\n");
235
+ printf("With no file names, or when file name is -, it reads standard input.\n");
236
+ }
237
+
238
+ int process(int argc, char* argv[])
239
+ {
240
+ Specifications specs;
241
+ int base64 = 1;
242
+ int i, r;
243
+ int was_filename = 0;
244
+ specs.algorithm = algorithm_Keccak;
245
+ specs.rate = 1344;
246
+ specs.capacity = 256;
247
+ specs.hashbitlen = 264;
248
+ specs.delimitedSuffix = 0x1F;
249
+
250
+ for(i=1; i<argc; i++) {
251
+ int outputbits;
252
+ if (strcmp("--base64", argv[i]) == 0)
253
+ base64 = 1;
254
+ else if (strcmp("--hex", argv[i]) == 0)
255
+ base64 = 0;
256
+ else if ((strcmp("--outputbits", argv[i]) == 0) || (strcmp("-n", argv[i]) == 0)) {
257
+ if ((i+1) >= argc) {
258
+ printf("Error: missing argument for --outputbits\n");
259
+ return -1;
260
+ }
261
+ outputbits = 0;
262
+ if (sscanf(argv[i+1], "%d", &outputbits) && (outputbits > 0) && ((outputbits % 8) == 0)) {
263
+ specs.hashbitlen = outputbits;
264
+ i++;
265
+ }
266
+ else {
267
+ printf("Error: argument for --outputbits option must be a positive integer multiple of 8\n");
268
+ return -1;
269
+ }
270
+ }
271
+ else if (strcmp("--shake128", argv[i]) == 0) {
272
+ specs.rate = 1344;
273
+ specs.capacity = 256;
274
+ specs.hashbitlen = 264;
275
+ specs.delimitedSuffix = 0x1F;
276
+ base64 = 1;
277
+ }
278
+ else if (strcmp("--shake256", argv[i]) == 0) {
279
+ specs.rate = 1088;
280
+ specs.capacity = 512;
281
+ specs.hashbitlen = 528;
282
+ specs.delimitedSuffix = 0x1F;
283
+ base64 = 1;
284
+ }
285
+ else if (strcmp("--sha3-224", argv[i]) == 0) {
286
+ specs.rate = 1152;
287
+ specs.capacity = 448;
288
+ specs.hashbitlen = 224;
289
+ specs.delimitedSuffix = 0x06;
290
+ base64 = 0;
291
+ }
292
+ else if (strcmp("--sha3-256", argv[i]) == 0) {
293
+ specs.rate = 1088;
294
+ specs.capacity = 512;
295
+ specs.hashbitlen = 256;
296
+ specs.delimitedSuffix = 0x06;
297
+ base64 = 0;
298
+ }
299
+ else if (strcmp("--sha3-384", argv[i]) == 0) {
300
+ specs.rate = 832;
301
+ specs.capacity = 768;
302
+ specs.hashbitlen = 384;
303
+ specs.delimitedSuffix = 0x06;
304
+ base64 = 0;
305
+ }
306
+ else if (strcmp("--sha3-512", argv[i]) == 0) {
307
+ specs.rate = 576;
308
+ specs.capacity = 1024;
309
+ specs.hashbitlen = 512;
310
+ specs.delimitedSuffix = 0x06;
311
+ base64 = 0;
312
+ }
313
+ else if (strcmp("--no-suffix", argv[i]) == 0) {
314
+ specs.delimitedSuffix = 0x01;
315
+ }
316
+ else if (strcmp("--ethereum", argv[i]) == 0) {
317
+ specs.rate = 1088;
318
+ specs.capacity = 512;
319
+ specs.hashbitlen = 256;
320
+ specs.delimitedSuffix = 0x01;
321
+ base64 = 0;
322
+ }
323
+ else if ((strcmp("--kangarootwelve", argv[i]) == 0) || (strcmp("--k12", argv[i]) == 0)) {
324
+ specs.algorithm = algorithm_K12;
325
+ specs.hashbitlen = 264;
326
+ base64 = 1;
327
+ }
328
+ else if (strcmp("--ph128", argv[i]) == 0) {
329
+ specs.algorithm = algorithm_ParallelHash;
330
+ specs.capacity = 256;
331
+ specs.hashbitlen = 264;
332
+ specs.blockByteLen = 8192;
333
+ base64 = 1;
334
+ }
335
+ else if (strcmp("--ph256", argv[i]) == 0) {
336
+ specs.algorithm = algorithm_ParallelHash;
337
+ specs.capacity = 512;
338
+ specs.hashbitlen = 528;
339
+ specs.blockByteLen = 8192;
340
+ base64 = 1;
341
+ }
342
+ else if (strcmp("-B", argv[i]) == 0) {
343
+ int blockByteLen;
344
+ if ((i+1) >= argc) {
345
+ printf("Error: missing argument for -B\n");
346
+ return -1;
347
+ }
348
+ blockByteLen = 0;
349
+ if (sscanf(argv[i+1], "%d", &blockByteLen) && (blockByteLen > 0)) {
350
+ specs.blockByteLen = blockByteLen;
351
+ i++;
352
+ }
353
+ else {
354
+ printf("Error: argument for -B option must be a positive power of 2\n");
355
+ return -1;
356
+ }
357
+ }
358
+ else if (strcmp("--string", argv[i]) == 0) {
359
+ if ((i+1) >= argc) {
360
+ printf("Error: missing argument for --string\n");
361
+ return -1;
362
+ }
363
+ i++;
364
+ processString(argv[i], &specs, base64);
365
+ }
366
+ else if (strcmp("--help", argv[i]) == 0 || strcmp("-h", argv[i]) == 0) {
367
+ printHelp();
368
+ return 0;
369
+ }
370
+ else {
371
+ if (strlen(argv[i]) > 2) {
372
+ if ((argv[i][0] == '-') && (argv[i][1] == '-')) {
373
+ printf("Unrecognized command '%s'\n", argv[i]);
374
+ return -1;
375
+ }
376
+ }
377
+ was_filename = 1;
378
+ r = processFile(argv[i], &specs, base64);
379
+ if (r)
380
+ return r;
381
+ }
382
+ }
383
+ if (was_filename == 0) {
384
+ r = processFile("-", &specs, base64);
385
+ if (r)
386
+ return r;
387
+ }
388
+ return 0;
389
+ }
390
+
391
+ int main(int argc, char* argv[])
392
+ {
393
+ return process(argc, argv);
394
+ }
@@ -0,0 +1,86 @@
1
+ /*
2
+ Implementation taken from:
3
+ https://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64
4
+ (2015-12-16)
5
+
6
+ Available under the Creative Commons Attribution-ShareAlike License:
7
+ https://creativecommons.org/licenses/by-sa/3.0/
8
+ */
9
+
10
+ #include <stdint.h>
11
+ #include <string.h>
12
+
13
+ int base64encode(const void* data_buf, size_t dataLength, char* result, size_t resultSize)
14
+ {
15
+ const char base64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
16
+ const uint8_t *data = (const uint8_t *)data_buf;
17
+ size_t resultIndex = 0;
18
+ size_t x;
19
+ uint32_t n = 0;
20
+ int padCount = dataLength % 3;
21
+ uint8_t n0, n1, n2, n3;
22
+
23
+ /* increment over the length of the string, three characters at a time */
24
+ for (x = 0; x < dataLength; x += 3)
25
+ {
26
+ /* these three 8-bit (ASCII) characters become one 24-bit number */
27
+ n = ((uint32_t)data[x]) << 16; /* parenthesis needed, compiler depending on flags can do the shifting before conversion to uint32_t, resulting to 0 */
28
+
29
+ if((x+1) < dataLength)
30
+ n += ((uint32_t)data[x+1]) << 8; /* parenthesis needed, compiler depending on flags can do the shifting before conversion to uint32_t, resulting to 0 */
31
+
32
+ if((x+2) < dataLength)
33
+ n += data[x+2];
34
+
35
+ /* this 24-bit number gets separated into four 6-bit numbers */
36
+ n0 = (uint8_t)(n >> 18) & 63;
37
+ n1 = (uint8_t)(n >> 12) & 63;
38
+ n2 = (uint8_t)(n >> 6) & 63;
39
+ n3 = (uint8_t)n & 63;
40
+
41
+ /*
42
+ * if we have one byte available, then its encoding is spread
43
+ * out over two characters
44
+ */
45
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
46
+ result[resultIndex++] = base64chars[n0];
47
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
48
+ result[resultIndex++] = base64chars[n1];
49
+
50
+ /*
51
+ * if we have only two bytes available, then their encoding is
52
+ * spread out over three chars
53
+ */
54
+ if((x+1) < dataLength)
55
+ {
56
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
57
+ result[resultIndex++] = base64chars[n2];
58
+ }
59
+
60
+ /*
61
+ * if we have all three bytes available, then their encoding is spread
62
+ * out over four characters
63
+ */
64
+ if((x+2) < dataLength)
65
+ {
66
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
67
+ result[resultIndex++] = base64chars[n3];
68
+ }
69
+ }
70
+
71
+ /*
72
+ * create and add padding that is required if we did not have a multiple of 3
73
+ * number of characters available
74
+ */
75
+ if (padCount > 0)
76
+ {
77
+ for (; padCount < 3; padCount++)
78
+ {
79
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
80
+ result[resultIndex++] = '=';
81
+ }
82
+ }
83
+ if(resultIndex >= resultSize) return 1; /* indicate failure: buffer too small */
84
+ result[resultIndex] = 0;
85
+ return 0; /* indicate success */
86
+ }
@@ -0,0 +1,12 @@
1
+ /*
2
+ Implementation taken from:
3
+ https://en.wikibooks.org/wiki/Algorithm_Implementation/Miscellaneous/Base64
4
+ (2015-12-16)
5
+
6
+ Available under the Creative Commons Attribution-ShareAlike License:
7
+ https://creativecommons.org/licenses/by-sa/3.0/
8
+ */
9
+
10
+ #include <string.h>
11
+
12
+ int base64encode(const void* data_buf, size_t dataLength, char* result, size_t resultSize);
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'build/loader'
4
+
5
+ module SleepingKangaroo12
6
+ module Binding
7
+ extend ::FFI::Library
8
+ ffi_lib Build::Loader.find('SleepingKangaroo12')
9
+
10
+ attach_function :init, :SleepingKangaroo12_Init, [:int], :pointer
11
+ attach_function :update, :SleepingKangaroo12_Update, %i[pointer pointer size_t], :int
12
+ attach_function :final, :SleepingKangaroo12_Final, %i[pointer pointer pointer size_t], :int
13
+ attach_function :destroy, :SleepingKangaroo12_Destroy, %i[pointer], :void
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+ require 'pathname'
5
+ require_relative 'platform'
6
+
7
+ module SleepingKangaroo12
8
+ module Build
9
+ # taken from:
10
+ # https://github.com/ffi/ffi-compiler/blob/master/lib/ffi-compiler/loader.rb
11
+ module Loader
12
+ def self.find(name, start_path = nil)
13
+ library = Platform.instance.map_library_name(name)
14
+ root = false
15
+ ::Pathname.new(start_path || caller_path(caller[0])).ascend do |path|
16
+ Dir.glob("#{path}/**/{#{::FFI::Platform::ARCH}-#{::FFI::Platform::OS}/#{library},#{library}}") do |f|
17
+ return f
18
+ end
19
+
20
+ break if root
21
+
22
+ # Next iteration will be the root of the gem if this is the lib/ dir - stop after that
23
+ root = ::File.basename(path) == 'lib'
24
+ end
25
+ raise ::LoadError, "cannot find '#{name}' library"
26
+ end
27
+
28
+ def self.caller_path(line = caller[0])
29
+ if ::FFI::Platform::OS == 'windows'
30
+ drive = line[0..1]
31
+ path = line[2..].split(/:/)[0]
32
+ full_path = drive + path
33
+ else
34
+ full_path = line.split(/:/)[0]
35
+ end
36
+ ::File.dirname full_path
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+ require 'singleton'
5
+
6
+ module SleepingKangaroo12
7
+ module Build
8
+ # mostly taken from:
9
+ # https://github.com/ffi/ffi-compiler/blob/master/lib/ffi-compiler/platform.rb
10
+
11
+ class Platform
12
+ include ::Singleton
13
+
14
+ LIBSUFFIX = ::FFI::Platform.mac? ? 'bundle' : ::FFI::Platform::LIBSUFFIX
15
+
16
+ def map_library_name(name)
17
+ "#{::FFI::Platform::LIBPREFIX}#{name}.#{LIBSUFFIX}"
18
+ end
19
+
20
+ def arch
21
+ ::FFI::Platform::ARCH
22
+ end
23
+
24
+ def os
25
+ ::FFI::Platform::OS
26
+ end
27
+
28
+ def name
29
+ ::FFI::Platform.name
30
+ end
31
+
32
+ def mac?
33
+ ::FFI::Platform.mac?
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './build/platform'
4
+ require_relative './build/loader'
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'binding'
4
+
5
+ module SleepingKangaroo12
6
+ class Digest
7
+ class UpdatingFailed < ::StandardError
8
+ end
9
+
10
+ class FinalizationFailed < ::StandardError
11
+ end
12
+
13
+ class Finalized < ::StandardError
14
+ end
15
+
16
+ def initialize(output_length: 32, key: nil)
17
+ raise ::TypeError, 'Hash length is not an Integer' unless output_length.is_a?(::Integer)
18
+ raise ::ArgumentError, 'Hash length out of range' unless (1...(1 << 20)).include?(output_length)
19
+ raise ::TypeError, 'Key is not a String' if !key.nil? && !key.is_a?(::String)
20
+
21
+ # id = SecureRandom.uuid
22
+ @native_instance = Binding.init(output_length).tap do |pointer|
23
+ ::ObjectSpace.define_finalizer(self, self.class._create_finalizer(pointer))
24
+ end
25
+ @output_length = output_length
26
+ @key = key
27
+ @finalized = false
28
+ @result = nil
29
+ end
30
+
31
+ def update(data)
32
+ raise Finalized if @finalized
33
+
34
+ data_size = data.bytesize
35
+ data_buffer = ::FFI::MemoryPointer.new(:char, data_size)
36
+ data_buffer.put_bytes(0, data)
37
+ Binding.update(@native_instance, data_buffer, data_size).tap do |result|
38
+ raise UpdatingFailed unless result.zero?
39
+ end
40
+ nil
41
+ end
42
+
43
+ def <<(*args, **kwargs)
44
+ update(*args, **kwargs)
45
+ end
46
+
47
+ def digest
48
+ @finalized = true
49
+ return @_digest if @_digest
50
+
51
+ data_buffer = ::FFI::MemoryPointer.new(:char, @output_length)
52
+ customization_buffer, customization_size = @key.then do |key|
53
+ next [::FFI::MemoryPointer.new(:char, 0), 0] unless key
54
+
55
+ size = key.bytesize
56
+ [::FFI::MemoryPointer.new(:char, size).tap do |buffer|
57
+ buffer.put_bytes(0, key)
58
+ end, size]
59
+ end
60
+ Binding.final(@native_instance, data_buffer, customization_buffer, customization_size).tap do |result|
61
+ raise FinalizationFailed unless result.zero?
62
+ end
63
+ @_digest = data_buffer.get_bytes(0, @output_length)
64
+ end
65
+
66
+ def hexdigest
67
+ @_hexdigest ||= digest.unpack1('H*')
68
+ end
69
+
70
+ def base64digest
71
+ @_base64digest ||= ::Base64.strict_encode64(digest)
72
+ end
73
+
74
+ class << self
75
+ # https://www.mikeperham.com/2010/02/24/the-trouble-with-ruby-finalizers/
76
+ def _create_finalizer(instance)
77
+ proc {
78
+ Binding.destroy(instance)
79
+ }
80
+ end
81
+
82
+ def digest(*args, **kwargs)
83
+ _generic_digest(*args, **kwargs, &:digest)
84
+ end
85
+
86
+ def hexdigest(*args, **kwargs)
87
+ _generic_digest(*args, **kwargs, &:hexdigest)
88
+ end
89
+
90
+ def base64digest(*args, **kwargs)
91
+ _generic_digest(*args, **kwargs, &:base64digest)
92
+ end
93
+
94
+ private
95
+
96
+ def _generic_digest(data, output_length: nil, key: nil, &hash_finalizer)
97
+ instance = new(**{ output_length: output_length, key: key }.compact)
98
+ instance.update(data)
99
+ hash_finalizer.call(instance)
100
+ end
101
+ end
102
+ end
103
+ end