ox 1.0.4 → 1.1.0

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 (230) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/core/Base64.d.ts +10 -21
  3. package/dist/core/Base64.d.ts.map +1 -1
  4. package/dist/core/Base64.js +8 -127
  5. package/dist/core/Base64.js.map +1 -1
  6. package/dist/core/BinaryStateTree.d.ts.map +1 -1
  7. package/dist/core/BinaryStateTree.js +2 -2
  8. package/dist/core/BinaryStateTree.js.map +1 -1
  9. package/dist/core/Bls.d.ts.map +1 -1
  10. package/dist/core/Bls.js +19 -44
  11. package/dist/core/Bls.js.map +1 -1
  12. package/dist/core/Ed25519.d.ts.map +1 -1
  13. package/dist/core/Ed25519.js +7 -6
  14. package/dist/core/Ed25519.js.map +1 -1
  15. package/dist/core/Engine.d.ts +124 -0
  16. package/dist/core/Engine.d.ts.map +1 -0
  17. package/dist/core/Engine.js +180 -0
  18. package/dist/core/Engine.js.map +1 -0
  19. package/dist/core/Hash.d.ts +4 -4
  20. package/dist/core/Hash.d.ts.map +1 -1
  21. package/dist/core/Hash.js +9 -12
  22. package/dist/core/Hash.js.map +1 -1
  23. package/dist/core/Keystore.d.ts.map +1 -1
  24. package/dist/core/Keystore.js +15 -10
  25. package/dist/core/Keystore.js.map +1 -1
  26. package/dist/core/Mnemonic.d.ts.map +1 -1
  27. package/dist/core/Mnemonic.js +3 -2
  28. package/dist/core/Mnemonic.js.map +1 -1
  29. package/dist/core/P256.d.ts.map +1 -1
  30. package/dist/core/P256.js +8 -9
  31. package/dist/core/P256.js.map +1 -1
  32. package/dist/core/Secp256k1.d.ts.map +1 -1
  33. package/dist/core/Secp256k1.js +8 -9
  34. package/dist/core/Secp256k1.js.map +1 -1
  35. package/dist/core/WebCryptoP256.d.ts.map +1 -1
  36. package/dist/core/WebCryptoP256.js +2 -2
  37. package/dist/core/WebCryptoP256.js.map +1 -1
  38. package/dist/core/X25519.d.ts.map +1 -1
  39. package/dist/core/X25519.js +4 -3
  40. package/dist/core/X25519.js.map +1 -1
  41. package/dist/core/internal/bls.d.ts +12 -0
  42. package/dist/core/internal/bls.d.ts.map +1 -0
  43. package/dist/core/internal/bls.js +79 -0
  44. package/dist/core/internal/bls.js.map +1 -0
  45. package/dist/core/internal/codec/base64.d.ts +84 -0
  46. package/dist/core/internal/codec/base64.d.ts.map +1 -0
  47. package/dist/core/internal/codec/base64.js +177 -0
  48. package/dist/core/internal/codec/base64.js.map +1 -0
  49. package/dist/core/internal/codec/hex.d.ts +49 -4
  50. package/dist/core/internal/codec/hex.d.ts.map +1 -1
  51. package/dist/core/internal/codec/hex.js +109 -35
  52. package/dist/core/internal/codec/hex.js.map +1 -1
  53. package/dist/core/internal/curves.d.ts +17 -0
  54. package/dist/core/internal/curves.d.ts.map +1 -0
  55. package/dist/core/internal/curves.js +17 -0
  56. package/dist/core/internal/curves.js.map +1 -0
  57. package/dist/core/internal/ed25519.d.ts +14 -0
  58. package/dist/core/internal/ed25519.d.ts.map +1 -0
  59. package/dist/core/internal/ed25519.js +29 -0
  60. package/dist/core/internal/ed25519.js.map +1 -0
  61. package/dist/core/internal/engine.d.ts +278 -0
  62. package/dist/core/internal/engine.d.ts.map +1 -0
  63. package/dist/core/internal/engine.js +131 -0
  64. package/dist/core/internal/engine.js.map +1 -0
  65. package/dist/core/internal/hash.d.ts +12 -0
  66. package/dist/core/internal/hash.d.ts.map +1 -0
  67. package/dist/core/internal/hash.js +30 -0
  68. package/dist/core/internal/hash.js.map +1 -0
  69. package/dist/core/internal/keystore.d.ts +14 -0
  70. package/dist/core/internal/keystore.d.ts.map +1 -0
  71. package/dist/core/internal/keystore.js +32 -0
  72. package/dist/core/internal/keystore.js.map +1 -0
  73. package/dist/core/internal/mnemonic.d.ts +4 -0
  74. package/dist/core/internal/mnemonic.d.ts.map +1 -0
  75. package/dist/core/internal/mnemonic.js +14 -0
  76. package/dist/core/internal/mnemonic.js.map +1 -0
  77. package/dist/core/internal/p256.d.ts +14 -0
  78. package/dist/core/internal/p256.d.ts.map +1 -0
  79. package/dist/core/internal/p256.js +36 -0
  80. package/dist/core/internal/p256.js.map +1 -0
  81. package/dist/core/internal/secp256k1.d.ts +14 -0
  82. package/dist/core/internal/secp256k1.d.ts.map +1 -0
  83. package/dist/core/internal/secp256k1.js +36 -0
  84. package/dist/core/internal/secp256k1.js.map +1 -0
  85. package/dist/core/internal/x25519.d.ts +8 -0
  86. package/dist/core/internal/x25519.d.ts.map +1 -0
  87. package/dist/core/internal/x25519.js +20 -0
  88. package/dist/core/internal/x25519.js.map +1 -0
  89. package/dist/index.d.ts +35 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.docs.d.ts +2 -0
  92. package/dist/index.docs.d.ts.map +1 -1
  93. package/dist/index.docs.js +2 -0
  94. package/dist/index.docs.js.map +1 -1
  95. package/dist/index.js +35 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/node/Engine.d.ts +55 -0
  98. package/dist/node/Engine.d.ts.map +1 -0
  99. package/dist/node/Engine.js +51 -0
  100. package/dist/node/Engine.js.map +1 -0
  101. package/dist/node/Hash.d.ts +39 -0
  102. package/dist/node/Hash.d.ts.map +1 -0
  103. package/dist/node/Hash.js +37 -0
  104. package/dist/node/Hash.js.map +1 -0
  105. package/dist/node/index.d.ts +39 -0
  106. package/dist/node/index.d.ts.map +1 -0
  107. package/dist/node/index.js +39 -0
  108. package/dist/node/index.js.map +1 -0
  109. package/dist/tempo/VirtualMaster.d.ts +2 -0
  110. package/dist/tempo/VirtualMaster.d.ts.map +1 -1
  111. package/dist/tempo/VirtualMaster.js +19 -5
  112. package/dist/tempo/VirtualMaster.js.map +1 -1
  113. package/dist/tempo/ZoneId.d.ts +35 -17
  114. package/dist/tempo/ZoneId.d.ts.map +1 -1
  115. package/dist/tempo/ZoneId.js +41 -16
  116. package/dist/tempo/ZoneId.js.map +1 -1
  117. package/dist/tempo/index.d.ts +5 -6
  118. package/dist/tempo/index.d.ts.map +1 -1
  119. package/dist/tempo/index.js +5 -6
  120. package/dist/tempo/index.js.map +1 -1
  121. package/dist/tempo/internal/mine.wasm.d.ts +2 -4
  122. package/dist/tempo/internal/mine.wasm.d.ts.map +1 -1
  123. package/dist/tempo/internal/mine.wasm.js +7 -12
  124. package/dist/tempo/internal/mine.wasm.js.map +1 -1
  125. package/dist/tempo/internal/virtualMasterPool.js +4 -1
  126. package/dist/tempo/internal/virtualMasterPool.js.map +1 -1
  127. package/dist/wasm/Engine.d.ts +62 -0
  128. package/dist/wasm/Engine.d.ts.map +1 -0
  129. package/dist/wasm/Engine.js +57 -0
  130. package/dist/wasm/Engine.js.map +1 -0
  131. package/dist/wasm/Hash.d.ts +49 -0
  132. package/dist/wasm/Hash.d.ts.map +1 -0
  133. package/dist/wasm/Hash.js +70 -0
  134. package/dist/wasm/Hash.js.map +1 -0
  135. package/dist/wasm/index.d.ts +46 -0
  136. package/dist/wasm/index.d.ts.map +1 -0
  137. package/dist/wasm/index.js +46 -0
  138. package/dist/wasm/index.js.map +1 -0
  139. package/dist/wasm/internal/hash.d.ts +9 -0
  140. package/dist/wasm/internal/hash.d.ts.map +1 -0
  141. package/dist/wasm/internal/hash.js +26 -0
  142. package/dist/wasm/internal/hash.js.map +1 -0
  143. package/dist/wasm/internal/hashes.wasm.d.ts +5 -0
  144. package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -0
  145. package/dist/wasm/internal/hashes.wasm.js +12 -0
  146. package/dist/wasm/internal/hashes.wasm.js.map +1 -0
  147. package/dist/wasm/internal/instantiate.d.ts +56 -0
  148. package/dist/wasm/internal/instantiate.d.ts.map +1 -0
  149. package/dist/wasm/internal/instantiate.js +92 -0
  150. package/dist/wasm/internal/instantiate.js.map +1 -0
  151. package/dist/zod/TypedData.d.ts +12 -12
  152. package/package.json +36 -1
  153. package/src/core/Base64.ts +19 -166
  154. package/src/core/BinaryStateTree.ts +2 -3
  155. package/src/core/Bls.ts +27 -77
  156. package/src/core/Ed25519.ts +7 -7
  157. package/src/core/Engine.ts +235 -0
  158. package/src/core/Hash.ts +9 -12
  159. package/src/core/Keystore.ts +17 -17
  160. package/src/core/Mnemonic.ts +3 -6
  161. package/src/core/P256.ts +15 -24
  162. package/src/core/Rlp_tx.bench.ts +2 -4
  163. package/src/core/Secp256k1.ts +9 -14
  164. package/src/core/TxEnvelopeEip1559.bench.ts +0 -5
  165. package/src/core/WebCryptoP256.ts +2 -2
  166. package/src/core/X25519.ts +4 -3
  167. package/src/core/_test/AbiParameters.adversarial.fuzz.ts +1 -2
  168. package/src/core/_test/AbiParameters.fuzz.ts +1 -2
  169. package/src/core/_test/Base.fuzz.ts +1 -2
  170. package/src/core/_test/Cbor.fuzz.ts +1 -2
  171. package/src/core/_test/Engine.fuzz.ts +293 -0
  172. package/src/core/_test/Engine.test-d.ts +84 -0
  173. package/src/core/_test/Engine.test.ts +523 -0
  174. package/src/core/_test/Hash.vectors.test.ts +56 -0
  175. package/src/core/_test/Hex.fuzz.ts +1 -2
  176. package/src/core/_test/Rlp.fuzz.ts +1 -2
  177. package/src/core/_test/Signature.fuzz.ts +1 -2
  178. package/src/core/_test/curves.test.ts +7 -0
  179. package/src/core/_test/index.test.ts +1 -0
  180. package/src/core/internal/bls.ts +121 -0
  181. package/src/core/internal/codec/_test/base64.conformance.ts +156 -0
  182. package/src/core/internal/codec/_test/hex.conformance.ts +204 -0
  183. package/src/core/internal/codec/_test/hex.fuzz.ts +234 -0
  184. package/src/core/internal/codec/_test/hex.test.ts +124 -0
  185. package/src/core/internal/codec/base64.ts +222 -0
  186. package/src/core/internal/codec/hex.ts +115 -34
  187. package/src/core/internal/curves.ts +18 -0
  188. package/src/core/internal/ed25519.ts +64 -0
  189. package/src/core/internal/engine.ts +410 -0
  190. package/src/core/internal/hash.ts +48 -0
  191. package/src/core/internal/keystore.ts +107 -0
  192. package/src/core/internal/mnemonic.ts +18 -0
  193. package/src/core/internal/p256.ts +91 -0
  194. package/src/core/internal/secp256k1.ts +91 -0
  195. package/src/core/internal/x25519.ts +40 -0
  196. package/src/index.docs.ts +2 -0
  197. package/src/index.ts +36 -0
  198. package/src/node/Engine.ts +69 -0
  199. package/src/node/Hash.ts +56 -0
  200. package/src/node/_test/Engine.test.ts +62 -0
  201. package/src/node/_test/Hash.test-d.ts +26 -0
  202. package/src/node/_test/Hash.test.ts +102 -0
  203. package/src/node/index.ts +40 -0
  204. package/src/tempo/VirtualMaster.test.ts +75 -0
  205. package/src/tempo/VirtualMaster.ts +28 -6
  206. package/src/tempo/ZoneId.test-d.ts +16 -0
  207. package/src/tempo/ZoneId.test.ts +48 -13
  208. package/src/tempo/ZoneId.ts +55 -19
  209. package/src/tempo/index.ts +5 -6
  210. package/src/tempo/internal/mine.wasm.ts +7 -13
  211. package/src/tempo/internal/virtualMasterPool.ts +4 -1
  212. package/src/tsconfig.json +2 -1
  213. package/src/version.ts +1 -1
  214. package/src/wasm/Engine.ts +76 -0
  215. package/src/wasm/Hash.bench.ts +60 -0
  216. package/src/wasm/Hash.ts +109 -0
  217. package/src/wasm/_test/Engine.test.ts +62 -0
  218. package/src/wasm/_test/Hash.browser.test.ts +50 -0
  219. package/src/wasm/_test/Hash.fuzz.ts +188 -0
  220. package/src/wasm/_test/Hash.test-d.ts +28 -0
  221. package/src/wasm/_test/Hash.test.ts +211 -0
  222. package/src/wasm/_test/Hash.vectors.test.ts +117 -0
  223. package/src/wasm/_test/Runtime.test.ts +21 -0
  224. package/src/wasm/_test/runtime.wasm.ts +11 -0
  225. package/src/wasm/index.ts +47 -0
  226. package/src/wasm/internal/hash.ts +50 -0
  227. package/src/wasm/internal/hashes.wasm.ts +14 -0
  228. package/src/wasm/internal/instantiate.ts +135 -0
  229. package/src/zod/tempo/_test/ZoneId.test.ts +2 -2
  230. package/src/tempo/internal/mine.c +0 -182
@@ -1,182 +0,0 @@
1
- // TIP-1022 salt mining — isomorphic WASM (Node + browser).
2
- // Specialized single-block keccak256 for 52-byte input.
3
- //
4
- // Memory layout at offset 1024:
5
- // [0..19] address (set by JS)
6
- // [20..51] salt (set by JS, incremented in-place)
7
- // [52..83] hash out (written on match)
8
-
9
- typedef unsigned char uint8_t;
10
- typedef unsigned int uint32_t;
11
- typedef unsigned long long uint64_t;
12
-
13
- #define DATA_OFFSET 1024
14
-
15
- // ---------------------------------------------------------------------------
16
- // Keccak-f[1600] — fully unrolled, native uint64_t → wasm i64.
17
- // Based on XKCP / hash-wasm structure.
18
- // ---------------------------------------------------------------------------
19
-
20
- #define ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n))))
21
-
22
- static const uint64_t RC[24] = {
23
- 0x0000000000000001ULL, 0x0000000000008082ULL, 0x800000000000808aULL,
24
- 0x8000000080008000ULL, 0x000000000000808bULL, 0x0000000080000001ULL,
25
- 0x8000000080008081ULL, 0x8000000000008009ULL, 0x000000000000008aULL,
26
- 0x0000000000000088ULL, 0x0000000080008009ULL, 0x000000008000000aULL,
27
- 0x000000008000808bULL, 0x800000000000008bULL, 0x8000000000008089ULL,
28
- 0x8000000000008003ULL, 0x8000000000008002ULL, 0x8000000000000080ULL,
29
- 0x000000000000800aULL, 0x800000008000000aULL, 0x8000000080008081ULL,
30
- 0x8000000000008080ULL, 0x0000000080000001ULL, 0x8000000080008008ULL,
31
- };
32
-
33
- // Theta — fully unrolled column parity + diffusion
34
- #define XORED(i) (A[(i)] ^ A[(i)+5] ^ A[(i)+10] ^ A[(i)+15] ^ A[(i)+20])
35
-
36
- static inline void theta(uint64_t *A) {
37
- uint64_t D[5];
38
- D[0] = ROTL64(XORED(1), 1) ^ XORED(4);
39
- D[1] = ROTL64(XORED(2), 1) ^ XORED(0);
40
- D[2] = ROTL64(XORED(3), 1) ^ XORED(1);
41
- D[3] = ROTL64(XORED(4), 1) ^ XORED(2);
42
- D[4] = ROTL64(XORED(0), 1) ^ XORED(3);
43
- A[ 0]^=D[0]; A[ 1]^=D[1]; A[ 2]^=D[2]; A[ 3]^=D[3]; A[ 4]^=D[4];
44
- A[ 5]^=D[0]; A[ 6]^=D[1]; A[ 7]^=D[2]; A[ 8]^=D[3]; A[ 9]^=D[4];
45
- A[10]^=D[0]; A[11]^=D[1]; A[12]^=D[2]; A[13]^=D[3]; A[14]^=D[4];
46
- A[15]^=D[0]; A[16]^=D[1]; A[17]^=D[2]; A[18]^=D[3]; A[19]^=D[4];
47
- A[20]^=D[0]; A[21]^=D[1]; A[22]^=D[2]; A[23]^=D[3]; A[24]^=D[4];
48
- }
49
-
50
- // Rho — explicit per-lane rotations with compile-time constants
51
- static inline void rho(uint64_t *A) {
52
- A[ 1] = ROTL64(A[ 1], 1); A[ 2] = ROTL64(A[ 2], 62);
53
- A[ 3] = ROTL64(A[ 3], 28); A[ 4] = ROTL64(A[ 4], 27);
54
- A[ 5] = ROTL64(A[ 5], 36); A[ 6] = ROTL64(A[ 6], 44);
55
- A[ 7] = ROTL64(A[ 7], 6); A[ 8] = ROTL64(A[ 8], 55);
56
- A[ 9] = ROTL64(A[ 9], 20); A[10] = ROTL64(A[10], 3);
57
- A[11] = ROTL64(A[11], 10); A[12] = ROTL64(A[12], 43);
58
- A[13] = ROTL64(A[13], 25); A[14] = ROTL64(A[14], 39);
59
- A[15] = ROTL64(A[15], 41); A[16] = ROTL64(A[16], 45);
60
- A[17] = ROTL64(A[17], 15); A[18] = ROTL64(A[18], 21);
61
- A[19] = ROTL64(A[19], 8); A[20] = ROTL64(A[20], 18);
62
- A[21] = ROTL64(A[21], 2); A[22] = ROTL64(A[22], 61);
63
- A[23] = ROTL64(A[23], 56); A[24] = ROTL64(A[24], 14);
64
- }
65
-
66
- // Pi — single-temporary rotation chain (no scratch buffer)
67
- static inline void pi(uint64_t *A) {
68
- uint64_t A1 = A[1];
69
- A[ 1]=A[ 6]; A[ 6]=A[ 9]; A[ 9]=A[22]; A[22]=A[14]; A[14]=A[20];
70
- A[20]=A[ 2]; A[ 2]=A[12]; A[12]=A[13]; A[13]=A[19]; A[19]=A[23];
71
- A[23]=A[15]; A[15]=A[ 4]; A[ 4]=A[24]; A[24]=A[21]; A[21]=A[ 8];
72
- A[ 8]=A[16]; A[16]=A[ 5]; A[ 5]=A[ 3]; A[ 3]=A[18]; A[18]=A[17];
73
- A[17]=A[11]; A[11]=A[ 7]; A[ 7]=A[10]; A[10]=A1;
74
- }
75
-
76
- // Chi — unrolled nonlinear step
77
- #define CHI_ROW(i) { \
78
- uint64_t a0 = A[(i)], a1 = A[(i)+1]; \
79
- A[(i) ] ^= ~a1 & A[(i)+2]; \
80
- A[(i)+1] ^= ~A[(i)+2] & A[(i)+3]; \
81
- A[(i)+2] ^= ~A[(i)+3] & A[(i)+4]; \
82
- A[(i)+3] ^= ~A[(i)+4] & a0; \
83
- A[(i)+4] ^= ~a0 & a1; \
84
- }
85
-
86
- static inline void chi(uint64_t *A) {
87
- CHI_ROW(0); CHI_ROW(5); CHI_ROW(10); CHI_ROW(15); CHI_ROW(20);
88
- }
89
-
90
- static void keccak_f1600(uint64_t *A) {
91
- for (int r = 0; r < 24; r++) {
92
- theta(A); rho(A); pi(A); chi(A);
93
- A[0] ^= RC[r];
94
- }
95
- }
96
-
97
- // ---------------------------------------------------------------------------
98
- // Helpers
99
- // ---------------------------------------------------------------------------
100
-
101
- static inline uint64_t load64_le(const uint8_t *p) {
102
- return (uint64_t)p[0] | ((uint64_t)p[1] << 8) |
103
- ((uint64_t)p[2] <<16)| ((uint64_t)p[3] << 24) |
104
- ((uint64_t)p[4] <<32)| ((uint64_t)p[5] << 40) |
105
- ((uint64_t)p[6] <<48)| ((uint64_t)p[7] << 56);
106
- }
107
-
108
- static inline void store64_le(uint8_t *p, uint64_t v) {
109
- p[0]=(uint8_t)v; p[1]=(uint8_t)(v>>8); p[2]=(uint8_t)(v>>16); p[3]=(uint8_t)(v>>24);
110
- p[4]=(uint8_t)(v>>32); p[5]=(uint8_t)(v>>40); p[6]=(uint8_t)(v>>48); p[7]=(uint8_t)(v>>56);
111
- }
112
-
113
- static inline uint32_t load32_le(const uint8_t *p) {
114
- return (uint32_t)p[0] | ((uint32_t)p[1]<<8) | ((uint32_t)p[2]<<16) | ((uint32_t)p[3]<<24);
115
- }
116
-
117
- // ---------------------------------------------------------------------------
118
- // Mining entry point
119
- // ---------------------------------------------------------------------------
120
-
121
- __attribute__((export_name("mine")))
122
- int mine(int count) {
123
- uint8_t *mem = (uint8_t *)DATA_OFFSET;
124
- uint8_t *addr = mem; // 20 bytes
125
- uint8_t *salt = mem + 20; // 32 bytes
126
- uint8_t *hout = mem + 52; // 32 bytes
127
-
128
- // Pre-build base state for 52-byte keccak256 (one block, rate=136).
129
- // Block = [address(20) | salt(32) | 0x01 | zeros | 0x80]
130
- // Only lanes 0..6 are non-zero from the message, plus padding in lanes 6 & 16.
131
- uint64_t base[25];
132
- for (int i = 0; i < 25; i++) base[i] = 0;
133
-
134
- // Load address into lanes 0..2 (bytes 0..23, only 0..19 used)
135
- uint8_t buf[24];
136
- for (int i = 0; i < 20; i++) buf[i] = addr[i];
137
- for (int i = 20; i < 24; i++) buf[i] = 0;
138
- base[0] = load64_le(buf);
139
- base[1] = load64_le(buf + 8);
140
- base[2] = load64_le(buf + 16);
141
-
142
- // Keccak padding: byte 52 = 0x01, byte 135 = 0x80
143
- // Lane 6 (bytes 48..55): byte 52 = lane offset 4 → bit 32
144
- base[6] = (uint64_t)0x01 << 32;
145
- // Lane 16 (bytes 128..135): byte 135 = lane offset 7 → bit 56
146
- base[16] = (uint64_t)0x80 << 56;
147
-
148
- for (int iter = 0; iter < count; iter++) {
149
- // Copy base, XOR salt.
150
- // Salt occupies bytes 20..51 → lanes 2..6.
151
- uint64_t A[25];
152
- for (int i = 0; i < 25; i++) A[i] = base[i];
153
-
154
- // Lane 2 (bytes 16..23): upper 4 bytes = salt[0..3]
155
- A[2] ^= (uint64_t)load32_le(salt) << 32;
156
- // Lane 3 (bytes 24..31): salt[4..11]
157
- A[3] ^= load64_le(salt + 4);
158
- // Lane 4 (bytes 32..39): salt[12..19]
159
- A[4] ^= load64_le(salt + 12);
160
- // Lane 5 (bytes 40..47): salt[20..27]
161
- A[5] ^= load64_le(salt + 20);
162
- // Lane 6 (bytes 48..55): lower 4 bytes = salt[28..31]
163
- A[6] ^= (uint64_t)load32_le(salt + 28);
164
-
165
- keccak_f1600(A);
166
-
167
- // PoW check: first 4 bytes = low 32 bits of lane 0 must be zero.
168
- if ((uint32_t)A[0] == 0) {
169
- for (int i = 0; i < 4; i++)
170
- store64_le(hout + i * 8, A[i]);
171
- return 1;
172
- }
173
-
174
- // Increment big-endian salt.
175
- for (int i = 31; i >= 0; i--) {
176
- if (salt[i] < 0xFF) { salt[i]++; break; }
177
- salt[i] = 0;
178
- }
179
- }
180
-
181
- return 0;
182
- }