@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,168 @@
1
+ #if defined(SCRYPT_KECCAK256)
2
+ #define SCRYPT_HASH "Keccak-256"
3
+ #define SCRYPT_HASH_DIGEST_SIZE 32
4
+ #else
5
+ #define SCRYPT_HASH "Keccak-512"
6
+ #define SCRYPT_HASH_DIGEST_SIZE 64
7
+ #endif
8
+ #define SCRYPT_KECCAK_F 1600
9
+ #define SCRYPT_KECCAK_C (SCRYPT_HASH_DIGEST_SIZE * 8 * 2) /* 256=512, 512=1024 */
10
+ #define SCRYPT_KECCAK_R (SCRYPT_KECCAK_F - SCRYPT_KECCAK_C) /* 256=1088, 512=576 */
11
+ #define SCRYPT_HASH_BLOCK_SIZE (SCRYPT_KECCAK_R / 8)
12
+
13
+ typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE];
14
+
15
+ typedef struct scrypt_hash_state_t {
16
+ uint64_t state[SCRYPT_KECCAK_F / 64];
17
+ uint32_t leftover;
18
+ uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE];
19
+ } scrypt_hash_state;
20
+
21
+ static const uint64_t keccak_round_constants[24] = {
22
+ 0x0000000000000001ull, 0x0000000000008082ull,
23
+ 0x800000000000808aull, 0x8000000080008000ull,
24
+ 0x000000000000808bull, 0x0000000080000001ull,
25
+ 0x8000000080008081ull, 0x8000000000008009ull,
26
+ 0x000000000000008aull, 0x0000000000000088ull,
27
+ 0x0000000080008009ull, 0x000000008000000aull,
28
+ 0x000000008000808bull, 0x800000000000008bull,
29
+ 0x8000000000008089ull, 0x8000000000008003ull,
30
+ 0x8000000000008002ull, 0x8000000000000080ull,
31
+ 0x000000000000800aull, 0x800000008000000aull,
32
+ 0x8000000080008081ull, 0x8000000000008080ull,
33
+ 0x0000000080000001ull, 0x8000000080008008ull
34
+ };
35
+
36
+ static void
37
+ keccak_block(scrypt_hash_state *S, const uint8_t *in) {
38
+ size_t i;
39
+ uint64_t *s = S->state, t[5], u[5], v, w;
40
+
41
+ /* absorb input */
42
+ for (i = 0; i < SCRYPT_HASH_BLOCK_SIZE / 8; i++, in += 8)
43
+ s[i] ^= U8TO64_LE(in);
44
+
45
+ for (i = 0; i < 24; i++) {
46
+ /* theta: c = a[0,i] ^ a[1,i] ^ .. a[4,i] */
47
+ t[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20];
48
+ t[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21];
49
+ t[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22];
50
+ t[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23];
51
+ t[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24];
52
+
53
+ /* theta: d[i] = c[i+4] ^ rotl(c[i+1],1) */
54
+ u[0] = t[4] ^ ROTL64(t[1], 1);
55
+ u[1] = t[0] ^ ROTL64(t[2], 1);
56
+ u[2] = t[1] ^ ROTL64(t[3], 1);
57
+ u[3] = t[2] ^ ROTL64(t[4], 1);
58
+ u[4] = t[3] ^ ROTL64(t[0], 1);
59
+
60
+ /* theta: a[0,i], a[1,i], .. a[4,i] ^= d[i] */
61
+ s[0] ^= u[0]; s[5] ^= u[0]; s[10] ^= u[0]; s[15] ^= u[0]; s[20] ^= u[0];
62
+ s[1] ^= u[1]; s[6] ^= u[1]; s[11] ^= u[1]; s[16] ^= u[1]; s[21] ^= u[1];
63
+ s[2] ^= u[2]; s[7] ^= u[2]; s[12] ^= u[2]; s[17] ^= u[2]; s[22] ^= u[2];
64
+ s[3] ^= u[3]; s[8] ^= u[3]; s[13] ^= u[3]; s[18] ^= u[3]; s[23] ^= u[3];
65
+ s[4] ^= u[4]; s[9] ^= u[4]; s[14] ^= u[4]; s[19] ^= u[4]; s[24] ^= u[4];
66
+
67
+ /* rho pi: b[..] = rotl(a[..], ..) */
68
+ v = s[ 1];
69
+ s[ 1] = ROTL64(s[ 6], 44);
70
+ s[ 6] = ROTL64(s[ 9], 20);
71
+ s[ 9] = ROTL64(s[22], 61);
72
+ s[22] = ROTL64(s[14], 39);
73
+ s[14] = ROTL64(s[20], 18);
74
+ s[20] = ROTL64(s[ 2], 62);
75
+ s[ 2] = ROTL64(s[12], 43);
76
+ s[12] = ROTL64(s[13], 25);
77
+ s[13] = ROTL64(s[19], 8);
78
+ s[19] = ROTL64(s[23], 56);
79
+ s[23] = ROTL64(s[15], 41);
80
+ s[15] = ROTL64(s[ 4], 27);
81
+ s[ 4] = ROTL64(s[24], 14);
82
+ s[24] = ROTL64(s[21], 2);
83
+ s[21] = ROTL64(s[ 8], 55);
84
+ s[ 8] = ROTL64(s[16], 45);
85
+ s[16] = ROTL64(s[ 5], 36);
86
+ s[ 5] = ROTL64(s[ 3], 28);
87
+ s[ 3] = ROTL64(s[18], 21);
88
+ s[18] = ROTL64(s[17], 15);
89
+ s[17] = ROTL64(s[11], 10);
90
+ s[11] = ROTL64(s[ 7], 6);
91
+ s[ 7] = ROTL64(s[10], 3);
92
+ s[10] = ROTL64( v, 1);
93
+
94
+ /* chi: a[i,j] ^= ~b[i,j+1] & b[i,j+2] */
95
+ v = s[ 0]; w = s[ 1]; s[ 0] ^= (~w) & s[ 2]; s[ 1] ^= (~s[ 2]) & s[ 3]; s[ 2] ^= (~s[ 3]) & s[ 4]; s[ 3] ^= (~s[ 4]) & v; s[ 4] ^= (~v) & w;
96
+ v = s[ 5]; w = s[ 6]; s[ 5] ^= (~w) & s[ 7]; s[ 6] ^= (~s[ 7]) & s[ 8]; s[ 7] ^= (~s[ 8]) & s[ 9]; s[ 8] ^= (~s[ 9]) & v; s[ 9] ^= (~v) & w;
97
+ v = s[10]; w = s[11]; s[10] ^= (~w) & s[12]; s[11] ^= (~s[12]) & s[13]; s[12] ^= (~s[13]) & s[14]; s[13] ^= (~s[14]) & v; s[14] ^= (~v) & w;
98
+ v = s[15]; w = s[16]; s[15] ^= (~w) & s[17]; s[16] ^= (~s[17]) & s[18]; s[17] ^= (~s[18]) & s[19]; s[18] ^= (~s[19]) & v; s[19] ^= (~v) & w;
99
+ v = s[20]; w = s[21]; s[20] ^= (~w) & s[22]; s[21] ^= (~s[22]) & s[23]; s[22] ^= (~s[23]) & s[24]; s[23] ^= (~s[24]) & v; s[24] ^= (~v) & w;
100
+
101
+ /* iota: a[0,0] ^= round constant */
102
+ s[0] ^= keccak_round_constants[i];
103
+ }
104
+ }
105
+
106
+ static void
107
+ scrypt_hash_init(scrypt_hash_state *S) {
108
+ memset(S, 0, sizeof(*S));
109
+ }
110
+
111
+ static void
112
+ scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) {
113
+ size_t want;
114
+
115
+ /* handle the previous data */
116
+ if (S->leftover) {
117
+ want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover);
118
+ want = (want < inlen) ? want : inlen;
119
+ memcpy(S->buffer + S->leftover, in, want);
120
+ S->leftover += (uint32_t)want;
121
+ if (S->leftover < SCRYPT_HASH_BLOCK_SIZE)
122
+ return;
123
+ in += want;
124
+ inlen -= want;
125
+ keccak_block(S, S->buffer);
126
+ }
127
+
128
+ /* handle the current data */
129
+ while (inlen >= SCRYPT_HASH_BLOCK_SIZE) {
130
+ keccak_block(S, in);
131
+ in += SCRYPT_HASH_BLOCK_SIZE;
132
+ inlen -= SCRYPT_HASH_BLOCK_SIZE;
133
+ }
134
+
135
+ /* handle leftover data */
136
+ S->leftover = (uint32_t)inlen;
137
+ if (S->leftover)
138
+ memcpy(S->buffer, in, S->leftover);
139
+ }
140
+
141
+ static void
142
+ scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) {
143
+ size_t i;
144
+
145
+ S->buffer[S->leftover] = 0x01;
146
+ memset(S->buffer + (S->leftover + 1), 0, SCRYPT_HASH_BLOCK_SIZE - (S->leftover + 1));
147
+ S->buffer[SCRYPT_HASH_BLOCK_SIZE - 1] |= 0x80;
148
+ keccak_block(S, S->buffer);
149
+
150
+ for (i = 0; i < SCRYPT_HASH_DIGEST_SIZE; i += 8) {
151
+ U64TO8_LE(&hash[i], S->state[i / 8]);
152
+ }
153
+ }
154
+
155
+ #if defined(SCRYPT_KECCAK256)
156
+ static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
157
+ 0x26,0xb7,0x10,0xb3,0x66,0xb1,0xd1,0xb1,0x25,0xfc,0x3e,0xe3,0x1e,0x33,0x1d,0x19,
158
+ 0x94,0xaa,0x63,0x7a,0xd5,0x77,0x29,0xb4,0x27,0xe9,0xe0,0xf4,0x19,0xba,0x68,0xea,
159
+ };
160
+ #else
161
+ static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
162
+ 0x17,0xc7,0x8c,0xa0,0xd9,0x08,0x1d,0xba,0x8a,0xc8,0x3e,0x07,0x90,0xda,0x91,0x88,
163
+ 0x25,0xbd,0xd3,0xf8,0x78,0x4a,0x8d,0x5e,0xe4,0x96,0x9c,0x01,0xf3,0xeb,0xdc,0x12,
164
+ 0xea,0x35,0x57,0xba,0x94,0xb8,0xe9,0xb9,0x27,0x45,0x0a,0x48,0x5c,0x3d,0x69,0xf0,
165
+ 0xdb,0x22,0x38,0xb5,0x52,0x22,0x29,0xea,0x7a,0xb2,0xe6,0x07,0xaa,0x37,0x4d,0xe6,
166
+ };
167
+ #endif
168
+
@@ -0,0 +1,135 @@
1
+ #define SCRYPT_HASH "SHA-2-256"
2
+ #define SCRYPT_HASH_BLOCK_SIZE 64
3
+ #define SCRYPT_HASH_DIGEST_SIZE 32
4
+
5
+ typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE];
6
+
7
+ typedef struct scrypt_hash_state_t {
8
+ uint32_t H[8];
9
+ uint64_t T;
10
+ uint32_t leftover;
11
+ uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE];
12
+ } scrypt_hash_state;
13
+
14
+ static const uint32_t sha256_constants[64] = {
15
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
16
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
17
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
18
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
19
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
20
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
21
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
22
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
23
+ };
24
+
25
+ #define Ch(x,y,z) (z ^ (x & (y ^ z)))
26
+ #define Maj(x,y,z) (((x | y) & z) | (x & y))
27
+ #define S0(x) (ROTR32(x, 2) ^ ROTR32(x, 13) ^ ROTR32(x, 22))
28
+ #define S1(x) (ROTR32(x, 6) ^ ROTR32(x, 11) ^ ROTR32(x, 25))
29
+ #define G0(x) (ROTR32(x, 7) ^ ROTR32(x, 18) ^ (x >> 3))
30
+ #define G1(x) (ROTR32(x, 17) ^ ROTR32(x, 19) ^ (x >> 10))
31
+ #define W0(in,i) (U8TO32_BE(&in[i * 4]))
32
+ #define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16])
33
+ #define STEP(i) \
34
+ t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \
35
+ t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha256_constants[i] + w[i]; \
36
+ r[7] = r[6]; \
37
+ r[6] = r[5]; \
38
+ r[5] = r[4]; \
39
+ r[4] = r[3] + t0; \
40
+ r[3] = r[2]; \
41
+ r[2] = r[1]; \
42
+ r[1] = r[0]; \
43
+ r[0] = t0 + t1;
44
+
45
+ static void
46
+ sha256_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) {
47
+ uint32_t r[8], w[64], t0, t1;
48
+ size_t i;
49
+
50
+ for (i = 0; i < 8; i++) r[i] = S->H[i];
51
+
52
+ while (blocks--) {
53
+ for (i = 0; i < 16; i++) { w[i] = W0(in, i); }
54
+ for (i = 16; i < 64; i++) { w[i] = W1(i); }
55
+ for (i = 0; i < 64; i++) { STEP(i); }
56
+ for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; }
57
+ S->T += SCRYPT_HASH_BLOCK_SIZE * 8;
58
+ in += SCRYPT_HASH_BLOCK_SIZE;
59
+ }
60
+ }
61
+
62
+ static void
63
+ scrypt_hash_init(scrypt_hash_state *S) {
64
+ S->H[0] = 0x6a09e667;
65
+ S->H[1] = 0xbb67ae85;
66
+ S->H[2] = 0x3c6ef372;
67
+ S->H[3] = 0xa54ff53a;
68
+ S->H[4] = 0x510e527f;
69
+ S->H[5] = 0x9b05688c;
70
+ S->H[6] = 0x1f83d9ab;
71
+ S->H[7] = 0x5be0cd19;
72
+ S->T = 0;
73
+ S->leftover = 0;
74
+ }
75
+
76
+ static void
77
+ scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) {
78
+ size_t blocks, want;
79
+
80
+ /* handle the previous data */
81
+ if (S->leftover) {
82
+ want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover);
83
+ want = (want < inlen) ? want : inlen;
84
+ memcpy(S->buffer + S->leftover, in, want);
85
+ S->leftover += (uint32_t)want;
86
+ if (S->leftover < SCRYPT_HASH_BLOCK_SIZE)
87
+ return;
88
+ in += want;
89
+ inlen -= want;
90
+ sha256_blocks(S, S->buffer, 1);
91
+ }
92
+
93
+ /* handle the current data */
94
+ blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1));
95
+ S->leftover = (uint32_t)(inlen - blocks);
96
+ if (blocks) {
97
+ sha256_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE);
98
+ in += blocks;
99
+ }
100
+
101
+ /* handle leftover data */
102
+ if (S->leftover)
103
+ memcpy(S->buffer, in, S->leftover);
104
+ }
105
+
106
+ static void
107
+ scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) {
108
+ uint64_t t = S->T + (S->leftover * 8);
109
+
110
+ S->buffer[S->leftover] = 0x80;
111
+ if (S->leftover <= 55) {
112
+ memset(S->buffer + S->leftover + 1, 0, 55 - S->leftover);
113
+ } else {
114
+ memset(S->buffer + S->leftover + 1, 0, 63 - S->leftover);
115
+ sha256_blocks(S, S->buffer, 1);
116
+ memset(S->buffer, 0, 56);
117
+ }
118
+
119
+ U64TO8_BE(S->buffer + 56, t);
120
+ sha256_blocks(S, S->buffer, 1);
121
+
122
+ U32TO8_BE(&hash[ 0], S->H[0]);
123
+ U32TO8_BE(&hash[ 4], S->H[1]);
124
+ U32TO8_BE(&hash[ 8], S->H[2]);
125
+ U32TO8_BE(&hash[12], S->H[3]);
126
+ U32TO8_BE(&hash[16], S->H[4]);
127
+ U32TO8_BE(&hash[20], S->H[5]);
128
+ U32TO8_BE(&hash[24], S->H[6]);
129
+ U32TO8_BE(&hash[28], S->H[7]);
130
+ }
131
+
132
+ static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {
133
+ 0xee,0x36,0xae,0xa6,0x65,0xf0,0x28,0x7d,0xc9,0xde,0xd8,0xad,0x48,0x33,0x7d,0xbf,
134
+ 0xcb,0xc0,0x48,0xfa,0x5f,0x92,0xfd,0x0a,0x95,0x6f,0x34,0x8e,0x8c,0x1e,0x73,0xad,
135
+ };
@@ -0,0 +1,340 @@
1
+ /* x86 */
2
+ #if defined(X86ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
3
+
4
+ #define SCRYPT_CHACHA_AVX
5
+
6
+ asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r)
7
+ asm_naked_fn(scrypt_ChunkMix_avx)
8
+ a1(push ebx)
9
+ a1(push edi)
10
+ a1(push esi)
11
+ a1(push ebp)
12
+ a2(mov ebp,esp)
13
+ a2(mov edi,[ebp+20])
14
+ a2(mov esi,[ebp+24])
15
+ a2(mov eax,[ebp+28])
16
+ a2(mov ebx,[ebp+32])
17
+ a2(sub esp,64)
18
+ a2(and esp,~63)
19
+ a2(lea edx,[ebx*2])
20
+ a2(shl edx,6)
21
+ a2(lea ecx,[edx-64])
22
+ a2(and eax, eax)
23
+ a2(vmovdqa xmm4,[ssse3_rotl16_32bit])
24
+ a2(vmovdqa xmm5,[ssse3_rotl8_32bit])
25
+ a2(vmovdqa xmm0,[ecx+esi+0])
26
+ a2(vmovdqa xmm1,[ecx+esi+16])
27
+ a2(vmovdqa xmm2,[ecx+esi+32])
28
+ a2(vmovdqa xmm3,[ecx+esi+48])
29
+ a1(jz scrypt_ChunkMix_avx_no_xor1)
30
+ a3(vpxor xmm0,xmm0,[ecx+eax+0])
31
+ a3(vpxor xmm1,xmm1,[ecx+eax+16])
32
+ a3(vpxor xmm2,xmm2,[ecx+eax+32])
33
+ a3(vpxor xmm3,xmm3,[ecx+eax+48])
34
+ a1(scrypt_ChunkMix_avx_no_xor1:)
35
+ a2(xor ecx,ecx)
36
+ a2(xor ebx,ebx)
37
+ a1(scrypt_ChunkMix_avx_loop:)
38
+ a2(and eax, eax)
39
+ a3(vpxor xmm0,xmm0,[esi+ecx+0])
40
+ a3(vpxor xmm1,xmm1,[esi+ecx+16])
41
+ a3(vpxor xmm2,xmm2,[esi+ecx+32])
42
+ a3(vpxor xmm3,xmm3,[esi+ecx+48])
43
+ a1(jz scrypt_ChunkMix_avx_no_xor2)
44
+ a3(vpxor xmm0,xmm0,[eax+ecx+0])
45
+ a3(vpxor xmm1,xmm1,[eax+ecx+16])
46
+ a3(vpxor xmm2,xmm2,[eax+ecx+32])
47
+ a3(vpxor xmm3,xmm3,[eax+ecx+48])
48
+ a1(scrypt_ChunkMix_avx_no_xor2:)
49
+ a2(vmovdqa [esp+0],xmm0)
50
+ a2(vmovdqa [esp+16],xmm1)
51
+ a2(vmovdqa [esp+32],xmm2)
52
+ a2(vmovdqa [esp+48],xmm3)
53
+ a2(mov eax,8)
54
+ a1(scrypt_chacha_avx_loop: )
55
+ a3(vpaddd xmm0,xmm0,xmm1)
56
+ a3(vpxor xmm3,xmm3,xmm0)
57
+ a3(vpshufb xmm3,xmm3,xmm4)
58
+ a3(vpaddd xmm2,xmm2,xmm3)
59
+ a3(vpxor xmm1,xmm1,xmm2)
60
+ a3(vpsrld xmm6,xmm1,20)
61
+ a3(vpslld xmm1,xmm1,12)
62
+ a3(vpxor xmm1,xmm1,xmm6)
63
+ a3(vpaddd xmm0,xmm0,xmm1)
64
+ a3(vpxor xmm3,xmm3,xmm0)
65
+ a3(vpshufb xmm3,xmm3,xmm5)
66
+ a3(vpshufd xmm0,xmm0,0x93)
67
+ a3(vpaddd xmm2,xmm2,xmm3)
68
+ a3(vpshufd xmm3,xmm3,0x4e)
69
+ a3(vpxor xmm1,xmm1,xmm2)
70
+ a3(vpshufd xmm2,xmm2,0x39)
71
+ a3(vpsrld xmm6,xmm1,25)
72
+ a3(vpslld xmm1,xmm1,7)
73
+ a3(vpxor xmm1,xmm1,xmm6)
74
+ a2(sub eax,2)
75
+ a3(vpaddd xmm0,xmm0,xmm1)
76
+ a3(vpxor xmm3,xmm3,xmm0)
77
+ a3(vpshufb xmm3,xmm3,xmm4)
78
+ a3(vpaddd xmm2,xmm2,xmm3)
79
+ a3(vpxor xmm1,xmm1,xmm2)
80
+ a3(vpsrld xmm6,xmm1,20)
81
+ a3(vpslld xmm1,xmm1,12)
82
+ a3(vpxor xmm1,xmm1,xmm6)
83
+ a3(vpaddd xmm0,xmm0,xmm1)
84
+ a3(vpxor xmm3,xmm3,xmm0)
85
+ a3(vpshufb xmm3,xmm3,xmm5)
86
+ a3(vpshufd xmm0,xmm0,0x39)
87
+ a3(vpaddd xmm2,xmm2,xmm3)
88
+ a3(pshufd xmm3,xmm3,0x4e)
89
+ a3(vpxor xmm1,xmm1,xmm2)
90
+ a3(pshufd xmm2,xmm2,0x93)
91
+ a3(vpsrld xmm6,xmm1,25)
92
+ a3(vpslld xmm1,xmm1,7)
93
+ a3(vpxor xmm1,xmm1,xmm6)
94
+ a1(ja scrypt_chacha_avx_loop)
95
+ a3(vpaddd xmm0,xmm0,[esp+0])
96
+ a3(vpaddd xmm1,xmm1,[esp+16])
97
+ a3(vpaddd xmm2,xmm2,[esp+32])
98
+ a3(vpaddd xmm3,xmm3,[esp+48])
99
+ a2(lea eax,[ebx+ecx])
100
+ a2(xor ebx,edx)
101
+ a2(and eax,~0x7f)
102
+ a2(add ecx,64)
103
+ a2(shr eax,1)
104
+ a2(add eax, edi)
105
+ a2(cmp ecx,edx)
106
+ a2(vmovdqa [eax+0],xmm0)
107
+ a2(vmovdqa [eax+16],xmm1)
108
+ a2(vmovdqa [eax+32],xmm2)
109
+ a2(vmovdqa [eax+48],xmm3)
110
+ a2(mov eax,[ebp+28])
111
+ a1(jne scrypt_ChunkMix_avx_loop)
112
+ a2(mov esp,ebp)
113
+ a1(pop ebp)
114
+ a1(pop esi)
115
+ a1(pop edi)
116
+ a1(pop ebx)
117
+ a1(ret 16)
118
+ asm_naked_fn_end(scrypt_ChunkMix_avx)
119
+
120
+ #endif
121
+
122
+
123
+
124
+ /* x64 */
125
+ #if defined(X86_64ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
126
+
127
+ #define SCRYPT_CHACHA_AVX
128
+
129
+ asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r)
130
+ asm_naked_fn(scrypt_ChunkMix_avx)
131
+ a2(lea rcx,[rcx*2])
132
+ a2(shl rcx,6)
133
+ a2(lea r9,[rcx-64])
134
+ a2(lea rax,[rsi+r9])
135
+ a2(lea r9,[rdx+r9])
136
+ a2(and rdx, rdx)
137
+ a2(vmovdqa xmm4,[ssse3_rotl16_32bit])
138
+ a2(vmovdqa xmm5,[ssse3_rotl8_32bit])
139
+ a2(vmovdqa xmm0,[rax+0])
140
+ a2(vmovdqa xmm1,[rax+16])
141
+ a2(vmovdqa xmm2,[rax+32])
142
+ a2(vmovdqa xmm3,[rax+48])
143
+ a1(jz scrypt_ChunkMix_avx_no_xor1)
144
+ a3(vpxor xmm0,xmm0,[r9+0])
145
+ a3(vpxor xmm1,xmm1,[r9+16])
146
+ a3(vpxor xmm2,xmm2,[r9+32])
147
+ a3(vpxor xmm3,xmm3,[r9+48])
148
+ a1(scrypt_ChunkMix_avx_no_xor1:)
149
+ a2(xor r8,r8)
150
+ a2(xor r9,r9)
151
+ a1(scrypt_ChunkMix_avx_loop:)
152
+ a2(and rdx, rdx)
153
+ a3(vpxor xmm0,xmm0,[rsi+r9+0])
154
+ a3(vpxor xmm1,xmm1,[rsi+r9+16])
155
+ a3(vpxor xmm2,xmm2,[rsi+r9+32])
156
+ a3(vpxor xmm3,xmm3,[rsi+r9+48])
157
+ a1(jz scrypt_ChunkMix_avx_no_xor2)
158
+ a3(vpxor xmm0,xmm0,[rdx+r9+0])
159
+ a3(vpxor xmm1,xmm1,[rdx+r9+16])
160
+ a3(vpxor xmm2,xmm2,[rdx+r9+32])
161
+ a3(vpxor xmm3,xmm3,[rdx+r9+48])
162
+ a1(scrypt_ChunkMix_avx_no_xor2:)
163
+ a2(vmovdqa xmm8,xmm0)
164
+ a2(vmovdqa xmm9,xmm1)
165
+ a2(vmovdqa xmm10,xmm2)
166
+ a2(vmovdqa xmm11,xmm3)
167
+ a2(mov rax,8)
168
+ a1(scrypt_chacha_avx_loop: )
169
+ a3(vpaddd xmm0,xmm0,xmm1)
170
+ a3(vpxor xmm3,xmm3,xmm0)
171
+ a3(vpshufb xmm3,xmm3,xmm4)
172
+ a3(vpaddd xmm2,xmm2,xmm3)
173
+ a3(vpxor xmm1,xmm1,xmm2)
174
+ a3(vpsrld xmm12,xmm1,20)
175
+ a3(vpslld xmm1,xmm1,12)
176
+ a3(vpxor xmm1,xmm1,xmm12)
177
+ a3(vpaddd xmm0,xmm0,xmm1)
178
+ a3(vpxor xmm3,xmm3,xmm0)
179
+ a3(vpshufb xmm3,xmm3,xmm5)
180
+ a3(vpshufd xmm0,xmm0,0x93)
181
+ a3(vpaddd xmm2,xmm2,xmm3)
182
+ a3(vpshufd xmm3,xmm3,0x4e)
183
+ a3(vpxor xmm1,xmm1,xmm2)
184
+ a3(vpshufd xmm2,xmm2,0x39)
185
+ a3(vpsrld xmm12,xmm1,25)
186
+ a3(vpslld xmm1,xmm1,7)
187
+ a3(vpxor xmm1,xmm1,xmm12)
188
+ a2(sub rax,2)
189
+ a3(vpaddd xmm0,xmm0,xmm1)
190
+ a3(vpxor xmm3,xmm3,xmm0)
191
+ a3(vpshufb xmm3,xmm3,xmm4)
192
+ a3(vpaddd xmm2,xmm2,xmm3)
193
+ a3(vpxor xmm1,xmm1,xmm2)
194
+ a3(vpsrld xmm12,xmm1,20)
195
+ a3(vpslld xmm1,xmm1,12)
196
+ a3(vpxor xmm1,xmm1,xmm12)
197
+ a3(vpaddd xmm0,xmm0,xmm1)
198
+ a3(vpxor xmm3,xmm3,xmm0)
199
+ a3(vpshufb xmm3,xmm3,xmm5)
200
+ a3(vpshufd xmm0,xmm0,0x39)
201
+ a3(vpaddd xmm2,xmm2,xmm3)
202
+ a3(pshufd xmm3,xmm3,0x4e)
203
+ a3(vpxor xmm1,xmm1,xmm2)
204
+ a3(pshufd xmm2,xmm2,0x93)
205
+ a3(vpsrld xmm12,xmm1,25)
206
+ a3(vpslld xmm1,xmm1,7)
207
+ a3(vpxor xmm1,xmm1,xmm12)
208
+ a1(ja scrypt_chacha_avx_loop)
209
+ a3(vpaddd xmm0,xmm0,xmm8)
210
+ a3(vpaddd xmm1,xmm1,xmm9)
211
+ a3(vpaddd xmm2,xmm2,xmm10)
212
+ a3(vpaddd xmm3,xmm3,xmm11)
213
+ a2(lea rax,[r8+r9])
214
+ a2(xor r8,rcx)
215
+ a2(and rax,~0x7f)
216
+ a2(add r9,64)
217
+ a2(shr rax,1)
218
+ a2(add rax, rdi)
219
+ a2(cmp r9,rcx)
220
+ a2(vmovdqa [rax+0],xmm0)
221
+ a2(vmovdqa [rax+16],xmm1)
222
+ a2(vmovdqa [rax+32],xmm2)
223
+ a2(vmovdqa [rax+48],xmm3)
224
+ a1(jne scrypt_ChunkMix_avx_loop)
225
+ a1(ret)
226
+ asm_naked_fn_end(scrypt_ChunkMix_avx)
227
+
228
+ #endif
229
+
230
+
231
+ /* intrinsic */
232
+ #if defined(X86_INTRINSIC_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED))
233
+
234
+ #define SCRYPT_CHACHA_AVX
235
+
236
+ static void NOINLINE
237
+ scrypt_ChunkMix_avx(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) {
238
+ uint32_t i, blocksPerChunk = r * 2, half = 0;
239
+ xmmi *xmmp,x0,x1,x2,x3,x6,t0,t1,t2,t3;
240
+ const xmmi x4 = *(xmmi *)&ssse3_rotl16_32bit, x5 = *(xmmi *)&ssse3_rotl8_32bit;
241
+ size_t rounds;
242
+
243
+ /* 1: X = B_{2r - 1} */
244
+ xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1);
245
+ x0 = xmmp[0];
246
+ x1 = xmmp[1];
247
+ x2 = xmmp[2];
248
+ x3 = xmmp[3];
249
+
250
+ if (Bxor) {
251
+ xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1);
252
+ x0 = _mm_xor_si128(x0, xmmp[0]);
253
+ x1 = _mm_xor_si128(x1, xmmp[1]);
254
+ x2 = _mm_xor_si128(x2, xmmp[2]);
255
+ x3 = _mm_xor_si128(x3, xmmp[3]);
256
+ }
257
+
258
+ /* 2: for i = 0 to 2r - 1 do */
259
+ for (i = 0; i < blocksPerChunk; i++, half ^= r) {
260
+ /* 3: X = H(X ^ B_i) */
261
+ xmmp = (xmmi *)scrypt_block(Bin, i);
262
+ x0 = _mm_xor_si128(x0, xmmp[0]);
263
+ x1 = _mm_xor_si128(x1, xmmp[1]);
264
+ x2 = _mm_xor_si128(x2, xmmp[2]);
265
+ x3 = _mm_xor_si128(x3, xmmp[3]);
266
+
267
+ if (Bxor) {
268
+ xmmp = (xmmi *)scrypt_block(Bxor, i);
269
+ x0 = _mm_xor_si128(x0, xmmp[0]);
270
+ x1 = _mm_xor_si128(x1, xmmp[1]);
271
+ x2 = _mm_xor_si128(x2, xmmp[2]);
272
+ x3 = _mm_xor_si128(x3, xmmp[3]);
273
+ }
274
+
275
+ t0 = x0;
276
+ t1 = x1;
277
+ t2 = x2;
278
+ t3 = x3;
279
+
280
+ for (rounds = 8; rounds; rounds -= 2) {
281
+ x0 = _mm_add_epi32(x0, x1);
282
+ x3 = _mm_xor_si128(x3, x0);
283
+ x3 = _mm_shuffle_epi8(x3, x4);
284
+ x2 = _mm_add_epi32(x2, x3);
285
+ x1 = _mm_xor_si128(x1, x2);
286
+ x6 = x1;
287
+ x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20));
288
+ x0 = _mm_add_epi32(x0, x1);
289
+ x3 = _mm_xor_si128(x3, x0);
290
+ x3 = _mm_shuffle_epi8(x3, x5);
291
+ x0 = _mm_shuffle_epi32(x0, 0x93);
292
+ x2 = _mm_add_epi32(x2, x3);
293
+ x3 = _mm_shuffle_epi32(x3, 0x4e);
294
+ x1 = _mm_xor_si128(x1, x2);
295
+ x2 = _mm_shuffle_epi32(x2, 0x39);
296
+ x6 = x1;
297
+ x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25));
298
+ x0 = _mm_add_epi32(x0, x1);
299
+ x3 = _mm_xor_si128(x3, x0);
300
+ x3 = _mm_shuffle_epi8(x3, x4);
301
+ x2 = _mm_add_epi32(x2, x3);
302
+ x1 = _mm_xor_si128(x1, x2);
303
+ x6 = x1;
304
+ x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20));
305
+ x0 = _mm_add_epi32(x0, x1);
306
+ x3 = _mm_xor_si128(x3, x0);
307
+ x3 = _mm_shuffle_epi8(x3, x5);
308
+ x0 = _mm_shuffle_epi32(x0, 0x39);
309
+ x2 = _mm_add_epi32(x2, x3);
310
+ x3 = _mm_shuffle_epi32(x3, 0x4e);
311
+ x1 = _mm_xor_si128(x1, x2);
312
+ x2 = _mm_shuffle_epi32(x2, 0x93);
313
+ x6 = x1;
314
+ x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25));
315
+ }
316
+
317
+ x0 = _mm_add_epi32(x0, t0);
318
+ x1 = _mm_add_epi32(x1, t1);
319
+ x2 = _mm_add_epi32(x2, t2);
320
+ x3 = _mm_add_epi32(x3, t3);
321
+
322
+ /* 4: Y_i = X */
323
+ /* 6: B'[0..r-1] = Y_even */
324
+ /* 6: B'[r..2r-1] = Y_odd */
325
+ xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half);
326
+ xmmp[0] = x0;
327
+ xmmp[1] = x1;
328
+ xmmp[2] = x2;
329
+ xmmp[3] = x3;
330
+ }
331
+ }
332
+
333
+ #endif
334
+
335
+ #if defined(SCRYPT_CHACHA_AVX)
336
+ #undef SCRYPT_MIX
337
+ #define SCRYPT_MIX "ChaCha/8-AVX"
338
+ #undef SCRYPT_CHACHA_INCLUDED
339
+ #define SCRYPT_CHACHA_INCLUDED
340
+ #endif