You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

416 lines
12 KiB

  1. package cryptonight
  2. type size_t uint32
  3. type __locale_data struct {
  4. }
  5. type __locale_t struct {
  6. __locales [][]__locale_data
  7. __ctype_b []uint16
  8. __ctype_tolower []int
  9. __ctype_toupper []int
  10. __names [][]byte
  11. }
  12. type locale_t struct {
  13. __locales [][]__locale_data
  14. __ctype_b []uint16
  15. __ctype_tolower []int
  16. __ctype_toupper []int
  17. __names [][]byte
  18. }
  19. type ptrdiff_t int32
  20. type wchar_t int
  21. type max_align_t struct {
  22. __clang_max_align_nonce1 int64
  23. __clang_max_align_nonce2 float64
  24. }
  25. var sbox []uint8 = []uint8{99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22}
  26. var mul2 []uint8 = []uint8{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 27, 25, 31, 29, 19, 17, 23, 21, 11, 9, 15, 13, 3, 1, 7, 5, 59, 57, 63, 61, 51, 49, 55, 53, 43, 41, 47, 45, 35, 33, 39, 37, 91, 89, 95, 93, 83, 81, 87, 85, 75, 73, 79, 77, 67, 65, 71, 69, 123, 121, 127, 125, 115, 113, 119, 117, 107, 105, 111, 109, 99, 97, 103, 101, 155, 153, 159, 157, 147, 145, 151, 149, 139, 137, 143, 141, 131, 129, 135, 133, 187, 185, 191, 189, 179, 177, 183, 181, 171, 169, 175, 173, 163, 161, 167, 165, 219, 217, 223, 221, 211, 209, 215, 213, 203, 201, 207, 205, 195, 193, 199, 197, 251, 249, 255, 253, 243, 241, 247, 245, 235, 233, 239, 237, 227, 225, 231, 229}
  27. func mix_bytes(i0 uint8, i1 uint8, i2 uint8, i3 uint8, i4 uint8, i5 uint8, i6 uint8, i7 uint8, output []uint8) {
  28. var t0 uint8
  29. var t1 uint8
  30. var t2 uint8
  31. var t3 uint8
  32. var t4 uint8
  33. var t5 uint8
  34. var t6 uint8
  35. var t7 uint8
  36. var x0 uint8
  37. var x1 uint8
  38. var x2 uint8
  39. var x3 uint8
  40. var x4 uint8
  41. var x5 uint8
  42. var x6 uint8
  43. var x7 uint8
  44. var y0 uint8
  45. var y1 uint8
  46. var y2 uint8
  47. var y3 uint8
  48. var y4 uint8
  49. var y5 uint8
  50. var y6 uint8
  51. var y7 uint8
  52. t0 = i0 ^ i1
  53. t1 = i1 ^ i2
  54. t2 = i2 ^ i3
  55. t3 = i3 ^ i4
  56. t4 = i4 ^ i5
  57. t5 = i5 ^ i6
  58. t6 = i6 ^ i7
  59. t7 = i7 ^ i0
  60. x0 = t0 ^ t3
  61. x1 = t1 ^ t4
  62. x2 = t2 ^ t5
  63. x3 = t3 ^ t6
  64. x4 = t4 ^ t7
  65. x5 = t5 ^ t0
  66. x6 = t6 ^ t1
  67. x7 = t7 ^ t2
  68. y0 = t0 ^ t2 ^ i6
  69. y1 = t1 ^ t3 ^ i7
  70. y2 = t2 ^ t4 ^ i0
  71. y3 = t3 ^ t5 ^ i1
  72. y4 = t4 ^ t6 ^ i2
  73. y5 = t5 ^ t7 ^ i3
  74. y6 = t6 ^ t0 ^ i4
  75. y7 = t7 ^ t1 ^ i5
  76. x3 = func() uint8 {
  77. if (x3 & 128) != 0 {
  78. return (x3 << uint64(1)) ^ 27
  79. } else {
  80. return (x3 << uint64(1))
  81. }
  82. }()
  83. x0 = func() uint8 {
  84. if (x0 & 128) != 0 {
  85. return (x0 << uint64(1)) ^ 27
  86. } else {
  87. return (x0 << uint64(1))
  88. }
  89. }()
  90. t0 = x3 ^ y7
  91. t0 = func() uint8 {
  92. if (t0 & 128) != 0 {
  93. return (t0 << uint64(1)) ^ 27
  94. } else {
  95. return (t0 << uint64(1))
  96. }
  97. }()
  98. t5 = x0 ^ y4
  99. t5 = func() uint8 {
  100. if (t5 & 128) != 0 {
  101. return (t5 << uint64(1)) ^ 27
  102. } else {
  103. return (t5 << uint64(1))
  104. }
  105. }()
  106. output[0] = t0 ^ y4
  107. output[5] = t5 ^ y1
  108. output[1] = mul2[mul2[x4]^y0] ^ y5
  109. output[2] = mul2[mul2[x5]^y1] ^ y6
  110. output[3] = mul2[mul2[x6]^y2] ^ y7
  111. output[4] = mul2[mul2[x7]^y3] ^ y0
  112. output[6] = mul2[mul2[x1]^y5] ^ y2
  113. output[7] = mul2[mul2[x2]^y6] ^ y3
  114. }
  115. func perm_P(input []uint8, output []uint8) {
  116. var r0 uint8
  117. var r1 uint8
  118. var r2 uint8
  119. var r3 uint8
  120. var r4 uint8
  121. var r5 uint8
  122. var r6 uint8
  123. var r7 uint8
  124. var round uint8
  125. var state []uint8 = make([]uint8, 64, 64)
  126. var write []uint8 = state
  127. var read []uint8 = input
  128. var p_tmp []uint8
  129. for {
  130. break
  131. }
  132. {
  133. for round = uint8(0); round < 10; func() uint8 {
  134. round += 1
  135. return round
  136. }() {
  137. r0 = sbox[read[0]^round]
  138. r1 = sbox[read[9]]
  139. r2 = sbox[read[18]]
  140. r3 = sbox[read[27]]
  141. r4 = sbox[read[36]]
  142. r5 = sbox[read[45]]
  143. r6 = sbox[read[54]]
  144. r7 = sbox[read[63]]
  145. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write)
  146. r0 = sbox[read[8]^round^16]
  147. r1 = sbox[read[17]]
  148. r2 = sbox[read[26]]
  149. r3 = sbox[read[35]]
  150. r4 = sbox[read[44]]
  151. r5 = sbox[read[53]]
  152. r6 = sbox[read[62]]
  153. r7 = sbox[read[7]]
  154. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[8:])
  155. r0 = sbox[read[16]^round^32]
  156. r1 = sbox[read[25]]
  157. r2 = sbox[read[34]]
  158. r3 = sbox[read[43]]
  159. r4 = sbox[read[52]]
  160. r5 = sbox[read[61]]
  161. r6 = sbox[read[6]]
  162. r7 = sbox[read[15]]
  163. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[16:])
  164. r0 = sbox[read[24]^round^48]
  165. r1 = sbox[read[33]]
  166. r2 = sbox[read[42]]
  167. r3 = sbox[read[51]]
  168. r4 = sbox[read[60]]
  169. r5 = sbox[read[5]]
  170. r6 = sbox[read[14]]
  171. r7 = sbox[read[23]]
  172. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[24:])
  173. r0 = sbox[read[32]^round^64]
  174. r1 = sbox[read[41]]
  175. r2 = sbox[read[50]]
  176. r3 = sbox[read[59]]
  177. r4 = sbox[read[4]]
  178. r5 = sbox[read[13]]
  179. r6 = sbox[read[22]]
  180. r7 = sbox[read[31]]
  181. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[32:])
  182. r0 = sbox[read[40]^round^80]
  183. r1 = sbox[read[49]]
  184. r2 = sbox[read[58]]
  185. r3 = sbox[read[3]]
  186. r4 = sbox[read[12]]
  187. r5 = sbox[read[21]]
  188. r6 = sbox[read[30]]
  189. r7 = sbox[read[39]]
  190. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[40:])
  191. r0 = sbox[read[48]^round^96]
  192. r1 = sbox[read[57]]
  193. r2 = sbox[read[2]]
  194. r3 = sbox[read[11]]
  195. r4 = sbox[read[20]]
  196. r5 = sbox[read[29]]
  197. r6 = sbox[read[38]]
  198. r7 = sbox[read[47]]
  199. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[48:])
  200. r0 = sbox[read[56]^round^112]
  201. r1 = sbox[read[1]]
  202. r2 = sbox[read[10]]
  203. r3 = sbox[read[19]]
  204. r4 = sbox[read[28]]
  205. r5 = sbox[read[37]]
  206. r6 = sbox[read[46]]
  207. r7 = sbox[read[55]]
  208. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[56:])
  209. if round == uint8(0) {
  210. read = output
  211. }
  212. p_tmp = read
  213. read = write
  214. write = p_tmp
  215. }
  216. }
  217. }
  218. func perm_Q(input []uint8, output []uint8) {
  219. var r0 uint8
  220. var r1 uint8
  221. var r2 uint8
  222. var r3 uint8
  223. var r4 uint8
  224. var r5 uint8
  225. var r6 uint8
  226. var r7 uint8
  227. var round uint8
  228. var state []uint8 = make([]uint8, 64, 64)
  229. var write []uint8 = state
  230. var read []uint8 = input
  231. var p_tmp []uint8
  232. for {
  233. break
  234. }
  235. {
  236. for round = uint8(0); round < 10; func() uint8 {
  237. round += 1
  238. return round
  239. }() {
  240. r0 = sbox[read[8]^255]
  241. r1 = sbox[read[25]^255]
  242. r2 = sbox[read[42]^255]
  243. r3 = sbox[read[59]^255]
  244. r4 = sbox[read[4]^255]
  245. r5 = sbox[read[21]^255]
  246. r6 = sbox[read[38]^255]
  247. r7 = sbox[read[55]^159^round]
  248. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write)
  249. r0 = sbox[read[16]^255]
  250. r1 = sbox[read[33]^255]
  251. r2 = sbox[read[50]^255]
  252. r3 = sbox[read[3]^255]
  253. r4 = sbox[read[12]^255]
  254. r5 = sbox[read[29]^255]
  255. r6 = sbox[read[46]^255]
  256. r7 = sbox[read[63]^143^round]
  257. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[8:])
  258. r0 = sbox[read[24]^255]
  259. r1 = sbox[read[41]^255]
  260. r2 = sbox[read[58]^255]
  261. r3 = sbox[read[11]^255]
  262. r4 = sbox[read[20]^255]
  263. r5 = sbox[read[37]^255]
  264. r6 = sbox[read[54]^255]
  265. r7 = sbox[read[7]^255^round]
  266. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[16:])
  267. r0 = sbox[read[32]^255]
  268. r1 = sbox[read[49]^255]
  269. r2 = sbox[read[2]^255]
  270. r3 = sbox[read[19]^255]
  271. r4 = sbox[read[28]^255]
  272. r5 = sbox[read[45]^255]
  273. r6 = sbox[read[62]^255]
  274. r7 = sbox[read[15]^239^round]
  275. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[24:])
  276. r0 = sbox[read[40]^255]
  277. r1 = sbox[read[57]^255]
  278. r2 = sbox[read[10]^255]
  279. r3 = sbox[read[27]^255]
  280. r4 = sbox[read[36]^255]
  281. r5 = sbox[read[53]^255]
  282. r6 = sbox[read[6]^255]
  283. r7 = sbox[read[23]^223^round]
  284. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[32:])
  285. r0 = sbox[read[48]^255]
  286. r1 = sbox[read[1]^255]
  287. r2 = sbox[read[18]^255]
  288. r3 = sbox[read[35]^255]
  289. r4 = sbox[read[44]^255]
  290. r5 = sbox[read[61]^255]
  291. r6 = sbox[read[14]^255]
  292. r7 = sbox[read[31]^207^round]
  293. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[40:])
  294. r0 = sbox[read[56]^255]
  295. r1 = sbox[read[9]^255]
  296. r2 = sbox[read[26]^255]
  297. r3 = sbox[read[43]^255]
  298. r4 = sbox[read[52]^255]
  299. r5 = sbox[read[5]^255]
  300. r6 = sbox[read[22]^255]
  301. r7 = sbox[read[39]^191^round]
  302. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[48:])
  303. r0 = sbox[read[0]^255]
  304. r1 = sbox[read[17]^255]
  305. r2 = sbox[read[34]^255]
  306. r3 = sbox[read[51]^255]
  307. r4 = sbox[read[60]^255]
  308. r5 = sbox[read[13]^255]
  309. r6 = sbox[read[30]^255]
  310. r7 = sbox[read[47]^175^round]
  311. mix_bytes(r0, r1, r2, r3, r4, r5, r6, r7, write[56:])
  312. if round == uint8(0) {
  313. read = output
  314. }
  315. p_tmp = read
  316. read = write
  317. write = p_tmp
  318. }
  319. }
  320. }
  321. func crypto_hash(out []uint8, in []uint8, inlen uint64) int {
  322. if inlen >= (1 << uint64(16)) {
  323. return -1
  324. }
  325. var msg_len uint32 = uint32(uint32(inlen))
  326. var padded_len uint32 = ((msg_len+9-1)/64)*64 + 64
  327. var pad_block_len uint8 = uint8(padded_len - msg_len)
  328. var pad_block []uint8 = make([]uint8, pad_block_len, pad_block_len)
  329. pad_block[0] = uint8(128)
  330. var blocks uint32 = uint32((padded_len >> uint64(6)))
  331. pad_block[pad_block_len-1] = (uint8(blocks) & 255)
  332. var h_state []uint8 = make([]uint8, 64, 64)
  333. var p_state []uint8 = make([]uint8, 64, 64)
  334. var q_state []uint8 = make([]uint8, 64, 64)
  335. var x_state []uint8 = make([]uint8, 64, 64)
  336. var buf []uint8 = make([]uint8, 64, 64)
  337. h_state[62] = uint8(1)
  338. var i uint8
  339. var block uint32
  340. var remaining uint32 = uint32(0)
  341. var message_left_len uint32 = msg_len
  342. for {
  343. break
  344. }
  345. {
  346. for block = uint32(0); block < blocks; func() uint32 {
  347. block += 1
  348. return block
  349. }() {
  350. if block*64+64 < msg_len {
  351. //memcpy(buf, in+64*block, uint32(64))
  352. copy(buf, in[64*block:64*block+64]) //copy full block
  353. message_left_len -= 64
  354. } else {
  355. if message_left_len > 0 {
  356. remaining = uint32(64 - message_left_len)
  357. //memcpy(buf, in+64*block, message_left_len)
  358. copy(buf, in[64*block:64*block+message_left_len])
  359. //memcpy(buf+message_left_len, pad_block, uint32(remaining))
  360. copy(buf[message_left_len:], pad_block[:remaining])
  361. message_left_len = uint32(0)
  362. } else {
  363. //memcpy(buf, pad_block+remaining, uint32(64))
  364. copy(buf, pad_block[remaining:remaining+64])
  365. }
  366. }
  367. for {
  368. break
  369. }
  370. {
  371. for i = uint8(0); i < 64; func() uint8 {
  372. i += 1
  373. return i
  374. }() {
  375. x_state[i] = buf[i] ^ h_state[i]
  376. }
  377. }
  378. perm_P(x_state, p_state)
  379. perm_Q(buf, q_state)
  380. for {
  381. break
  382. }
  383. {
  384. for i = uint8(0); i < 64; func() uint8 {
  385. i += 1
  386. return i
  387. }() {
  388. h_state[i] ^= p_state[i] ^ q_state[i]
  389. }
  390. }
  391. }
  392. }
  393. perm_P(h_state, p_state)
  394. for {
  395. break
  396. }
  397. {
  398. for i = uint8(32); i < 64; func() uint8 {
  399. i += 1
  400. return i
  401. }() {
  402. out[i-32] = h_state[i] ^ p_state[i]
  403. }
  404. }
  405. return 0
  406. }
  407. func __init() {
  408. }