ox 1.1.0 → 1.2.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 (284) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/core/Engine.d.ts +43 -11
  3. package/dist/core/Engine.d.ts.map +1 -1
  4. package/dist/core/Engine.js +40 -10
  5. package/dist/core/Engine.js.map +1 -1
  6. package/dist/core/Hash.d.ts +36 -0
  7. package/dist/core/Hash.d.ts.map +1 -1
  8. package/dist/core/Hash.js +35 -0
  9. package/dist/core/Hash.js.map +1 -1
  10. package/dist/core/internal/engine.d.ts +8 -8
  11. package/dist/core/internal/engine.d.ts.map +1 -1
  12. package/dist/index.d.ts +5 -2
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +5 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/node/Ed25519.d.ts +33 -0
  17. package/dist/node/Ed25519.d.ts.map +1 -0
  18. package/dist/node/Ed25519.js +67 -0
  19. package/dist/node/Ed25519.js.map +1 -0
  20. package/dist/node/Engine.d.ts +29 -16
  21. package/dist/node/Engine.d.ts.map +1 -1
  22. package/dist/node/Engine.js +38 -14
  23. package/dist/node/Engine.js.map +1 -1
  24. package/dist/node/Hash.d.ts +17 -19
  25. package/dist/node/Hash.d.ts.map +1 -1
  26. package/dist/node/Hash.js +17 -19
  27. package/dist/node/Hash.js.map +1 -1
  28. package/dist/node/Keystore.d.ts +36 -0
  29. package/dist/node/Keystore.d.ts.map +1 -0
  30. package/dist/node/Keystore.js +72 -0
  31. package/dist/node/Keystore.js.map +1 -0
  32. package/dist/node/Mnemonic.d.ts +35 -0
  33. package/dist/node/Mnemonic.d.ts.map +1 -0
  34. package/dist/node/Mnemonic.js +46 -0
  35. package/dist/node/Mnemonic.js.map +1 -0
  36. package/dist/node/P256.d.ts +32 -0
  37. package/dist/node/P256.d.ts.map +1 -0
  38. package/dist/node/P256.js +34 -0
  39. package/dist/node/P256.js.map +1 -0
  40. package/dist/node/X25519.d.ts +31 -0
  41. package/dist/node/X25519.d.ts.map +1 -0
  42. package/dist/node/X25519.js +71 -0
  43. package/dist/node/X25519.js.map +1 -0
  44. package/dist/node/index.d.ts +95 -8
  45. package/dist/node/index.d.ts.map +1 -1
  46. package/dist/node/index.js +95 -8
  47. package/dist/node/index.js.map +1 -1
  48. package/dist/trusted-setups/Paths.d.ts +1 -0
  49. package/dist/trusted-setups/Paths.d.ts.map +1 -1
  50. package/dist/trusted-setups/Paths.js +1 -0
  51. package/dist/trusted-setups/Paths.js.map +1 -1
  52. package/dist/trusted-setups/Setups.d.ts +35 -0
  53. package/dist/trusted-setups/Setups.d.ts.map +1 -0
  54. package/dist/trusted-setups/Setups.js +29 -0
  55. package/dist/trusted-setups/Setups.js.map +1 -0
  56. package/dist/trusted-setups/index.d.ts +20 -0
  57. package/dist/trusted-setups/index.d.ts.map +1 -1
  58. package/dist/trusted-setups/index.js +20 -0
  59. package/dist/trusted-setups/index.js.map +1 -1
  60. package/dist/trusted-setups/internal/paths.d.ts.map +1 -1
  61. package/dist/trusted-setups/internal/paths.js +1 -1
  62. package/dist/trusted-setups/internal/paths.js.map +1 -1
  63. package/dist/trusted-setups/internal/setups/mainnet.d.ts +7 -0
  64. package/dist/trusted-setups/internal/setups/mainnet.d.ts.map +1 -0
  65. package/dist/trusted-setups/internal/setups/mainnet.js +11 -0
  66. package/dist/trusted-setups/internal/setups/mainnet.js.map +1 -0
  67. package/dist/wasm/Ed25519.d.ts +35 -0
  68. package/dist/wasm/Ed25519.d.ts.map +1 -0
  69. package/dist/wasm/Ed25519.js +88 -0
  70. package/dist/wasm/Ed25519.js.map +1 -0
  71. package/dist/wasm/Engine.d.ts +36 -26
  72. package/dist/wasm/Engine.d.ts.map +1 -1
  73. package/dist/wasm/Engine.js +44 -25
  74. package/dist/wasm/Engine.js.map +1 -1
  75. package/dist/wasm/Hash.d.ts +13 -19
  76. package/dist/wasm/Hash.d.ts.map +1 -1
  77. package/dist/wasm/Hash.js +21 -27
  78. package/dist/wasm/Hash.js.map +1 -1
  79. package/dist/wasm/Keystore.d.ts +51 -0
  80. package/dist/wasm/Keystore.d.ts.map +1 -0
  81. package/dist/wasm/Keystore.js +51 -0
  82. package/dist/wasm/Keystore.js.map +1 -0
  83. package/dist/wasm/Kzg.d.ts +112 -0
  84. package/dist/wasm/Kzg.d.ts.map +1 -0
  85. package/dist/wasm/Kzg.js +333 -0
  86. package/dist/wasm/Kzg.js.map +1 -0
  87. package/dist/wasm/Mnemonic.d.ts +33 -0
  88. package/dist/wasm/Mnemonic.d.ts.map +1 -0
  89. package/dist/wasm/Mnemonic.js +30 -0
  90. package/dist/wasm/Mnemonic.js.map +1 -0
  91. package/dist/wasm/Secp256k1.d.ts +55 -0
  92. package/dist/wasm/Secp256k1.d.ts.map +1 -0
  93. package/dist/wasm/Secp256k1.js +181 -0
  94. package/dist/wasm/Secp256k1.js.map +1 -0
  95. package/dist/wasm/X25519.d.ts +33 -0
  96. package/dist/wasm/X25519.d.ts.map +1 -0
  97. package/dist/wasm/X25519.js +53 -0
  98. package/dist/wasm/X25519.js.map +1 -0
  99. package/dist/wasm/index.d.ts +124 -12
  100. package/dist/wasm/index.d.ts.map +1 -1
  101. package/dist/wasm/index.js +124 -12
  102. package/dist/wasm/index.js.map +1 -1
  103. package/dist/wasm/internal/blake3.d.ts +11 -0
  104. package/dist/wasm/internal/blake3.d.ts.map +1 -0
  105. package/dist/wasm/internal/blake3.js +31 -0
  106. package/dist/wasm/internal/blake3.js.map +1 -0
  107. package/dist/wasm/internal/blake3.wasm.d.ts +3 -0
  108. package/dist/wasm/internal/blake3.wasm.d.ts.map +1 -0
  109. package/dist/wasm/internal/blake3.wasm.js +10 -0
  110. package/dist/wasm/internal/blake3.wasm.js.map +1 -0
  111. package/dist/wasm/internal/crypto25519.d.ts +16 -0
  112. package/dist/wasm/internal/crypto25519.d.ts.map +1 -0
  113. package/dist/wasm/internal/crypto25519.js +5 -0
  114. package/dist/wasm/internal/crypto25519.js.map +1 -0
  115. package/dist/wasm/internal/crypto25519.wasm.d.ts +3 -0
  116. package/dist/wasm/internal/crypto25519.wasm.d.ts.map +1 -0
  117. package/dist/wasm/internal/crypto25519.wasm.js +10 -0
  118. package/dist/wasm/internal/crypto25519.wasm.js.map +1 -0
  119. package/dist/wasm/internal/ed25519.d.ts +4 -0
  120. package/dist/wasm/internal/ed25519.d.ts.map +1 -0
  121. package/dist/wasm/internal/ed25519.js +21 -0
  122. package/dist/wasm/internal/ed25519.js.map +1 -0
  123. package/dist/wasm/internal/hashes.d.ts +12 -0
  124. package/dist/wasm/internal/hashes.d.ts.map +1 -0
  125. package/dist/wasm/internal/hashes.js +8 -0
  126. package/dist/wasm/internal/hashes.js.map +1 -0
  127. package/dist/wasm/internal/hashes.wasm.d.ts +4 -2
  128. package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -1
  129. package/dist/wasm/internal/hashes.wasm.js +4 -2
  130. package/dist/wasm/internal/hashes.wasm.js.map +1 -1
  131. package/dist/wasm/internal/instantiate.d.ts +12 -0
  132. package/dist/wasm/internal/instantiate.d.ts.map +1 -1
  133. package/dist/wasm/internal/instantiate.js +23 -7
  134. package/dist/wasm/internal/instantiate.js.map +1 -1
  135. package/dist/wasm/internal/keystore.d.ts +10 -0
  136. package/dist/wasm/internal/keystore.d.ts.map +1 -0
  137. package/dist/wasm/internal/keystore.js +10 -0
  138. package/dist/wasm/internal/keystore.js.map +1 -0
  139. package/dist/wasm/internal/kzg.d.ts +17 -0
  140. package/dist/wasm/internal/kzg.d.ts.map +1 -0
  141. package/dist/wasm/internal/kzg.js +8 -0
  142. package/dist/wasm/internal/kzg.js.map +1 -0
  143. package/dist/wasm/internal/kzg.wasm.d.ts +3 -0
  144. package/dist/wasm/internal/kzg.wasm.d.ts.map +1 -0
  145. package/dist/wasm/internal/kzg.wasm.js +10 -0
  146. package/dist/wasm/internal/kzg.wasm.js.map +1 -0
  147. package/dist/wasm/internal/mnemonic.d.ts +4 -0
  148. package/dist/wasm/internal/mnemonic.d.ts.map +1 -0
  149. package/dist/wasm/internal/mnemonic.js +45 -0
  150. package/dist/wasm/internal/mnemonic.js.map +1 -0
  151. package/dist/wasm/internal/pbkdf2.d.ts +12 -0
  152. package/dist/wasm/internal/pbkdf2.d.ts.map +1 -0
  153. package/dist/wasm/internal/pbkdf2.js +51 -0
  154. package/dist/wasm/internal/pbkdf2.js.map +1 -0
  155. package/dist/wasm/internal/scrypt.d.ts +16 -0
  156. package/dist/wasm/internal/scrypt.d.ts.map +1 -0
  157. package/dist/wasm/internal/scrypt.js +78 -0
  158. package/dist/wasm/internal/scrypt.js.map +1 -0
  159. package/dist/wasm/internal/scrypt.wasm.d.ts +7 -0
  160. package/dist/wasm/internal/scrypt.wasm.d.ts.map +1 -0
  161. package/dist/wasm/internal/scrypt.wasm.js +14 -0
  162. package/dist/wasm/internal/scrypt.wasm.js.map +1 -0
  163. package/dist/wasm/internal/secp256k1.d.ts +16 -0
  164. package/dist/wasm/internal/secp256k1.d.ts.map +1 -0
  165. package/dist/wasm/internal/secp256k1.js +20 -0
  166. package/dist/wasm/internal/secp256k1.js.map +1 -0
  167. package/dist/wasm/internal/secp256k1.wasm.d.ts +3 -0
  168. package/dist/wasm/internal/secp256k1.wasm.d.ts.map +1 -0
  169. package/dist/wasm/internal/secp256k1.wasm.js +10 -0
  170. package/dist/wasm/internal/secp256k1.wasm.js.map +1 -0
  171. package/dist/wasm/internal/x25519.d.ts +4 -0
  172. package/dist/wasm/internal/x25519.d.ts.map +1 -0
  173. package/dist/wasm/internal/x25519.js +21 -0
  174. package/dist/wasm/internal/x25519.js.map +1 -0
  175. package/package.json +64 -2
  176. package/src/core/Engine.ts +84 -11
  177. package/src/core/Hash.ts +59 -0
  178. package/src/core/_test/Block.test.ts +9 -2
  179. package/src/core/_test/Engine.test-d.ts +56 -0
  180. package/src/core/_test/Engine.test.ts +95 -0
  181. package/src/core/_test/Hash.test-d.ts +18 -0
  182. package/src/core/_test/Hash.test.ts +100 -1
  183. package/src/core/_test/Hash.vectors.test.ts +7 -0
  184. package/src/core/_test/Transaction.test.ts +11 -2
  185. package/src/core/internal/engine.ts +8 -8
  186. package/src/index.ts +5 -2
  187. package/src/node/Ed25519.ts +87 -0
  188. package/src/node/Engine.ts +79 -23
  189. package/src/node/Hash.ts +25 -30
  190. package/src/node/Keystore.ts +103 -0
  191. package/src/node/Mnemonic.ts +68 -0
  192. package/src/node/P256.ts +48 -0
  193. package/src/node/X25519.ts +93 -0
  194. package/src/node/_test/Curves.fuzz.ts +76 -0
  195. package/src/node/_test/Ed25519.test-d.ts +35 -0
  196. package/src/node/_test/Ed25519.test.ts +220 -0
  197. package/src/node/_test/Engine.test-d.ts +28 -0
  198. package/src/node/_test/Engine.test.ts +62 -22
  199. package/src/node/_test/Hash.test-d.ts +16 -9
  200. package/src/node/_test/Hash.test.ts +10 -11
  201. package/src/node/_test/Keystore.fuzz.ts +58 -0
  202. package/src/node/_test/Keystore.test-d.ts +43 -0
  203. package/src/node/_test/Keystore.test.ts +198 -0
  204. package/src/node/_test/Mnemonic.fuzz.ts +31 -0
  205. package/src/node/_test/Mnemonic.test-d.ts +21 -0
  206. package/src/node/_test/Mnemonic.test.ts +98 -0
  207. package/src/node/_test/P256.test-d.ts +29 -0
  208. package/src/node/_test/P256.test.ts +102 -0
  209. package/src/node/_test/X25519.test-d.ts +28 -0
  210. package/src/node/_test/X25519.test.ts +239 -0
  211. package/src/node/index.ts +100 -8
  212. package/src/trusted-setups/Paths.ts +1 -0
  213. package/src/trusted-setups/README.md +39 -0
  214. package/src/trusted-setups/Setups.ts +46 -0
  215. package/src/trusted-setups/_test/Paths.test.ts +16 -0
  216. package/src/trusted-setups/_test/Setups.test-d.ts +7 -0
  217. package/src/trusted-setups/_test/Setups.test.ts +43 -0
  218. package/src/trusted-setups/_test/index.test.ts +1 -0
  219. package/src/trusted-setups/index.ts +21 -0
  220. package/src/trusted-setups/internal/paths.ts +4 -1
  221. package/src/trusted-setups/internal/setups/mainnet.source.json +7 -0
  222. package/src/trusted-setups/internal/setups/mainnet.ts +16 -0
  223. package/src/version.ts +1 -1
  224. package/src/wasm/Ed25519.ts +114 -0
  225. package/src/wasm/Engine.ts +78 -31
  226. package/src/wasm/Hash.bench.ts +2 -2
  227. package/src/wasm/Hash.ts +29 -50
  228. package/src/wasm/Keystore.bench.ts +26 -0
  229. package/src/wasm/Keystore.ts +66 -0
  230. package/src/wasm/Kzg.bench.ts +63 -0
  231. package/src/wasm/Kzg.ts +518 -0
  232. package/src/wasm/Mnemonic.ts +44 -0
  233. package/src/wasm/Secp256k1.bench.ts +79 -0
  234. package/src/wasm/Secp256k1.ts +248 -0
  235. package/src/wasm/X25519.ts +70 -0
  236. package/src/wasm/_test/Crypto25519.conformance.ts +57 -0
  237. package/src/wasm/_test/Crypto25519.fuzz.ts +187 -0
  238. package/src/wasm/_test/Ed25519.test-d.ts +28 -0
  239. package/src/wasm/_test/Ed25519.test.ts +168 -0
  240. package/src/wasm/_test/Ed25519.vectors.test.ts +73 -0
  241. package/src/wasm/_test/Engine.test-d.ts +29 -0
  242. package/src/wasm/_test/Engine.test.ts +59 -25
  243. package/src/wasm/_test/Hash.browser.test.ts +14 -7
  244. package/src/wasm/_test/Hash.fuzz.ts +58 -23
  245. package/src/wasm/_test/Hash.test-d.ts +16 -10
  246. package/src/wasm/_test/Hash.test.ts +148 -48
  247. package/src/wasm/_test/Hash.vectors.test.ts +15 -8
  248. package/src/wasm/_test/Keystore.browser.test.ts +73 -0
  249. package/src/wasm/_test/Keystore.fuzz.ts +163 -0
  250. package/src/wasm/_test/Keystore.test-d.ts +42 -0
  251. package/src/wasm/_test/Keystore.test.ts +477 -0
  252. package/src/wasm/_test/Keystore.vectors.test.ts +21 -0
  253. package/src/wasm/_test/Kzg.test-d.ts +19 -0
  254. package/src/wasm/_test/Kzg.test.ts +220 -0
  255. package/src/wasm/_test/Mnemonic.test-d.ts +17 -0
  256. package/src/wasm/_test/Mnemonic.test.ts +110 -0
  257. package/src/wasm/_test/Runtime.test.ts +9 -0
  258. package/src/wasm/_test/Secp256k1.test-d.ts +35 -0
  259. package/src/wasm/_test/Secp256k1.test.ts +354 -0
  260. package/src/wasm/_test/X25519.test-d.ts +21 -0
  261. package/src/wasm/_test/X25519.test.ts +194 -0
  262. package/src/wasm/_test/fixtures.ts +4 -0
  263. package/src/wasm/index.ts +130 -12
  264. package/src/wasm/internal/blake3.ts +45 -0
  265. package/src/wasm/internal/blake3.wasm.ts +11 -0
  266. package/src/wasm/internal/crypto25519.ts +43 -0
  267. package/src/wasm/internal/crypto25519.wasm.ts +11 -0
  268. package/src/wasm/internal/ed25519.ts +31 -0
  269. package/src/wasm/internal/hashes.ts +29 -0
  270. package/src/wasm/internal/hashes.wasm.ts +5 -2
  271. package/src/wasm/internal/instantiate.ts +29 -9
  272. package/src/wasm/internal/keystore.ts +19 -0
  273. package/src/wasm/internal/kzg.ts +50 -0
  274. package/src/wasm/internal/kzg.wasm.ts +11 -0
  275. package/src/wasm/internal/mnemonic.ts +56 -0
  276. package/src/wasm/internal/pbkdf2.ts +86 -0
  277. package/src/wasm/internal/scrypt.ts +131 -0
  278. package/src/wasm/internal/scrypt.wasm.ts +17 -0
  279. package/src/wasm/internal/secp256k1.ts +62 -0
  280. package/src/wasm/internal/secp256k1.wasm.ts +11 -0
  281. package/src/wasm/internal/x25519.ts +29 -0
  282. package/wasm/vendor/c-kzg-4844/LICENSE +201 -0
  283. package/wasm/vendor/c-kzg-4844/blst/LICENSE +201 -0
  284. package/src/trusted-setups/internal/setups/mainnet.txt +0 -4163
@@ -0,0 +1,56 @@
1
+ import type { Module } from './crypto25519.js'
2
+
3
+ const encoder = new TextEncoder()
4
+ const seedSize = 64
5
+ const wordCounts = [12, 15, 18, 21, 24]
6
+
7
+ /** Derives a BIP-39 seed and clears encoded and staged secret material. */
8
+ export function toSeed(
9
+ module: Module,
10
+ mnemonic: string,
11
+ passphrase = '',
12
+ ): Uint8Array {
13
+ const password = encoder.encode(normalize(mnemonic))
14
+ try {
15
+ const salt = encoder.encode(normalizeSalt(passphrase))
16
+ try {
17
+ const size = password.length + salt.length + seedSize
18
+ module.reserve(size)
19
+ const passwordPtr = module.heapBase
20
+ const saltPtr = passwordPtr + password.length
21
+ const seedPtr = saltPtr + salt.length
22
+ try {
23
+ const memory = module.view()
24
+ memory.set(password, passwordPtr)
25
+ memory.set(salt, saltPtr)
26
+ module.exports.mnemonic_to_seed(
27
+ passwordPtr,
28
+ password.length,
29
+ saltPtr,
30
+ salt.length,
31
+ seedPtr,
32
+ )
33
+ return module.view().slice(seedPtr, seedPtr + seedSize)
34
+ } finally {
35
+ module.exports.zero(passwordPtr, size)
36
+ }
37
+ } finally {
38
+ salt.fill(0)
39
+ }
40
+ } finally {
41
+ password.fill(0)
42
+ }
43
+ }
44
+
45
+ function normalize(mnemonic: string): string {
46
+ if (typeof mnemonic !== 'string')
47
+ throw new TypeError(`invalid mnemonic type: ${typeof mnemonic}`)
48
+ const normalized = mnemonic.normalize('NFKD')
49
+ if (!wordCounts.includes(normalized.split(' ').length))
50
+ throw new Error('Invalid mnemonic')
51
+ return normalized
52
+ }
53
+
54
+ function normalizeSalt(passphrase: string): string {
55
+ return `mnemonic${passphrase}`.normalize('NFKD')
56
+ }
@@ -0,0 +1,86 @@
1
+ import { pbkdf2Sha256ScratchSize } from './hashes.wasm.js'
2
+ import { MemoryError, type Module } from './instantiate.js'
3
+
4
+ /** WASM exports used by the PBKDF2-HMAC-SHA256 loader. @internal */
5
+ export type Exports = {
6
+ pbkdf2_sha256(
7
+ password: number,
8
+ passwordLength: number,
9
+ salt: number,
10
+ saltLength: number,
11
+ iterations: number,
12
+ out: number,
13
+ outLength: number,
14
+ scratch: number,
15
+ ): void
16
+ zero(ptr: number, length: number): void
17
+ }
18
+
19
+ const maximumUint32 = 0xffff_ffff
20
+ const wasm32Size = 0x1_0000_0000
21
+
22
+ /** Calls PBKDF2-HMAC-SHA256 and clears its complete linear-memory region. */
23
+ export function pbkdf2Sha256(
24
+ module: Module<Exports>,
25
+ password: Uint8Array,
26
+ salt: Uint8Array,
27
+ options: { c: number; dkLen: number },
28
+ ): Uint8Array {
29
+ const { c, dkLen } = options
30
+ assertPositiveUint32(c, 'c')
31
+ assertPositiveUint32(dkLen, 'dkLen')
32
+
33
+ const passwordLength = password.length
34
+ const saltLength = salt.length
35
+ if (saltLength > maximumUint32 - 4)
36
+ throw new RangeError(
37
+ `"salt" length must be <= ${maximumUint32 - 4}, got ${saltLength}`,
38
+ )
39
+
40
+ const passwordPtr = module.heapBase
41
+ const saltPtr = passwordPtr + passwordLength
42
+ const outPtr = saltPtr + saltLength + 4
43
+ const scratchPtr = align4(outPtr + dkLen)
44
+ const end = scratchPtr + pbkdf2Sha256ScratchSize
45
+ if (!Number.isSafeInteger(end) || end > wasm32Size)
46
+ throw new MemoryError({
47
+ bytes: end,
48
+ cause: new RangeError('PBKDF2 workspace exceeds wasm32 memory.'),
49
+ })
50
+
51
+ module.reserve(end - passwordPtr)
52
+ const view = module.view()
53
+ try {
54
+ view.set(password, passwordPtr)
55
+ view.set(salt, saltPtr)
56
+ module.exports.pbkdf2_sha256(
57
+ passwordPtr,
58
+ passwordLength,
59
+ saltPtr,
60
+ saltLength,
61
+ c,
62
+ outPtr,
63
+ dkLen,
64
+ scratchPtr,
65
+ )
66
+ return module.view().slice(outPtr, outPtr + dkLen)
67
+ } finally {
68
+ // This includes the password, salt and counter, staged output, alignment
69
+ // padding, and every byte of PBKDF2/HMAC working state.
70
+ module.exports.zero(passwordPtr, end - passwordPtr)
71
+ }
72
+ }
73
+
74
+ function align4(value: number) {
75
+ return Math.ceil(value / 4) * 4
76
+ }
77
+
78
+ function assertPositiveUint32(value: number, name: string) {
79
+ if (typeof value !== 'number')
80
+ throw new TypeError(`"${name}" expected number, got ${typeof value}`)
81
+ if (!Number.isSafeInteger(value) || value < 0)
82
+ throw new RangeError(`"${name}" expected integer >= 0, got ${value}`)
83
+ if (value < 1) throw new Error(`"${name}" must be >= 1`)
84
+ if (value > maximumUint32)
85
+ throw new RangeError(`"${name}" must be <= ${maximumUint32}, got ${value}`)
86
+ }
@@ -0,0 +1,131 @@
1
+ import {
2
+ scryptMaxMemory,
3
+ scryptScratchSize,
4
+ wasmBase64,
5
+ } from './scrypt.wasm.js'
6
+ import * as internal from './instantiate.js'
7
+
8
+ /** Exports supplied by the standalone scrypt artifact. @internal */
9
+ export type Exports = {
10
+ scrypt(
11
+ password: number,
12
+ passwordLength: number,
13
+ salt: number,
14
+ saltLength: number,
15
+ N: number,
16
+ r: number,
17
+ p: number,
18
+ out: number,
19
+ outLength: number,
20
+ B: number,
21
+ V: number,
22
+ tmp: number,
23
+ scratch: number,
24
+ ): void
25
+ zero(ptr: number, length: number): void
26
+ }
27
+
28
+ const maximumWorkspace = 1024 ** 3 + 1024
29
+ const pow32 = 2 ** 32
30
+ const active = new WeakSet<internal.Module<Exports>>()
31
+
32
+ const instantiate = /*#__PURE__*/ internal.memoize(() =>
33
+ internal.instantiate<Exports>(wasmBase64),
34
+ )
35
+
36
+ /** Returns the one memoized scrypt instance shared by its providers. */
37
+ export function load() {
38
+ return instantiate()
39
+ }
40
+
41
+ /** Derives a key through a loaded scrypt module. @internal */
42
+ export function derive(
43
+ module: internal.Module<Exports>,
44
+ password: Uint8Array,
45
+ salt: Uint8Array,
46
+ options: { N: number; dkLen: number; p: number; r: number },
47
+ ): Uint8Array {
48
+ const { N, dkLen, p, r } = options
49
+ assertNumber(N, 'N')
50
+ assertNumber(r, 'r')
51
+ assertNumber(p, 'p')
52
+ assertNumber(dkLen, 'dkLen')
53
+
54
+ const blockSize = 128 * r
55
+ if (N <= 1 || (N & (N - 1)) !== 0 || N > pow32)
56
+ throw new Error('"N" expected a power of 2, and 2^1 <= N <= 2^32')
57
+ if (p < 1 || p > ((pow32 - 1) * 32) / blockSize)
58
+ throw new Error('"p" expected integer 1..((2^32 - 1) * 32) / (128 * r)')
59
+ if (dkLen < 1 || dkLen > (pow32 - 1) * 32)
60
+ throw new Error('"dkLen" expected integer 1..(2^32 - 1) * 32')
61
+
62
+ const workspace = blockSize * (N + p + 1)
63
+ if (workspace > maximumWorkspace)
64
+ throw new Error(
65
+ `"maxmem" limit was hit: memUsed(128*r*(N+p+1))=${workspace}, maxmem=${maximumWorkspace}`,
66
+ )
67
+ if (blockSize === 0) throw new Error('"dkLen" must be >= 1')
68
+
69
+ const passwordPtr = module.heapBase
70
+ const saltPtr = passwordPtr + password.length
71
+ const outPtr = saltPtr + salt.length + 4
72
+ const bPtr = align4(outPtr + dkLen)
73
+ const bLength = blockSize * p
74
+ const vPtr = align4(bPtr + bLength + 4)
75
+ const vLength = blockSize * N
76
+ const tmpPtr = vPtr + vLength
77
+ const scratchPtr = align4(tmpPtr + blockSize)
78
+ const end = scratchPtr + scryptScratchSize
79
+ if (!Number.isSafeInteger(end) || end > scryptMaxMemory)
80
+ throw new internal.MemoryError({
81
+ bytes: end,
82
+ cause: new RangeError('Scrypt workspace exceeds the WASM memory limit.'),
83
+ })
84
+
85
+ if (active.has(module))
86
+ throw new Error('The scrypt WASM instance is already deriving a key.')
87
+ active.add(module)
88
+
89
+ const size = end - passwordPtr
90
+ let reserved = false
91
+ try {
92
+ module.reserve(size)
93
+ reserved = true
94
+ const view = module.view()
95
+ view.set(password, passwordPtr)
96
+ view.set(salt, saltPtr)
97
+ module.exports.scrypt(
98
+ passwordPtr,
99
+ password.length,
100
+ saltPtr,
101
+ salt.length,
102
+ N,
103
+ r,
104
+ p,
105
+ outPtr,
106
+ dkLen,
107
+ bPtr,
108
+ vPtr,
109
+ tmpPtr,
110
+ scratchPtr,
111
+ )
112
+ return module.view().slice(outPtr, outPtr + dkLen)
113
+ } finally {
114
+ try {
115
+ if (reserved) module.exports.zero(passwordPtr, size)
116
+ } finally {
117
+ active.delete(module)
118
+ }
119
+ }
120
+ }
121
+
122
+ function align4(value: number) {
123
+ return Math.ceil(value / 4) * 4
124
+ }
125
+
126
+ function assertNumber(value: number, name: string) {
127
+ if (typeof value !== 'number')
128
+ throw new TypeError(`"${name}" expected number, got ${typeof value}`)
129
+ if (!Number.isSafeInteger(value) || value < 0)
130
+ throw new RangeError(`"${name}" expected integer >= 0, got ${value}`)
131
+ }
@@ -0,0 +1,17 @@
1
+ // Generated by `pnpm wasm:build --target=scrypt`. Do not edit.
2
+ //
3
+ // Compiled from wasm/src/scrypt.c, wasm/src/ox_rt.c
4
+ // with wasi-sdk 25.0 + binaryen 123.
5
+ //
6
+ // `pnpm wasm:check` rebuilds this file and fails if the bytes differ, so any
7
+ // change to the C or to `wasm/targets.ts` must be followed by `pnpm wasm:build`.
8
+
9
+ /** Base64-encoded WASM binary. */
10
+ export const wasmBase64 =
11
+ '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IAZzIgUgCmpBEncgDXMiBiASakEHd3MiCCAGakEJdyAVcyEMIAggDGpBDXcgEnMiECAMakESdyAGcyENIBQgBSASIBZqQQ13IAtzIgsgFmpBEncgBHMiBCAHakEHd3MiBiAEakEJd3MhBSAFIAUgBmpBDXcgB3MiB2pBEncgBHMhBCAVIBdqQRJ3IAFzIgEgCWpBB3cgC3MiCyABakEJdyAKcyIKIAtqQQ13IAlzIQkgCSAKakESdyABcyEBIBNBAmoiE0EGSQ0ACyADIA42AtAEIAMgATYCoAQgAyAMNgLABCADIAc2ArAEIAMgBDYCtAQgAyAPNgLUBCADIBA2AsQEIAMgCzYCpAQgAyANNgLIBCADIBE2AtgEIAMgBjYCuAQgAyACNgLcBCADIAo2AqgEIAMgCDYCzAQgAyAFNgK8BCADIAk2AqwEIAAgAygC4AQgAWo2AgAgACADKALkBCADKAKkBGo2AgQgACADKALoBCADKAKoBGo2AgggACADKALsBCADKAKsBGo2AgwgACADKALwBCADKAKwBGo2AhAgACADKAL0BCADKAK0BGo2AhQgACADKAL4BCADKAK4BGo2AhggACADKAL8BCADKAK8BGo2AhwgACADKAKABSADKALABGo2AiAgACADKAKEBSADKALEBGo2AiQgACADKAKIBSADKALIBGo2AiggACADKAKMBSADKALMBGo2AiwgACADKAKQBSADKALQBGo2AjAgACADKAKUBSADKALUBGo2AjQgACADKAKYBSADKALYBGo2AjggACADKAKcBSADKALcBGo2AjwL7AUBCX8gASIIQcAATwRAA0AgBCAAIApqIAYQBCAKQUBrIQogCEFAaiIIQT9LDQALC0GAAUHAACAIQTdLGyENA0AgBSAHakIANwAAIA0gB0EIaiIHRw0ACwJAIAhFDQAgCEEDcSELQQAhByAIQQRPBEAgACAKaiEOIAhBPHEhDwNAIAUgB2oiCSAHIA5qIgwtAAA6AAAgCUEBaiAMQQFqLQAAOgAAIAlBAmogDEECai0AADoAACAJQQNqIAxBA2otAAA6AAAgDyAHQQRqIgdHDQALCyALRQ0AIAUgB2ohCSAAIAcgCmpqIQcDQCAJIActAAA6AAAgB0EBaiEHIAlBAWohCSALQQFrIgsNAAsLIAUgCGpBgAE6AAAgBSAN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'
12
+
13
+ /** Constant shared with the module's C source. */
14
+ export const scryptMaxMemory = 1074790400
15
+
16
+ /** Constant shared with the module's C source. */
17
+ export const scryptScratchSize = 672
@@ -0,0 +1,62 @@
1
+ import { wasmBase64 } from './secp256k1.wasm.js'
2
+ import {
3
+ instantiate,
4
+ memoize,
5
+ type Module as WasmModule,
6
+ } from './instantiate.js'
7
+
8
+ export type Exports = {
9
+ secp256k1_get_public_key(privateKey: number, publicKey: number): number
10
+ secp256k1_get_shared_secret(
11
+ privateKey: number,
12
+ publicKey: number,
13
+ publicKeySize: number,
14
+ sharedSecret: number,
15
+ ): number
16
+ secp256k1_init(): number
17
+ secp256k1_randomize(seed: number): number
18
+ secp256k1_recover_public_key(
19
+ signature: number,
20
+ message: number,
21
+ messageSize: number,
22
+ publicKey: number,
23
+ ): number
24
+ secp256k1_sign(
25
+ message: number,
26
+ messageSize: number,
27
+ privateKey: number,
28
+ entropy: number,
29
+ entropySize: number,
30
+ prehash: number,
31
+ signature: number,
32
+ ): number
33
+ secp256k1_verify(
34
+ signature: number,
35
+ message: number,
36
+ messageSize: number,
37
+ publicKey: number,
38
+ publicKeySize: number,
39
+ prehash: number,
40
+ ): number
41
+ zero(pointer: number, length: number): void
42
+ }
43
+
44
+ /** Instantiated secp256k1 module. */
45
+ export type Module = WasmModule<Exports>
46
+
47
+ /** Instantiates and initializes the secp256k1 module once. */
48
+ export const load = memoize(async () => {
49
+ const module = await instantiate<Exports>(wasmBase64)
50
+ if (module.exports.secp256k1_init() !== 1)
51
+ throw new Error('WASM secp256k1 context could not be initialized.')
52
+ const seed = crypto.getRandomValues(new Uint8Array(32))
53
+ module.reserve(seed.length)
54
+ try {
55
+ module.view().set(seed, module.heapBase)
56
+ if (module.exports.secp256k1_randomize(module.heapBase) !== 1)
57
+ throw new Error('WASM secp256k1 context could not be randomized.')
58
+ } finally {
59
+ module.exports.zero(module.heapBase, seed.length)
60
+ }
61
+ return module
62
+ })