ox 1.1.0 → 1.1.2

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 (184) hide show
  1. package/CHANGELOG.md +27 -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/internal/engine.d.ts +8 -8
  7. package/dist/core/internal/engine.d.ts.map +1 -1
  8. package/dist/index.d.ts +5 -2
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +5 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/node/Ed25519.d.ts +33 -0
  13. package/dist/node/Ed25519.d.ts.map +1 -0
  14. package/dist/node/Ed25519.js +67 -0
  15. package/dist/node/Ed25519.js.map +1 -0
  16. package/dist/node/Engine.d.ts +29 -16
  17. package/dist/node/Engine.d.ts.map +1 -1
  18. package/dist/node/Engine.js +38 -14
  19. package/dist/node/Engine.js.map +1 -1
  20. package/dist/node/Hash.d.ts +14 -16
  21. package/dist/node/Hash.d.ts.map +1 -1
  22. package/dist/node/Hash.js +14 -16
  23. package/dist/node/Hash.js.map +1 -1
  24. package/dist/node/Keystore.d.ts +36 -0
  25. package/dist/node/Keystore.d.ts.map +1 -0
  26. package/dist/node/Keystore.js +72 -0
  27. package/dist/node/Keystore.js.map +1 -0
  28. package/dist/node/Mnemonic.d.ts +35 -0
  29. package/dist/node/Mnemonic.d.ts.map +1 -0
  30. package/dist/node/Mnemonic.js +46 -0
  31. package/dist/node/Mnemonic.js.map +1 -0
  32. package/dist/node/P256.d.ts +32 -0
  33. package/dist/node/P256.d.ts.map +1 -0
  34. package/dist/node/P256.js +34 -0
  35. package/dist/node/P256.js.map +1 -0
  36. package/dist/node/X25519.d.ts +31 -0
  37. package/dist/node/X25519.d.ts.map +1 -0
  38. package/dist/node/X25519.js +71 -0
  39. package/dist/node/X25519.js.map +1 -0
  40. package/dist/node/index.d.ts +95 -8
  41. package/dist/node/index.d.ts.map +1 -1
  42. package/dist/node/index.js +95 -8
  43. package/dist/node/index.js.map +1 -1
  44. package/dist/wasm/Ed25519.d.ts +35 -0
  45. package/dist/wasm/Ed25519.d.ts.map +1 -0
  46. package/dist/wasm/Ed25519.js +88 -0
  47. package/dist/wasm/Ed25519.js.map +1 -0
  48. package/dist/wasm/Engine.d.ts +35 -26
  49. package/dist/wasm/Engine.d.ts.map +1 -1
  50. package/dist/wasm/Engine.js +44 -25
  51. package/dist/wasm/Engine.js.map +1 -1
  52. package/dist/wasm/Hash.d.ts +13 -19
  53. package/dist/wasm/Hash.d.ts.map +1 -1
  54. package/dist/wasm/Hash.js +21 -27
  55. package/dist/wasm/Hash.js.map +1 -1
  56. package/dist/wasm/Keystore.d.ts +37 -0
  57. package/dist/wasm/Keystore.d.ts.map +1 -0
  58. package/dist/wasm/Keystore.js +34 -0
  59. package/dist/wasm/Keystore.js.map +1 -0
  60. package/dist/wasm/Mnemonic.d.ts +33 -0
  61. package/dist/wasm/Mnemonic.d.ts.map +1 -0
  62. package/dist/wasm/Mnemonic.js +30 -0
  63. package/dist/wasm/Mnemonic.js.map +1 -0
  64. package/dist/wasm/X25519.d.ts +33 -0
  65. package/dist/wasm/X25519.d.ts.map +1 -0
  66. package/dist/wasm/X25519.js +53 -0
  67. package/dist/wasm/X25519.js.map +1 -0
  68. package/dist/wasm/index.d.ts +81 -12
  69. package/dist/wasm/index.d.ts.map +1 -1
  70. package/dist/wasm/index.js +81 -12
  71. package/dist/wasm/index.js.map +1 -1
  72. package/dist/wasm/internal/blake3.d.ts +11 -0
  73. package/dist/wasm/internal/blake3.d.ts.map +1 -0
  74. package/dist/wasm/internal/blake3.js +31 -0
  75. package/dist/wasm/internal/blake3.js.map +1 -0
  76. package/dist/wasm/internal/blake3.wasm.d.ts +3 -0
  77. package/dist/wasm/internal/blake3.wasm.d.ts.map +1 -0
  78. package/dist/wasm/internal/blake3.wasm.js +10 -0
  79. package/dist/wasm/internal/blake3.wasm.js.map +1 -0
  80. package/dist/wasm/internal/crypto25519.d.ts +16 -0
  81. package/dist/wasm/internal/crypto25519.d.ts.map +1 -0
  82. package/dist/wasm/internal/crypto25519.js +5 -0
  83. package/dist/wasm/internal/crypto25519.js.map +1 -0
  84. package/dist/wasm/internal/crypto25519.wasm.d.ts +3 -0
  85. package/dist/wasm/internal/crypto25519.wasm.d.ts.map +1 -0
  86. package/dist/wasm/internal/crypto25519.wasm.js +10 -0
  87. package/dist/wasm/internal/crypto25519.wasm.js.map +1 -0
  88. package/dist/wasm/internal/ed25519.d.ts +4 -0
  89. package/dist/wasm/internal/ed25519.d.ts.map +1 -0
  90. package/dist/wasm/internal/ed25519.js +21 -0
  91. package/dist/wasm/internal/ed25519.js.map +1 -0
  92. package/dist/wasm/internal/hashes.d.ts +12 -0
  93. package/dist/wasm/internal/hashes.d.ts.map +1 -0
  94. package/dist/wasm/internal/hashes.js +8 -0
  95. package/dist/wasm/internal/hashes.js.map +1 -0
  96. package/dist/wasm/internal/hashes.wasm.d.ts +4 -2
  97. package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -1
  98. package/dist/wasm/internal/hashes.wasm.js +4 -2
  99. package/dist/wasm/internal/hashes.wasm.js.map +1 -1
  100. package/dist/wasm/internal/mnemonic.d.ts +4 -0
  101. package/dist/wasm/internal/mnemonic.d.ts.map +1 -0
  102. package/dist/wasm/internal/mnemonic.js +45 -0
  103. package/dist/wasm/internal/mnemonic.js.map +1 -0
  104. package/dist/wasm/internal/pbkdf2.d.ts +12 -0
  105. package/dist/wasm/internal/pbkdf2.d.ts.map +1 -0
  106. package/dist/wasm/internal/pbkdf2.js +51 -0
  107. package/dist/wasm/internal/pbkdf2.js.map +1 -0
  108. package/dist/wasm/internal/x25519.d.ts +4 -0
  109. package/dist/wasm/internal/x25519.d.ts.map +1 -0
  110. package/dist/wasm/internal/x25519.js +21 -0
  111. package/dist/wasm/internal/x25519.js.map +1 -0
  112. package/package.json +46 -1
  113. package/src/core/Engine.ts +84 -11
  114. package/src/core/_test/Engine.test-d.ts +56 -0
  115. package/src/core/_test/Engine.test.ts +95 -0
  116. package/src/core/_test/Hash.vectors.test.ts +8 -0
  117. package/src/core/internal/engine.ts +8 -8
  118. package/src/index.ts +5 -2
  119. package/src/node/Ed25519.ts +87 -0
  120. package/src/node/Engine.ts +79 -23
  121. package/src/node/Hash.ts +22 -27
  122. package/src/node/Keystore.ts +103 -0
  123. package/src/node/Mnemonic.ts +68 -0
  124. package/src/node/P256.ts +48 -0
  125. package/src/node/X25519.ts +93 -0
  126. package/src/node/_test/Curves.fuzz.ts +76 -0
  127. package/src/node/_test/Ed25519.test-d.ts +35 -0
  128. package/src/node/_test/Ed25519.test.ts +220 -0
  129. package/src/node/_test/Engine.test-d.ts +28 -0
  130. package/src/node/_test/Engine.test.ts +62 -22
  131. package/src/node/_test/Hash.test-d.ts +15 -9
  132. package/src/node/_test/Hash.test.ts +10 -11
  133. package/src/node/_test/Keystore.fuzz.ts +58 -0
  134. package/src/node/_test/Keystore.test-d.ts +43 -0
  135. package/src/node/_test/Keystore.test.ts +198 -0
  136. package/src/node/_test/Mnemonic.fuzz.ts +31 -0
  137. package/src/node/_test/Mnemonic.test-d.ts +21 -0
  138. package/src/node/_test/Mnemonic.test.ts +98 -0
  139. package/src/node/_test/P256.test-d.ts +29 -0
  140. package/src/node/_test/P256.test.ts +102 -0
  141. package/src/node/_test/X25519.test-d.ts +28 -0
  142. package/src/node/_test/X25519.test.ts +239 -0
  143. package/src/node/index.ts +100 -8
  144. package/src/version.ts +1 -1
  145. package/src/wasm/Ed25519.ts +114 -0
  146. package/src/wasm/Engine.ts +76 -31
  147. package/src/wasm/Hash.bench.ts +2 -2
  148. package/src/wasm/Hash.ts +29 -50
  149. package/src/wasm/Keystore.ts +48 -0
  150. package/src/wasm/Mnemonic.ts +44 -0
  151. package/src/wasm/X25519.ts +70 -0
  152. package/src/wasm/_test/Crypto25519.conformance.ts +57 -0
  153. package/src/wasm/_test/Crypto25519.fuzz.ts +187 -0
  154. package/src/wasm/_test/Ed25519.test-d.ts +28 -0
  155. package/src/wasm/_test/Ed25519.test.ts +168 -0
  156. package/src/wasm/_test/Ed25519.vectors.test.ts +73 -0
  157. package/src/wasm/_test/Engine.test-d.ts +28 -0
  158. package/src/wasm/_test/Engine.test.ts +59 -25
  159. package/src/wasm/_test/Hash.browser.test.ts +11 -7
  160. package/src/wasm/_test/Hash.fuzz.ts +58 -23
  161. package/src/wasm/_test/Hash.test-d.ts +15 -10
  162. package/src/wasm/_test/Hash.test.ts +148 -48
  163. package/src/wasm/_test/Hash.vectors.test.ts +15 -8
  164. package/src/wasm/_test/Keystore.browser.test.ts +42 -0
  165. package/src/wasm/_test/Keystore.fuzz.ts +113 -0
  166. package/src/wasm/_test/Keystore.test-d.ts +33 -0
  167. package/src/wasm/_test/Keystore.test.ts +192 -0
  168. package/src/wasm/_test/Keystore.vectors.test.ts +21 -0
  169. package/src/wasm/_test/Mnemonic.test-d.ts +17 -0
  170. package/src/wasm/_test/Mnemonic.test.ts +110 -0
  171. package/src/wasm/_test/X25519.test-d.ts +21 -0
  172. package/src/wasm/_test/X25519.test.ts +194 -0
  173. package/src/wasm/_test/fixtures.ts +4 -0
  174. package/src/wasm/index.ts +85 -12
  175. package/src/wasm/internal/blake3.ts +45 -0
  176. package/src/wasm/internal/blake3.wasm.ts +11 -0
  177. package/src/wasm/internal/crypto25519.ts +43 -0
  178. package/src/wasm/internal/crypto25519.wasm.ts +11 -0
  179. package/src/wasm/internal/ed25519.ts +31 -0
  180. package/src/wasm/internal/hashes.ts +29 -0
  181. package/src/wasm/internal/hashes.wasm.ts +5 -2
  182. package/src/wasm/internal/mnemonic.ts +56 -0
  183. package/src/wasm/internal/pbkdf2.ts +86 -0
  184. package/src/wasm/internal/x25519.ts +29 -0
@@ -0,0 +1,194 @@
1
+ import * as fs from 'node:fs'
2
+ import { x25519 } from '@noble/curves/ed25519.js'
3
+ import { describe, expect, test } from 'vp/test'
4
+ import * as X25519 from '../X25519.js'
5
+ import * as crypto25519 from '../internal/crypto25519.js'
6
+ import { wasmBase64 } from '../internal/crypto25519.wasm.js'
7
+ import * as internal from '../internal/instantiate.js'
8
+ import * as x25519_internal from '../internal/x25519.js'
9
+ import { x25519LowOrder } from './fixtures.js'
10
+
11
+ const alicePrivateKey = fromHex(
12
+ '77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a',
13
+ )
14
+ const bobPrivateKey = fromHex(
15
+ '5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb',
16
+ )
17
+
18
+ describe('engine', () => {
19
+ test('vectors: matches RFC 7748 key agreement', async () => {
20
+ const engine = await X25519.engine()
21
+ const alicePublicKey = engine.getPublicKey(alicePrivateKey)
22
+ const bobPublicKey = engine.getPublicKey(bobPrivateKey)
23
+
24
+ expect(toHex(alicePublicKey)).toMatchInlineSnapshot(
25
+ `"8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a"`,
26
+ )
27
+ expect(toHex(bobPublicKey)).toMatchInlineSnapshot(
28
+ `"de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f"`,
29
+ )
30
+ expect(
31
+ toHex(engine.getSharedSecret(alicePrivateKey, bobPublicKey)),
32
+ ).toMatchInlineSnapshot(
33
+ `"4a5d9d5ba4ce2de1728e3bf480350f25e07e21c947d19e3376f09b3c1e161742"`,
34
+ )
35
+ })
36
+
37
+ test('vectors: matches RFC 7748 arbitrary-point cases', async () => {
38
+ const engine = await X25519.engine()
39
+ const vectors = [
40
+ [
41
+ 'a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4',
42
+ 'e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c',
43
+ 'c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552',
44
+ ],
45
+ [
46
+ '4b66e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba0d',
47
+ 'e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a493',
48
+ '95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957',
49
+ ],
50
+ ] as const
51
+
52
+ for (const [privateKey, publicKey, expected] of vectors)
53
+ expect(
54
+ toHex(engine.getSharedSecret(fromHex(privateKey), fromHex(publicKey))),
55
+ ).toBe(expected)
56
+ })
57
+
58
+ test('vectors: matches RFC 7748 iterated cases', async () => {
59
+ const engine = await X25519.engine()
60
+ let privateKey = Uint8Array.of(9, ...new Uint8Array(31))
61
+ let publicKey = privateKey
62
+ const expected = new Map([
63
+ [1, '422c8e7a6227d7bca1350b3e2bb7279f7897b87bb6854b783c60e80311ae3079'],
64
+ [
65
+ 1000,
66
+ '684cf59ba83309552800ef566f2f4d3c1c3887c49360e3875f2eb94d99532c51',
67
+ ],
68
+ ])
69
+
70
+ for (let iteration = 1; iteration <= 1000; iteration++) {
71
+ const previousPrivateKey = privateKey
72
+ privateKey = engine.getSharedSecret(privateKey, publicKey)
73
+ publicKey = previousPrivateKey
74
+ if (expected.has(iteration))
75
+ expect(toHex(privateKey), `iteration ${iteration}`).toBe(
76
+ expected.get(iteration),
77
+ )
78
+ }
79
+ })
80
+
81
+ test('behavior: accepts masked and noncanonical u-coordinates', async () => {
82
+ const engine = await X25519.engine()
83
+ const publicKey = x25519.getPublicKey(bobPrivateKey)
84
+ const masked = publicKey.slice()
85
+ masked[31]! |= 0x80
86
+ const noncanonicalBasePoint = fromHex(`f6${'ff'.repeat(30)}7f`)
87
+
88
+ expect(engine.getSharedSecret(alicePrivateKey, masked)).toEqual(
89
+ engine.getSharedSecret(alicePrivateKey, publicKey),
90
+ )
91
+ expect(
92
+ engine.getSharedSecret(alicePrivateKey, noncanonicalBasePoint),
93
+ ).toEqual(engine.getPublicKey(alicePrivateKey))
94
+ })
95
+
96
+ test('behavior: rejects low-order and malformed public keys', async () => {
97
+ const engine = await X25519.engine()
98
+
99
+ expect(x25519LowOrder).toEqual(
100
+ JSON.parse(
101
+ fs.readFileSync(
102
+ new URL(
103
+ '../../../test/vectors/x25519/low-order.json',
104
+ import.meta.url,
105
+ ),
106
+ 'utf8',
107
+ ),
108
+ ),
109
+ )
110
+ expect(x25519LowOrder).toHaveLength(7)
111
+ for (const vector of x25519LowOrder) {
112
+ const publicKey = fromHex(vector.publicKey)
113
+ const highBitAlias = publicKey.slice()
114
+ highBitAlias[31]! |= 0x80
115
+ for (const value of [publicKey, highBitAlias])
116
+ expect(() =>
117
+ engine.getSharedSecret(alicePrivateKey, value),
118
+ ).toThrowError(`invalid private or public key received`)
119
+ }
120
+
121
+ for (const size of [0, 1, 31, 33, 64]) {
122
+ expect(() => engine.getPublicKey(new Uint8Array(size))).toThrowError(
123
+ `X25519 private key must be 32 bytes, got ${size}`,
124
+ )
125
+ expect(() =>
126
+ engine.getSharedSecret(alicePrivateKey, new Uint8Array(size)),
127
+ ).toThrowError(`X25519 public key must be 32 bytes, got ${size}`)
128
+ }
129
+ })
130
+
131
+ test('behavior: respects subviews, ownership, and cleanup', async () => {
132
+ const engine = await X25519.engine()
133
+ const privateKey = offsetView(alicePrivateKey)
134
+ const publicKey = offsetView(x25519.getPublicKey(bobPrivateKey))
135
+ const before = {
136
+ privateKey: privateKey.slice(),
137
+ publicKey: publicKey.slice(),
138
+ }
139
+ const sharedSecret = engine.getSharedSecret(privateKey, publicKey)
140
+ const snapshot = sharedSecret.slice()
141
+
142
+ engine.getPublicKey(new Uint8Array(32).fill(0xa5))
143
+ expect(sharedSecret).toEqual(snapshot)
144
+ expect({ privateKey, publicKey }).toEqual(before)
145
+
146
+ const module = await crypto25519.load()
147
+ expect(
148
+ module
149
+ .view()
150
+ .subarray(module.heapBase, module.heapBase + 96)
151
+ .every((byte) => byte === 0),
152
+ ).toBe(true)
153
+ })
154
+
155
+ test('behavior: clears both keys and the shared secret after a late trap', async () => {
156
+ const module = await internal.instantiate<crypto25519.Exports>(wasmBase64)
157
+ const publicKey = x25519.getPublicKey(bobPrivateKey)
158
+ const exports: crypto25519.Exports = {
159
+ ...module.exports,
160
+ x25519_get_shared_secret(...parameters) {
161
+ module.exports.x25519_get_shared_secret(...parameters)
162
+ throw new WebAssembly.RuntimeError('forced late trap')
163
+ },
164
+ }
165
+
166
+ expect(() =>
167
+ x25519_internal.getSharedSecret(
168
+ { ...module, exports },
169
+ alicePrivateKey,
170
+ publicKey,
171
+ ),
172
+ ).toThrow(WebAssembly.RuntimeError)
173
+ expect(
174
+ module
175
+ .view()
176
+ .subarray(module.heapBase, module.heapBase + 96)
177
+ .every((byte) => byte === 0),
178
+ ).toBe(true)
179
+ })
180
+ })
181
+
182
+ function fromHex(value: string): Uint8Array {
183
+ return Uint8Array.from(Buffer.from(value, 'hex'))
184
+ }
185
+
186
+ function offsetView(value: Uint8Array): Uint8Array {
187
+ const bytes = new Uint8Array(value.length + 4).fill(0xff)
188
+ bytes.set(value, 2)
189
+ return bytes.subarray(2, -2)
190
+ }
191
+
192
+ function toHex(value: Uint8Array): string {
193
+ return Buffer.from(value).toString('hex')
194
+ }
@@ -0,0 +1,4 @@
1
+ import { lowOrder } from '../../../test/vectors/x25519/index.js'
2
+
3
+ /** Complete libsodium X25519 low-order corpus. */
4
+ export const x25519LowOrder = lowOrder
package/src/wasm/index.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /** @entrypointCategory WASM */
2
2
 
3
3
  /**
4
- * WASM implementations of ox's hash primitives, compiled from C.
4
+ * WASM implementations of Ox's supported cryptographic primitives, compiled
5
+ * from C.
5
6
  *
6
- * Load it and hand the result to {@link ox#Engine.set}. WASM must be compiled
7
- * asynchronously, so the `await` lives here -- every call afterwards is
8
- * synchronous.
7
+ * Install it during startup. WASM must be compiled asynchronously, so the
8
+ * `await` lives there. Every cryptographic call afterwards is synchronous.
9
9
  *
10
10
  * :::note
11
11
  * Performance varies by primitive, input size, runtime, and processor. Run
@@ -16,32 +16,105 @@
16
16
  * @example
17
17
  * ```ts twoslash
18
18
  * // @noErrors
19
- * import { Hash } from 'ox'
20
- * import { Engine } from 'ox/wasm'
19
+ * import { Engine, Hash } from 'ox/wasm'
21
20
  *
22
- * await Engine.load()
21
+ * await Engine.install()
23
22
  *
24
- * Hash.keccak256('0xdeadbeef')
23
+ * Hash.sha256('0xdeadbeef')
25
24
  * ```
26
25
  *
27
26
  * @category Crypto
28
27
  */
29
28
  export * as Engine from './Engine.js'
30
29
 
30
+ /**
31
+ * WASM implementations of Ox's supported Ed25519 primitives.
32
+ *
33
+ * @example
34
+ * ```ts twoslash
35
+ * // @noErrors
36
+ * import { Engine } from 'ox'
37
+ * import { Ed25519 } from 'ox/wasm'
38
+ *
39
+ * await Engine.install({ Ed25519: Ed25519.engine() })
40
+ *
41
+ * Ed25519.getPublicKey({ privateKey: '0x...' })
42
+ * ```
43
+ *
44
+ * @category Crypto
45
+ */
46
+ export * as Ed25519 from './Ed25519.js'
47
+
31
48
  /**
32
49
  * WASM implementations of Ox's supported hash primitives.
33
50
  *
34
51
  * @example
35
52
  * ```ts twoslash
36
53
  * // @noErrors
37
- * import { Engine, Hash } from 'ox'
38
- * import * as WasmHash from 'ox/wasm/Hash'
54
+ * import { Engine } from 'ox'
55
+ * import { Hash } from 'ox/wasm'
39
56
  *
40
- * Engine.set(await WasmHash.create())
57
+ * await Engine.install({ Hash: Hash.engine() })
41
58
  *
42
- * Hash.keccak256('0xdeadbeef')
59
+ * Hash.sha256('0xdeadbeef')
43
60
  * ```
44
61
  *
45
62
  * @category Crypto
46
63
  */
47
64
  export * as Hash from './Hash.js'
65
+
66
+ /**
67
+ * WASM implementation of Ox's synchronous PBKDF2-HMAC-SHA256 primitive.
68
+ *
69
+ * @example
70
+ * ```ts twoslash
71
+ * // @noErrors
72
+ * import { Engine } from 'ox'
73
+ * import { Keystore } from 'ox/wasm'
74
+ *
75
+ * await Engine.install({ Keystore: Keystore.engine() })
76
+ *
77
+ * Keystore.pbkdf2({ password: 'testpassword' })
78
+ * ```
79
+ *
80
+ * @category Crypto
81
+ */
82
+ export * as Keystore from './Keystore.js'
83
+
84
+ /**
85
+ * WASM implementation of Ox's BIP-39 seed derivation.
86
+ *
87
+ * @example
88
+ * ```ts twoslash
89
+ * // @noErrors
90
+ * import { Engine } from 'ox'
91
+ * import { Mnemonic } from 'ox/wasm'
92
+ *
93
+ * await Engine.install({ Mnemonic: Mnemonic.engine() })
94
+ *
95
+ * Mnemonic.toSeed(
96
+ * 'test test test test test test test test test test test junk'
97
+ * )
98
+ * ```
99
+ *
100
+ * @category Crypto
101
+ */
102
+ export * as Mnemonic from './Mnemonic.js'
103
+
104
+ /**
105
+ * WASM implementations of Ox's supported X25519 primitives.
106
+ *
107
+ * @example
108
+ * ```ts twoslash
109
+ * // @noErrors
110
+ * import { Engine } from 'ox'
111
+ * import { X25519 } from 'ox/wasm'
112
+ *
113
+ * await Engine.install({ X25519: X25519.engine() })
114
+ *
115
+ * X25519.getPublicKey({ privateKey: '0x...' })
116
+ * ```
117
+ *
118
+ * @category Crypto
119
+ */
120
+ export * as X25519 from './X25519.js'
@@ -0,0 +1,45 @@
1
+ import { wasmBase64 } from './blake3.wasm.js'
2
+ import * as internal from './instantiate.js'
3
+
4
+ const digestSize = 32
5
+ const wasm32Size = 0x1_0000_0000
6
+
7
+ /** Exports supplied by the dedicated portable BLAKE3 artifact. @internal */
8
+ export type Exports = {
9
+ blake3_hash(input: number, length: number, out: number): void
10
+ zero(ptr: number, length: number): void
11
+ }
12
+
13
+ const instantiate = /*#__PURE__*/ internal.memoize(() =>
14
+ internal.instantiate<Exports>(wasmBase64),
15
+ )
16
+
17
+ /** Returns the one memoized BLAKE3 instance shared by its providers. */
18
+ export function load() {
19
+ return instantiate()
20
+ }
21
+
22
+ /** Hashes an input through a loaded BLAKE3 module. @internal */
23
+ export function hash(
24
+ module: internal.Module<Exports>,
25
+ input: Uint8Array,
26
+ ): Uint8Array {
27
+ const inputPtr = module.heapBase
28
+ const end = inputPtr + input.length + digestSize
29
+ if (!Number.isSafeInteger(end) || end > wasm32Size)
30
+ throw new internal.MemoryError({
31
+ bytes: end,
32
+ cause: new RangeError('BLAKE3 workspace exceeds wasm32 memory.'),
33
+ })
34
+
35
+ const outPtr = inputPtr + input.length
36
+ const size = end - inputPtr
37
+ module.reserve(size)
38
+ try {
39
+ module.view().set(input, inputPtr)
40
+ module.exports.blake3_hash(inputPtr, input.length, outPtr)
41
+ return module.view().slice(outPtr, outPtr + digestSize)
42
+ } finally {
43
+ module.exports.zero(inputPtr, size)
44
+ }
45
+ }
@@ -0,0 +1,11 @@
1
+ // Generated by `pnpm wasm:build --target=blake3`. Do not edit.
2
+ //
3
+ // Compiled from wasm/src/blake3.c, wasm/vendor/blake3/blake3.c, wasm/vendor/blake3/blake3_dispatch.c, wasm/vendor/blake3/blake3_portable.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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QcAAOgDoESADIA9BBHIiDzoA6REgA0IANwOgESADIAQtADM6ANsRIAMgBCgANDYC3BEgAyAEKQA4NwPgESADIAMtAIAROgDgECADIAMtAIEROgDhECADIAMtAIIROgDiECADIAMtAIMROgDjECADIAMtAIQROgDkECADIAMtAIUROgDlECADIAMtAIYROgDmECADIAMtAIcROgDnECADIAMtAIgROgDoECADIAMtAIkROgDpECADIAMtAIoROgDqECADIAMtAIsROgDrECADIAMtAIwROgDsECADIAMtAI0ROgDtECADIAMtAI4ROgDuECADIAMtAI8ROgDvECADIAMtAJAROgDwECADIAMtAJEROgDxECADIAMtAJIROgDyECADIAMtAJMROgDzECADIAMtAJQROgD0ECADIAMtAJUROgD1ECADIAMtAJYROgD2ECADIAMtAJcROgD3ECADIAMtAJgROgD4ECADIAMtAJkROgD5ECADIAMtAJoROgD6ECADIAMtAJsROgD7ECADIAMtAJwROgD8ECADIAMtAJ0ROgD9ECADIAMtAJ4ROgD+ECADIAMtAJ8ROgD/ECADQeAQaiARQcAAQgAgDxABIAQgAygC/BA2ABwgBCADKALgEDYAACAEIAMpAuQQNwAEIAQgAykC7BA3AAwgBCADKQL0EDcAFCADIAMtAJgBQQFrIgQ6AJgBIBogBEH/AXEiBEkNAAsLIAogBEEFdGoiBCASOgAfIAQgBUEQdjoAHiAEIAVBCHY6AB0gBCAFOgAcIAQgEzoAGyAEIAdBEHY6ABogBCAHQQh2OgAZIAQgBzoAGCAEIBQ6ABcgBCAIQRB2OgAWIAQgCEEIdjoAFSAEIAg6ABQgBCAVOgATIAQgCUEQdjoAEiAEIAlBCHY6ABEgBCAJOgAQIAQgFjoADyAEIAtBEHY6AA4gBCALQQh2OgANIAQgCzoADCAEIBc6AAsgBCAMQRB2OgAKIAQgDEEIdjoACSAEIAw6AAggBCAYOgAHIAQgDUEQdjoABiAEIA1BCHY6AAUgBCANOgAEIAQgGToAAyAEIA5BEHY6AAIgBCAOQQh2OgABIAQgDjoAAAwBCyAAIAYgA0EIaiBMIAMtAJIBIANBgBFqEAJBA08NByADLQC/ESEFIAMtAL4RIQcgAy0AvREhCCADLQC8ESEJIAMtALsRIQsgAy0AuhEhDCADLQC5ESENIAMtALgRIQ4gAy0AtxEhEiADLQC2ESETIAMtALURIRQgAy0AtBEhFSADLQCzESEWIAMtALIRIRcgAy0AsREhGCADLQCwESEZIAMtAK8RIRogAy0ArhEhDyADLQCtESEeIAMtAKwRIR8gAy0AqxEhICADLQCqESEhIAMtAKkRISIgAy0AqBEhIyADLQCnESEkIAMtAKYRISUgAy0ApREhJiADLQCkESEnIAMtAKMRISggAy0AohEhKSADLQChESEqIAMtAKARISsgAy0AnxEhGyADLQCeESEQIAMtAJ0RISwgAy0AnBEhLSADLQCbESEuIAMtAJoRIS8gAy0AmREhMSADLQCYESEyIAMtAJcRITMgAy0AlhEhNCADLQCVESE1IAMtAJQRITYgAy0AkxEhNyADLQCSESE4IAMtAJERITkgAy0AkBEhOiADLQCPESE7IAMtAI4RITwgAy0AjREhPSADLQCMESE+IAMtAIsRIT8gAy0AihEhQCADLQCJESFBIAMtAIgRIUIgAy0AhxEhQyADLQCGESFEIAMtAIURIUUgAy0AhBEhRiADLQCDESFHIAMtAIIRIUggAy0AgREhSSADLQCAESFKIAMtAJgBIgQgAykDSHunIktLBEADQCADIAMoAgg2AoARIAMgAykCDDcChBEgAyADKQIUNwKMESADIAMpAhw3ApQRIAMgAygCJDYCnBEgAyAEQQV0IApqQUBqIgQoAAA2AqgRIAMgBC8ABDsBrBEgAyAELQAGOgCuESADLQCSASEwIAMgBC0ABzoArxEgAyAEKAAINgKwESADIAQpAAw3ArQRIAMgBCkAFDcCvBEgAyAEKQAcNwLEESADIAQpACQ3AswRIAMgBCgALDYC1BEgAyAELwAwOwHYESADIAQtADI6ANoRIANBwAA6AOgRIAMgMEEEciIwOgDpESADQgA3A6ARIAMgBC0AMzoA2xEgAyAEKAA0NgLcESADIAQpADg3A+ARIAMgAy0AgBE6APAPIAMgAy0AgRE6APEPIAMgAy0AghE6APIPIAMgAy0AgxE6APMPIAMgAy0AhBE6APQPIAMgAy0AhRE6APUPIAMgAy0AhhE6APYPIAMgAy0AhxE6APcPIAMgAy0AiBE6APgPIAMgAy0AiRE6APkPIAMgAy0AihE6APoPIAMgAy0AixE6APsPIAMgAy0AjBE6APwPIAMgAy0AjRE6AP0PIAMgAy0AjhE6AP4PIAMgAy0AjxE6AP8PIAMgAy0AkBE6AIAQIAMgAy0AkRE6AIEQIAMgAy0AkhE6AIIQIAMgAy0AkxE6AIMQIAMgAy0AlBE6AIQQIAMgAy0AlRE6AIUQIAMgAy0AlhE6AIYQIAMgAy0AlxE6AIcQIAMgAy0AmBE6AIgQIAMgAy0AmRE6AIkQIAMgAy0AmhE6AIoQIAMgAy0AmxE6AIsQIAMgAy0AnBE6AIwQIAMgAy0AnRE6AI0QIAMgAy0AnhE6AI4QIAMgAy0AnxE6AI8QIANB8A9qIBFBwABCACAwEAEgBCADKAKMEDYAHCAEIAMoAvAPNgAAIAQgAykC9A83AAQgBCADKQL8DzcADCAEIAMpAoQQNwAUIAMgAy0AmAFBAWsiBDoAmAEgSyAEQf8BcSIESQ0ACwsgCiAEQQV0aiIEIBs6AB8gBCAQOgAeIAQgLDoAHSAEIC06ABwgBCAuOgAbIAQgLzoAGiAEIDE6ABkgBCAyOgAYIAQgMzoAFyAEIDQ6ABYgBCA1OgAVIAQgNjoAFCAEIDc6ABMgBCA4OgASIAQgOToAESAEIDo6ABAgBCA7OgAPIAQgPDoADiAEID06AA0gBCA+OgAMIAQgPzoACyAEIEA6AAogBCBBOgAJIAQgQjoACCAEIEM6AAcgBCBEOgAGIAQgRToABSAEIEY6AAQgBCBHOgADIAQgSDoAAiAEIEk6AAEgBCBKOgAAIAMgAy0AmAFBAWoiBDoAmAEgBEH/AXEiBCADKQNIIE1CAYh8e6ciG0sEQANAIAMgAygCCDYCgBEgAyADKQIMNwKEESADIAMpAhQ3AowRIAMgAykCHDcClBEgAyADKAIkNgKcESADIARBBXQgCmpBQGoiBCgAADYCqBEgAyAELwAEOwGsESADIAQtAAY6AK4RIAMtAJIBIRAgAyAELQAHOgCvESADIAQoAAg2ArARIAMgBCkADDcCtBEgAyAEKQAUNwK8ESADIAQpABw3AsQRIAMgBCkAJDcCzBEgAyAEKAAsNgLUESADIAQvADA7AdgRIAMgBC0AMjoA2hEgA0HAADoA6BEgAyAQQQRyIhA6AOkRIANCADcDoBEgAyAELQAzOgDbESADIAQoADQ2AtwRIAMgBCkAODcD4BEgAyADLQCAEToA8A8gAyADLQCBEToA8Q8gAyADLQCCEToA8g8gAyADLQCDEToA8w8gAyADLQCEEToA9A8gAyADLQCFEToA9Q8gAyADLQCGEToA9g8gAyADLQCHEToA9w8gAyADLQCIEToA+A8gAyADLQCJEToA+Q8gAyADLQCKEToA+g8gAyADLQCLEToA+w8gAyADLQCMEToA/A8gAyADLQCNEToA/Q8gAyADLQCOEToA/g8gAyADLQCPEToA/w8gAyADLQCQEToAgBAgAyADLQCREToAgRAgAyADLQCSEToAghAgAyADLQCTEToAgxAgAyADLQCUEToAhBAgAyADLQCVEToAhRAgAyADLQCWEToAhhAgAyADLQCXEToAhxAgAyADLQCYEToAiBAgAyADLQCZEToAiRAgAyADLQCaEToAihAgAyADLQCbEToAixAgAyADLQCcEToAjBAgAyADLQCdEToAjRAgAyADLQCeEToAjhAgAyADLQCfEToAjxAgA0HwD2ogEUHAAEIAIBAQASAEIAMoAowQNgAcIAQgAygC8A82AAAgBCADKQL0DzcABCAEIAMpAvwPNwAMIAQgAykChBA3ABQgAyADLQCYAUEBayIEOgCYASAbIARB/wFxIgRJDQALCyAKIARBBXRqIgQgBToAHyAEIAc6AB4gBCAIOgAdIAQgCToAHCAEIAs6ABsgBCAMOgAaIAQgDToAGSAEIA46ABggBCASOgAXIAQgEzoAFiAEIBQ6ABUgBCAVOgAUIAQgFjoAEyAEIBc6ABIgBCAYOgARIAQgGToAECAEIBo6AA8gBCAPOgAOIAQgHjoADSAEIB86AAwgBCAgOgALIAQgIToACiAEICI6AAkgBCAjOgAIIAQgJDoAByAEICU6AAYgBCAmOgAFIAQgJzoABCAEICg6AAMgBCApOgACIAQgKjoAASAEICs6AAALIAMgAy0AmAFBAWoiBDoAmAEgAyADKQNIIE18Ikw3A0ggACAGaiEAIAEgBmsiAUGACEsNAAsgAUUNAQsgA0HQAGohCCADQShqIQoCQCADLQCQASIEBEBBwAAgBGsiBiABIAEgBksbIQUCQCAEQcAARg0AIAQgCGohBAJAIAVBB3EiCUUEQCAAIQYgBSEHDAELIAVB+A9xIQcgACEGA0AgBCAGLQAAOgAAIARBAWohBCAGQQFq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sBEgAyADKQNgNwO4ESADIAMpA2g3A8ARIAMgAykDcDcDyBEgAyADKQN4NwPQESADIAMpA4ABNwPYESADIAMpA4gBNwPgESADIAMoAfAPNgHqESADIAMtAJIBIABFckECcjoA6REgBEH/AXEhBAwBCyADQe4RaiADQfQPai8BADsBACADQgA3A6ARIANBwAA6AOgRIAMgAykDCDcDgBEgAyADKQMQNwOIESADIAMpAxg3A5ARIAMgAykDIDcDmBEgAyADLQCSAUEEcjoA6REgAyADKAHwDzYB6hEgAyADQQhqIARB/wFxQQJrIgRBBXRqIgBBkQFqKQAANwOoESADIABBmQFqKQAANwOwESADIABBoQFqKQAANwO4ESADIABBqQFqKQAANwPAESADIABBsQFqKQAANwPIESADIABBuQFqKQAANwPQESADIABBwQFqKQAANwPYESADIABByQFqKQAANwPgESAERQ0BCyAEQQV0IQEgA0HqEWohLCADQagRaiEvIAMtAOkRIS0gAykDoBEhTCADLQDoESEuIAMtAJ8RIQsgAy0AnhEhDCADLQCdESENIAMtAJwRIQ4gAy0AmxEhHCADLQCaESEdIAMtAJkRIRIgAy0AmBEhEyADLQCXESEUIAMtAJYRIRUgAy0AlREhFiADLQCUESEXIAMtAJMRIRggAy0AkhEhGSADLQCRESEaIAMtAJARIQ8gAy0AjxEhHiADLQCOESEfIAMtAI0RISAgAy0AjBEhISADLQCLESEiIAMtAIoRISMgAy0AiREhJCADLQCIESElIAMtAIcRISYgAy0AhhEhJyADLQCFESEoIAMtAIQRISkgAy0AgxEhKiADLQCCESErIAMtAIERIRsgAy0AgBEhEANAIANBCGogAWoiAEHxAGopAAAhTSAAQfkAaikAACFOIABBgQFqKQAAIU8gAEGJAWopAAAhUCADIAs6AI8QIAMgDDoAjhAgAyANOgCNECADIA46AIwQIAMgHDoAixAgAyAdOgCKECADIBI6AIkQIAMgEzoAiBAgAyAUOgCHECADIBU6AIYQIAMgFjoAhRAgAyAXOgCEECADIBg6AIMQIAMgGToAghAgAyAaOgCBECADIA86AIAQIAMgHjoA/w8gAyAfOgD+DyADICA6AP0PIAMgIToA/A8gAyAiOgD7DyADICM6APoPIAMg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'
@@ -0,0 +1,43 @@
1
+ import { wasmBase64 } from './crypto25519.wasm.js'
2
+ import {
3
+ instantiate,
4
+ memoize,
5
+ type Module as WasmModule,
6
+ } from './instantiate.js'
7
+
8
+ export type Exports = {
9
+ ed25519_get_public_key(seed: number, publicKey: number): void
10
+ ed25519_sign(
11
+ seed: number,
12
+ message: number,
13
+ messageSize: number,
14
+ signature: number,
15
+ ): void
16
+ ed25519_to_montgomery_secret(seed: number, secretKey: number): void
17
+ ed25519_verify(
18
+ signature: number,
19
+ message: number,
20
+ messageSize: number,
21
+ publicKey: number,
22
+ ): number
23
+ mnemonic_to_seed(
24
+ password: number,
25
+ passwordSize: number,
26
+ salt: number,
27
+ saltSize: number,
28
+ seed: number,
29
+ ): void
30
+ x25519_get_public_key(privateKey: number, publicKey: number): void
31
+ x25519_get_shared_secret(
32
+ privateKey: number,
33
+ publicKey: number,
34
+ sharedSecret: number,
35
+ ): number
36
+ zero(pointer: number, length: number): void
37
+ }
38
+
39
+ /** Instantiated shared cryptographic module. */
40
+ export type Module = WasmModule<Exports>
41
+
42
+ /** Instantiates the shared Ed25519, X25519, and mnemonic module once. */
43
+ export const load = memoize(() => instantiate<Exports>(wasmBase64))