ox 1.1.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -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 +200 -1
- package/dist/core/Hash.d.ts.map +1 -1
- package/dist/core/Hash.js +207 -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/trusted-setups/Paths.d.ts +1 -0
- package/dist/trusted-setups/Paths.d.ts.map +1 -1
- package/dist/trusted-setups/Paths.js +1 -0
- package/dist/trusted-setups/Paths.js.map +1 -1
- package/dist/trusted-setups/Setups.d.ts +35 -0
- package/dist/trusted-setups/Setups.d.ts.map +1 -0
- package/dist/trusted-setups/Setups.js +29 -0
- package/dist/trusted-setups/Setups.js.map +1 -0
- package/dist/trusted-setups/index.d.ts +20 -0
- package/dist/trusted-setups/index.d.ts.map +1 -1
- package/dist/trusted-setups/index.js +20 -0
- package/dist/trusted-setups/index.js.map +1 -1
- package/dist/trusted-setups/internal/paths.d.ts.map +1 -1
- package/dist/trusted-setups/internal/paths.js +1 -1
- package/dist/trusted-setups/internal/paths.js.map +1 -1
- package/dist/trusted-setups/internal/setups/mainnet.d.ts +7 -0
- package/dist/trusted-setups/internal/setups/mainnet.d.ts.map +1 -0
- package/dist/trusted-setups/internal/setups/mainnet.js +11 -0
- package/dist/trusted-setups/internal/setups/mainnet.js.map +1 -0
- package/dist/wasm/Engine.d.ts +4 -3
- package/dist/wasm/Engine.d.ts.map +1 -1
- package/dist/wasm/Engine.js +5 -5
- 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/Keystore.d.ts +23 -9
- package/dist/wasm/Keystore.d.ts.map +1 -1
- package/dist/wasm/Keystore.js +30 -13
- package/dist/wasm/Keystore.js.map +1 -1
- package/dist/wasm/Kzg.d.ts +112 -0
- package/dist/wasm/Kzg.d.ts.map +1 -0
- package/dist/wasm/Kzg.js +333 -0
- package/dist/wasm/Kzg.js.map +1 -0
- package/dist/wasm/Secp256k1.d.ts +55 -0
- package/dist/wasm/Secp256k1.d.ts.map +1 -0
- package/dist/wasm/Secp256k1.js +181 -0
- package/dist/wasm/Secp256k1.js.map +1 -0
- package/dist/wasm/index.d.ts +44 -1
- package/dist/wasm/index.d.ts.map +1 -1
- package/dist/wasm/index.js +44 -1
- package/dist/wasm/index.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/wasm/internal/instantiate.d.ts +12 -0
- package/dist/wasm/internal/instantiate.d.ts.map +1 -1
- package/dist/wasm/internal/instantiate.js +23 -7
- package/dist/wasm/internal/instantiate.js.map +1 -1
- package/dist/wasm/internal/keystore.d.ts +10 -0
- package/dist/wasm/internal/keystore.d.ts.map +1 -0
- package/dist/wasm/internal/keystore.js +10 -0
- package/dist/wasm/internal/keystore.js.map +1 -0
- package/dist/wasm/internal/kzg.d.ts +17 -0
- package/dist/wasm/internal/kzg.d.ts.map +1 -0
- package/dist/wasm/internal/kzg.js +8 -0
- package/dist/wasm/internal/kzg.js.map +1 -0
- package/dist/wasm/internal/kzg.wasm.d.ts +3 -0
- package/dist/wasm/internal/kzg.wasm.d.ts.map +1 -0
- package/dist/wasm/internal/kzg.wasm.js +10 -0
- package/dist/wasm/internal/kzg.wasm.js.map +1 -0
- package/dist/wasm/internal/scrypt.d.ts +16 -0
- package/dist/wasm/internal/scrypt.d.ts.map +1 -0
- package/dist/wasm/internal/scrypt.js +78 -0
- package/dist/wasm/internal/scrypt.js.map +1 -0
- package/dist/wasm/internal/scrypt.wasm.d.ts +7 -0
- package/dist/wasm/internal/scrypt.wasm.d.ts.map +1 -0
- package/dist/wasm/internal/scrypt.wasm.js +14 -0
- package/dist/wasm/internal/scrypt.wasm.js.map +1 -0
- package/dist/wasm/internal/secp256k1.d.ts +16 -0
- package/dist/wasm/internal/secp256k1.d.ts.map +1 -0
- package/dist/wasm/internal/secp256k1.js +20 -0
- package/dist/wasm/internal/secp256k1.js.map +1 -0
- package/dist/wasm/internal/secp256k1.wasm.d.ts +3 -0
- package/dist/wasm/internal/secp256k1.wasm.d.ts.map +1 -0
- package/dist/wasm/internal/secp256k1.wasm.js +10 -0
- package/dist/wasm/internal/secp256k1.wasm.js.map +1 -0
- 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 +27 -2
- 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 +321 -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/Block.test.ts +9 -2
- 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 +41 -0
- package/src/core/_test/Hash.test.ts +278 -1
- package/src/core/_test/Hash.vectors.test.ts +1 -2
- 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/Transaction.test.ts +11 -2
- 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 +11 -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/trusted-setups/Paths.ts +1 -0
- package/src/trusted-setups/README.md +39 -0
- package/src/trusted-setups/Setups.ts +46 -0
- package/src/trusted-setups/_test/Paths.test.ts +16 -0
- package/src/trusted-setups/_test/Setups.test-d.ts +7 -0
- package/src/trusted-setups/_test/Setups.test.ts +43 -0
- package/src/trusted-setups/_test/index.test.ts +1 -0
- package/src/trusted-setups/index.ts +21 -0
- package/src/trusted-setups/internal/paths.ts +4 -1
- package/src/trusted-setups/internal/setups/mainnet.source.json +7 -0
- package/src/trusted-setups/internal/setups/mainnet.ts +16 -0
- package/src/version.ts +1 -1
- package/src/wasm/Engine.ts +9 -6
- package/src/wasm/Hash.ts +10 -0
- package/src/wasm/Keystore.bench.ts +26 -0
- package/src/wasm/Keystore.ts +32 -14
- package/src/wasm/Kzg.bench.ts +63 -0
- package/src/wasm/Kzg.ts +518 -0
- package/src/wasm/Secp256k1.bench.ts +79 -0
- package/src/wasm/Secp256k1.ts +248 -0
- package/src/wasm/_test/Engine.test-d.ts +2 -0
- package/src/wasm/_test/Engine.test.ts +5 -0
- package/src/wasm/_test/Hash.browser.test.ts +31 -0
- package/src/wasm/_test/Hash.test-d.ts +17 -0
- package/src/wasm/_test/Hash.test.ts +252 -3
- package/src/wasm/_test/Keystore.browser.test.ts +31 -0
- package/src/wasm/_test/Keystore.fuzz.ts +50 -0
- package/src/wasm/_test/Keystore.test-d.ts +10 -1
- package/src/wasm/_test/Keystore.test.ts +289 -4
- package/src/wasm/_test/Kzg.test-d.ts +19 -0
- package/src/wasm/_test/Kzg.test.ts +220 -0
- package/src/wasm/_test/Runtime.test.ts +9 -0
- package/src/wasm/_test/Secp256k1.test-d.ts +35 -0
- package/src/wasm/_test/Secp256k1.test.ts +354 -0
- package/src/wasm/index.ts +46 -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/wasm/internal/instantiate.ts +29 -9
- package/src/wasm/internal/keystore.ts +19 -0
- package/src/wasm/internal/kzg.ts +50 -0
- package/src/wasm/internal/kzg.wasm.ts +11 -0
- package/src/wasm/internal/scrypt.ts +131 -0
- package/src/wasm/internal/scrypt.wasm.ts +17 -0
- package/src/wasm/internal/secp256k1.ts +62 -0
- package/src/wasm/internal/secp256k1.wasm.ts +11 -0
- 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
- package/wasm/vendor/c-kzg-4844/LICENSE +201 -0
- package/wasm/vendor/c-kzg-4844/blst/LICENSE +201 -0
- package/src/trusted-setups/internal/setups/mainnet.txt +0 -4163
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Address, Bytes, Hex, PublicKey, Secp256k1 } from 'ox'
|
|
1
|
+
import { Address, Bytes, Engine, Hex, PublicKey, Secp256k1 } from 'ox'
|
|
2
2
|
import { describe, expect, test } from 'vp/test'
|
|
3
3
|
import { accounts } from '../../../test/constants/accounts.js'
|
|
4
4
|
|
|
@@ -123,6 +123,94 @@ describe('createKeyPair', () => {
|
|
|
123
123
|
})
|
|
124
124
|
})
|
|
125
125
|
|
|
126
|
+
describe('fromPrf', () => {
|
|
127
|
+
test.each([
|
|
128
|
+
{
|
|
129
|
+
privateKey:
|
|
130
|
+
'0xd23e6d2bbfdc109c1d4706bc3a78a32356682a4e6ef09c3bbeabf5460235de36',
|
|
131
|
+
prf: '0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
privateKey:
|
|
135
|
+
'0xcf0eab798d92f274ee2b9b6f3397186cdd3a08b09c77b7313fb1abf529611bc5',
|
|
136
|
+
prf: '0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
|
|
137
|
+
},
|
|
138
|
+
] as const)('vector: $prf', ({ privateKey, prf }) => {
|
|
139
|
+
expect(Secp256k1.fromPrf(prf)).toBe(privateKey)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
test('value: Bytes', () => {
|
|
143
|
+
const prf = Bytes.fromHex(
|
|
144
|
+
'0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
|
|
145
|
+
)
|
|
146
|
+
expect(Secp256k1.fromPrf(prf)).toMatchInlineSnapshot(
|
|
147
|
+
`"0xcf0eab798d92f274ee2b9b6f3397186cdd3a08b09c77b7313fb1abf529611bc5"`,
|
|
148
|
+
)
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
test('options: as', () => {
|
|
152
|
+
const privateKey = Secp256k1.fromPrf(
|
|
153
|
+
'0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
|
|
154
|
+
{ as: 'Bytes' },
|
|
155
|
+
)
|
|
156
|
+
expect(privateKey).toEqual(
|
|
157
|
+
Bytes.fromHex(
|
|
158
|
+
'0xcf0eab798d92f274ee2b9b6f3397186cdd3a08b09c77b7313fb1abf529611bc5',
|
|
159
|
+
),
|
|
160
|
+
)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('behavior: output is a valid secp256k1 private key', () => {
|
|
164
|
+
const privateKey = Secp256k1.fromPrf(Bytes.random(32), { as: 'Bytes' })
|
|
165
|
+
expect(Secp256k1.noble.utils.isValidSecretKey(privateKey)).toBe(true)
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
test('behavior: skips invalid scalar candidates', () => {
|
|
169
|
+
const messages: Hex.Hex[] = []
|
|
170
|
+
const privateKey = Engine.with(
|
|
171
|
+
{
|
|
172
|
+
Hash: {
|
|
173
|
+
hmacSha256: (_key, message) => {
|
|
174
|
+
messages.push(Hex.fromBytes(message))
|
|
175
|
+
if (messages.length === 1) return new Uint8Array(32)
|
|
176
|
+
return Bytes.fromHex(
|
|
177
|
+
'0xef3f982137910a4c362017e69ba173fbb342325802ec827767aa6942027af35b',
|
|
178
|
+
)
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
() =>
|
|
183
|
+
Secp256k1.fromPrf(
|
|
184
|
+
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
|
185
|
+
),
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
expect(privateKey).toBe(
|
|
189
|
+
'0xef3f982137910a4c362017e69ba173fbb342325802ec827767aa6942027af35b',
|
|
190
|
+
)
|
|
191
|
+
expect(messages).toMatchInlineSnapshot(`
|
|
192
|
+
[
|
|
193
|
+
"0x6f782e736563703235366b312e66726f6d5072662e763100000000",
|
|
194
|
+
"0x6f782e736563703235366b312e66726f6d5072662e763100000001",
|
|
195
|
+
]
|
|
196
|
+
`)
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
test('error: PRF output is too short', () => {
|
|
200
|
+
expect(() => Secp256k1.fromPrf(new Uint8Array(31)))
|
|
201
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
202
|
+
[Secp256k1.InvalidPrfSizeError: PRF output must be exactly 32 bytes. Received 31 bytes.]
|
|
203
|
+
`)
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
test('error: PRF output is too long', () => {
|
|
207
|
+
expect(() => Secp256k1.fromPrf(new Uint8Array(33)))
|
|
208
|
+
.toThrowErrorMatchingInlineSnapshot(`
|
|
209
|
+
[Secp256k1.InvalidPrfSizeError: PRF output must be exactly 32 bytes. Received 33 bytes.]
|
|
210
|
+
`)
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
|
|
126
214
|
describe('getSharedSecret', () => {
|
|
127
215
|
test('default', () => {
|
|
128
216
|
const privateKeyA = accounts[0].privateKey
|
|
@@ -483,6 +571,7 @@ test('exports', () => {
|
|
|
483
571
|
[
|
|
484
572
|
"noble",
|
|
485
573
|
"createKeyPair",
|
|
574
|
+
"fromPrf",
|
|
486
575
|
"getPublicKey",
|
|
487
576
|
"getSharedSecret",
|
|
488
577
|
"randomPrivateKey",
|
|
@@ -490,6 +579,7 @@ test('exports', () => {
|
|
|
490
579
|
"recoverPublicKey",
|
|
491
580
|
"sign",
|
|
492
581
|
"verify",
|
|
582
|
+
"InvalidPrfSizeError",
|
|
493
583
|
]
|
|
494
584
|
`)
|
|
495
585
|
})
|
|
@@ -158,7 +158,11 @@ describe('fromRpc', () => {
|
|
|
158
158
|
})
|
|
159
159
|
.then(Transaction.fromRpc)
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
const { blockTimestamp: _, ...transaction_ } = {
|
|
162
|
+
blockTimestamp: undefined,
|
|
163
|
+
...transaction,
|
|
164
|
+
}
|
|
165
|
+
expect(transaction_).toMatchInlineSnapshot(`
|
|
162
166
|
{
|
|
163
167
|
"blockHash": "0x8299a290ae51a8958965987e2caf178a09b8ecde01b737b5f9a8badbacb407cb",
|
|
164
168
|
"blockNumber": 1110749n,
|
|
@@ -411,7 +415,12 @@ describe('fromRpc', () => {
|
|
|
411
415
|
],
|
|
412
416
|
})
|
|
413
417
|
.then(Transaction.fromRpc)
|
|
414
|
-
|
|
418
|
+
|
|
419
|
+
const { blockTimestamp: _, ...transaction_ } = {
|
|
420
|
+
blockTimestamp: undefined,
|
|
421
|
+
...transaction,
|
|
422
|
+
}
|
|
423
|
+
expect(transaction_).toMatchInlineSnapshot(`
|
|
415
424
|
{
|
|
416
425
|
"accessList": [],
|
|
417
426
|
"blockHash": "0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b",
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Bytes,
|
|
3
|
+
type Hex,
|
|
4
|
+
Secp256k1,
|
|
5
|
+
WebAuthn,
|
|
6
|
+
type WebAuthnP256,
|
|
7
|
+
} from 'ox'
|
|
8
|
+
import { describe, expectTypeOf, test } from 'vp/test'
|
|
9
|
+
|
|
10
|
+
declare const input: Bytes.Bytes
|
|
11
|
+
|
|
12
|
+
describe('createCredential', () => {
|
|
13
|
+
test('behavior: returns required PRF output when requested', () => {
|
|
14
|
+
const infer = async () => {
|
|
15
|
+
const credential = await WebAuthn.createCredential({
|
|
16
|
+
name: 'Example',
|
|
17
|
+
prf: true,
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
expectTypeOf(credential.prf).toEqualTypeOf<Bytes.Bytes>()
|
|
21
|
+
expectTypeOf(Secp256k1.fromPrf(credential.prf)).toEqualTypeOf<Hex.Hex>()
|
|
22
|
+
}
|
|
23
|
+
expectTypeOf(infer).toBeFunction()
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test('behavior: preserves ordinary credential return type', () => {
|
|
27
|
+
const infer = async () => {
|
|
28
|
+
const credential = await WebAuthn.createCredential({
|
|
29
|
+
name: 'Example',
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
expectTypeOf(credential).toEqualTypeOf<WebAuthnP256.P256Credential>()
|
|
33
|
+
// @ts-expect-error Ordinary credential creation has no PRF output.
|
|
34
|
+
void credential.prf
|
|
35
|
+
}
|
|
36
|
+
expectTypeOf(infer).toBeFunction()
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('behavior: accepts custom input', () => {
|
|
40
|
+
const infer = async () => {
|
|
41
|
+
const credential = await WebAuthn.createCredential({
|
|
42
|
+
name: 'Example',
|
|
43
|
+
prf: {
|
|
44
|
+
input,
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
expectTypeOf(credential.prf).toEqualTypeOf<Bytes.Bytes>()
|
|
49
|
+
}
|
|
50
|
+
expectTypeOf(infer).toBeFunction()
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
test('error: managed options', () => {
|
|
54
|
+
const managedExtension = () =>
|
|
55
|
+
// @ts-expect-error The PRF extension is managed by createCredential.
|
|
56
|
+
WebAuthn.createCredential({
|
|
57
|
+
extensions: {
|
|
58
|
+
prf: {
|
|
59
|
+
eval: {
|
|
60
|
+
first: input,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
name: 'Example',
|
|
65
|
+
prf: true,
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
const userVerification = () =>
|
|
69
|
+
WebAuthn.createCredential({
|
|
70
|
+
authenticatorSelection: {
|
|
71
|
+
// @ts-expect-error User verification is always required.
|
|
72
|
+
userVerification: 'preferred',
|
|
73
|
+
},
|
|
74
|
+
name: 'Example',
|
|
75
|
+
prf: true,
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const rawOptions = {
|
|
79
|
+
name: 'Example',
|
|
80
|
+
prf: true,
|
|
81
|
+
publicKey: {},
|
|
82
|
+
} as const
|
|
83
|
+
const publicKey = () =>
|
|
84
|
+
// @ts-expect-error Raw credential options cannot be combined with PRF.
|
|
85
|
+
WebAuthn.createCredential(rawOptions)
|
|
86
|
+
|
|
87
|
+
expectTypeOf(managedExtension).toBeFunction()
|
|
88
|
+
expectTypeOf(publicKey).toBeFunction()
|
|
89
|
+
expectTypeOf(userVerification).toBeFunction()
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
describe('getCredential', () => {
|
|
94
|
+
test('behavior: returns required PRF output', () => {
|
|
95
|
+
const infer = async () => {
|
|
96
|
+
const credential = await WebAuthn.getCredential({
|
|
97
|
+
prf: true,
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
expectTypeOf(credential.prf).toEqualTypeOf<Bytes.Bytes>()
|
|
101
|
+
expectTypeOf(credential.id).toEqualTypeOf<string>()
|
|
102
|
+
expectTypeOf(credential.raw).toEqualTypeOf<WebAuthn.PublicKeyCredential>()
|
|
103
|
+
// @ts-expect-error PRF requests do not parse the assertion signature.
|
|
104
|
+
void credential.signature
|
|
105
|
+
}
|
|
106
|
+
expectTypeOf(infer).toBeFunction()
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
test('error: managed options', () => {
|
|
110
|
+
const managedExtension = () =>
|
|
111
|
+
WebAuthn.getCredential({
|
|
112
|
+
extensions: {
|
|
113
|
+
// @ts-expect-error The PRF extension is managed by getCredential.
|
|
114
|
+
prf: {
|
|
115
|
+
eval: {
|
|
116
|
+
first: input,
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
prf: true,
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const userVerification = () =>
|
|
124
|
+
WebAuthn.getCredential({
|
|
125
|
+
prf: true,
|
|
126
|
+
// @ts-expect-error User verification is always required.
|
|
127
|
+
userVerification: 'preferred',
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
const rawOptions = {
|
|
131
|
+
prf: true,
|
|
132
|
+
publicKey: {},
|
|
133
|
+
} as const
|
|
134
|
+
const publicKey = () =>
|
|
135
|
+
// @ts-expect-error Raw credential options cannot be combined with PRF.
|
|
136
|
+
WebAuthn.getCredential(rawOptions)
|
|
137
|
+
|
|
138
|
+
expectTypeOf(managedExtension).toBeFunction()
|
|
139
|
+
expectTypeOf(publicKey).toBeFunction()
|
|
140
|
+
expectTypeOf(userVerification).toBeFunction()
|
|
141
|
+
})
|
|
142
|
+
})
|