@leocuvee/wrkzcoin-multi-hashing 0.0.20

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 (314) hide show
  1. package/.travis.yml +5 -0
  2. package/LICENSE +674 -0
  3. package/README.md +87 -0
  4. package/appveyor.yml +12 -0
  5. package/argon2/.gitattributes +10 -0
  6. package/argon2/.travis.yml +25 -0
  7. package/argon2/Argon2.sln +160 -0
  8. package/argon2/CHANGELOG.md +32 -0
  9. package/argon2/CMakeLists.txt +87 -0
  10. package/argon2/LICENSE +314 -0
  11. package/argon2/Makefile +196 -0
  12. package/argon2/README.md +297 -0
  13. package/argon2/appveyor.yml +40 -0
  14. package/argon2/argon2-specs.pdf +0 -0
  15. package/argon2/export.sh +7 -0
  16. package/argon2/include/argon2.h +427 -0
  17. package/argon2/latex/CMakeLists.txt +34 -0
  18. package/argon2/latex/IEEEtran.cls +6347 -0
  19. package/argon2/latex/Makefile +18 -0
  20. package/argon2/latex/argon2-specs.tex +920 -0
  21. package/argon2/latex/pics/argon2-par.pdf +0 -0
  22. package/argon2/latex/pics/compression.pdf +0 -0
  23. package/argon2/latex/pics/generic.pdf +0 -0
  24. package/argon2/latex/pics/power-distribution.jpg +0 -0
  25. package/argon2/latex/tradeoff.bib +822 -0
  26. package/argon2/libargon2.pc +16 -0
  27. package/argon2/man/CMakeLists.txt +8 -0
  28. package/argon2/man/argon2.1 +57 -0
  29. package/argon2/meson.build +16 -0
  30. package/argon2/meson_options.txt +1 -0
  31. package/argon2/src/CMakeLists.txt +147 -0
  32. package/argon2/src/argon2.c +452 -0
  33. package/argon2/src/argon2.pc.in +11 -0
  34. package/argon2/src/blake2/blake2-impl.h +156 -0
  35. package/argon2/src/blake2/blake2.h +89 -0
  36. package/argon2/src/blake2/blake2b.c +390 -0
  37. package/argon2/src/blake2/blamka-round-opt.h +471 -0
  38. package/argon2/src/blake2/blamka-round-ref.h +56 -0
  39. package/argon2/src/core.c +634 -0
  40. package/argon2/src/core.h +228 -0
  41. package/argon2/src/encoding.c +467 -0
  42. package/argon2/src/encoding.h +57 -0
  43. package/argon2/src/genkat.h +51 -0
  44. package/argon2/src/meson.build +68 -0
  45. package/argon2/src/opt.c +283 -0
  46. package/argon2/src/optimization/CMakeLists.txt +10 -0
  47. package/argon2/src/ref.c +194 -0
  48. package/argon2/src/thread.c +57 -0
  49. package/argon2/src/thread.h +67 -0
  50. package/argon2/tests/CMakeLists.txt +43 -0
  51. package/argon2/tests/bench.c +111 -0
  52. package/argon2/tests/genkat.c +207 -0
  53. package/argon2/tests/kats/argon2d +12304 -0
  54. package/argon2/tests/kats/argon2d.shasum +1 -0
  55. package/argon2/tests/kats/argon2d_v16 +12304 -0
  56. package/argon2/tests/kats/argon2d_v16.shasum +1 -0
  57. package/argon2/tests/kats/argon2i +12304 -0
  58. package/argon2/tests/kats/argon2i.shasum +1 -0
  59. package/argon2/tests/kats/argon2i_v16 +12304 -0
  60. package/argon2/tests/kats/argon2i_v16.shasum +1 -0
  61. package/argon2/tests/kats/argon2id +12304 -0
  62. package/argon2/tests/kats/argon2id.shasum +1 -0
  63. package/argon2/tests/kats/argon2id_v16 +12304 -0
  64. package/argon2/tests/kats/argon2id_v16.shasum +1 -0
  65. package/argon2/tests/kats/check-sums.ps1 +48 -0
  66. package/argon2/tests/kats/check-sums.sh +16 -0
  67. package/argon2/tests/kats/test.ps1 +132 -0
  68. package/argon2/tests/kats/test.sh +117 -0
  69. package/argon2/tests/meson.build +34 -0
  70. package/argon2/tests/test.c +289 -0
  71. package/argon2/tool/CMakeLists.txt +7 -0
  72. package/argon2/tool/main.c +339 -0
  73. package/argon2/tool/meson.build +8 -0
  74. package/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +226 -0
  75. package/argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters +69 -0
  76. package/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +226 -0
  77. package/argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters +69 -0
  78. package/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj +225 -0
  79. package/argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters +66 -0
  80. package/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +239 -0
  81. package/argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters +72 -0
  82. package/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +227 -0
  83. package/argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters +69 -0
  84. package/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +226 -0
  85. package/argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters +69 -0
  86. package/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +226 -0
  87. package/argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters +69 -0
  88. package/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj +225 -0
  89. package/argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters +66 -0
  90. package/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +227 -0
  91. package/argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters +72 -0
  92. package/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +226 -0
  93. package/argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters +69 -0
  94. package/bcrypt.c +566 -0
  95. package/bcrypt.h +14 -0
  96. package/binding.gyp +93 -0
  97. package/blake.c +17 -0
  98. package/blake.h +16 -0
  99. package/boolberry.cc +11 -0
  100. package/boolberry.h +6 -0
  101. package/build/Makefile +354 -0
  102. package/build/Release/.deps/Release/multihashing.node.d +1 -0
  103. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/argon2.o.d +8 -0
  104. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/blake2/blake2b.o.d +8 -0
  105. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/core.o.d +10 -0
  106. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/encoding.o.d +8 -0
  107. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/ref.o.d +14 -0
  108. package/build/Release/.deps/Release/obj.target/multihashing/argon2/src/thread.o.d +5 -0
  109. package/build/Release/.deps/Release/obj.target/multihashing/bcrypt.o.d +4 -0
  110. package/build/Release/.deps/Release/obj.target/multihashing/blake.o.d +7 -0
  111. package/build/Release/.deps/Release/obj.target/multihashing/boolberry.o.d +12 -0
  112. package/build/Release/.deps/Release/obj.target/multihashing/c11.o.d +20 -0
  113. package/build/Release/.deps/Release/obj.target/multihashing/crypto/aesb.o.d +3 -0
  114. package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_blake256.o.d +5 -0
  115. package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_groestl.o.d +10 -0
  116. package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_jh.o.d +9 -0
  117. package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_keccak.o.d +7 -0
  118. package/build/Release/.deps/Release/obj.target/multihashing/crypto/c_skein.o.d +10 -0
  119. package/build/Release/.deps/Release/obj.target/multihashing/crypto/hash.o.d +7 -0
  120. package/build/Release/.deps/Release/obj.target/multihashing/crypto/oaes_lib.o.d +6 -0
  121. package/build/Release/.deps/Release/obj.target/multihashing/crypto/wild_keccak.o.d +8 -0
  122. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight.o.d +18 -0
  123. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_dark.o.d +18 -0
  124. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_dark_lite.o.d +18 -0
  125. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_fast.o.d +18 -0
  126. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_lite.o.d +18 -0
  127. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_soft_shell.o.d +18 -0
  128. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_turtle.o.d +18 -0
  129. package/build/Release/.deps/Release/obj.target/multihashing/cryptonight_turtle_lite.o.d +18 -0
  130. package/build/Release/.deps/Release/obj.target/multihashing/fresh.o.d +10 -0
  131. package/build/Release/.deps/Release/obj.target/multihashing/fugue.o.d +7 -0
  132. package/build/Release/.deps/Release/obj.target/multihashing/groestl.o.d +8 -0
  133. package/build/Release/.deps/Release/obj.target/multihashing/hefty1.o.d +12 -0
  134. package/build/Release/.deps/Release/obj.target/multihashing/keccak.o.d +8 -0
  135. package/build/Release/.deps/Release/obj.target/multihashing/multihashing.o.d +155 -0
  136. package/build/Release/.deps/Release/obj.target/multihashing/nist5.o.d +12 -0
  137. package/build/Release/.deps/Release/obj.target/multihashing/quark.o.d +14 -0
  138. package/build/Release/.deps/Release/obj.target/multihashing/qubit.o.d +12 -0
  139. package/build/Release/.deps/Release/obj.target/multihashing/scryptjane.o.d +30 -0
  140. package/build/Release/.deps/Release/obj.target/multihashing/scryptn.o.d +6 -0
  141. package/build/Release/.deps/Release/obj.target/multihashing/sha1.o.d +24 -0
  142. package/build/Release/.deps/Release/obj.target/multihashing/sha3/aes_helper.o.d +5 -0
  143. package/build/Release/.deps/Release/obj.target/multihashing/sha3/hamsi.o.d +7 -0
  144. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_blake.o.d +6 -0
  145. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_bmw.o.d +6 -0
  146. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_cubehash.o.d +6 -0
  147. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_echo.o.d +7 -0
  148. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_fugue.o.d +6 -0
  149. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_groestl.o.d +6 -0
  150. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_hefty1.o.d +5 -0
  151. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_jh.o.d +6 -0
  152. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_keccak.o.d +6 -0
  153. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_luffa.o.d +6 -0
  154. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_shabal.o.d +6 -0
  155. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_shavite.o.d +7 -0
  156. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_simd.o.d +6 -0
  157. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_skein.o.d +6 -0
  158. package/build/Release/.deps/Release/obj.target/multihashing/sha3/sph_whirlpool.o.d +8 -0
  159. package/build/Release/.deps/Release/obj.target/multihashing/shavite3.o.d +7 -0
  160. package/build/Release/.deps/Release/obj.target/multihashing/skein.o.d +8 -0
  161. package/build/Release/.deps/Release/obj.target/multihashing/x11.o.d +20 -0
  162. package/build/Release/.deps/Release/obj.target/multihashing/x13.o.d +23 -0
  163. package/build/Release/.deps/Release/obj.target/multihashing/x15.o.d +26 -0
  164. package/build/Release/.deps/Release/obj.target/multihashing.node.d +1 -0
  165. package/build/Release/multihashing.node +0 -0
  166. package/build/binding.Makefile +6 -0
  167. package/build/multihashing.target.mk +255 -0
  168. package/c11.c +85 -0
  169. package/c11.h +17 -0
  170. package/crypto/aesb.c +177 -0
  171. package/crypto/c_blake256.c +326 -0
  172. package/crypto/c_blake256.h +43 -0
  173. package/crypto/c_groestl.c +360 -0
  174. package/crypto/c_groestl.h +56 -0
  175. package/crypto/c_jh.c +367 -0
  176. package/crypto/c_jh.h +20 -0
  177. package/crypto/c_keccak.c +112 -0
  178. package/crypto/c_keccak.h +26 -0
  179. package/crypto/c_skein.c +2036 -0
  180. package/crypto/c_skein.h +45 -0
  181. package/crypto/crypto.h +186 -0
  182. package/crypto/cryptonote_core/account.cpp +50 -0
  183. package/crypto/cryptonote_core/account.h +61 -0
  184. package/crypto/cryptonote_core/cryptonote_basic_impl.cpp +186 -0
  185. package/crypto/cryptonote_core/cryptonote_basic_impl.h +65 -0
  186. package/crypto/cryptonote_core/cryptonote_format_utils.cpp +766 -0
  187. package/crypto/cryptonote_core/cryptonote_format_utils.h +30 -0
  188. package/crypto/cryptonote_protocol/cryptonote_protocol_defs.h +152 -0
  189. package/crypto/groestl_tables.h +38 -0
  190. package/crypto/hash-ops.h +57 -0
  191. package/crypto/hash.c +24 -0
  192. package/crypto/hash.h +22 -0
  193. package/crypto/int-util.h +230 -0
  194. package/crypto/oaes_config.h +50 -0
  195. package/crypto/oaes_lib.c +1468 -0
  196. package/crypto/oaes_lib.h +215 -0
  197. package/crypto/skein_port.h +190 -0
  198. package/crypto/variant2_int_sqrt.h +168 -0
  199. package/crypto/wild_keccak.cpp +119 -0
  200. package/crypto/wild_keccak.h +168 -0
  201. package/cryptonight.c +300 -0
  202. package/cryptonight.h +17 -0
  203. package/cryptonight_dark.c +300 -0
  204. package/cryptonight_dark.h +17 -0
  205. package/cryptonight_dark_lite.c +300 -0
  206. package/cryptonight_dark_lite.h +17 -0
  207. package/cryptonight_fast.c +300 -0
  208. package/cryptonight_fast.h +17 -0
  209. package/cryptonight_lite.c +300 -0
  210. package/cryptonight_lite.h +17 -0
  211. package/cryptonight_soft_shell.c +298 -0
  212. package/cryptonight_soft_shell.h +17 -0
  213. package/cryptonight_turtle.c +300 -0
  214. package/cryptonight_turtle.h +17 -0
  215. package/cryptonight_turtle_lite.c +300 -0
  216. package/cryptonight_turtle_lite.h +17 -0
  217. package/fresh.c +42 -0
  218. package/fresh.h +16 -0
  219. package/fugue.c +12 -0
  220. package/fugue.h +16 -0
  221. package/groestl.c +40 -0
  222. package/groestl.h +17 -0
  223. package/hefty1.c +63 -0
  224. package/hefty1.h +16 -0
  225. package/index.js +1 -0
  226. package/keccak.c +14 -0
  227. package/keccak.h +16 -0
  228. package/leocuvee-wrkzcoin-multi-hashing-0.0.20.tgz +0 -0
  229. package/multihashing.cc +699 -0
  230. package/nist5.c +46 -0
  231. package/nist5.h +16 -0
  232. package/package.json +56 -0
  233. package/quark.c +210 -0
  234. package/quark.h +16 -0
  235. package/qubit.c +45 -0
  236. package/qubit.h +16 -0
  237. package/scryptjane/scrypt-jane-chacha.h +132 -0
  238. package/scryptjane/scrypt-jane-hash.h +48 -0
  239. package/scryptjane/scrypt-jane-hash_keccak.h +168 -0
  240. package/scryptjane/scrypt-jane-hash_sha256.h +135 -0
  241. package/scryptjane/scrypt-jane-mix_chacha-avx.h +340 -0
  242. package/scryptjane/scrypt-jane-mix_chacha-sse2.h +371 -0
  243. package/scryptjane/scrypt-jane-mix_chacha-ssse3.h +348 -0
  244. package/scryptjane/scrypt-jane-mix_chacha.h +69 -0
  245. package/scryptjane/scrypt-jane-mix_salsa-avx.h +381 -0
  246. package/scryptjane/scrypt-jane-mix_salsa-sse2.h +443 -0
  247. package/scryptjane/scrypt-jane-mix_salsa.h +70 -0
  248. package/scryptjane/scrypt-jane-pbkdf2.h +112 -0
  249. package/scryptjane/scrypt-jane-portable-x86.h +364 -0
  250. package/scryptjane/scrypt-jane-portable.h +281 -0
  251. package/scryptjane/scrypt-jane-romix-basic.h +67 -0
  252. package/scryptjane/scrypt-jane-romix-template.h +118 -0
  253. package/scryptjane/scrypt-jane-romix.h +27 -0
  254. package/scryptjane/scrypt-jane-salsa.h +106 -0
  255. package/scryptjane/scrypt-jane-test-vectors.h +261 -0
  256. package/scryptjane.c +223 -0
  257. package/scryptjane.h +36 -0
  258. package/scryptn.c +258 -0
  259. package/scryptn.h +16 -0
  260. package/sha1.c +65 -0
  261. package/sha1.h +16 -0
  262. package/sha256.h +440 -0
  263. package/sha3/aes_helper.c +392 -0
  264. package/sha3/hamsi.c +867 -0
  265. package/sha3/hamsi_helper.c +39648 -0
  266. package/sha3/md_helper.c +347 -0
  267. package/sha3/sph_blake.c +1114 -0
  268. package/sha3/sph_blake.h +327 -0
  269. package/sha3/sph_bmw.c +965 -0
  270. package/sha3/sph_bmw.h +328 -0
  271. package/sha3/sph_cubehash.c +723 -0
  272. package/sha3/sph_cubehash.h +292 -0
  273. package/sha3/sph_echo.c +1031 -0
  274. package/sha3/sph_echo.h +320 -0
  275. package/sha3/sph_fugue.c +1208 -0
  276. package/sha3/sph_fugue.h +81 -0
  277. package/sha3/sph_groestl.c +3119 -0
  278. package/sha3/sph_groestl.h +329 -0
  279. package/sha3/sph_hamsi.h +321 -0
  280. package/sha3/sph_hefty1.c +378 -0
  281. package/sha3/sph_hefty1.h +66 -0
  282. package/sha3/sph_jh.c +1116 -0
  283. package/sha3/sph_jh.h +298 -0
  284. package/sha3/sph_keccak.c +1824 -0
  285. package/sha3/sph_keccak.h +293 -0
  286. package/sha3/sph_luffa.c +1426 -0
  287. package/sha3/sph_luffa.h +296 -0
  288. package/sha3/sph_shabal.c +806 -0
  289. package/sha3/sph_shabal.h +344 -0
  290. package/sha3/sph_shavite.c +1764 -0
  291. package/sha3/sph_shavite.h +314 -0
  292. package/sha3/sph_simd.c +1799 -0
  293. package/sha3/sph_simd.h +309 -0
  294. package/sha3/sph_skein.c +1254 -0
  295. package/sha3/sph_skein.h +298 -0
  296. package/sha3/sph_types.h +1976 -0
  297. package/sha3/sph_whirlpool.c +3480 -0
  298. package/sha3/sph_whirlpool.h +209 -0
  299. package/shavite3.c +24 -0
  300. package/shavite3.h +16 -0
  301. package/skein.c +26 -0
  302. package/skein.h +16 -0
  303. package/stdint.h +259 -0
  304. package/tests/argon2-tests.js +16 -0
  305. package/tests/benchmark.js +36 -0
  306. package/tests/cryptonight-tests.js +189 -0
  307. package/tests/cryptonight_monero.js +53 -0
  308. package/tests/test.js +16 -0
  309. package/x11.c +85 -0
  310. package/x11.h +16 -0
  311. package/x13.c +97 -0
  312. package/x13.h +5 -0
  313. package/x15.c +106 -0
  314. package/x15.h +16 -0
@@ -0,0 +1,298 @@
1
+ // Copyright (c) 2012-2013 The Cryptonote developers
2
+ // Distributed under the MIT/X11 software license, see the accompanying
3
+ // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
+ // Portions Copyright (c) 2018 The Monero developers
5
+ // Portions Copyright (c) 2018 The TurtleCoin Developers
6
+
7
+ #include <stdio.h>
8
+ #include <stdlib.h>
9
+ #include "crypto/oaes_lib.h"
10
+ #include "crypto/c_keccak.h"
11
+ #include "crypto/c_groestl.h"
12
+ #include "crypto/c_blake256.h"
13
+ #include "crypto/c_jh.h"
14
+ #include "crypto/c_skein.h"
15
+ #include "crypto/int-util.h"
16
+ #include "crypto/hash-ops.h"
17
+ #include "crypto/variant2_int_sqrt.h"
18
+
19
+ #if defined(_MSC_VER)
20
+ #include <malloc.h>
21
+ #endif
22
+
23
+ // Standard Crypto Definitions
24
+ #define AES_BLOCK_SIZE 16
25
+ #define AES_KEY_SIZE 32
26
+ #define INIT_SIZE_BLK 8
27
+ #define INIT_SIZE_BYTE (INIT_SIZE_BLK * AES_BLOCK_SIZE)
28
+
29
+ #define VARIANT1_1(p) \
30
+ do if (variant == 1) \
31
+ { \
32
+ const uint8_t tmp = ((const uint8_t*)(p))[11]; \
33
+ static const uint32_t table = 0x75310; \
34
+ const uint8_t index = (((tmp >> 3) & 6) | (tmp & 1)) << 1; \
35
+ ((uint8_t*)(p))[11] = tmp ^ ((table >> index) & 0x30); \
36
+ } while(0)
37
+
38
+ #define VARIANT1_2(p) \
39
+ do if (variant == 1) \
40
+ { \
41
+ ((uint64_t*)p)[1] ^= tweak1_2; \
42
+ } while(0)
43
+
44
+ #define VARIANT1_INIT() \
45
+ if (variant == 1 && len < 43) \
46
+ { \
47
+ fprintf(stderr, "Cryptonight variant 1 needs at least 43 bytes of data"); \
48
+ _exit(1); \
49
+ } \
50
+ const uint64_t tweak1_2 = (variant == 1) ? *(const uint64_t*)(((const uint8_t*)input)+35) ^ state.hs.w[24] : 0
51
+
52
+ #define U64(p) ((uint64_t*)(p))
53
+
54
+ #define VARIANT2_INIT(b, state) \
55
+ uint64_t division_result; \
56
+ uint64_t sqrt_result; \
57
+ do if (variant >= 2) \
58
+ { \
59
+ U64(b)[2] = state.hs.w[8] ^ state.hs.w[10]; \
60
+ U64(b)[3] = state.hs.w[9] ^ state.hs.w[11]; \
61
+ division_result = state.hs.w[12]; \
62
+ sqrt_result = state.hs.w[13]; \
63
+ } while (0)
64
+
65
+ #define VARIANT2_SHUFFLE_ADD(base_ptr, offset, a, b) \
66
+ do if (variant >= 2) \
67
+ { \
68
+ uint64_t* chunk1 = U64((base_ptr) + ((offset) ^ 0x10)); \
69
+ uint64_t* chunk2 = U64((base_ptr) + ((offset) ^ 0x20)); \
70
+ uint64_t* chunk3 = U64((base_ptr) + ((offset) ^ 0x30)); \
71
+ \
72
+ const uint64_t chunk1_old[2] = { chunk1[0], chunk1[1] }; \
73
+ \
74
+ chunk1[0] = chunk3[0] + U64(b + 16)[0]; \
75
+ chunk1[1] = chunk3[1] + U64(b + 16)[1]; \
76
+ \
77
+ chunk3[0] = chunk2[0] + U64(a)[0]; \
78
+ chunk3[1] = chunk2[1] + U64(a)[1]; \
79
+ \
80
+ chunk2[0] = chunk1_old[0] + U64(b)[0]; \
81
+ chunk2[1] = chunk1_old[1] + U64(b)[1]; \
82
+ } while (0)
83
+
84
+ #define VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr) \
85
+ ((uint64_t*)(b))[0] ^= division_result ^ (sqrt_result << 32); \
86
+ { \
87
+ const uint64_t dividend = ((uint64_t*)(ptr))[1]; \
88
+ const uint32_t divisor = (((uint32_t*)(ptr))[0] + (uint32_t)(sqrt_result << 1)) | 0x80000001UL; \
89
+ division_result = ((uint32_t)(dividend / divisor)) + \
90
+ (((uint64_t)(dividend % divisor)) << 32); \
91
+ } \
92
+ const uint64_t sqrt_input = ((uint64_t*)(ptr))[0] + division_result
93
+
94
+ #define VARIANT2_INTEGER_MATH(b, ptr) \
95
+ do if (variant >= 2) \
96
+ { \
97
+ VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr); \
98
+ VARIANT2_INTEGER_MATH_SQRT_STEP_FP64(); \
99
+ VARIANT2_INTEGER_MATH_SQRT_FIXUP(sqrt_result); \
100
+ } while (0)
101
+
102
+ #define VARIANT2_2() \
103
+ do if (variant >= 2) { \
104
+ ((uint64_t*)(long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[0] ^= hi; \
105
+ ((uint64_t*)(long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[1] ^= lo; \
106
+ hi ^= ((uint64_t*)(long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[0]; \
107
+ lo ^= ((uint64_t*)(long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[1]; \
108
+ } while (0)
109
+
110
+ #pragma pack(push, 1)
111
+ union cn_slow_hash_state {
112
+ union hash_state hs;
113
+ struct {
114
+ uint8_t k[64];
115
+ uint8_t init[INIT_SIZE_BYTE];
116
+ };
117
+ };
118
+ #pragma pack(pop)
119
+
120
+ static void do_soft_shell_blake_hash(const void* input, size_t len, char* output) {
121
+ blake256_hash((uint8_t*)output, input, len);
122
+ }
123
+
124
+ void do_soft_shell_groestl_hash(const void* input, size_t len, char* output) {
125
+ groestl(input, len * 8, (uint8_t*)output);
126
+ }
127
+
128
+ static void do_soft_shell_jh_hash(const void* input, size_t len, char* output) {
129
+ int r = jh_hash(HASH_SIZE * 8, input, 8 * len, (uint8_t*)output);
130
+ assert(SUCCESS == r);
131
+ }
132
+
133
+ static void do_soft_shell_skein_hash(const void* input, size_t len, char* output) {
134
+ int r = c_skein_hash(8 * HASH_SIZE, input, 8 * len, (uint8_t*)output);
135
+ assert(SKEIN_SUCCESS == r);
136
+ }
137
+
138
+ static void (* const extra_hashes[4])(const void *, size_t, char *) = {
139
+ do_soft_shell_blake_hash, do_soft_shell_groestl_hash, do_soft_shell_jh_hash, do_soft_shell_skein_hash
140
+ };
141
+
142
+ extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey);
143
+ extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *expandedKey);
144
+
145
+ static inline size_t e2i(const uint8_t* a, size_t count) {
146
+ return (*((uint64_t*) a) / AES_BLOCK_SIZE) & (count - 1);
147
+ }
148
+
149
+ static void mul(const uint8_t* a, const uint8_t* b, uint8_t* res) {
150
+ ((uint64_t*) res)[1] = mul128(((uint64_t*) a)[0], ((uint64_t*) b)[0], (uint64_t*) res);
151
+ }
152
+
153
+ static void sum_half_blocks(uint8_t* a, const uint8_t* b) {
154
+ uint64_t a0, a1, b0, b1;
155
+
156
+ a0 = SWAP64LE(((uint64_t*) a)[0]);
157
+ a1 = SWAP64LE(((uint64_t*) a)[1]);
158
+ b0 = SWAP64LE(((uint64_t*) b)[0]);
159
+ b1 = SWAP64LE(((uint64_t*) b)[1]);
160
+ a0 += b0;
161
+ a1 += b1;
162
+ ((uint64_t*) a)[0] = SWAP64LE(a0);
163
+ ((uint64_t*) a)[1] = SWAP64LE(a1);
164
+ }
165
+
166
+ static inline void copy_block(uint8_t* dst, const uint8_t* src) {
167
+ ((uint64_t*) dst)[0] = ((uint64_t*) src)[0];
168
+ ((uint64_t*) dst)[1] = ((uint64_t*) src)[1];
169
+ }
170
+
171
+ static void swap_blocks(uint8_t* a, uint8_t* b) {
172
+ size_t i;
173
+ uint8_t t;
174
+ for (i = 0; i < AES_BLOCK_SIZE; i++) {
175
+ t = a[i];
176
+ a[i] = b[i];
177
+ b[i] = t;
178
+ }
179
+ }
180
+
181
+ static inline void xor_blocks(uint8_t* a, const uint8_t* b) {
182
+ ((uint64_t*) a)[0] ^= ((uint64_t*) b)[0];
183
+ ((uint64_t*) a)[1] ^= ((uint64_t*) b)[1];
184
+ }
185
+
186
+ static inline void xor_blocks_dst(const uint8_t* a, const uint8_t* b, uint8_t* dst) {
187
+ ((uint64_t*) dst)[0] = ((uint64_t*) a)[0] ^ ((uint64_t*) b)[0];
188
+ ((uint64_t*) dst)[1] = ((uint64_t*) a)[1] ^ ((uint64_t*) b)[1];
189
+ }
190
+
191
+ void cryptonight_soft_shell_hash(const char* input, char* output, uint32_t len, int variant, uint32_t scratchpad, uint32_t iterations) {
192
+ union cn_slow_hash_state state;
193
+ uint8_t text[INIT_SIZE_BYTE];
194
+ uint8_t a[AES_BLOCK_SIZE];
195
+ uint8_t b[AES_BLOCK_SIZE];
196
+ uint8_t c[AES_BLOCK_SIZE];
197
+ uint8_t aes_key[AES_KEY_SIZE];
198
+ oaes_ctx* aes_ctx;
199
+
200
+ #if defined(_MSC_VER)
201
+ uint8_t *long_state = (uint8_t *)_malloca(scratchpad);
202
+ #else
203
+ uint8_t *long_state = (uint8_t *)malloc(scratchpad);
204
+ #endif
205
+
206
+ size_t CN_INIT = (scratchpad / INIT_SIZE_BYTE);
207
+ size_t ITER_DIV = (iterations / 2);
208
+ size_t CN_AES_INIT = (scratchpad / AES_BLOCK_SIZE) / 2;
209
+
210
+ hash_process(&state.hs, (const uint8_t*) input, len);
211
+ memcpy(text, state.init, INIT_SIZE_BYTE);
212
+ memcpy(aes_key, state.hs.b, AES_KEY_SIZE);
213
+ aes_ctx = (oaes_ctx*) oaes_alloc();
214
+ size_t i, j;
215
+
216
+ VARIANT1_INIT();
217
+ VARIANT2_INIT(b, state);
218
+
219
+ oaes_key_import_data(aes_ctx, aes_key, AES_KEY_SIZE);
220
+ for (i = 0; i < CN_INIT; i++) {
221
+ for (j = 0; j < INIT_SIZE_BLK; j++) {
222
+ aesb_pseudo_round(&text[AES_BLOCK_SIZE * j],
223
+ &text[AES_BLOCK_SIZE * j],
224
+ aes_ctx->key->exp_data);
225
+ }
226
+ memcpy(&long_state[i * INIT_SIZE_BYTE], text, INIT_SIZE_BYTE);
227
+ }
228
+
229
+ for (i = 0; i < 16; i++) {
230
+ a[i] = state.k[i] ^ state.k[32 + i];
231
+ b[i] = state.k[16 + i] ^ state.k[48 + i];
232
+ }
233
+
234
+ for (i = 0; i < ITER_DIV; i++) {
235
+ /* Dependency chain: address -> read value ------+
236
+ * written value <-+ hard function (AES or MUL) <+
237
+ * next address <-+
238
+ */
239
+ /* Iteration 1 */
240
+ j = e2i(a, CN_AES_INIT);
241
+ aesb_single_round(&long_state[j * AES_BLOCK_SIZE], c, a);
242
+ VARIANT2_SHUFFLE_ADD(long_state, j * AES_BLOCK_SIZE, a, b);
243
+ xor_blocks_dst(c, b, &long_state[j * AES_BLOCK_SIZE]);
244
+ VARIANT1_1((uint8_t*)&long_state[j * AES_BLOCK_SIZE]);
245
+ /* Iteration 2 */
246
+ j = e2i(c, CN_AES_INIT);
247
+
248
+ uint64_t* dst = (uint64_t*)&long_state[j * AES_BLOCK_SIZE];
249
+
250
+ uint64_t t[2];
251
+ t[0] = dst[0];
252
+ t[1] = dst[1];
253
+
254
+ VARIANT2_INTEGER_MATH(t, c);
255
+
256
+ uint64_t hi;
257
+ uint64_t lo = mul128(((uint64_t*)c)[0], t[0], &hi);
258
+
259
+ VARIANT2_2();
260
+ VARIANT2_SHUFFLE_ADD(long_state, j * AES_BLOCK_SIZE, a, b);
261
+
262
+ ((uint64_t*)a)[0] += hi;
263
+ ((uint64_t*)a)[1] += lo;
264
+
265
+ dst[0] = ((uint64_t*)a)[0];
266
+ dst[1] = ((uint64_t*)a)[1];
267
+
268
+ ((uint64_t*)a)[0] ^= t[0];
269
+ ((uint64_t*)a)[1] ^= t[1];
270
+
271
+ VARIANT1_2((uint8_t*)&long_state[j * AES_BLOCK_SIZE]);
272
+ copy_block(b + AES_BLOCK_SIZE, b);
273
+ copy_block(b, c);
274
+ }
275
+
276
+ memcpy(text, state.init, INIT_SIZE_BYTE);
277
+ oaes_key_import_data(aes_ctx, &state.hs.b[32], AES_KEY_SIZE);
278
+ for (i = 0; i < CN_INIT; i++) {
279
+ for (j = 0; j < INIT_SIZE_BLK; j++) {
280
+ xor_blocks(&text[j * AES_BLOCK_SIZE],
281
+ &long_state[i * INIT_SIZE_BYTE + j * AES_BLOCK_SIZE]);
282
+ aesb_pseudo_round(&text[j * AES_BLOCK_SIZE],
283
+ &text[j * AES_BLOCK_SIZE],
284
+ aes_ctx->key->exp_data);
285
+ }
286
+ }
287
+ memcpy(state.init, text, INIT_SIZE_BYTE);
288
+ hash_permutation(&state.hs);
289
+ /*memcpy(hash, &state, 32);*/
290
+ extra_hashes[state.hs.b[0] & 3](&state, 200, output);
291
+ oaes_free((OAES_CTX **) &aes_ctx);
292
+ }
293
+
294
+ void cryptonight_soft_shell_fast_hash(const char* input, char* output, uint32_t len) {
295
+ union hash_state state;
296
+ hash_process(&state, (const uint8_t*) input, len);
297
+ memcpy(output, &state, HASH_SIZE);
298
+ }
@@ -0,0 +1,17 @@
1
+ #ifndef CRYPTONIGHT_SOFT_SHELL_H
2
+ #define CRYPTONIGHT_SOFT_SHELL_H
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <stdint.h>
9
+
10
+ void cryptonight_soft_shell_hash(const char* input, char* output, uint32_t len, int variant, uint32_t scratchpad, uint32_t iterations);
11
+ void cryptonight_soft_shell_fast_hash(const char* input, char* output, uint32_t len);
12
+
13
+ #ifdef __cplusplus
14
+ }
15
+ #endif
16
+
17
+ #endif
@@ -0,0 +1,300 @@
1
+ // Copyright (c) 2012-2013 The Cryptonote developers
2
+ // Distributed under the MIT/X11 software license, see the accompanying
3
+ // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
+ // Portions Copyright (c) 2018 The Monero developers
5
+ // Portions Copyright (c) 2018 The TurtleCoin Developers
6
+
7
+ #include <stdio.h>
8
+ #include <stdlib.h>
9
+ #include "crypto/oaes_lib.h"
10
+ #include "crypto/c_keccak.h"
11
+ #include "crypto/c_groestl.h"
12
+ #include "crypto/c_blake256.h"
13
+ #include "crypto/c_jh.h"
14
+ #include "crypto/c_skein.h"
15
+ #include "crypto/int-util.h"
16
+ #include "crypto/hash-ops.h"
17
+ #include "crypto/variant2_int_sqrt.h"
18
+
19
+ #if defined(_MSC_VER)
20
+ #include <malloc.h>
21
+ #endif
22
+
23
+ #define MEMORY 262144 /* 256KB - 2^18 */
24
+ #define ITER 131072 /* 2^17 */
25
+ #define ITER_DIV 65536 /* 2^16 */
26
+ #define AES_BLOCK_SIZE 16
27
+ #define AES_KEY_SIZE 32 /*16*/
28
+ #define INIT_SIZE_BLK 8
29
+ #define INIT_SIZE_BYTE (INIT_SIZE_BLK * AES_BLOCK_SIZE)
30
+ #define CN_INIT (MEMORY / INIT_SIZE_BYTE)
31
+ #define CN_AES_INIT (MEMORY / AES_BLOCK_SIZE)
32
+
33
+ #define VARIANT1_1(p) \
34
+ do if (variant == 1) \
35
+ { \
36
+ const uint8_t tmp = ((const uint8_t*)(p))[11]; \
37
+ static const uint32_t table = 0x75310; \
38
+ const uint8_t index = (((tmp >> 3) & 6) | (tmp & 1)) << 1; \
39
+ ((uint8_t*)(p))[11] = tmp ^ ((table >> index) & 0x30); \
40
+ } while(0)
41
+
42
+ #define VARIANT1_2(p) \
43
+ do if (variant == 1) \
44
+ { \
45
+ ((uint64_t*)p)[1] ^= tweak1_2; \
46
+ } while(0)
47
+
48
+ #define VARIANT1_INIT() \
49
+ if (variant == 1 && len < 43) \
50
+ { \
51
+ fprintf(stderr, "Cryptonight variant 1 needs at least 43 bytes of data"); \
52
+ _exit(1); \
53
+ } \
54
+ const uint64_t tweak1_2 = (variant == 1) ? *(const uint64_t*)(((const uint8_t*)input)+35) ^ ctx->state.hs.w[24] : 0
55
+
56
+ #define U64(p) ((uint64_t*)(p))
57
+
58
+ #define VARIANT2_INIT(b, state) \
59
+ uint64_t division_result; \
60
+ uint64_t sqrt_result; \
61
+ do if (variant >= 2) \
62
+ { \
63
+ U64(b)[2] = state.hs.w[8] ^ state.hs.w[10]; \
64
+ U64(b)[3] = state.hs.w[9] ^ state.hs.w[11]; \
65
+ division_result = state.hs.w[12]; \
66
+ sqrt_result = state.hs.w[13]; \
67
+ } while (0)
68
+
69
+ #define VARIANT2_SHUFFLE_ADD(base_ptr, offset, a, b) \
70
+ do if (variant >= 2) \
71
+ { \
72
+ uint64_t* chunk1 = U64((base_ptr) + ((offset) ^ 0x10)); \
73
+ uint64_t* chunk2 = U64((base_ptr) + ((offset) ^ 0x20)); \
74
+ uint64_t* chunk3 = U64((base_ptr) + ((offset) ^ 0x30)); \
75
+ \
76
+ const uint64_t chunk1_old[2] = { chunk1[0], chunk1[1] }; \
77
+ \
78
+ chunk1[0] = chunk3[0] + U64(b + 16)[0]; \
79
+ chunk1[1] = chunk3[1] + U64(b + 16)[1]; \
80
+ \
81
+ chunk3[0] = chunk2[0] + U64(a)[0]; \
82
+ chunk3[1] = chunk2[1] + U64(a)[1]; \
83
+ \
84
+ chunk2[0] = chunk1_old[0] + U64(b)[0]; \
85
+ chunk2[1] = chunk1_old[1] + U64(b)[1]; \
86
+ } while (0)
87
+
88
+ #define VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr) \
89
+ ((uint64_t*)(b))[0] ^= division_result ^ (sqrt_result << 32); \
90
+ { \
91
+ const uint64_t dividend = ((uint64_t*)(ptr))[1]; \
92
+ const uint32_t divisor = (((uint32_t*)(ptr))[0] + (uint32_t)(sqrt_result << 1)) | 0x80000001UL; \
93
+ division_result = ((uint32_t)(dividend / divisor)) + \
94
+ (((uint64_t)(dividend % divisor)) << 32); \
95
+ } \
96
+ const uint64_t sqrt_input = ((uint64_t*)(ptr))[0] + division_result
97
+
98
+ #define VARIANT2_INTEGER_MATH(b, ptr) \
99
+ do if (variant >= 2) \
100
+ { \
101
+ VARIANT2_INTEGER_MATH_DIVISION_STEP(b, ptr); \
102
+ VARIANT2_INTEGER_MATH_SQRT_STEP_FP64(); \
103
+ VARIANT2_INTEGER_MATH_SQRT_FIXUP(sqrt_result); \
104
+ } while (0)
105
+
106
+ #define VARIANT2_2() \
107
+ do if (variant >= 2) { \
108
+ ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[0] ^= hi; \
109
+ ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x10)))[1] ^= lo; \
110
+ hi ^= ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[0]; \
111
+ lo ^= ((uint64_t*)(ctx->long_state + ((j * AES_BLOCK_SIZE) ^ 0x20)))[1]; \
112
+ } while (0)
113
+
114
+ #pragma pack(push, 1)
115
+ union cn_slow_hash_state {
116
+ union hash_state hs;
117
+ struct {
118
+ uint8_t k[64];
119
+ uint8_t init[INIT_SIZE_BYTE];
120
+ };
121
+ };
122
+ #pragma pack(pop)
123
+
124
+ static void do_turtle_blake_hash(const void* input, size_t len, char* output) {
125
+ blake256_hash((uint8_t*)output, input, len);
126
+ }
127
+
128
+ void do_turtle_groestl_hash(const void* input, size_t len, char* output) {
129
+ groestl(input, len * 8, (uint8_t*)output);
130
+ }
131
+
132
+ static void do_turtle_jh_hash(const void* input, size_t len, char* output) {
133
+ int r = jh_hash(HASH_SIZE * 8, input, 8 * len, (uint8_t*)output);
134
+ assert(SUCCESS == r);
135
+ }
136
+
137
+ static void do_turtle_skein_hash(const void* input, size_t len, char* output) {
138
+ int r = c_skein_hash(8 * HASH_SIZE, input, 8 * len, (uint8_t*)output);
139
+ assert(SKEIN_SUCCESS == r);
140
+ }
141
+
142
+ static void (* const extra_hashes[4])(const void *, size_t, char *) = {
143
+ do_turtle_blake_hash, do_turtle_groestl_hash, do_turtle_jh_hash, do_turtle_skein_hash
144
+ };
145
+
146
+ extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey);
147
+ extern int aesb_pseudo_round(const uint8_t *in, uint8_t *out, const uint8_t *expandedKey);
148
+
149
+ static inline size_t e2i(const uint8_t* a) {
150
+ return (*((uint64_t*) a) / AES_BLOCK_SIZE) & (CN_AES_INIT - 1);
151
+ }
152
+
153
+ static void mul(const uint8_t* a, const uint8_t* b, uint8_t* res) {
154
+ ((uint64_t*) res)[1] = mul128(((uint64_t*) a)[0], ((uint64_t*) b)[0], (uint64_t*) res);
155
+ }
156
+
157
+ static void sum_half_blocks(uint8_t* a, const uint8_t* b) {
158
+ uint64_t a0, a1, b0, b1;
159
+
160
+ a0 = SWAP64LE(((uint64_t*) a)[0]);
161
+ a1 = SWAP64LE(((uint64_t*) a)[1]);
162
+ b0 = SWAP64LE(((uint64_t*) b)[0]);
163
+ b1 = SWAP64LE(((uint64_t*) b)[1]);
164
+ a0 += b0;
165
+ a1 += b1;
166
+ ((uint64_t*) a)[0] = SWAP64LE(a0);
167
+ ((uint64_t*) a)[1] = SWAP64LE(a1);
168
+ }
169
+
170
+ static inline void copy_block(uint8_t* dst, const uint8_t* src) {
171
+ ((uint64_t*) dst)[0] = ((uint64_t*) src)[0];
172
+ ((uint64_t*) dst)[1] = ((uint64_t*) src)[1];
173
+ }
174
+
175
+ static void swap_blocks(uint8_t* a, uint8_t* b) {
176
+ size_t i;
177
+ uint8_t t;
178
+ for (i = 0; i < AES_BLOCK_SIZE; i++) {
179
+ t = a[i];
180
+ a[i] = b[i];
181
+ b[i] = t;
182
+ }
183
+ }
184
+
185
+ static inline void xor_blocks(uint8_t* a, const uint8_t* b) {
186
+ ((uint64_t*) a)[0] ^= ((uint64_t*) b)[0];
187
+ ((uint64_t*) a)[1] ^= ((uint64_t*) b)[1];
188
+ }
189
+
190
+ static inline void xor_blocks_dst(const uint8_t* a, const uint8_t* b, uint8_t* dst) {
191
+ ((uint64_t*) dst)[0] = ((uint64_t*) a)[0] ^ ((uint64_t*) b)[0];
192
+ ((uint64_t*) dst)[1] = ((uint64_t*) a)[1] ^ ((uint64_t*) b)[1];
193
+ }
194
+
195
+ struct cryptonightturtle_ctx {
196
+ uint8_t long_state[MEMORY];
197
+ union cn_slow_hash_state state;
198
+ uint8_t text[INIT_SIZE_BYTE];
199
+ uint8_t a[AES_BLOCK_SIZE];
200
+ uint8_t b[AES_BLOCK_SIZE * 2];
201
+ uint8_t c[AES_BLOCK_SIZE];
202
+ uint8_t aes_key[AES_KEY_SIZE];
203
+ oaes_ctx* aes_ctx;
204
+ };
205
+
206
+ void cryptonightturtle_hash(const char* input, char* output, uint32_t len, int variant) {
207
+ #if defined(_MSC_VER)
208
+ struct cryptonightturtle_ctx *ctx = _malloca(sizeof(struct cryptonightturtle_ctx));
209
+ #else
210
+ struct cryptonightturtle_ctx *ctx = alloca(sizeof(struct cryptonightturtle_ctx));
211
+ #endif
212
+ hash_process(&ctx->state.hs, (const uint8_t*) input, len);
213
+ memcpy(ctx->text, ctx->state.init, INIT_SIZE_BYTE);
214
+ memcpy(ctx->aes_key, ctx->state.hs.b, AES_KEY_SIZE);
215
+ ctx->aes_ctx = (oaes_ctx*) oaes_alloc();
216
+ size_t i, j;
217
+
218
+ VARIANT1_INIT();
219
+ VARIANT2_INIT(ctx->b, ctx->state);
220
+
221
+ oaes_key_import_data(ctx->aes_ctx, ctx->aes_key, AES_KEY_SIZE);
222
+ for (i = 0; i < CN_INIT; i++) {
223
+ for (j = 0; j < INIT_SIZE_BLK; j++) {
224
+ aesb_pseudo_round(&ctx->text[AES_BLOCK_SIZE * j],
225
+ &ctx->text[AES_BLOCK_SIZE * j],
226
+ ctx->aes_ctx->key->exp_data);
227
+ }
228
+ memcpy(&ctx->long_state[i * INIT_SIZE_BYTE], ctx->text, INIT_SIZE_BYTE);
229
+ }
230
+
231
+ for (i = 0; i < 16; i++) {
232
+ ctx->a[i] = ctx->state.k[i] ^ ctx->state.k[32 + i];
233
+ ctx->b[i] = ctx->state.k[16 + i] ^ ctx->state.k[48 + i];
234
+ }
235
+
236
+ for (i = 0; i < ITER_DIV; i++) {
237
+ /* Dependency chain: address -> read value ------+
238
+ * written value <-+ hard function (AES or MUL) <+
239
+ * next address <-+
240
+ */
241
+ /* Iteration 1 */
242
+ j = e2i(ctx->a);
243
+ aesb_single_round(&ctx->long_state[j * AES_BLOCK_SIZE], ctx->c, ctx->a);
244
+ VARIANT2_SHUFFLE_ADD(ctx->long_state, j * AES_BLOCK_SIZE, ctx->a, ctx->b);
245
+ xor_blocks_dst(ctx->c, ctx->b, &ctx->long_state[j * AES_BLOCK_SIZE]);
246
+ VARIANT1_1((uint8_t*)&ctx->long_state[j * AES_BLOCK_SIZE]);
247
+ /* Iteration 2 */
248
+ j = e2i(ctx->c);
249
+
250
+ uint64_t* dst = (uint64_t*)&ctx->long_state[j * AES_BLOCK_SIZE];
251
+
252
+ uint64_t t[2];
253
+ t[0] = dst[0];
254
+ t[1] = dst[1];
255
+
256
+ VARIANT2_INTEGER_MATH(t, ctx->c);
257
+
258
+ uint64_t hi;
259
+ uint64_t lo = mul128(((uint64_t*)ctx->c)[0], t[0], &hi);
260
+
261
+ VARIANT2_2();
262
+ VARIANT2_SHUFFLE_ADD(ctx->long_state, j * AES_BLOCK_SIZE, ctx->a, ctx->b);
263
+
264
+ ((uint64_t*)ctx->a)[0] += hi;
265
+ ((uint64_t*)ctx->a)[1] += lo;
266
+
267
+ dst[0] = ((uint64_t*)ctx->a)[0];
268
+ dst[1] = ((uint64_t*)ctx->a)[1];
269
+
270
+ ((uint64_t*)ctx->a)[0] ^= t[0];
271
+ ((uint64_t*)ctx->a)[1] ^= t[1];
272
+
273
+ VARIANT1_2((uint8_t*)&ctx->long_state[j * AES_BLOCK_SIZE]);
274
+ copy_block(ctx->b + AES_BLOCK_SIZE, ctx->b);
275
+ copy_block(ctx->b, ctx->c);
276
+ }
277
+
278
+ memcpy(ctx->text, ctx->state.init, INIT_SIZE_BYTE);
279
+ oaes_key_import_data(ctx->aes_ctx, &ctx->state.hs.b[32], AES_KEY_SIZE);
280
+ for (i = 0; i < CN_INIT; i++) {
281
+ for (j = 0; j < INIT_SIZE_BLK; j++) {
282
+ xor_blocks(&ctx->text[j * AES_BLOCK_SIZE],
283
+ &ctx->long_state[i * INIT_SIZE_BYTE + j * AES_BLOCK_SIZE]);
284
+ aesb_pseudo_round(&ctx->text[j * AES_BLOCK_SIZE],
285
+ &ctx->text[j * AES_BLOCK_SIZE],
286
+ ctx->aes_ctx->key->exp_data);
287
+ }
288
+ }
289
+ memcpy(ctx->state.init, ctx->text, INIT_SIZE_BYTE);
290
+ hash_permutation(&ctx->state.hs);
291
+ /*memcpy(hash, &state, 32);*/
292
+ extra_hashes[ctx->state.hs.b[0] & 3](&ctx->state, 200, output);
293
+ oaes_free((OAES_CTX **) &ctx->aes_ctx);
294
+ }
295
+
296
+ void cryptonightturtle_fast_hash(const char* input, char* output, uint32_t len) {
297
+ union hash_state state;
298
+ hash_process(&state, (const uint8_t*) input, len);
299
+ memcpy(output, &state, HASH_SIZE);
300
+ }
@@ -0,0 +1,17 @@
1
+ #ifndef CRYPTONIGHTTURTLE_H
2
+ #define CRYPTONIGHTTURTLE_H
3
+
4
+ #ifdef __cplusplus
5
+ extern "C" {
6
+ #endif
7
+
8
+ #include <stdint.h>
9
+
10
+ void cryptonightturtle_hash(const char* input, char* output, uint32_t len, int variant);
11
+ void cryptonightturtle_fast_hash(const char* input, char* output, uint32_t len);
12
+
13
+ #ifdef __cplusplus
14
+ }
15
+ #endif
16
+
17
+ #endif