@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
package/sha3/hamsi.c ADDED
@@ -0,0 +1,867 @@
1
+ /* $Id: hamsi.c 251 2010-10-19 14:31:51Z tp $ */
2
+ /*
3
+ * Hamsi implementation.
4
+ *
5
+ * ==========================(LICENSE BEGIN)============================
6
+ *
7
+ * Copyright (c) 2007-2010 Projet RNRT SAPHIR
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining
10
+ * a copy of this software and associated documentation files (the
11
+ * "Software"), to deal in the Software without restriction, including
12
+ * without limitation the rights to use, copy, modify, merge, publish,
13
+ * distribute, sublicense, and/or sell copies of the Software, and to
14
+ * permit persons to whom the Software is furnished to do so, subject to
15
+ * the following conditions:
16
+ *
17
+ * The above copyright notice and this permission notice shall be
18
+ * included in all copies or substantial portions of the Software.
19
+ *
20
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
+ *
28
+ * ===========================(LICENSE END)=============================
29
+ *
30
+ * @author Thomas Pornin <thomas.pornin@cryptolog.com>
31
+ */
32
+
33
+ #include <stddef.h>
34
+ #include <string.h>
35
+
36
+ #include "sph_hamsi.h"
37
+
38
+ #ifdef __cplusplus
39
+ extern "C"{
40
+ #endif
41
+
42
+ #if SPH_SMALL_FOOTPRINT && !defined SPH_SMALL_FOOTPRINT_HAMSI
43
+ #define SPH_SMALL_FOOTPRINT_HAMSI 1
44
+ #endif
45
+
46
+ /*
47
+ * The SPH_HAMSI_EXPAND_* define how many input bits we handle in one
48
+ * table lookup during message expansion (1 to 8, inclusive). If we note
49
+ * w the number of bits per message word (w=32 for Hamsi-224/256, w=64
50
+ * for Hamsi-384/512), r the size of a "row" in 32-bit words (r=8 for
51
+ * Hamsi-224/256, r=16 for Hamsi-384/512), and n the expansion level,
52
+ * then we will get t tables (where t=ceil(w/n)) of individual size
53
+ * 2^n*r*4 (in bytes). The last table may be shorter (e.g. with w=32 and
54
+ * n=5, there are 7 tables, but the last one uses only two bits on
55
+ * input, not five).
56
+ *
57
+ * Also, we read t rows of r words from RAM. Words in a given row are
58
+ * concatenated in RAM in that order, so most of the cost is about
59
+ * reading the first row word; comparatively, cache misses are thus
60
+ * less expensive with Hamsi-512 (r=16) than with Hamsi-256 (r=8).
61
+ *
62
+ * When n=1, tables are "special" in that we omit the first entry of
63
+ * each table (which always contains 0), so that total table size is
64
+ * halved.
65
+ *
66
+ * We thus have the following (size1 is the cumulative table size of
67
+ * Hamsi-224/256; size2 is for Hamsi-384/512; similarly, t1 and t2
68
+ * are for Hamsi-224/256 and Hamsi-384/512, respectively).
69
+ *
70
+ * n size1 size2 t1 t2
71
+ * ---------------------------------------
72
+ * 1 1024 4096 32 64
73
+ * 2 2048 8192 16 32
74
+ * 3 2688 10880 11 22
75
+ * 4 4096 16384 8 16
76
+ * 5 6272 25600 7 13
77
+ * 6 10368 41984 6 11
78
+ * 7 16896 73856 5 10
79
+ * 8 32768 131072 4 8
80
+ *
81
+ * So there is a trade-off: a lower n makes the tables fit better in
82
+ * L1 cache, but increases the number of memory accesses. The optimal
83
+ * value depends on the amount of available L1 cache and the relative
84
+ * impact of a cache miss.
85
+ *
86
+ * Experimentally, in ideal benchmark conditions (which are not necessarily
87
+ * realistic with regards to L1 cache contention), it seems that n=8 is
88
+ * the best value on "big" architectures (those with 32 kB or more of L1
89
+ * cache), while n=4 is better on "small" architectures. This was tested
90
+ * on an Intel Core2 Q6600 (both 32-bit and 64-bit mode), a PowerPC G3
91
+ * (32 kB L1 cache, hence "big"), and a MIPS-compatible Broadcom BCM3302
92
+ * (8 kB L1 cache).
93
+ *
94
+ * Note: with n=1, the 32 tables (actually implemented as one big table)
95
+ * are read entirely and sequentially, regardless of the input data,
96
+ * thus avoiding any data-dependent table access pattern.
97
+ */
98
+
99
+ #if !defined SPH_HAMSI_EXPAND_SMALL
100
+ #if SPH_SMALL_FOOTPRINT_HAMSI
101
+ #define SPH_HAMSI_EXPAND_SMALL 4
102
+ #else
103
+ #define SPH_HAMSI_EXPAND_SMALL 8
104
+ #endif
105
+ #endif
106
+
107
+ #if !defined SPH_HAMSI_EXPAND_BIG
108
+ #define SPH_HAMSI_EXPAND_BIG 8
109
+ #endif
110
+
111
+ #ifdef _MSC_VER
112
+ #pragma warning (disable: 4146)
113
+ #endif
114
+
115
+ #include "hamsi_helper.c"
116
+
117
+ static const sph_u32 IV224[] = {
118
+ SPH_C32(0xc3967a67), SPH_C32(0xc3bc6c20), SPH_C32(0x4bc3bcc3),
119
+ SPH_C32(0xa7c3bc6b), SPH_C32(0x2c204b61), SPH_C32(0x74686f6c),
120
+ SPH_C32(0x69656b65), SPH_C32(0x20556e69)
121
+ };
122
+
123
+ /*
124
+ * This version is the one used in the Hamsi submission package for
125
+ * round 2 of the SHA-3 competition; the UTF-8 encoding is wrong and
126
+ * shall soon be corrected in the official Hamsi specification.
127
+ *
128
+ static const sph_u32 IV224[] = {
129
+ SPH_C32(0x3c967a67), SPH_C32(0x3cbc6c20), SPH_C32(0xb4c343c3),
130
+ SPH_C32(0xa73cbc6b), SPH_C32(0x2c204b61), SPH_C32(0x74686f6c),
131
+ SPH_C32(0x69656b65), SPH_C32(0x20556e69)
132
+ };
133
+ */
134
+
135
+ static const sph_u32 IV256[] = {
136
+ SPH_C32(0x76657273), SPH_C32(0x69746569), SPH_C32(0x74204c65),
137
+ SPH_C32(0x7576656e), SPH_C32(0x2c204465), SPH_C32(0x70617274),
138
+ SPH_C32(0x656d656e), SPH_C32(0x7420456c)
139
+ };
140
+
141
+ static const sph_u32 IV384[] = {
142
+ SPH_C32(0x656b7472), SPH_C32(0x6f746563), SPH_C32(0x686e6965),
143
+ SPH_C32(0x6b2c2043), SPH_C32(0x6f6d7075), SPH_C32(0x74657220),
144
+ SPH_C32(0x53656375), SPH_C32(0x72697479), SPH_C32(0x20616e64),
145
+ SPH_C32(0x20496e64), SPH_C32(0x75737472), SPH_C32(0x69616c20),
146
+ SPH_C32(0x43727970), SPH_C32(0x746f6772), SPH_C32(0x61706879),
147
+ SPH_C32(0x2c204b61)
148
+ };
149
+
150
+ static const sph_u32 IV512[] = {
151
+ SPH_C32(0x73746565), SPH_C32(0x6c706172), SPH_C32(0x6b204172),
152
+ SPH_C32(0x656e6265), SPH_C32(0x72672031), SPH_C32(0x302c2062),
153
+ SPH_C32(0x75732032), SPH_C32(0x3434362c), SPH_C32(0x20422d33),
154
+ SPH_C32(0x30303120), SPH_C32(0x4c657576), SPH_C32(0x656e2d48),
155
+ SPH_C32(0x65766572), SPH_C32(0x6c65652c), SPH_C32(0x2042656c),
156
+ SPH_C32(0x6769756d)
157
+ };
158
+
159
+ static const sph_u32 alpha_n[] = {
160
+ SPH_C32(0xff00f0f0), SPH_C32(0xccccaaaa), SPH_C32(0xf0f0cccc),
161
+ SPH_C32(0xff00aaaa), SPH_C32(0xccccaaaa), SPH_C32(0xf0f0ff00),
162
+ SPH_C32(0xaaaacccc), SPH_C32(0xf0f0ff00), SPH_C32(0xf0f0cccc),
163
+ SPH_C32(0xaaaaff00), SPH_C32(0xccccff00), SPH_C32(0xaaaaf0f0),
164
+ SPH_C32(0xaaaaf0f0), SPH_C32(0xff00cccc), SPH_C32(0xccccf0f0),
165
+ SPH_C32(0xff00aaaa), SPH_C32(0xccccaaaa), SPH_C32(0xff00f0f0),
166
+ SPH_C32(0xff00aaaa), SPH_C32(0xf0f0cccc), SPH_C32(0xf0f0ff00),
167
+ SPH_C32(0xccccaaaa), SPH_C32(0xf0f0ff00), SPH_C32(0xaaaacccc),
168
+ SPH_C32(0xaaaaff00), SPH_C32(0xf0f0cccc), SPH_C32(0xaaaaf0f0),
169
+ SPH_C32(0xccccff00), SPH_C32(0xff00cccc), SPH_C32(0xaaaaf0f0),
170
+ SPH_C32(0xff00aaaa), SPH_C32(0xccccf0f0)
171
+ };
172
+
173
+ static const sph_u32 alpha_f[] = {
174
+ SPH_C32(0xcaf9639c), SPH_C32(0x0ff0f9c0), SPH_C32(0x639c0ff0),
175
+ SPH_C32(0xcaf9f9c0), SPH_C32(0x0ff0f9c0), SPH_C32(0x639ccaf9),
176
+ SPH_C32(0xf9c00ff0), SPH_C32(0x639ccaf9), SPH_C32(0x639c0ff0),
177
+ SPH_C32(0xf9c0caf9), SPH_C32(0x0ff0caf9), SPH_C32(0xf9c0639c),
178
+ SPH_C32(0xf9c0639c), SPH_C32(0xcaf90ff0), SPH_C32(0x0ff0639c),
179
+ SPH_C32(0xcaf9f9c0), SPH_C32(0x0ff0f9c0), SPH_C32(0xcaf9639c),
180
+ SPH_C32(0xcaf9f9c0), SPH_C32(0x639c0ff0), SPH_C32(0x639ccaf9),
181
+ SPH_C32(0x0ff0f9c0), SPH_C32(0x639ccaf9), SPH_C32(0xf9c00ff0),
182
+ SPH_C32(0xf9c0caf9), SPH_C32(0x639c0ff0), SPH_C32(0xf9c0639c),
183
+ SPH_C32(0x0ff0caf9), SPH_C32(0xcaf90ff0), SPH_C32(0xf9c0639c),
184
+ SPH_C32(0xcaf9f9c0), SPH_C32(0x0ff0639c)
185
+ };
186
+
187
+ #define DECL_STATE_SMALL \
188
+ sph_u32 c0, c1, c2, c3, c4, c5, c6, c7;
189
+
190
+ #define READ_STATE_SMALL(sc) do { \
191
+ c0 = sc->h[0x0]; \
192
+ c1 = sc->h[0x1]; \
193
+ c2 = sc->h[0x2]; \
194
+ c3 = sc->h[0x3]; \
195
+ c4 = sc->h[0x4]; \
196
+ c5 = sc->h[0x5]; \
197
+ c6 = sc->h[0x6]; \
198
+ c7 = sc->h[0x7]; \
199
+ } while (0)
200
+
201
+ #define WRITE_STATE_SMALL(sc) do { \
202
+ sc->h[0x0] = c0; \
203
+ sc->h[0x1] = c1; \
204
+ sc->h[0x2] = c2; \
205
+ sc->h[0x3] = c3; \
206
+ sc->h[0x4] = c4; \
207
+ sc->h[0x5] = c5; \
208
+ sc->h[0x6] = c6; \
209
+ sc->h[0x7] = c7; \
210
+ } while (0)
211
+
212
+ #define s0 m0
213
+ #define s1 m1
214
+ #define s2 c0
215
+ #define s3 c1
216
+ #define s4 c2
217
+ #define s5 c3
218
+ #define s6 m2
219
+ #define s7 m3
220
+ #define s8 m4
221
+ #define s9 m5
222
+ #define sA c4
223
+ #define sB c5
224
+ #define sC c6
225
+ #define sD c7
226
+ #define sE m6
227
+ #define sF m7
228
+
229
+ #define SBOX(a, b, c, d) do { \
230
+ sph_u32 t; \
231
+ t = (a); \
232
+ (a) &= (c); \
233
+ (a) ^= (d); \
234
+ (c) ^= (b); \
235
+ (c) ^= (a); \
236
+ (d) |= t; \
237
+ (d) ^= (b); \
238
+ t ^= (c); \
239
+ (b) = (d); \
240
+ (d) |= t; \
241
+ (d) ^= (a); \
242
+ (a) &= (b); \
243
+ t ^= (a); \
244
+ (b) ^= (d); \
245
+ (b) ^= t; \
246
+ (a) = (c); \
247
+ (c) = (b); \
248
+ (b) = (d); \
249
+ (d) = SPH_T32(~t); \
250
+ } while (0)
251
+
252
+ #define L(a, b, c, d) do { \
253
+ (a) = SPH_ROTL32(a, 13); \
254
+ (c) = SPH_ROTL32(c, 3); \
255
+ (b) ^= (a) ^ (c); \
256
+ (d) ^= (c) ^ SPH_T32((a) << 3); \
257
+ (b) = SPH_ROTL32(b, 1); \
258
+ (d) = SPH_ROTL32(d, 7); \
259
+ (a) ^= (b) ^ (d); \
260
+ (c) ^= (d) ^ SPH_T32((b) << 7); \
261
+ (a) = SPH_ROTL32(a, 5); \
262
+ (c) = SPH_ROTL32(c, 22); \
263
+ } while (0)
264
+
265
+ #define ROUND_SMALL(rc, alpha) do { \
266
+ s0 ^= alpha[0x00]; \
267
+ s1 ^= alpha[0x01] ^ (sph_u32)(rc); \
268
+ s2 ^= alpha[0x02]; \
269
+ s3 ^= alpha[0x03]; \
270
+ s4 ^= alpha[0x08]; \
271
+ s5 ^= alpha[0x09]; \
272
+ s6 ^= alpha[0x0A]; \
273
+ s7 ^= alpha[0x0B]; \
274
+ s8 ^= alpha[0x10]; \
275
+ s9 ^= alpha[0x11]; \
276
+ sA ^= alpha[0x12]; \
277
+ sB ^= alpha[0x13]; \
278
+ sC ^= alpha[0x18]; \
279
+ sD ^= alpha[0x19]; \
280
+ sE ^= alpha[0x1A]; \
281
+ sF ^= alpha[0x1B]; \
282
+ SBOX(s0, s4, s8, sC); \
283
+ SBOX(s1, s5, s9, sD); \
284
+ SBOX(s2, s6, sA, sE); \
285
+ SBOX(s3, s7, sB, sF); \
286
+ L(s0, s5, sA, sF); \
287
+ L(s1, s6, sB, sC); \
288
+ L(s2, s7, s8, sD); \
289
+ L(s3, s4, s9, sE); \
290
+ } while (0)
291
+
292
+ #define P_SMALL do { \
293
+ ROUND_SMALL(0, alpha_n); \
294
+ ROUND_SMALL(1, alpha_n); \
295
+ ROUND_SMALL(2, alpha_n); \
296
+ } while (0)
297
+
298
+ #define PF_SMALL do { \
299
+ ROUND_SMALL(0, alpha_f); \
300
+ ROUND_SMALL(1, alpha_f); \
301
+ ROUND_SMALL(2, alpha_f); \
302
+ ROUND_SMALL(3, alpha_f); \
303
+ ROUND_SMALL(4, alpha_f); \
304
+ ROUND_SMALL(5, alpha_f); \
305
+ } while (0)
306
+
307
+ #define T_SMALL do { \
308
+ /* order is important */ \
309
+ c7 = (sc->h[7] ^= sB); \
310
+ c6 = (sc->h[6] ^= sA); \
311
+ c5 = (sc->h[5] ^= s9); \
312
+ c4 = (sc->h[4] ^= s8); \
313
+ c3 = (sc->h[3] ^= s3); \
314
+ c2 = (sc->h[2] ^= s2); \
315
+ c1 = (sc->h[1] ^= s1); \
316
+ c0 = (sc->h[0] ^= s0); \
317
+ } while (0)
318
+
319
+ static void
320
+ hamsi_small(sph_hamsi_small_context *sc, const unsigned char *buf, size_t num)
321
+ {
322
+ DECL_STATE_SMALL
323
+ #if !SPH_64
324
+ sph_u32 tmp;
325
+ #endif
326
+
327
+ #if SPH_64
328
+ sc->count += (sph_u64)num << 5;
329
+ #else
330
+ tmp = SPH_T32((sph_u32)num << 5);
331
+ sc->count_low = SPH_T32(sc->count_low + tmp);
332
+ sc->count_high += (sph_u32)((num >> 13) >> 14);
333
+ if (sc->count_low < tmp)
334
+ sc->count_high ++;
335
+ #endif
336
+ READ_STATE_SMALL(sc);
337
+ while (num -- > 0) {
338
+ sph_u32 m0, m1, m2, m3, m4, m5, m6, m7;
339
+
340
+ INPUT_SMALL;
341
+ P_SMALL;
342
+ T_SMALL;
343
+ buf += 4;
344
+ }
345
+ WRITE_STATE_SMALL(sc);
346
+ }
347
+
348
+ static void
349
+ hamsi_small_final(sph_hamsi_small_context *sc, const unsigned char *buf)
350
+ {
351
+ sph_u32 m0, m1, m2, m3, m4, m5, m6, m7;
352
+ DECL_STATE_SMALL
353
+
354
+ READ_STATE_SMALL(sc);
355
+ INPUT_SMALL;
356
+ PF_SMALL;
357
+ T_SMALL;
358
+ WRITE_STATE_SMALL(sc);
359
+ }
360
+
361
+ static void
362
+ hamsi_small_init(sph_hamsi_small_context *sc, const sph_u32 *iv)
363
+ {
364
+ sc->partial_len = 0;
365
+ memcpy(sc->h, iv, sizeof sc->h);
366
+ #if SPH_64
367
+ sc->count = 0;
368
+ #else
369
+ sc->count_high = sc->count_low = 0;
370
+ #endif
371
+ }
372
+
373
+ static void
374
+ hamsi_small_core(sph_hamsi_small_context *sc, const void *data, size_t len)
375
+ {
376
+ if (sc->partial_len != 0) {
377
+ size_t mlen;
378
+
379
+ mlen = 4 - sc->partial_len;
380
+ if (len < mlen) {
381
+ memcpy(sc->partial + sc->partial_len, data, len);
382
+ sc->partial_len += len;
383
+ return;
384
+ } else {
385
+ memcpy(sc->partial + sc->partial_len, data, mlen);
386
+ len -= mlen;
387
+ data = (const unsigned char *)data + mlen;
388
+ hamsi_small(sc, sc->partial, 1);
389
+ sc->partial_len = 0;
390
+ }
391
+ }
392
+
393
+ hamsi_small(sc, data, (len >> 2));
394
+ data = (const unsigned char *)data + (len & ~(size_t)3);
395
+ len &= (size_t)3;
396
+ memcpy(sc->partial, data, len);
397
+ sc->partial_len = len;
398
+ }
399
+
400
+ static void
401
+ hamsi_small_close(sph_hamsi_small_context *sc,
402
+ unsigned ub, unsigned n, void *dst, size_t out_size_w32)
403
+ {
404
+ unsigned char pad[12];
405
+ size_t ptr, u;
406
+ unsigned z;
407
+ unsigned char *out;
408
+
409
+ ptr = sc->partial_len;
410
+ memcpy(pad, sc->partial, ptr);
411
+ #if SPH_64
412
+ sph_enc64be(pad + 4, sc->count + (ptr << 3) + n);
413
+ #else
414
+ sph_enc32be(pad + 4, sc->count_high);
415
+ sph_enc32be(pad + 8, sc->count_low + (ptr << 3) + n);
416
+ #endif
417
+ z = 0x80 >> n;
418
+ pad[ptr ++] = ((ub & -z) | z) & 0xFF;
419
+ while (ptr < 4)
420
+ pad[ptr ++] = 0;
421
+ hamsi_small(sc, pad, 2);
422
+ hamsi_small_final(sc, pad + 8);
423
+ out = dst;
424
+ for (u = 0; u < out_size_w32; u ++)
425
+ sph_enc32be(out + (u << 2), sc->h[u]);
426
+ }
427
+
428
+ #define DECL_STATE_BIG \
429
+ sph_u32 c0, c1, c2, c3, c4, c5, c6, c7; \
430
+ sph_u32 c8, c9, cA, cB, cC, cD, cE, cF;
431
+
432
+ #define READ_STATE_BIG(sc) do { \
433
+ c0 = sc->h[0x0]; \
434
+ c1 = sc->h[0x1]; \
435
+ c2 = sc->h[0x2]; \
436
+ c3 = sc->h[0x3]; \
437
+ c4 = sc->h[0x4]; \
438
+ c5 = sc->h[0x5]; \
439
+ c6 = sc->h[0x6]; \
440
+ c7 = sc->h[0x7]; \
441
+ c8 = sc->h[0x8]; \
442
+ c9 = sc->h[0x9]; \
443
+ cA = sc->h[0xA]; \
444
+ cB = sc->h[0xB]; \
445
+ cC = sc->h[0xC]; \
446
+ cD = sc->h[0xD]; \
447
+ cE = sc->h[0xE]; \
448
+ cF = sc->h[0xF]; \
449
+ } while (0)
450
+
451
+ #define WRITE_STATE_BIG(sc) do { \
452
+ sc->h[0x0] = c0; \
453
+ sc->h[0x1] = c1; \
454
+ sc->h[0x2] = c2; \
455
+ sc->h[0x3] = c3; \
456
+ sc->h[0x4] = c4; \
457
+ sc->h[0x5] = c5; \
458
+ sc->h[0x6] = c6; \
459
+ sc->h[0x7] = c7; \
460
+ sc->h[0x8] = c8; \
461
+ sc->h[0x9] = c9; \
462
+ sc->h[0xA] = cA; \
463
+ sc->h[0xB] = cB; \
464
+ sc->h[0xC] = cC; \
465
+ sc->h[0xD] = cD; \
466
+ sc->h[0xE] = cE; \
467
+ sc->h[0xF] = cF; \
468
+ } while (0)
469
+
470
+ #define s00 m0
471
+ #define s01 m1
472
+ #define s02 c0
473
+ #define s03 c1
474
+ #define s04 m2
475
+ #define s05 m3
476
+ #define s06 c2
477
+ #define s07 c3
478
+ #define s08 c4
479
+ #define s09 c5
480
+ #define s0A m4
481
+ #define s0B m5
482
+ #define s0C c6
483
+ #define s0D c7
484
+ #define s0E m6
485
+ #define s0F m7
486
+ #define s10 m8
487
+ #define s11 m9
488
+ #define s12 c8
489
+ #define s13 c9
490
+ #define s14 mA
491
+ #define s15 mB
492
+ #define s16 cA
493
+ #define s17 cB
494
+ #define s18 cC
495
+ #define s19 cD
496
+ #define s1A mC
497
+ #define s1B mD
498
+ #define s1C cE
499
+ #define s1D cF
500
+ #define s1E mE
501
+ #define s1F mF
502
+
503
+ #define ROUND_BIG(rc, alpha) do { \
504
+ s00 ^= alpha[0x00]; \
505
+ s01 ^= alpha[0x01] ^ (sph_u32)(rc); \
506
+ s02 ^= alpha[0x02]; \
507
+ s03 ^= alpha[0x03]; \
508
+ s04 ^= alpha[0x04]; \
509
+ s05 ^= alpha[0x05]; \
510
+ s06 ^= alpha[0x06]; \
511
+ s07 ^= alpha[0x07]; \
512
+ s08 ^= alpha[0x08]; \
513
+ s09 ^= alpha[0x09]; \
514
+ s0A ^= alpha[0x0A]; \
515
+ s0B ^= alpha[0x0B]; \
516
+ s0C ^= alpha[0x0C]; \
517
+ s0D ^= alpha[0x0D]; \
518
+ s0E ^= alpha[0x0E]; \
519
+ s0F ^= alpha[0x0F]; \
520
+ s10 ^= alpha[0x10]; \
521
+ s11 ^= alpha[0x11]; \
522
+ s12 ^= alpha[0x12]; \
523
+ s13 ^= alpha[0x13]; \
524
+ s14 ^= alpha[0x14]; \
525
+ s15 ^= alpha[0x15]; \
526
+ s16 ^= alpha[0x16]; \
527
+ s17 ^= alpha[0x17]; \
528
+ s18 ^= alpha[0x18]; \
529
+ s19 ^= alpha[0x19]; \
530
+ s1A ^= alpha[0x1A]; \
531
+ s1B ^= alpha[0x1B]; \
532
+ s1C ^= alpha[0x1C]; \
533
+ s1D ^= alpha[0x1D]; \
534
+ s1E ^= alpha[0x1E]; \
535
+ s1F ^= alpha[0x1F]; \
536
+ SBOX(s00, s08, s10, s18); \
537
+ SBOX(s01, s09, s11, s19); \
538
+ SBOX(s02, s0A, s12, s1A); \
539
+ SBOX(s03, s0B, s13, s1B); \
540
+ SBOX(s04, s0C, s14, s1C); \
541
+ SBOX(s05, s0D, s15, s1D); \
542
+ SBOX(s06, s0E, s16, s1E); \
543
+ SBOX(s07, s0F, s17, s1F); \
544
+ L(s00, s09, s12, s1B); \
545
+ L(s01, s0A, s13, s1C); \
546
+ L(s02, s0B, s14, s1D); \
547
+ L(s03, s0C, s15, s1E); \
548
+ L(s04, s0D, s16, s1F); \
549
+ L(s05, s0E, s17, s18); \
550
+ L(s06, s0F, s10, s19); \
551
+ L(s07, s08, s11, s1A); \
552
+ L(s00, s02, s05, s07); \
553
+ L(s10, s13, s15, s16); \
554
+ L(s09, s0B, s0C, s0E); \
555
+ L(s19, s1A, s1C, s1F); \
556
+ } while (0)
557
+
558
+ #if SPH_SMALL_FOOTPRINT_HAMSI
559
+
560
+ #define P_BIG do { \
561
+ unsigned r; \
562
+ for (r = 0; r < 6; r ++) \
563
+ ROUND_BIG(r, alpha_n); \
564
+ } while (0)
565
+
566
+ #define PF_BIG do { \
567
+ unsigned r; \
568
+ for (r = 0; r < 12; r ++) \
569
+ ROUND_BIG(r, alpha_f); \
570
+ } while (0)
571
+
572
+ #else
573
+
574
+ #define P_BIG do { \
575
+ ROUND_BIG(0, alpha_n); \
576
+ ROUND_BIG(1, alpha_n); \
577
+ ROUND_BIG(2, alpha_n); \
578
+ ROUND_BIG(3, alpha_n); \
579
+ ROUND_BIG(4, alpha_n); \
580
+ ROUND_BIG(5, alpha_n); \
581
+ } while (0)
582
+
583
+ #define PF_BIG do { \
584
+ ROUND_BIG(0, alpha_f); \
585
+ ROUND_BIG(1, alpha_f); \
586
+ ROUND_BIG(2, alpha_f); \
587
+ ROUND_BIG(3, alpha_f); \
588
+ ROUND_BIG(4, alpha_f); \
589
+ ROUND_BIG(5, alpha_f); \
590
+ ROUND_BIG(6, alpha_f); \
591
+ ROUND_BIG(7, alpha_f); \
592
+ ROUND_BIG(8, alpha_f); \
593
+ ROUND_BIG(9, alpha_f); \
594
+ ROUND_BIG(10, alpha_f); \
595
+ ROUND_BIG(11, alpha_f); \
596
+ } while (0)
597
+
598
+ #endif
599
+
600
+ #define T_BIG do { \
601
+ /* order is important */ \
602
+ cF = (sc->h[0xF] ^= s17); \
603
+ cE = (sc->h[0xE] ^= s16); \
604
+ cD = (sc->h[0xD] ^= s15); \
605
+ cC = (sc->h[0xC] ^= s14); \
606
+ cB = (sc->h[0xB] ^= s13); \
607
+ cA = (sc->h[0xA] ^= s12); \
608
+ c9 = (sc->h[0x9] ^= s11); \
609
+ c8 = (sc->h[0x8] ^= s10); \
610
+ c7 = (sc->h[0x7] ^= s07); \
611
+ c6 = (sc->h[0x6] ^= s06); \
612
+ c5 = (sc->h[0x5] ^= s05); \
613
+ c4 = (sc->h[0x4] ^= s04); \
614
+ c3 = (sc->h[0x3] ^= s03); \
615
+ c2 = (sc->h[0x2] ^= s02); \
616
+ c1 = (sc->h[0x1] ^= s01); \
617
+ c0 = (sc->h[0x0] ^= s00); \
618
+ } while (0)
619
+
620
+ static void
621
+ hamsi_big(sph_hamsi_big_context *sc, const unsigned char *buf, size_t num)
622
+ {
623
+ DECL_STATE_BIG
624
+ #if !SPH_64
625
+ sph_u32 tmp;
626
+ #endif
627
+
628
+ #if SPH_64
629
+ sc->count += (sph_u64)num << 6;
630
+ #else
631
+ tmp = SPH_T32((sph_u32)num << 6);
632
+ sc->count_low = SPH_T32(sc->count_low + tmp);
633
+ sc->count_high += (sph_u32)((num >> 13) >> 13);
634
+ if (sc->count_low < tmp)
635
+ sc->count_high ++;
636
+ #endif
637
+ READ_STATE_BIG(sc);
638
+ while (num -- > 0) {
639
+ sph_u32 m0, m1, m2, m3, m4, m5, m6, m7;
640
+ sph_u32 m8, m9, mA, mB, mC, mD, mE, mF;
641
+
642
+ INPUT_BIG;
643
+ P_BIG;
644
+ T_BIG;
645
+ buf += 8;
646
+ }
647
+ WRITE_STATE_BIG(sc);
648
+ }
649
+
650
+ static void
651
+ hamsi_big_final(sph_hamsi_big_context *sc, const unsigned char *buf)
652
+ {
653
+ sph_u32 m0, m1, m2, m3, m4, m5, m6, m7;
654
+ sph_u32 m8, m9, mA, mB, mC, mD, mE, mF;
655
+ DECL_STATE_BIG
656
+
657
+ READ_STATE_BIG(sc);
658
+ INPUT_BIG;
659
+ PF_BIG;
660
+ T_BIG;
661
+ WRITE_STATE_BIG(sc);
662
+ }
663
+
664
+ static void
665
+ hamsi_big_init(sph_hamsi_big_context *sc, const sph_u32 *iv)
666
+ {
667
+ sc->partial_len = 0;
668
+ memcpy(sc->h, iv, sizeof sc->h);
669
+ #if SPH_64
670
+ sc->count = 0;
671
+ #else
672
+ sc->count_high = sc->count_low = 0;
673
+ #endif
674
+ }
675
+
676
+ static void
677
+ hamsi_big_core(sph_hamsi_big_context *sc, const void *data, size_t len)
678
+ {
679
+ if (sc->partial_len != 0) {
680
+ size_t mlen;
681
+
682
+ mlen = 8 - sc->partial_len;
683
+ if (len < mlen) {
684
+ memcpy(sc->partial + sc->partial_len, data, len);
685
+ sc->partial_len += len;
686
+ return;
687
+ } else {
688
+ memcpy(sc->partial + sc->partial_len, data, mlen);
689
+ len -= mlen;
690
+ data = (const unsigned char *)data + mlen;
691
+ hamsi_big(sc, sc->partial, 1);
692
+ sc->partial_len = 0;
693
+ }
694
+ }
695
+
696
+ hamsi_big(sc, data, (len >> 3));
697
+ data = (const unsigned char *)data + (len & ~(size_t)7);
698
+ len &= (size_t)7;
699
+ memcpy(sc->partial, data, len);
700
+ sc->partial_len = len;
701
+ }
702
+
703
+ static void
704
+ hamsi_big_close(sph_hamsi_big_context *sc,
705
+ unsigned ub, unsigned n, void *dst, size_t out_size_w32)
706
+ {
707
+ unsigned char pad[8];
708
+ size_t ptr, u;
709
+ unsigned z;
710
+ unsigned char *out;
711
+
712
+ ptr = sc->partial_len;
713
+ #if SPH_64
714
+ sph_enc64be(pad, sc->count + (ptr << 3) + n);
715
+ #else
716
+ sph_enc32be(pad, sc->count_high);
717
+ sph_enc32be(pad + 4, sc->count_low + (ptr << 3) + n);
718
+ #endif
719
+ z = 0x80 >> n;
720
+ sc->partial[ptr ++] = ((ub & -z) | z) & 0xFF;
721
+ while (ptr < 8)
722
+ sc->partial[ptr ++] = 0;
723
+ hamsi_big(sc, sc->partial, 1);
724
+ hamsi_big_final(sc, pad);
725
+ out = dst;
726
+ if (out_size_w32 == 12) {
727
+ sph_enc32be(out + 0, sc->h[ 0]);
728
+ sph_enc32be(out + 4, sc->h[ 1]);
729
+ sph_enc32be(out + 8, sc->h[ 3]);
730
+ sph_enc32be(out + 12, sc->h[ 4]);
731
+ sph_enc32be(out + 16, sc->h[ 5]);
732
+ sph_enc32be(out + 20, sc->h[ 6]);
733
+ sph_enc32be(out + 24, sc->h[ 8]);
734
+ sph_enc32be(out + 28, sc->h[ 9]);
735
+ sph_enc32be(out + 32, sc->h[10]);
736
+ sph_enc32be(out + 36, sc->h[12]);
737
+ sph_enc32be(out + 40, sc->h[13]);
738
+ sph_enc32be(out + 44, sc->h[15]);
739
+ } else {
740
+ for (u = 0; u < 16; u ++)
741
+ sph_enc32be(out + (u << 2), sc->h[u]);
742
+ }
743
+ }
744
+
745
+ /* see sph_hamsi.h */
746
+ void
747
+ sph_hamsi224_init(void *cc)
748
+ {
749
+ hamsi_small_init(cc, IV224);
750
+ }
751
+
752
+ /* see sph_hamsi.h */
753
+ void
754
+ sph_hamsi224(void *cc, const void *data, size_t len)
755
+ {
756
+ hamsi_small_core(cc, data, len);
757
+ }
758
+
759
+ /* see sph_hamsi.h */
760
+ void
761
+ sph_hamsi224_close(void *cc, void *dst)
762
+ {
763
+ hamsi_small_close(cc, 0, 0, dst, 7);
764
+ hamsi_small_init(cc, IV224);
765
+ }
766
+
767
+ /* see sph_hamsi.h */
768
+ void
769
+ sph_hamsi224_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
770
+ {
771
+ hamsi_small_close(cc, ub, n, dst, 7);
772
+ hamsi_small_init(cc, IV224);
773
+ }
774
+
775
+ /* see sph_hamsi.h */
776
+ void
777
+ sph_hamsi256_init(void *cc)
778
+ {
779
+ hamsi_small_init(cc, IV256);
780
+ }
781
+
782
+ /* see sph_hamsi.h */
783
+ void
784
+ sph_hamsi256(void *cc, const void *data, size_t len)
785
+ {
786
+ hamsi_small_core(cc, data, len);
787
+ }
788
+
789
+ /* see sph_hamsi.h */
790
+ void
791
+ sph_hamsi256_close(void *cc, void *dst)
792
+ {
793
+ hamsi_small_close(cc, 0, 0, dst, 8);
794
+ hamsi_small_init(cc, IV256);
795
+ }
796
+
797
+ /* see sph_hamsi.h */
798
+ void
799
+ sph_hamsi256_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
800
+ {
801
+ hamsi_small_close(cc, ub, n, dst, 8);
802
+ hamsi_small_init(cc, IV256);
803
+ }
804
+
805
+ /* see sph_hamsi.h */
806
+ void
807
+ sph_hamsi384_init(void *cc)
808
+ {
809
+ hamsi_big_init(cc, IV384);
810
+ }
811
+
812
+ /* see sph_hamsi.h */
813
+ void
814
+ sph_hamsi384(void *cc, const void *data, size_t len)
815
+ {
816
+ hamsi_big_core(cc, data, len);
817
+ }
818
+
819
+ /* see sph_hamsi.h */
820
+ void
821
+ sph_hamsi384_close(void *cc, void *dst)
822
+ {
823
+ hamsi_big_close(cc, 0, 0, dst, 12);
824
+ hamsi_big_init(cc, IV384);
825
+ }
826
+
827
+ /* see sph_hamsi.h */
828
+ void
829
+ sph_hamsi384_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
830
+ {
831
+ hamsi_big_close(cc, ub, n, dst, 12);
832
+ hamsi_big_init(cc, IV384);
833
+ }
834
+
835
+ /* see sph_hamsi.h */
836
+ void
837
+ sph_hamsi512_init(void *cc)
838
+ {
839
+ hamsi_big_init(cc, IV512);
840
+ }
841
+
842
+ /* see sph_hamsi.h */
843
+ void
844
+ sph_hamsi512(void *cc, const void *data, size_t len)
845
+ {
846
+ hamsi_big_core(cc, data, len);
847
+ }
848
+
849
+ /* see sph_hamsi.h */
850
+ void
851
+ sph_hamsi512_close(void *cc, void *dst)
852
+ {
853
+ hamsi_big_close(cc, 0, 0, dst, 16);
854
+ hamsi_big_init(cc, IV512);
855
+ }
856
+
857
+ /* see sph_hamsi.h */
858
+ void
859
+ sph_hamsi512_addbits_and_close(void *cc, unsigned ub, unsigned n, void *dst)
860
+ {
861
+ hamsi_big_close(cc, ub, n, dst, 16);
862
+ hamsi_big_init(cc, IV512);
863
+ }
864
+
865
+ #ifdef __cplusplus
866
+ }
867
+ #endif