ox 1.2.0 → 1.3.1

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 (187) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/core/AbiFunction.d.ts +1 -1
  3. package/dist/core/AbiFunction.d.ts.map +1 -1
  4. package/dist/core/AbiFunction.js +6 -2
  5. package/dist/core/AbiFunction.js.map +1 -1
  6. package/dist/core/AbiParameters.d.ts +1 -1
  7. package/dist/core/AbiParameters.d.ts.map +1 -1
  8. package/dist/core/AbiParameters.js +1 -13
  9. package/dist/core/AbiParameters.js.map +1 -1
  10. package/dist/core/AesGcm.d.ts +36 -1
  11. package/dist/core/AesGcm.d.ts.map +1 -1
  12. package/dist/core/AesGcm.js +44 -0
  13. package/dist/core/AesGcm.js.map +1 -1
  14. package/dist/core/Ed25519.d.ts +46 -1
  15. package/dist/core/Ed25519.d.ts.map +1 -1
  16. package/dist/core/Ed25519.js +43 -0
  17. package/dist/core/Ed25519.js.map +1 -1
  18. package/dist/core/Engine.d.ts +1 -1
  19. package/dist/core/Engine.d.ts.map +1 -1
  20. package/dist/core/Engine.js.map +1 -1
  21. package/dist/core/Hash.d.ts +164 -1
  22. package/dist/core/Hash.d.ts.map +1 -1
  23. package/dist/core/Hash.js +172 -0
  24. package/dist/core/Hash.js.map +1 -1
  25. package/dist/core/Hex.d.ts.map +1 -1
  26. package/dist/core/Hex.js +1 -4
  27. package/dist/core/Hex.js.map +1 -1
  28. package/dist/core/Rlp.d.ts +32 -0
  29. package/dist/core/Rlp.d.ts.map +1 -1
  30. package/dist/core/Rlp.js +146 -0
  31. package/dist/core/Rlp.js.map +1 -1
  32. package/dist/core/Secp256k1.d.ts +46 -1
  33. package/dist/core/Secp256k1.d.ts.map +1 -1
  34. package/dist/core/Secp256k1.js +48 -0
  35. package/dist/core/Secp256k1.js.map +1 -1
  36. package/dist/core/WebAuthn.d.ts +224 -0
  37. package/dist/core/WebAuthn.d.ts.map +1 -0
  38. package/dist/core/WebAuthn.js +343 -0
  39. package/dist/core/WebAuthn.js.map +1 -0
  40. package/dist/core/WebAuthnP256.d.ts +46 -50
  41. package/dist/core/WebAuthnP256.d.ts.map +1 -1
  42. package/dist/core/WebAuthnP256.js +44 -50
  43. package/dist/core/WebAuthnP256.js.map +1 -1
  44. package/dist/core/internal/abiParameters.d.ts +7 -87
  45. package/dist/core/internal/abiParameters.d.ts.map +1 -1
  46. package/dist/core/internal/abiParameters.js +339 -194
  47. package/dist/core/internal/abiParameters.js.map +1 -1
  48. package/dist/core/internal/engine.d.ts +35 -2
  49. package/dist/core/internal/engine.d.ts.map +1 -1
  50. package/dist/core/internal/engine.js +12 -1
  51. package/dist/core/internal/engine.js.map +1 -1
  52. package/dist/core/internal/hash.d.ts +10 -0
  53. package/dist/core/internal/hash.d.ts.map +1 -1
  54. package/dist/core/internal/hash.js +26 -1
  55. package/dist/core/internal/hash.js.map +1 -1
  56. package/dist/index.d.ts +23 -14
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +23 -14
  59. package/dist/index.js.map +1 -1
  60. package/dist/node/Engine.d.ts +1 -1
  61. package/dist/node/Engine.d.ts.map +1 -1
  62. package/dist/node/Engine.js.map +1 -1
  63. package/dist/node/Hash.d.ts +6 -4
  64. package/dist/node/Hash.d.ts.map +1 -1
  65. package/dist/node/Hash.js +35 -3
  66. package/dist/node/Hash.js.map +1 -1
  67. package/dist/tempo/AuthorizationTempo.d.ts +6 -6
  68. package/dist/tempo/AuthorizationTempo.js +6 -6
  69. package/dist/tempo/KeyAuthorization.d.ts +3 -8
  70. package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
  71. package/dist/tempo/KeyAuthorization.js +3 -8
  72. package/dist/tempo/KeyAuthorization.js.map +1 -1
  73. package/dist/tempo/SignatureEnvelope.d.ts +8 -8
  74. package/dist/tempo/SignatureEnvelope.js +8 -8
  75. package/dist/wasm/Engine.d.ts +1 -1
  76. package/dist/wasm/Engine.d.ts.map +1 -1
  77. package/dist/wasm/Engine.js.map +1 -1
  78. package/dist/wasm/Hash.d.ts +1 -1
  79. package/dist/wasm/Hash.d.ts.map +1 -1
  80. package/dist/wasm/Hash.js +5 -0
  81. package/dist/wasm/Hash.js.map +1 -1
  82. package/dist/wasm/internal/blake3.d.ts +10 -1
  83. package/dist/wasm/internal/blake3.d.ts.map +1 -1
  84. package/dist/wasm/internal/blake3.js +12 -1
  85. package/dist/wasm/internal/blake3.js.map +1 -1
  86. package/dist/wasm/internal/blake3.wasm.d.ts +3 -1
  87. package/dist/wasm/internal/blake3.wasm.d.ts.map +1 -1
  88. package/dist/wasm/internal/blake3.wasm.js +3 -1
  89. package/dist/wasm/internal/blake3.wasm.js.map +1 -1
  90. package/dist/wasm/internal/hash.d.ts +9 -0
  91. package/dist/wasm/internal/hash.d.ts.map +1 -1
  92. package/dist/wasm/internal/hash.js +13 -1
  93. package/dist/wasm/internal/hash.js.map +1 -1
  94. package/dist/wasm/internal/hashState.d.ts +25 -0
  95. package/dist/wasm/internal/hashState.d.ts.map +1 -0
  96. package/dist/wasm/internal/hashState.js +105 -0
  97. package/dist/wasm/internal/hashState.js.map +1 -0
  98. package/dist/wasm/internal/hashes.d.ts +12 -1
  99. package/dist/wasm/internal/hashes.d.ts.map +1 -1
  100. package/dist/wasm/internal/hashes.js +18 -1
  101. package/dist/wasm/internal/hashes.js.map +1 -1
  102. package/dist/wasm/internal/hashes.wasm.d.ts +11 -3
  103. package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -1
  104. package/dist/wasm/internal/hashes.wasm.js +11 -3
  105. package/dist/wasm/internal/hashes.wasm.js.map +1 -1
  106. package/dist/webauthn/Authentication.d.ts +2 -0
  107. package/dist/webauthn/Authentication.d.ts.map +1 -1
  108. package/dist/webauthn/Authentication.js +2 -1
  109. package/dist/webauthn/Authentication.js.map +1 -1
  110. package/dist/webauthn/Registration.d.ts.map +1 -1
  111. package/dist/webauthn/Registration.js +2 -1
  112. package/dist/webauthn/Registration.js.map +1 -1
  113. package/dist/webauthn/Types.d.ts +27 -6
  114. package/dist/webauthn/Types.d.ts.map +1 -1
  115. package/dist/webauthn/internal/utils.d.ts.map +1 -1
  116. package/dist/webauthn/internal/utils.js +35 -9
  117. package/dist/webauthn/internal/utils.js.map +1 -1
  118. package/dist/zod/TypedData.d.ts +2 -2
  119. package/package.json +13 -1
  120. package/src/benchmarks/Ox.bench.ts +6 -0
  121. package/src/benchmarks/OxNode.bench.ts +8 -0
  122. package/src/benchmarks/OxV0.bench.ts +4 -0
  123. package/src/benchmarks/OxWasm.bench.ts +22 -0
  124. package/src/core/AbiFunction.ts +5 -5
  125. package/src/core/AbiParameters.ts +8 -20
  126. package/src/core/AesGcm.ts +86 -1
  127. package/src/core/Ed25519.ts +87 -1
  128. package/src/core/Engine.ts +1 -0
  129. package/src/core/Hash.ts +262 -1
  130. package/src/core/Hex.ts +1 -4
  131. package/src/core/Rlp.ts +172 -5
  132. package/src/core/Secp256k1.ts +92 -1
  133. package/src/core/WebAuthn.ts +579 -0
  134. package/src/core/WebAuthnP256.ts +47 -50
  135. package/src/core/_test/AbiFunction.test.ts +9 -0
  136. package/src/core/_test/AbiParameters.differential.fuzz.ts +156 -0
  137. package/src/core/_test/AbiParameters.encode.test.ts +22 -0
  138. package/src/core/_test/AbiParameters.fuzz.ts +4 -0
  139. package/src/core/_test/AesGcm.test.ts +76 -0
  140. package/src/core/_test/Ed25519.test-d.ts +13 -1
  141. package/src/core/_test/Ed25519.test.ts +120 -1
  142. package/src/core/_test/Engine.test-d.ts +9 -0
  143. package/src/core/_test/Engine.test.ts +1 -1
  144. package/src/core/_test/Hash.test-d.ts +23 -0
  145. package/src/core/_test/Hash.test.ts +179 -1
  146. package/src/core/_test/Hex.test.ts +2 -0
  147. package/src/core/_test/Rlp.test-d.ts +18 -0
  148. package/src/core/_test/Rlp.test.ts +109 -0
  149. package/src/core/_test/Secp256k1.test-d.ts +14 -0
  150. package/src/core/_test/Secp256k1.test.ts +91 -1
  151. package/src/core/_test/WebAuthn.test-d.ts +142 -0
  152. package/src/core/_test/WebAuthn.test.ts +766 -0
  153. package/src/core/_test/index.test.ts +1 -0
  154. package/src/core/internal/abiParameters.ts +466 -326
  155. package/src/core/internal/engine.ts +47 -2
  156. package/src/core/internal/hash.ts +53 -1
  157. package/src/index.ts +24 -14
  158. package/src/node/Engine.ts +1 -0
  159. package/src/node/Hash.ts +43 -6
  160. package/src/node/_test/Engine.test-d.ts +1 -0
  161. package/src/node/_test/Engine.test.ts +2 -0
  162. package/src/node/_test/Hash.test-d.ts +10 -0
  163. package/src/node/_test/Hash.test.ts +46 -0
  164. package/src/tempo/AuthorizationTempo.ts +6 -6
  165. package/src/tempo/KeyAuthorization.ts +3 -8
  166. package/src/tempo/SignatureEnvelope.ts +8 -8
  167. package/src/version.ts +1 -1
  168. package/src/wasm/Engine.ts +1 -0
  169. package/src/wasm/Hash.ts +10 -0
  170. package/src/wasm/_test/Engine.test-d.ts +1 -0
  171. package/src/wasm/_test/Engine.test.ts +5 -0
  172. package/src/wasm/_test/Hash.browser.test.ts +28 -0
  173. package/src/wasm/_test/Hash.test-d.ts +16 -0
  174. package/src/wasm/_test/Hash.test.ts +250 -1
  175. package/src/wasm/internal/blake3.ts +23 -2
  176. package/src/wasm/internal/blake3.wasm.ts +4 -1
  177. package/src/wasm/internal/hash.ts +27 -1
  178. package/src/wasm/internal/hashState.ts +154 -0
  179. package/src/wasm/internal/hashes.ts +56 -15
  180. package/src/wasm/internal/hashes.wasm.ts +15 -3
  181. package/src/webauthn/Authentication.ts +4 -0
  182. package/src/webauthn/Registration.ts +2 -0
  183. package/src/webauthn/Types.ts +32 -2
  184. package/src/webauthn/_test/Authentication.test.ts +123 -1
  185. package/src/webauthn/_test/Registration.test.ts +26 -6
  186. package/src/webauthn/_test/WebAuthn.browser.test.ts +28 -0
  187. package/src/webauthn/internal/utils.ts +41 -8
@@ -21,6 +21,21 @@ test('every primitive is present, so callers need no assertion', () => {
21
21
  expectTypeOf<Slot['hmacSha256']>().toEqualTypeOf<
22
22
  (key: Uint8Array, message: Uint8Array) => Uint8Array
23
23
  >()
24
+ expectTypeOf<Slot['createBlake3']>().toEqualTypeOf<
25
+ () => CoreEngine.HashState
26
+ >()
27
+ expectTypeOf<Slot['createHmacSha256']>().toEqualTypeOf<
28
+ (key: Uint8Array) => CoreEngine.HashState
29
+ >()
30
+ expectTypeOf<Slot['createKeccak256']>().toEqualTypeOf<
31
+ () => CoreEngine.HashState
32
+ >()
33
+ expectTypeOf<Slot['createRipemd160']>().toEqualTypeOf<
34
+ () => CoreEngine.HashState
35
+ >()
36
+ expectTypeOf<Slot['createSha256']>().toEqualTypeOf<
37
+ () => CoreEngine.HashState
38
+ >()
24
39
  })
25
40
 
26
41
  test('the result is the raw slot, so `Engine.install` accepts it', () => {
@@ -29,6 +44,7 @@ test('the result is the raw slot, so `Engine.install` accepts it', () => {
29
44
 
30
45
  test('the WASM namespace exposes the public Hash API', () => {
31
46
  expectTypeOf(WasmHash.blake3).toEqualTypeOf(CoreHash.blake3)
47
+ expectTypeOf(WasmHash.createBlake3).toEqualTypeOf(CoreHash.createBlake3)
32
48
  expectTypeOf(WasmHash.sha256).toEqualTypeOf(CoreHash.sha256)
33
49
  expectTypeOf<typeof WasmHash>().not.toHaveProperty('create')
34
50
  })
@@ -8,8 +8,14 @@ import { Hash as WasmHash } from 'ox/wasm'
8
8
  import { beforeAll, describe, expect, test } from 'vp/test'
9
9
  import { wasmBase64 as blake3WasmBase64 } from '../internal/blake3.wasm.js'
10
10
  import * as blake3_internal from '../internal/blake3.js'
11
- import { hmacSha256ScratchSize, wasmBase64 } from '../internal/hashes.wasm.js'
11
+ import { blake3StateSize } from '../internal/blake3.wasm.js'
12
+ import {
13
+ hmacSha256ScratchSize,
14
+ hmacSha256StateSize,
15
+ wasmBase64,
16
+ } from '../internal/hashes.wasm.js'
12
17
  import * as hash from '../internal/hash.js'
18
+ import * as hashes_internal from '../internal/hashes.js'
13
19
  import * as internal from '../internal/instantiate.js'
14
20
 
15
21
  let engine: WasmHash.engine.ReturnType
@@ -23,6 +29,11 @@ describe('engine', () => {
23
29
  expect(Object.keys(await WasmHash.engine())).toMatchInlineSnapshot(`
24
30
  [
25
31
  "blake3",
32
+ "createBlake3",
33
+ "createHmacSha256",
34
+ "createKeccak256",
35
+ "createRipemd160",
36
+ "createSha256",
26
37
  "hmacSha256",
27
38
  "keccak256",
28
39
  "ripemd160",
@@ -58,6 +69,79 @@ function input(size: number) {
58
69
  return new Uint8Array(size).map((_, index) => (index * 37 + 11) & 0xff)
59
70
  }
60
71
 
72
+ type HashState = ReturnType<WasmHash.engine.ReturnType['createSha256']>
73
+
74
+ type IncrementalCase = {
75
+ create: () => HashState
76
+ digestSize: number
77
+ name: string
78
+ oneShot: (input: Uint8Array) => Uint8Array
79
+ wasmOneShot: (input: Uint8Array) => Uint8Array
80
+ }
81
+
82
+ function concat(...values: readonly Uint8Array[]) {
83
+ const output = new Uint8Array(
84
+ values.reduce((length, value) => length + value.length, 0),
85
+ )
86
+ let offset = 0
87
+ for (const value of values) {
88
+ output.set(value, offset)
89
+ offset += value.length
90
+ }
91
+ return output
92
+ }
93
+
94
+ function align8(value: number) {
95
+ return Math.ceil(value / 8) * 8
96
+ }
97
+
98
+ function digest(state: HashState, size: number) {
99
+ const output = new Uint8Array(size)
100
+ state.digestInto(output)
101
+ return output
102
+ }
103
+
104
+ function incrementalCases(): readonly IncrementalCase[] {
105
+ const key = input(100)
106
+ return [
107
+ {
108
+ create: () => engine.createBlake3(),
109
+ digestSize: 32,
110
+ name: 'blake3',
111
+ oneShot: blake3,
112
+ wasmOneShot: (value) => engine.blake3(value),
113
+ },
114
+ {
115
+ create: () => engine.createHmacSha256(key),
116
+ digestSize: 32,
117
+ name: 'hmacSha256',
118
+ oneShot: (value) => hmac(sha256, key, value),
119
+ wasmOneShot: (value) => engine.hmacSha256(key, value),
120
+ },
121
+ {
122
+ create: () => engine.createKeccak256(),
123
+ digestSize: 32,
124
+ name: 'keccak256',
125
+ oneShot: keccak_256,
126
+ wasmOneShot: (value) => engine.keccak256(value),
127
+ },
128
+ {
129
+ create: () => engine.createRipemd160(),
130
+ digestSize: 20,
131
+ name: 'ripemd160',
132
+ oneShot: ripemd160,
133
+ wasmOneShot: (value) => engine.ripemd160(value),
134
+ },
135
+ {
136
+ create: () => engine.createSha256(),
137
+ digestSize: 32,
138
+ name: 'sha256',
139
+ oneShot: sha256,
140
+ wasmOneShot: (value) => engine.sha256(value),
141
+ },
142
+ ]
143
+ }
144
+
61
145
  describe('Hash', () => {
62
146
  test.each(sizes)('blake3 matches the default at %i bytes', (size) => {
63
147
  expect(engine.blake3(input(size))).toEqual(blake3(input(size)))
@@ -86,6 +170,97 @@ describe('Hash', () => {
86
170
  },
87
171
  )
88
172
 
173
+ test.each(incrementalCases())(
174
+ '$name matches arbitrary chunk boundaries',
175
+ ({ create, digestSize, oneShot }) => {
176
+ const message = input(4097)
177
+ const snapshot = message.slice()
178
+ const chunks = [0, 1, 7, 55, 64, 129, 1023, 136, 2]
179
+ const state = create()
180
+ let offset = 0
181
+ let index = 0
182
+ while (offset < message.length) {
183
+ const length = Math.min(
184
+ chunks[index++ % chunks.length]!,
185
+ message.length - offset,
186
+ )
187
+ state.update(message.subarray(offset, offset + length))
188
+ offset += length
189
+ }
190
+
191
+ expect(digest(state, digestSize)).toEqual(oneShot(message))
192
+ expect(message).toEqual(snapshot)
193
+ },
194
+ )
195
+
196
+ test.each(incrementalCases())(
197
+ '$name clones an independent prefix',
198
+ ({ create, digestSize, oneShot }) => {
199
+ const prefix = input(137)
200
+ const left = input(63)
201
+ const right = input(1025)
202
+ const state = create()
203
+ state.update(prefix)
204
+ const clone = state.clone()
205
+ state.update(left)
206
+ clone.update(right)
207
+
208
+ expect(digest(state, digestSize)).toEqual(oneShot(concat(prefix, left)))
209
+ expect(digest(clone, digestSize)).toEqual(oneShot(concat(prefix, right)))
210
+ },
211
+ )
212
+
213
+ test.each(incrementalCases())(
214
+ '$name keeps interleaved states independent',
215
+ ({ create, digestSize, oneShot }) => {
216
+ const a = input(2049)
217
+ const b = input(271)
218
+ const stateA = create()
219
+ const stateB = create()
220
+
221
+ stateA.update(a.subarray(0, 55))
222
+ stateB.update(b.subarray(0, 136))
223
+ stateA.update(a.subarray(55, 1024))
224
+ stateB.update(b.subarray(136))
225
+ stateA.update(a.subarray(1024))
226
+
227
+ expect(digest(stateB, digestSize)).toEqual(oneShot(b))
228
+ expect(digest(stateA, digestSize)).toEqual(oneShot(a))
229
+ },
230
+ )
231
+
232
+ test.each(incrementalCases())(
233
+ '$name survives one-shot calls through the shared module',
234
+ ({ create, digestSize, oneShot, wasmOneShot }) => {
235
+ const message = input(1025)
236
+ const state = create()
237
+ state.update(message.subarray(0, 136))
238
+
239
+ expect(wasmOneShot(input(2049))).toEqual(oneShot(input(2049)))
240
+
241
+ state.update(message.subarray(136))
242
+ expect(digest(state, digestSize)).toEqual(oneShot(message))
243
+ },
244
+ )
245
+
246
+ test.each(incrementalCases())(
247
+ '$name consumes and clears its lifecycle',
248
+ ({ create, digestSize, oneShot }) => {
249
+ const message = input(72)
250
+ const state = create()
251
+ state.update(message)
252
+ const output = new Uint8Array(digestSize + 7).fill(0xa5)
253
+ state.digestInto(output)
254
+
255
+ expect(output.subarray(0, digestSize)).toEqual(oneShot(message))
256
+ expect(output.subarray(digestSize)).toEqual(new Uint8Array(7).fill(0xa5))
257
+ expect(() => state.update(message)).toThrow('destroyed')
258
+ expect(() => state.clone()).toThrow('destroyed')
259
+ expect(() => state.digestInto(output)).toThrow('destroyed')
260
+ expect(() => state.destroy()).not.toThrow()
261
+ },
262
+ )
263
+
89
264
  test('behavior: known vectors', () => {
90
265
  expect(Bytes.toHex(engine.blake3(new Uint8Array(0)))).toBe(
91
266
  '0xaf1349b9f5f9a1a6a0404dea36dcc9499bcb25c9adc112b7cc9a93cae41f3262',
@@ -134,6 +309,34 @@ describe('Hash', () => {
134
309
  )
135
310
  })
136
311
 
312
+ test('behavior: incremental blake3 clears every WASM workspace', async () => {
313
+ const module = await internal.instantiate<
314
+ blake3_internal.Exports & blake3_internal.StateExports
315
+ >(blake3WasmBase64)
316
+ const initEnd = align8(module.heapBase) + blake3StateSize
317
+ module.view().fill(0xa5, module.heapBase, initEnd)
318
+ const state = blake3_internal.create(module)
319
+ expect(module.view().slice(module.heapBase, initEnd)).toEqual(
320
+ new Uint8Array(initEnd - module.heapBase),
321
+ )
322
+
323
+ const message = input(1025)
324
+ const updateEnd = align8(module.heapBase + message.length) + blake3StateSize
325
+ state.update(message)
326
+ expect(module.view().slice(module.heapBase, updateEnd)).toEqual(
327
+ new Uint8Array(updateEnd - module.heapBase),
328
+ )
329
+
330
+ const output = new Uint8Array(32)
331
+ const finalizeEnd =
332
+ align8(module.heapBase) + blake3StateSize + output.length
333
+ state.digestInto(output)
334
+ expect(output).toEqual(blake3(message))
335
+ expect(module.view().slice(module.heapBase, finalizeEnd)).toEqual(
336
+ new Uint8Array(finalizeEnd - module.heapBase),
337
+ )
338
+ })
339
+
137
340
  test('behavior: blake3 clears its complete region after a late trap', async () => {
138
341
  const module =
139
342
  await internal.instantiate<blake3_internal.Exports>(blake3WasmBase64)
@@ -215,6 +418,35 @@ describe('Hash', () => {
215
418
  )
216
419
  })
217
420
 
421
+ test('behavior: incremental hmacSha256 clears every WASM workspace', async () => {
422
+ const module =
423
+ await internal.instantiate<hashes_internal.Exports>(wasmBase64)
424
+ const key = input(100)
425
+ const initEnd = align8(module.heapBase + key.length) + hmacSha256StateSize
426
+ module.view().fill(0xa5, module.heapBase, initEnd)
427
+ const state = hash.createHmacSha256(module, key)
428
+ expect(module.view().slice(module.heapBase, initEnd)).toEqual(
429
+ new Uint8Array(initEnd - module.heapBase),
430
+ )
431
+
432
+ const message = input(137)
433
+ const updateEnd =
434
+ align8(module.heapBase + message.length) + hmacSha256StateSize
435
+ state.update(message)
436
+ expect(module.view().slice(module.heapBase, updateEnd)).toEqual(
437
+ new Uint8Array(updateEnd - module.heapBase),
438
+ )
439
+
440
+ const output = new Uint8Array(32)
441
+ const finalizeEnd =
442
+ align8(module.heapBase) + hmacSha256StateSize + output.length
443
+ state.digestInto(output)
444
+ expect(output).toEqual(hmac(sha256, key, message))
445
+ expect(module.view().slice(module.heapBase, finalizeEnd)).toEqual(
446
+ new Uint8Array(finalizeEnd - module.heapBase),
447
+ )
448
+ })
449
+
218
450
  test('behavior: hmacSha256 clears its complete region after a trap', async () => {
219
451
  const module = await internal.instantiate<hash.Exports>(wasmBase64)
220
452
  const key = input(120)
@@ -264,6 +496,23 @@ describe('Hash', () => {
264
496
  )
265
497
  })
266
498
 
499
+ test('behavior: streams a large total input through bounded memory', async () => {
500
+ const module =
501
+ await internal.instantiate<hashes_internal.Exports>(wasmBase64)
502
+ const state = hashes_internal.create(module, 'sha256')
503
+ const expected = sha256.create()
504
+ const chunk = input(64 * 1024)
505
+ const memorySize = module.view().length
506
+
507
+ for (let index = 0; index < 1024; index++) {
508
+ state.update(chunk)
509
+ expected.update(chunk)
510
+ }
511
+
512
+ expect(module.view().length).toBe(memorySize)
513
+ expect(digest(state, 32)).toEqual(expected.digest())
514
+ }, 60_000)
515
+
267
516
  test('behavior: consecutive calls do not corrupt each other', () => {
268
517
  const a = input(200)
269
518
  const b = input(7)
@@ -1,4 +1,5 @@
1
- import { wasmBase64 } from './blake3.wasm.js'
1
+ import { blake3StateSize, wasmBase64 } from './blake3.wasm.js'
2
+ import * as hashState from './hashState.js'
2
3
  import * as internal from './instantiate.js'
3
4
 
4
5
  const digestSize = 32
@@ -10,8 +11,16 @@ export type Exports = {
10
11
  zero(ptr: number, length: number): void
11
12
  }
12
13
 
14
+ /** Exports supplied for incremental BLAKE3 states. @internal */
15
+ export type StateExports = {
16
+ blake3_finalize(state: number, out: number): void
17
+ blake3_init(state: number): void
18
+ blake3_update(state: number, input: number, inputLength: number): void
19
+ zero(ptr: number, length: number): void
20
+ }
21
+
13
22
  const instantiate = /*#__PURE__*/ internal.memoize(() =>
14
- internal.instantiate<Exports>(wasmBase64),
23
+ internal.instantiate<Exports & StateExports>(wasmBase64),
15
24
  )
16
25
 
17
26
  /** Returns the one memoized BLAKE3 instance shared by its providers. */
@@ -43,3 +52,15 @@ export function hash(
43
52
  module.exports.zero(inputPtr, size)
44
53
  }
45
54
  }
55
+
56
+ /** Creates an incremental BLAKE3 state. @internal */
57
+ export function create(module: internal.Module<Exports & StateExports>) {
58
+ return hashState.create(module, {
59
+ digestSize,
60
+ finalize: (exports, state, out) => exports.blake3_finalize(state, out),
61
+ init: (exports, state) => exports.blake3_init(state),
62
+ stateSize: blake3StateSize,
63
+ update: (exports, state, input, inputLength) =>
64
+ exports.blake3_update(state, input, inputLength),
65
+ })
66
+ }
@@ -8,4 +8,7 @@
8
8
 
9
9
  /** Base64-encoded WASM binary. */
10
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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'
11
+ 'AGFzbQEAAAABOwhgAn9/AGADf39/AGABfwBgBn9/f35/fwF/YAp/f39/fn9/f39/AGAFf39/fn8AYAV/f39/fwBgAAF/Aw0MAAABAQIBAwQFBgcABQYBAQKAgAQGCAF/AUGQiAQLB1sHBm1lbW9yeQIAC2JsYWtlM19oYXNoAAIEemVybwALC2JsYWtlM19pbml0AAQNYmxha2UzX3VwZGF0ZQAFD2JsYWtlM19maW5hbGl6ZQAACWhlYXBfYmFzZQAKCv24AQwIACAAIAEQAQvgEgIvfwV+IwBBsAFrIgIkAAJAIAAtAJABIgVFBEAgAiAALQAgOgAAIAIgAC8AITsAASACIAApACM3AAMgAiAAKQArNwALIAIgACgAMzYAEyACIAAvADc7ABcgAiAALQA5OgAZIAApA0AhMSAALQCKASEFIAAtAIkBIQQgAC0AiAEhAyACIAAvADo7ARogAiAAKAA8NgIcIAIgAC0ASDoAKCACIAApAEk3ACkgAiAAKQBRNwAxIAIgACgAWTYAOSACIAAvAF07AD0gAiAALQBfOgA/IAIgAC0AYDoAQCACIAM6AGggAiAFIARFciIFQQJyOgBpIAIgMTcDICACIAAtAGE6AEEgAiAAKABiNgFCIAIgACkAZjcBRiACIAApAG43AU4gAiAAKQB2NwFWIAIgACkAfjcBXiACIAAvAIYBOwFmIAIgAkEoaiADIAVBCnJB/wFxIAJB8ABqEAkMAQsCQAJAIAAtAIgBIgQgAC0AiQEiA0EGdHIEQCACQe4AaiACQfQAai8BADsBACACIAQ6AGggAiAAKQNANwMgIAIgACkAIDcDACACIAApACg3AwggAiAAKQAwNwMQIAIgACkAODcDGCACIAApAEg3AyggAiAAKQBQNwMwIAIgACkAWDcDOCACIAApAGA3A0AgAiAAKQBoNwNIIAIgACkAcDcDUCACIAApAHg3A1ggAiAAKQCAATcDYCACIAIoAXA2AWogAiAALQCKASADRXJBAnI6AGkMAQsgAkHuAGogAkH0AGovAQA7AQAgAkIANwMgIAJBwAA6AGggAiAAKQAANwMAIAIgACkACDcDCCACIAApABA3AxAgAiAAKQAYNwMYIAIgAigBcDYBaiACIAAtAIoBQQRyOgBpIAIgACAFQQJrIgVBBXRqIgNBkQFqKQAANwMoIAIgA0GZAWopAAA3AzAgAiADQaEBaikAADcDOCACIANBqQFqKQAANwNAIAIgA0GxAWopAAA3A0ggAiADQbkBaikAADcDUCACIANBwQFqKQAANwNYIAIgA0HJAWopAAA3A2AgBUUNAQsgBUEFdCEMIAJB6gBqIS0gAkEoaiEvIAItAGkhBCACKQMgITEgAi0AaCEuIAItAB8hDSACLQAeIQ4gAi0AHSEPIAItABwhECACLQAbIREgAi0AGiESIAItABkhEyACLQAYIRQgAi0AFyEVIAItABYhFiACLQAVIRcgAi0AFCEYIAItABMhGSACLQASIRogAi0AESEbIAItABAhHCACLQAPIR0gAi0ADiEeIAItAA0hHyACLQAMISAgAi0ACyEhIAItAAohIiACLQAJISMgAi0ACCEkIAItAAchJSACLQAGISYgAi0ABSEnIAItAAQhKCACLQADISkgAi0AAiEqIAItAAEhKyACLQAAISwDQCAAIAxqIgNB8QBqKQAAITIgA0H5AGopAAAhMyADQYEBaikAACE0IANBiQFqKQAAITUgAiANOgCPASACIA46AI4BIAIgDzoAjQEgAiAQOgCMASACIBE6AIsBIAIgEjoAigEgAiATOgCJASACIBQ6AIgBIAIgFToAhwEgAiAWOgCGASACIBc6AIUBIAIgGDoAhAEgAiAZOgCDASACIBo6AIIBIAIgGzoAgQEgAiAcOgCAASACIB06AH8gAiAeOgB+IAIgHzoAfSACICA6AHwgAiAhOgB7IAIgIjoAeiACICM6AHkgAiAkOgB4IAIgJToAdyACICY6AHYgAiAnOgB1IAIgKDoAdCACICk6AHMgAiAqOgByIAIgKzoAcSACICw6AHAgAkHwAGogLyAuIDEgBEH/AXEQCCACKAJwIQMgAigCdCEEIAIoAnghBiACKAJ8IQcgAigCgAEhCCACKAKEASEJIAIoAogBIQogAigCjAEhCyAALQCKASEwIAAtAAAhLCAALQABISsgAC0AAiEqIAAtAAMhKSAALQAEISggAC0ABSEnIAAtAAYhJiAALQAHISUgAC0ACCEkIAAtAAkhIyAALQAKISIgAC0ACyEhIAAtAAwhICAALQANIR8gAC0ADiEeIAAtAA8hHSAALQAQIRwgAC0AESEbIAAtABIhGiAALQATIRkgAC0AFCEYIAAtABUh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'
12
+
13
+ /** Constant shared with the module's C source. */
14
+ export const blake3StateSize = 1912
@@ -1,4 +1,5 @@
1
- import { hmacSha256ScratchSize } from './hashes.wasm.js'
1
+ import { hmacSha256ScratchSize, hmacSha256StateSize } from './hashes.wasm.js'
2
+ import * as hashState from './hashState.js'
2
3
  import type { Module } from './instantiate.js'
3
4
 
4
5
  /** WASM exports used by the HMAC-SHA256 loader. @internal */
@@ -14,6 +15,14 @@ export type Exports = {
14
15
  zero(ptr: number, length: number): void
15
16
  }
16
17
 
18
+ /** WASM exports used by incremental HMAC-SHA256 states. @internal */
19
+ export type StateExports = {
20
+ hmac_sha256_finalize(state: number, out: number): void
21
+ hmac_sha256_init(state: number, key: number, keyLength: number): void
22
+ hmac_sha256_update(state: number, input: number, inputLength: number): void
23
+ zero(ptr: number, length: number): void
24
+ }
25
+
17
26
  /** Calls HMAC-SHA256 and clears its complete linear-memory region. @internal */
18
27
  export function hmacSha256(
19
28
  module: Module<Exports>,
@@ -48,3 +57,20 @@ export function hmacSha256(
48
57
  module.exports.zero(messagePtr, end - messagePtr)
49
58
  }
50
59
  }
60
+
61
+ /** Creates an incremental HMAC-SHA256 state. @internal */
62
+ export function createHmacSha256(
63
+ module: Module<Exports & StateExports>,
64
+ key: Uint8Array,
65
+ ) {
66
+ return hashState.create(module, {
67
+ digestSize: 32,
68
+ finalize: (exports, state, out) => exports.hmac_sha256_finalize(state, out),
69
+ init: (exports, state, input, inputLength) =>
70
+ exports.hmac_sha256_init(state, input, inputLength),
71
+ input: key,
72
+ stateSize: hmacSha256StateSize,
73
+ update: (exports, state, input, inputLength) =>
74
+ exports.hmac_sha256_update(state, input, inputLength),
75
+ })
76
+ }