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.
- package/CHANGELOG.md +40 -0
- package/dist/core/AbiFunction.d.ts +1 -1
- package/dist/core/AbiFunction.d.ts.map +1 -1
- package/dist/core/AbiFunction.js +6 -2
- package/dist/core/AbiFunction.js.map +1 -1
- package/dist/core/AbiParameters.d.ts +1 -1
- package/dist/core/AbiParameters.d.ts.map +1 -1
- package/dist/core/AbiParameters.js +1 -13
- package/dist/core/AbiParameters.js.map +1 -1
- package/dist/core/AesGcm.d.ts +36 -1
- package/dist/core/AesGcm.d.ts.map +1 -1
- package/dist/core/AesGcm.js +44 -0
- package/dist/core/AesGcm.js.map +1 -1
- package/dist/core/Ed25519.d.ts +46 -1
- package/dist/core/Ed25519.d.ts.map +1 -1
- package/dist/core/Ed25519.js +43 -0
- package/dist/core/Ed25519.js.map +1 -1
- package/dist/core/Engine.d.ts +1 -1
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Hash.d.ts +164 -1
- package/dist/core/Hash.d.ts.map +1 -1
- package/dist/core/Hash.js +172 -0
- package/dist/core/Hash.js.map +1 -1
- package/dist/core/Hex.d.ts.map +1 -1
- package/dist/core/Hex.js +1 -4
- package/dist/core/Hex.js.map +1 -1
- package/dist/core/Rlp.d.ts +32 -0
- package/dist/core/Rlp.d.ts.map +1 -1
- package/dist/core/Rlp.js +146 -0
- package/dist/core/Rlp.js.map +1 -1
- package/dist/core/Secp256k1.d.ts +46 -1
- package/dist/core/Secp256k1.d.ts.map +1 -1
- package/dist/core/Secp256k1.js +48 -0
- package/dist/core/Secp256k1.js.map +1 -1
- package/dist/core/WebAuthn.d.ts +224 -0
- package/dist/core/WebAuthn.d.ts.map +1 -0
- package/dist/core/WebAuthn.js +343 -0
- package/dist/core/WebAuthn.js.map +1 -0
- package/dist/core/WebAuthnP256.d.ts +46 -50
- package/dist/core/WebAuthnP256.d.ts.map +1 -1
- package/dist/core/WebAuthnP256.js +44 -50
- package/dist/core/WebAuthnP256.js.map +1 -1
- package/dist/core/internal/abiParameters.d.ts +7 -87
- package/dist/core/internal/abiParameters.d.ts.map +1 -1
- package/dist/core/internal/abiParameters.js +339 -194
- package/dist/core/internal/abiParameters.js.map +1 -1
- package/dist/core/internal/engine.d.ts +35 -2
- package/dist/core/internal/engine.d.ts.map +1 -1
- package/dist/core/internal/engine.js +12 -1
- package/dist/core/internal/engine.js.map +1 -1
- package/dist/core/internal/hash.d.ts +10 -0
- package/dist/core/internal/hash.d.ts.map +1 -1
- package/dist/core/internal/hash.js +26 -1
- package/dist/core/internal/hash.js.map +1 -1
- package/dist/index.d.ts +23 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -14
- package/dist/index.js.map +1 -1
- package/dist/node/Engine.d.ts +1 -1
- package/dist/node/Engine.d.ts.map +1 -1
- package/dist/node/Engine.js.map +1 -1
- package/dist/node/Hash.d.ts +6 -4
- package/dist/node/Hash.d.ts.map +1 -1
- package/dist/node/Hash.js +35 -3
- package/dist/node/Hash.js.map +1 -1
- package/dist/tempo/AuthorizationTempo.d.ts +6 -6
- package/dist/tempo/AuthorizationTempo.js +6 -6
- package/dist/tempo/KeyAuthorization.d.ts +3 -8
- package/dist/tempo/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/KeyAuthorization.js +3 -8
- package/dist/tempo/KeyAuthorization.js.map +1 -1
- package/dist/tempo/SignatureEnvelope.d.ts +8 -8
- package/dist/tempo/SignatureEnvelope.js +8 -8
- package/dist/wasm/Engine.d.ts +1 -1
- package/dist/wasm/Engine.d.ts.map +1 -1
- package/dist/wasm/Engine.js.map +1 -1
- package/dist/wasm/Hash.d.ts +1 -1
- package/dist/wasm/Hash.d.ts.map +1 -1
- package/dist/wasm/Hash.js +5 -0
- package/dist/wasm/Hash.js.map +1 -1
- package/dist/wasm/internal/blake3.d.ts +10 -1
- package/dist/wasm/internal/blake3.d.ts.map +1 -1
- package/dist/wasm/internal/blake3.js +12 -1
- package/dist/wasm/internal/blake3.js.map +1 -1
- package/dist/wasm/internal/blake3.wasm.d.ts +3 -1
- package/dist/wasm/internal/blake3.wasm.d.ts.map +1 -1
- package/dist/wasm/internal/blake3.wasm.js +3 -1
- package/dist/wasm/internal/blake3.wasm.js.map +1 -1
- package/dist/wasm/internal/hash.d.ts +9 -0
- package/dist/wasm/internal/hash.d.ts.map +1 -1
- package/dist/wasm/internal/hash.js +13 -1
- package/dist/wasm/internal/hash.js.map +1 -1
- package/dist/wasm/internal/hashState.d.ts +25 -0
- package/dist/wasm/internal/hashState.d.ts.map +1 -0
- package/dist/wasm/internal/hashState.js +105 -0
- package/dist/wasm/internal/hashState.js.map +1 -0
- package/dist/wasm/internal/hashes.d.ts +12 -1
- package/dist/wasm/internal/hashes.d.ts.map +1 -1
- package/dist/wasm/internal/hashes.js +18 -1
- package/dist/wasm/internal/hashes.js.map +1 -1
- package/dist/wasm/internal/hashes.wasm.d.ts +11 -3
- package/dist/wasm/internal/hashes.wasm.d.ts.map +1 -1
- package/dist/wasm/internal/hashes.wasm.js +11 -3
- package/dist/wasm/internal/hashes.wasm.js.map +1 -1
- package/dist/webauthn/Authentication.d.ts +2 -0
- package/dist/webauthn/Authentication.d.ts.map +1 -1
- package/dist/webauthn/Authentication.js +2 -1
- package/dist/webauthn/Authentication.js.map +1 -1
- package/dist/webauthn/Registration.d.ts.map +1 -1
- package/dist/webauthn/Registration.js +2 -1
- package/dist/webauthn/Registration.js.map +1 -1
- package/dist/webauthn/Types.d.ts +27 -6
- package/dist/webauthn/Types.d.ts.map +1 -1
- package/dist/webauthn/internal/utils.d.ts.map +1 -1
- package/dist/webauthn/internal/utils.js +35 -9
- package/dist/webauthn/internal/utils.js.map +1 -1
- package/dist/zod/TypedData.d.ts +2 -2
- package/package.json +13 -1
- package/src/benchmarks/Ox.bench.ts +6 -0
- package/src/benchmarks/OxNode.bench.ts +8 -0
- package/src/benchmarks/OxV0.bench.ts +4 -0
- package/src/benchmarks/OxWasm.bench.ts +22 -0
- package/src/core/AbiFunction.ts +5 -5
- package/src/core/AbiParameters.ts +8 -20
- package/src/core/AesGcm.ts +86 -1
- package/src/core/Ed25519.ts +87 -1
- package/src/core/Engine.ts +1 -0
- package/src/core/Hash.ts +262 -1
- package/src/core/Hex.ts +1 -4
- package/src/core/Rlp.ts +172 -5
- package/src/core/Secp256k1.ts +92 -1
- package/src/core/WebAuthn.ts +579 -0
- package/src/core/WebAuthnP256.ts +47 -50
- package/src/core/_test/AbiFunction.test.ts +9 -0
- package/src/core/_test/AbiParameters.differential.fuzz.ts +156 -0
- package/src/core/_test/AbiParameters.encode.test.ts +22 -0
- package/src/core/_test/AbiParameters.fuzz.ts +4 -0
- package/src/core/_test/AesGcm.test.ts +76 -0
- package/src/core/_test/Ed25519.test-d.ts +13 -1
- package/src/core/_test/Ed25519.test.ts +120 -1
- package/src/core/_test/Engine.test-d.ts +9 -0
- package/src/core/_test/Engine.test.ts +1 -1
- package/src/core/_test/Hash.test-d.ts +23 -0
- package/src/core/_test/Hash.test.ts +179 -1
- package/src/core/_test/Hex.test.ts +2 -0
- package/src/core/_test/Rlp.test-d.ts +18 -0
- package/src/core/_test/Rlp.test.ts +109 -0
- package/src/core/_test/Secp256k1.test-d.ts +14 -0
- package/src/core/_test/Secp256k1.test.ts +91 -1
- package/src/core/_test/WebAuthn.test-d.ts +142 -0
- package/src/core/_test/WebAuthn.test.ts +766 -0
- package/src/core/_test/index.test.ts +1 -0
- package/src/core/internal/abiParameters.ts +466 -326
- package/src/core/internal/engine.ts +47 -2
- package/src/core/internal/hash.ts +53 -1
- package/src/index.ts +24 -14
- package/src/node/Engine.ts +1 -0
- package/src/node/Hash.ts +43 -6
- package/src/node/_test/Engine.test-d.ts +1 -0
- package/src/node/_test/Engine.test.ts +2 -0
- package/src/node/_test/Hash.test-d.ts +10 -0
- package/src/node/_test/Hash.test.ts +46 -0
- package/src/tempo/AuthorizationTempo.ts +6 -6
- package/src/tempo/KeyAuthorization.ts +3 -8
- package/src/tempo/SignatureEnvelope.ts +8 -8
- package/src/version.ts +1 -1
- package/src/wasm/Engine.ts +1 -0
- package/src/wasm/Hash.ts +10 -0
- package/src/wasm/_test/Engine.test-d.ts +1 -0
- package/src/wasm/_test/Engine.test.ts +5 -0
- package/src/wasm/_test/Hash.browser.test.ts +28 -0
- package/src/wasm/_test/Hash.test-d.ts +16 -0
- package/src/wasm/_test/Hash.test.ts +250 -1
- package/src/wasm/internal/blake3.ts +23 -2
- package/src/wasm/internal/blake3.wasm.ts +4 -1
- package/src/wasm/internal/hash.ts +27 -1
- package/src/wasm/internal/hashState.ts +154 -0
- package/src/wasm/internal/hashes.ts +56 -15
- package/src/wasm/internal/hashes.wasm.ts +15 -3
- package/src/webauthn/Authentication.ts +4 -0
- package/src/webauthn/Registration.ts +2 -0
- package/src/webauthn/Types.ts +32 -2
- package/src/webauthn/_test/Authentication.test.ts +123 -1
- package/src/webauthn/_test/Registration.test.ts +26 -6
- package/src/webauthn/_test/WebAuthn.browser.test.ts +28 -0
- 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 {
|
|
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
|
+
}
|