@tinfoilsh/passkey-kit 0.2.2 → 0.2.4
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/README.md +40 -119
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/kit.d.ts.map +1 -1
- package/dist/kit.js +15 -4
- package/dist/kit.js.map +1 -1
- package/dist/support.d.ts +2 -2
- package/dist/support.d.ts.map +1 -1
- package/dist/support.js +2 -2
- package/dist/support.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webauthn.d.ts +3 -3
- package/dist/webauthn.d.ts.map +1 -1
- package/dist/webauthn.js +36 -5
- package/dist/webauthn.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/kit.ts +20 -4
- package/src/support.ts +3 -2
- package/src/types.ts +6 -0
- package/src/webauthn.ts +42 -7
package/README.md
CHANGED
|
@@ -9,15 +9,10 @@ session to a server, or provide hosted storage.
|
|
|
9
9
|
|
|
10
10
|
## JavaScript quickstart
|
|
11
11
|
|
|
12
|
-
Install the browser package:
|
|
13
|
-
|
|
14
12
|
```sh
|
|
15
13
|
npm install @tinfoilsh/passkey-kit
|
|
16
14
|
```
|
|
17
15
|
|
|
18
|
-
Create one explicit version 1 profile and keep every field stable for existing
|
|
19
|
-
records. The display name belongs to manager configuration, not the profile.
|
|
20
|
-
|
|
21
16
|
```ts
|
|
22
17
|
import {
|
|
23
18
|
createPasskeyKeyManager,
|
|
@@ -26,153 +21,79 @@ import {
|
|
|
26
21
|
} from "@tinfoilsh/passkey-kit";
|
|
27
22
|
|
|
28
23
|
const encoder = new TextEncoder();
|
|
29
|
-
|
|
30
|
-
version: 1,
|
|
31
|
-
relyingPartyId: "example.com",
|
|
32
|
-
prfSalt: encoder.encode("example-key-wrapping"),
|
|
33
|
-
hkdfInfo: encoder.encode("example-wrapping-key-v1"),
|
|
34
|
-
};
|
|
24
|
+
// Keep every profile field stable for existing records.
|
|
35
25
|
const manager = createPasskeyKeyManager({
|
|
36
|
-
profile
|
|
26
|
+
profile: {
|
|
27
|
+
version: 1,
|
|
28
|
+
relyingPartyId: "example.com",
|
|
29
|
+
prfSalt: encoder.encode("example-key-wrapping"),
|
|
30
|
+
hkdfInfo: encoder.encode("example-wrapping-key-v1"),
|
|
31
|
+
},
|
|
37
32
|
relyingPartyName: "Example App",
|
|
38
33
|
});
|
|
39
|
-
const key = crypto.getRandomValues(new Uint8Array(32));
|
|
40
34
|
|
|
41
35
|
const created = await manager.createAndWrapKey({
|
|
42
|
-
user: {
|
|
43
|
-
|
|
44
|
-
name: "person@example.com",
|
|
45
|
-
displayName: "Example Person",
|
|
46
|
-
},
|
|
47
|
-
key,
|
|
36
|
+
user: { id: crypto.getRandomValues(new Uint8Array(32)), name: "person@example.com" },
|
|
37
|
+
key: crypto.getRandomValues(new Uint8Array(32)),
|
|
48
38
|
});
|
|
49
|
-
|
|
39
|
+
// Persist the encoded records in your application's storage.
|
|
40
|
+
const records = [encodeWrappedKeyRecord(created.wrappedKey)];
|
|
50
41
|
|
|
51
|
-
const
|
|
52
|
-
const wrappedKeys = records.map(decodeWrappedKeyRecord);
|
|
53
|
-
const recovered = await manager.recoverKey({ wrappedKeys });
|
|
54
|
-
useKey(recovered.key);
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
`evaluateCredential` is available for advanced migrations that need direct PRF
|
|
58
|
-
evaluation:
|
|
59
|
-
|
|
60
|
-
```ts
|
|
61
|
-
const evaluated = await manager.evaluateCredential({
|
|
62
|
-
credentialIds: wrappedKeys.map(({ credentialId }) => credentialId),
|
|
63
|
-
});
|
|
64
|
-
usePRFOutput(evaluated.prfResult.output);
|
|
65
|
-
evaluated.prfResult.output.fill(0);
|
|
42
|
+
const recovered = await manager.recoverKey({ wrappedKeys: records.map(decodeWrappedKeyRecord) });
|
|
66
43
|
```
|
|
67
44
|
|
|
68
|
-
|
|
69
|
-
recovery. `wrappedKeyRepository` is application-owned. See the minimal
|
|
45
|
+
Record persistence is application-owned; see the
|
|
70
46
|
[repository interface](https://github.com/tinfoilsh/tinfoil-passkey-kit/blob/main/docs/wrapped-key-repository.md)
|
|
71
|
-
and runnable [web example](https://github.com/tinfoilsh/tinfoil-passkey-kit/blob/main/Examples/Web/README.md).
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Persistence is disabled by default. Cached recovery and rewrap require an
|
|
78
|
-
explicit synchronous `PasskeyKeyStorage`. Cached PRF output is raw secret key
|
|
79
|
-
material and requires host-appropriate protection.
|
|
80
|
-
|
|
81
|
-
The memory adapter is suitable for tests. The explicitly named
|
|
82
|
-
`createInsecureBrowserLocalStoragePasskeyKeyStorage(namespace)` adapter stores
|
|
83
|
-
raw PRF output unencrypted, isolates records by its required namespace, and is
|
|
84
|
-
insecure because same-origin scripts can read the cached secret material.
|
|
85
|
-
|
|
86
|
-
`evaluateCredential` exposes raw PRF output for advanced migrations. Treat
|
|
87
|
-
`prfResult.output` as secret key material and prefer `recoverKey` for normal
|
|
88
|
-
recovery. `wrapKeyWithPRFResult` and `unwrapKeyWithPRFResult` perform explicit
|
|
89
|
-
crypto-only operations without starting a ceremony or accessing storage.
|
|
90
|
-
|
|
91
|
-
The standalone `wrapKey(profile, credentialId, prfOutput, key)` and
|
|
92
|
-
`unwrapKey(profile, prfOutput, wrappedKey)` functions expose the same
|
|
93
|
-
crypto-only operations without constructing a manager, for migration and
|
|
94
|
-
interoperability tooling that already holds raw PRF output. They apply the
|
|
95
|
-
same validation as the manager methods and treat the PRF output as secret
|
|
96
|
-
key material.
|
|
47
|
+
and the runnable [web example](https://github.com/tinfoilsh/tinfoil-passkey-kit/blob/main/Examples/Web/README.md).
|
|
48
|
+
Failures throw `PasskeyKeyError`; branch on its `category`, not its message.
|
|
49
|
+
PRF caching is off unless you pass a `PasskeyKeyStorage`. Cached PRF output is
|
|
50
|
+
raw secret key material, and `createInsecureBrowserLocalStoragePasskeyKeyStorage`
|
|
51
|
+
stores it where same-origin scripts can read it.
|
|
97
52
|
|
|
98
53
|
## Swift quickstart
|
|
99
54
|
|
|
100
55
|
Add this repository as a Swift Package Manager dependency and link the
|
|
101
|
-
`TinfoilPasskeyKit` product. The package requires iOS 18 or macOS 15
|
|
56
|
+
`TinfoilPasskeyKit` product. The package requires iOS 18 or macOS 15, and the
|
|
57
|
+
app needs the `webcredentials` associated-domain entitlement for its
|
|
58
|
+
relying-party domain.
|
|
102
59
|
|
|
103
60
|
```swift
|
|
104
61
|
import Foundation
|
|
105
62
|
import TinfoilPasskeyKit
|
|
106
63
|
|
|
64
|
+
// The provider returns the window that presents passkey UI.
|
|
107
65
|
@MainActor
|
|
108
|
-
func
|
|
109
|
-
|
|
66
|
+
func protectAndRecover(
|
|
67
|
+
key: Data,
|
|
68
|
+
userHandle: Data,
|
|
110
69
|
presentationAnchorProvider: any PasskeyPresentationAnchorProviding
|
|
111
|
-
) async throws {
|
|
112
|
-
let profile = try PasskeyKeyProfile(
|
|
113
|
-
version: 1,
|
|
114
|
-
relyingPartyId: "example.com",
|
|
115
|
-
prfSalt: Data("example-key-wrapping".utf8),
|
|
116
|
-
hkdfInfo: Data("example-wrapping-key-v1".utf8)
|
|
117
|
-
)
|
|
70
|
+
) async throws -> Data {
|
|
118
71
|
let manager = try PasskeyKeyManager(
|
|
119
|
-
profile:
|
|
72
|
+
profile: PasskeyKeyProfile(
|
|
73
|
+
version: 1,
|
|
74
|
+
relyingPartyId: "example.com",
|
|
75
|
+
prfSalt: Data("example-key-wrapping".utf8),
|
|
76
|
+
hkdfInfo: Data("example-wrapping-key-v1".utf8)
|
|
77
|
+
),
|
|
120
78
|
relyingPartyName: "Example App",
|
|
121
79
|
presentationAnchorProvider: presentationAnchorProvider
|
|
122
80
|
)
|
|
123
81
|
|
|
124
82
|
let created = try await manager.createAndWrapKey(
|
|
125
|
-
user: PasskeyUser(
|
|
126
|
-
id: opaqueUserHandle,
|
|
127
|
-
name: "person@example.com",
|
|
128
|
-
displayName: "Example Person"
|
|
129
|
-
),
|
|
83
|
+
user: PasskeyUser(id: userHandle, name: "person@example.com"),
|
|
130
84
|
key: key
|
|
131
85
|
)
|
|
132
|
-
|
|
86
|
+
// Persist the encoded records in your application's storage.
|
|
87
|
+
let records = [try encodeWrappedKeyRecord(created.wrappedKey)]
|
|
133
88
|
|
|
134
|
-
let
|
|
135
|
-
|
|
136
|
-
let recovered = try await manager.recoverKey(wrappedKeys: wrappedKeys)
|
|
137
|
-
useKey(recovered.key)
|
|
89
|
+
let recovered = try await manager.recoverKey(wrappedKeys: records.map(decodeWrappedKeyRecord))
|
|
90
|
+
return recovered.key
|
|
138
91
|
}
|
|
139
92
|
```
|
|
140
93
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
The standalone `wrapKey(profile:credentialId:prfOutput:key:)` and
|
|
146
|
-
`unwrapKey(profile:prfOutput:wrapped:)` functions expose the same crypto-only
|
|
147
|
-
operations without constructing a manager or providing a presentation anchor,
|
|
148
|
-
for migration and interoperability tooling that already holds raw PRF output.
|
|
149
|
-
|
|
150
|
-
Apple hosts must pass a `PasskeyPresentationAnchorProviding` implementation to
|
|
151
|
-
the manager as `presentationAnchorProvider`. The provider returns the iOS or
|
|
152
|
-
macOS window AuthenticationServices uses for interactive presentation. Making
|
|
153
|
-
it required prevents constructing a manager that cannot present a ceremony.
|
|
154
|
-
AuthenticationServices does not accept the configured `relyingPartyName`; Apple
|
|
155
|
-
derives relying-party presentation from system and associated-domain metadata.
|
|
156
|
-
|
|
157
|
-
Persistence is disabled by default. `KeychainPasskeyKeyStorage` is an optional
|
|
158
|
-
generic Apple adapter that stores cached PRF output with
|
|
159
|
-
`kSecAttrAccessibleWhenUnlockedThisDeviceOnly`. Its records are device-bound and
|
|
160
|
-
unavailable while the device is locked, but any process context that can read
|
|
161
|
-
the item can recover keys without another passkey prompt. Choose storage based
|
|
162
|
-
on the host app's threat model. Hosts migrating from a pre-kit cache format can
|
|
163
|
-
pass the optional `decodeCachedRecord` hook to decode non-canonical stored
|
|
164
|
-
payloads instead of forking the adapter. The host app must also provide the
|
|
165
|
-
`webcredentials` associated-domain entitlement for its relying-party domain.
|
|
166
|
-
Keychain operations are synchronous and can block the manager's main actor.
|
|
167
|
-
|
|
168
|
-
On iOS 18 and macOS 15, recovery supports platform and synced passkeys,
|
|
169
|
-
including Apple's cross-device passkey flow. Explicit security-key PRF is not
|
|
170
|
-
currently enabled in the Apple target because the baseline toolchain does not
|
|
171
|
-
provide that API. Browsers may support security-key or hybrid recovery.
|
|
172
|
-
Capability remains `unknown` when Apple cannot preflight PRF support; callers
|
|
173
|
-
should allow an attempt.
|
|
174
|
-
|
|
175
|
-
See the compilable [Apple example](https://github.com/tinfoilsh/tinfoil-passkey-kit/blob/main/Examples/Apple/README.md).
|
|
94
|
+
`KeychainPasskeyKeyStorage` is an optional device-bound PRF cache; choose
|
|
95
|
+
storage based on your threat model. See the compilable
|
|
96
|
+
[Apple example](https://github.com/tinfoilsh/tinfoil-passkey-kit/blob/main/Examples/Apple/README.md).
|
|
176
97
|
|
|
177
98
|
## Documentation
|
|
178
99
|
|
package/dist/index.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export { unwrapKey, wrapKey } from "./crypto.js";
|
|
|
5
5
|
export { decodeWrappedKeyRecord, encodeWrappedKeyRecord, } from "./wrapped-key-record-codec.js";
|
|
6
6
|
export { createInsecureBrowserLocalStoragePasskeyKeyStorage, createMemoryPasskeyKeyStorage, } from "./storage.js";
|
|
7
7
|
export type { CachedPRFResult, PasskeyKeyStorage } from "./storage.js";
|
|
8
|
-
export type { CreateAndWrapKeyInput, CreatedWrappedKey, EvaluatedCredential, EvaluateCredentialInput, PasskeyCapability, PasskeyInteraction, PasskeyKeyManager, PasskeyKeyManagerConfig, PasskeyKeyProfile, PasskeyUser, PRFResult, RecoveredKey, RecoverKeyInput, RewrapKeyInput, UnwrapKeyWithPRFResultInput, WrapKeyWithPRFResultInput, WrappedKey, WrappedKeyRecord, } from "./types.js";
|
|
8
|
+
export type { CreateAndWrapKeyInput, CreatedWrappedKey, EvaluatedCredential, EvaluateCredentialInput, EnrollmentAttachment, PasskeyAttachment, PasskeyCapability, PasskeyInteraction, PasskeyKeyManager, PasskeyKeyManagerConfig, PasskeyKeyProfile, PasskeyUser, PRFResult, RecoveredKey, RecoverKeyInput, RewrapKeyInput, UnwrapKeyWithPRFResultInput, WrapKeyWithPRFResultInput, WrappedKey, WrappedKeyRecord, } from "./types.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kDAAkD,EAClD,6BAA6B,GAC9B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kDAAkD,EAClD,6BAA6B,GAC9B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,2BAA2B,EAC3B,yBAAyB,EACzB,UAAU,EACV,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
|
package/dist/kit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,iBAAiB,EACjB,uBAAuB,EAMxB,MAAM,YAAY,CAAC;AAoFpB,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,iBAAiB,EACjB,uBAAuB,EAMxB,MAAM,YAAY,CAAC;AAoFpB,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,iBAAiB,CA2ZnB"}
|
package/dist/kit.js
CHANGED
|
@@ -75,6 +75,10 @@ export function createPasskeyKeyManager(config) {
|
|
|
75
75
|
throw invalidInput(`timeoutMs must be between ${MIN_TIMEOUT_MS} and ${MAX_TIMEOUT_MS}`);
|
|
76
76
|
}
|
|
77
77
|
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
78
|
+
const enrollmentAttachment = config.enrollmentAttachment ?? "platform";
|
|
79
|
+
if (enrollmentAttachment !== "platform" && enrollmentAttachment !== "any") {
|
|
80
|
+
throw invalidInput("enrollmentAttachment must be platform or any");
|
|
81
|
+
}
|
|
78
82
|
let activeCeremony = null;
|
|
79
83
|
async function runCeremony(operation, callerSignal, perform) {
|
|
80
84
|
if (activeCeremony) {
|
|
@@ -129,7 +133,7 @@ export function createPasskeyKeyManager(config) {
|
|
|
129
133
|
catch {
|
|
130
134
|
// Storage is best-effort and cannot invalidate a successful ceremony.
|
|
131
135
|
}
|
|
132
|
-
if (result.
|
|
136
|
+
if (result.authenticatorAttachment === "platform") {
|
|
133
137
|
try {
|
|
134
138
|
config.storage?.saveLocalCredentialId(result.credentialId);
|
|
135
139
|
}
|
|
@@ -234,14 +238,18 @@ export function createPasskeyKeyManager(config) {
|
|
|
234
238
|
validateKey(input.key, "createAndWrapKey");
|
|
235
239
|
const key = input.key.slice();
|
|
236
240
|
const user = copyUser(input.user);
|
|
237
|
-
const result = await runCeremony("createAndWrapKey", input.signal, (signal) => createPrfCredential(context(profile, relyingPartyName, timeoutMs), user, signal));
|
|
241
|
+
const result = await runCeremony("createAndWrapKey", input.signal, (signal) => createPrfCredential(context(profile, relyingPartyName, timeoutMs), user, signal, enrollmentAttachment));
|
|
238
242
|
recordSuccessfulCredential(result);
|
|
239
243
|
const wrappedKey = await wrapKeyWithPRFResult({
|
|
240
244
|
keyMaterial: key,
|
|
241
245
|
credentialId: result.credentialId,
|
|
242
246
|
prfResult: { output: result.prfOutput },
|
|
243
247
|
}, "createAndWrapKey");
|
|
244
|
-
return {
|
|
248
|
+
return {
|
|
249
|
+
credentialId: result.credentialId,
|
|
250
|
+
wrappedKey,
|
|
251
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
252
|
+
};
|
|
245
253
|
}
|
|
246
254
|
function prepareRecovery(input) {
|
|
247
255
|
if (!input || typeof input !== "object")
|
|
@@ -285,6 +293,7 @@ export function createPasskeyKeyManager(config) {
|
|
|
285
293
|
return {
|
|
286
294
|
credentialId: result.credentialId,
|
|
287
295
|
prfResult: { output: result.prfOutput.slice() },
|
|
296
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
288
297
|
};
|
|
289
298
|
}
|
|
290
299
|
return {
|
|
@@ -294,7 +303,7 @@ export function createPasskeyKeyManager(config) {
|
|
|
294
303
|
(input.operation !== "enroll" && input.operation !== "recover")) {
|
|
295
304
|
throw invalidInput("operation must be enroll or recover", "capability");
|
|
296
305
|
}
|
|
297
|
-
return detectCapability(input.operation);
|
|
306
|
+
return detectCapability(input.operation, enrollmentAttachment);
|
|
298
307
|
},
|
|
299
308
|
createAndWrapKey,
|
|
300
309
|
evaluateCredential(input) {
|
|
@@ -320,6 +329,7 @@ export function createPasskeyKeyManager(config) {
|
|
|
320
329
|
return {
|
|
321
330
|
credentialId: result.credentialId,
|
|
322
331
|
key: await unwrapKeyWithPRFResult({ wrappedKey: wrapped, prfResult: result.prfResult }, "recoverKey"),
|
|
332
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
323
333
|
};
|
|
324
334
|
},
|
|
325
335
|
async recoverKeyFromCache(input) {
|
|
@@ -337,6 +347,7 @@ export function createPasskeyKeyManager(config) {
|
|
|
337
347
|
wrappedKey: wrapped,
|
|
338
348
|
prfResult: { output: cached.prfOutput },
|
|
339
349
|
}, "recoverKeyFromCache"),
|
|
350
|
+
authenticatorAttachment: null,
|
|
340
351
|
};
|
|
341
352
|
}
|
|
342
353
|
catch {
|
package/dist/kit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,OAAO,GACR,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAa9D,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAGtB,MAAM,eAAe,CAAC;AAEvB,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAClC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,cAAc,GAAG,UAAa,CAAC;AAQrC,SAAS,gBAAgB,CAAC,KAAc,EAAE,SAAiB;IACzD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE;YACxD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACtE,OAAO,IAAI,eAAe,CACxB,WAAW,EACX,kEAAkE,EAClE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAC5B,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjE,OAAO,IAAI,eAAe,CAAC,WAAW,EAAE,qCAAqC,EAAE;YAC7E,KAAK,EAAE,KAAK;YACZ,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,eAAe,CAAC,kBAAkB,EAAE,8BAA8B,EAAE;QAC7E,KAAK,EAAE,KAAK;QACZ,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CACd,OAAkC,EAClC,gBAAwB,EACxB,SAAiB;IAEjB,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,cAAc;QAC5B,MAAM,EAAE,gBAAgB;QACxB,QAAQ,EAAE,OAAO,CAAC,OAAO;QACzB,SAAS;KACV,CAAC;AACJ,CAAC;AAID,SAAS,QAAQ,CAAC,IAAiB;IACjC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,MAAM,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAC9E,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;QAC7D,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,WAAyB;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC;SACjD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,MAAM,YAAY,CAAC,4BAA4B,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvD,IACE,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ;QAC3C,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EACpC,CAAC;QACD,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACjD,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YACjC,MAAM,CAAC,SAAS,GAAG,cAAc;YACjC,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC,EACpC,CAAC;QACD,MAAM,YAAY,CAChB,6BAA6B,cAAc,QAAQ,cAAc,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACzD,MAAM,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,UAAU,CAAC;IACvE,IAAI,oBAAoB,KAAK,UAAU,IAAI,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC1E,MAAM,YAAY,CAAC,8CAA8C,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,cAAc,GAA0B,IAAI,CAAC;IAEjD,KAAK,UAAU,WAAW,CACxB,SAAiB,EACjB,YAAqC,EACrC,OAA4D;QAE5D,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,eAAe,CACvB,uBAAuB,EACvB,yCAAyC,EACzC,EAAE,SAAS,EAAE,CACd,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,eAAe,CAAC,WAAW,EAAE,qCAAqC,EAAE;gBAC5E,KAAK,EAAE,YAAY,CAAC,MAAM;gBAC1B,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,kBAAkE,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,OAAO,CAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/D,kBAAkB,GAAG,MAAM,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC,CAAC;QACF,cAAc,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC9C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAC5B,MAAM,CACJ,IAAI,eAAe,CAAC,WAAW,EAAE,qCAAqC,EAAE;YACtE,KAAK,EAAE,YAAY,EAAE,MAAM;YAC3B,SAAS;SACV,CAAC,CACH,CAAC;QACJ,YAAY,EAAE,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CACH,MAAM,CACJ,IAAI,eAAe,CAAC,SAAS,EAAE,iCAAiC,EAAE;YAChE,SAAS;SACV,CAAC,CACH,EACH,SAAS,CACV,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,YAAY,EAAE,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAC7D,IAAI,cAAc,EAAE,KAAK,KAAK,KAAK;gBAAE,cAAc,GAAG,IAAI,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,SAAS,0BAA0B,CAAC,MAAyB;QAC3D,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC;gBAClC,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC;gBACxC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;QACD,IAAI,MAAM,CAAC,uBAAuB,KAAK,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,gBAAgB;QACvB,IAAI,MAA8B,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,aAAwC,CAAC;QAC7C,IAAI,CAAC;YACH,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvD,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,CAAC,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,SAAS,YAAY,UAAU,CAAC;YACzC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,EAAE;YAC9B,OAAO,IAAI,CAAC;QACd,OAAO;YACL,OAAO,EAAE,aAAa;YACtB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,SAAS,yBAAyB;QAChC,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,oBAAoB,CAC3B,aAAuB,EACvB,qBAA8B;QAE9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChE,MAAM,YAAY,CAAC,uCAAuC,CAAC,CAAC;QAC9D,CAAC;QACD,8DAA8D;QAC9D,+DAA+D;QAC/D,8DAA8D;QAC9D,kBAAkB;QAClB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;YACjE,IAAI,CAAC;gBACH,oBAAoB,CAAC,YAAY,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,SAAS,GAAG,qBAAqB,IAAI,yBAAyB,EAAE,CAAC;QACvE,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,MAAM,CAAC;QAC7D,OAAO,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,SAAS,aAAa,CACpB,SAAiC,EACjC,SAAiB;QAEjB,IACE,CAAC,SAAS;YACV,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,CAAC,SAAS,CAAC,MAAM,YAAY,UAAU,CAAC;YACzC,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,EAC9B,CAAC;YACD,MAAM,YAAY,CAAC,2CAA2C,EAAE,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,UAAU,oBAAoB,CACjC,KAAgC,EAChC,SAAS,GAAG,sBAAsB;QAElC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,YAAY,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;QAC5F,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC1C,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,OAAO,CACZ,OAAO,EACP,KAAK,CAAC,YAAY,EAClB,SAAS,EACT,WAAW,EACX,SAAS,CACV,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,sBAAsB,CACnC,KAAkC,EAClC,SAAS,GAAG,wBAAwB;QAEpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,YAAY,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG;YACjB,GAAG,KAAK,CAAC,UAAU;YACnB,OAAO,EAAE,sBAAsB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC;SAC3D,CAAC;QACF,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,UAAU,gBAAgB,CAAC,KAA4B;QAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACjF,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5E,mBAAmB,CACjB,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAC7C,IAAI,EACJ,MAAM,EACN,oBAAoB,CACrB,CACF,CAAC;QACF,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAC3C;YACE,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;SACxC,EACD,kBAAkB,CACnB,CAAC;QACF,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU;YACV,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;SACxD,CAAC;IACJ,CAAC;IAED,SAAS,eAAe,CAAC,KAAsB;QAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACjF,0DAA0D;QAC1D,iEAAiE;QACjE,kEAAkE;QAClE,6DAA6D;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxE,MAAM,YAAY,CAAC,sCAAsC,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC/C,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACrC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,YAAY,CAAC,gDAAgD,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,UAAU,kBAAkB,CAC/B,KAA8B,EAC9B,SAAS,GAAG,oBAAoB;QAEhC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACjF,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,aAAa,CAAC;QACvD,IAAI,WAAW,KAAK,aAAa,IAAI,WAAW,KAAK,sBAAsB,EAAE,CAAC;YAC5E,MAAM,YAAY,CAAC,yDAAyD,EAAE,SAAS,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,WAAW,KAAK,sBAAsB,EAAE,CAAC;YAC3C,MAAM,IAAI,eAAe,CACvB,aAAa,EACb,yEAAyE,EACzE,EAAE,SAAS,EAAE,CACd,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,oBAAoB,CACxC,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,qBAAqB,CAC5B,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACnE,qBAAqB,CACnB,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAC7C,aAAa,EACb,MAAM,CACP,CACF,CAAC;QACF,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE;YAC/C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;SACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,KAAK;YACpB,IACE,CAAC,KAAK;gBACN,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,EAC/D,CAAC;gBACD,MAAM,YAAY,CAAC,qCAAqC,EAAE,YAAY,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACjE,CAAC;QAED,gBAAgB;QAEhB,kBAAkB,CAAC,KAAK;YACtB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,oBAAoB,CAAC,KAAK;YACxB,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,sBAAsB,CAAC,KAAK;YAC1B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,KAAK;YACpB,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CACrC;gBACE,aAAa,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;gBACjE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;gBAClD,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,EACD,YAAY,CACb,CAAC;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAC9B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,CAC9D,CAAC;YACF,IAAI,CAAC,OAAO;gBAAE,MAAM,YAAY,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;YACzF,OAAO;gBACL,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,GAAG,EAAE,MAAM,sBAAsB,CAC/B,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EACpD,YAAY,CACb;gBACD,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;aACxD,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,KAAK;YAC7B,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAC9B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,CAC9D,CAAC;YACF,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO;oBACL,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,GAAG,EAAE,MAAM,sBAAsB,CAC/B;wBACE,UAAU,EAAE,OAAO;wBACnB,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;qBACxC,EACD,qBAAqB,CACtB;oBACD,uBAAuB,EAAE,IAAI;iBAC9B,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,kBAAkB,CAAC,KAAK;YAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,MAAM,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACjF,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,oBAAoB,CACzB;gBACE,WAAW,EAAE,KAAK,CAAC,GAAG;gBACtB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE;aACxC,EACD,oBAAoB,CACrB,CAAC;QACJ,CAAC;QAED,eAAe;YACb,IAAI,CAAC;gBACH,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;QAED,oBAAoB;YAClB,MAAM,SAAS,GAAG,cAAc,EAAE,SAAS,CAAC;YAC5C,cAAc,EAAE,MAAM,CACpB,IAAI,eAAe,CAAC,WAAW,EAAE,qCAAqC,EAAE;gBACtE,SAAS;aACV,CAAC,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/support.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { PasskeyCapability } from "./types.js";
|
|
2
|
-
export declare function capability(operation: "enroll" | "recover"): Promise<PasskeyCapability>;
|
|
1
|
+
import type { EnrollmentAttachment, PasskeyCapability } from "./types.js";
|
|
2
|
+
export declare function capability(operation: "enroll" | "recover", enrollmentAttachment: EnrollmentAttachment): Promise<PasskeyCapability>;
|
|
3
3
|
//# sourceMappingURL=support.d.ts.map
|
package/dist/support.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA4B1E,wBAAsB,UAAU,CAC9B,SAAS,EAAE,QAAQ,GAAG,SAAS,EAC/B,oBAAoB,EAAE,oBAAoB,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
|
package/dist/support.js
CHANGED
|
@@ -22,10 +22,10 @@ async function prfCapability() {
|
|
|
22
22
|
}
|
|
23
23
|
return "unknown";
|
|
24
24
|
}
|
|
25
|
-
export async function capability(operation) {
|
|
25
|
+
export async function capability(operation, enrollmentAttachment) {
|
|
26
26
|
if (!hasWebAuthn(operation))
|
|
27
27
|
return "unsupported";
|
|
28
|
-
if (operation === "recover")
|
|
28
|
+
if (operation === "recover" || enrollmentAttachment === "any")
|
|
29
29
|
return prfCapability();
|
|
30
30
|
if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== "function") {
|
|
31
31
|
return "unknown";
|
package/dist/support.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAAC,SAA+B;IAClD,OAAO,CACL,OAAO,SAAS,KAAK,WAAW;QAChC,CAAC,CAAC,SAAS,CAAC,WAAW;QACvB,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YACrE,UAAU;QACZ,OAAO,mBAAmB,KAAK,WAAW,CAC3C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,eAAe,GAAG,mBAEvB,CAAC;IACF,IAAI,OAAO,eAAe,CAAC,qBAAqB,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,qBAAqB,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC;QAC1C,IAAI,QAAQ,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA+B
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../src/support.ts"],"names":[],"mappings":"AAEA,SAAS,WAAW,CAAC,SAA+B;IAClD,OAAO,CACL,OAAO,SAAS,KAAK,WAAW;QAChC,CAAC,CAAC,SAAS,CAAC,WAAW;QACvB,OAAO,SAAS,CAAC,WAAW,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YACrE,UAAU;QACZ,OAAO,mBAAmB,KAAK,WAAW,CAC3C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,eAAe,GAAG,mBAEvB,CAAC;IACF,IAAI,OAAO,eAAe,CAAC,qBAAqB,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAClF,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,qBAAqB,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC;QAC1C,IAAI,QAAQ,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA+B,EAC/B,oBAA0C;IAE1C,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QAAE,OAAO,aAAa,CAAC;IAClD,IAAI,SAAS,KAAK,SAAS,IAAI,oBAAoB,KAAK,KAAK;QAAE,OAAO,aAAa,EAAE,CAAC;IACtF,IACE,OAAO,mBAAmB,CAAC,6CAA6C,KAAK,UAAU,EACvF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,6CAA6C,EAAE,CAAC,EAAE,CAAC;YACjF,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export interface PasskeyUser {
|
|
|
18
18
|
}
|
|
19
19
|
export type PasskeyCapability = "supported" | "unsupported" | "unknown";
|
|
20
20
|
export type PasskeyInteraction = "interactive" | "immediatelyAvailable";
|
|
21
|
+
export type EnrollmentAttachment = "platform" | "any";
|
|
22
|
+
export type PasskeyAttachment = "platform" | "cross-platform";
|
|
21
23
|
export interface CreateAndWrapKeyInput {
|
|
22
24
|
user: PasskeyUser;
|
|
23
25
|
key: Uint8Array;
|
|
@@ -26,6 +28,7 @@ export interface CreateAndWrapKeyInput {
|
|
|
26
28
|
export interface CreatedWrappedKey {
|
|
27
29
|
credentialId: string;
|
|
28
30
|
wrappedKey: WrappedKey;
|
|
31
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
29
32
|
}
|
|
30
33
|
export interface RecoverKeyInput {
|
|
31
34
|
wrappedKeys: WrappedKey[];
|
|
@@ -45,6 +48,7 @@ export interface PRFResult {
|
|
|
45
48
|
export interface EvaluatedCredential {
|
|
46
49
|
credentialId: string;
|
|
47
50
|
prfResult: PRFResult;
|
|
51
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
48
52
|
}
|
|
49
53
|
export interface WrapKeyWithPRFResultInput {
|
|
50
54
|
keyMaterial: Uint8Array;
|
|
@@ -58,6 +62,7 @@ export interface UnwrapKeyWithPRFResultInput {
|
|
|
58
62
|
export interface RecoveredKey {
|
|
59
63
|
credentialId: string;
|
|
60
64
|
key: Uint8Array;
|
|
65
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
61
66
|
}
|
|
62
67
|
export interface RewrapKeyInput {
|
|
63
68
|
key: Uint8Array;
|
|
@@ -67,6 +72,7 @@ export interface PasskeyKeyManagerConfig {
|
|
|
67
72
|
relyingPartyName: string;
|
|
68
73
|
timeoutMs?: number;
|
|
69
74
|
storage?: PasskeyKeyStorage;
|
|
75
|
+
enrollmentAttachment?: EnrollmentAttachment;
|
|
70
76
|
}
|
|
71
77
|
export interface PasskeyKeyManager {
|
|
72
78
|
capability(input: {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AACxE,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/webauthn.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PasskeyUser } from "./types.js";
|
|
1
|
+
import type { EnrollmentAttachment, PasskeyAttachment, PasskeyUser } from "./types.js";
|
|
2
2
|
export interface CeremonyContext {
|
|
3
3
|
rpId: string;
|
|
4
4
|
rpName: string;
|
|
@@ -8,8 +8,8 @@ export interface CeremonyContext {
|
|
|
8
8
|
export interface InternalPrfResult {
|
|
9
9
|
credentialId: string;
|
|
10
10
|
prfOutput: Uint8Array;
|
|
11
|
-
|
|
11
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
12
12
|
}
|
|
13
|
-
export declare function createPrfCredential(context: CeremonyContext, user: PasskeyUser, signal: AbortSignal): Promise<InternalPrfResult>;
|
|
13
|
+
export declare function createPrfCredential(context: CeremonyContext, user: PasskeyUser, signal: AbortSignal, enrollmentAttachment: EnrollmentAttachment): Promise<InternalPrfResult>;
|
|
14
14
|
export declare function evaluatePrfCredential(context: CeremonyContext, credentialIds: string[], signal: AbortSignal): Promise<InternalPrfResult>;
|
|
15
15
|
//# sourceMappingURL=webauthn.d.ts.map
|
package/dist/webauthn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOvF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;IACtB,uBAAuB,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACnD;AAoED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,EACnB,oBAAoB,EAAE,oBAAoB,GACzC,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,eAAe,EACxB,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,iBAAiB,CAAC,CAwB5B"}
|
package/dist/webauthn.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { base64UrlToBytes,
|
|
1
|
+
import { base64UrlToBytes, bytesToBase64Url } from "./codec.js";
|
|
2
2
|
import { invalidInput, PasskeyKeyError } from "./errors.js";
|
|
3
3
|
const CHALLENGE_BYTES = 32;
|
|
4
4
|
const MAX_USER_HANDLE_BYTES = 64;
|
|
5
5
|
const PRF_OUTPUT_BYTES = 32;
|
|
6
|
+
const MAX_BYTE_VALUE = 255;
|
|
6
7
|
function extensionResults(credential) {
|
|
7
8
|
return credential.getClientExtensionResults();
|
|
8
9
|
}
|
|
@@ -12,22 +13,52 @@ function credentialId(credential) {
|
|
|
12
13
|
throw invalidInput("credential ID must not be empty");
|
|
13
14
|
return bytesToBase64Url(rawId);
|
|
14
15
|
}
|
|
16
|
+
function authenticatorAttachment(credential) {
|
|
17
|
+
const attachment = credential.authenticatorAttachment;
|
|
18
|
+
return attachment === "platform" || attachment === "cross-platform"
|
|
19
|
+
? attachment
|
|
20
|
+
: null;
|
|
21
|
+
}
|
|
15
22
|
function resultFromCredential(credential) {
|
|
16
23
|
const first = extensionResults(credential).prf?.results?.first;
|
|
17
24
|
if (!first) {
|
|
18
25
|
throw new PasskeyKeyError("unsupported", "the authenticator returned no PRF output");
|
|
19
26
|
}
|
|
20
|
-
|
|
27
|
+
let prfOutput;
|
|
28
|
+
if (Array.isArray(first)) {
|
|
29
|
+
// 1Password's browser extension can return a plain array instead of BufferSource.
|
|
30
|
+
if (first.length !== PRF_OUTPUT_BYTES) {
|
|
31
|
+
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
32
|
+
}
|
|
33
|
+
prfOutput = new Uint8Array(PRF_OUTPUT_BYTES);
|
|
34
|
+
for (let index = 0; index < PRF_OUTPUT_BYTES; index++) {
|
|
35
|
+
const byte = first[index];
|
|
36
|
+
if (!Object.prototype.hasOwnProperty.call(first, index) ||
|
|
37
|
+
!Number.isInteger(byte) || byte < 0 || byte > MAX_BYTE_VALUE) {
|
|
38
|
+
throw invalidInput("PRF output must contain only integer bytes");
|
|
39
|
+
}
|
|
40
|
+
prfOutput[index] = byte;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if (first instanceof ArrayBuffer || ArrayBuffer.isView(first)) {
|
|
44
|
+
const bytes = first instanceof ArrayBuffer
|
|
45
|
+
? new Uint8Array(first)
|
|
46
|
+
: new Uint8Array(first.buffer, first.byteOffset, first.byteLength);
|
|
47
|
+
prfOutput = bytes.slice();
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw invalidInput("PRF output must be a buffer or byte array");
|
|
51
|
+
}
|
|
21
52
|
if (prfOutput.length !== PRF_OUTPUT_BYTES) {
|
|
22
53
|
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
23
54
|
}
|
|
24
55
|
return {
|
|
25
56
|
credentialId: credentialId(credential),
|
|
26
57
|
prfOutput,
|
|
27
|
-
|
|
58
|
+
authenticatorAttachment: authenticatorAttachment(credential),
|
|
28
59
|
};
|
|
29
60
|
}
|
|
30
|
-
export async function createPrfCredential(context, user, signal) {
|
|
61
|
+
export async function createPrfCredential(context, user, signal, enrollmentAttachment) {
|
|
31
62
|
if (!(user?.id instanceof Uint8Array) || user.id.length === 0) {
|
|
32
63
|
throw invalidInput("user.id must be a non-empty Uint8Array");
|
|
33
64
|
}
|
|
@@ -55,7 +86,7 @@ export async function createPrfCredential(context, user, signal) {
|
|
|
55
86
|
{ type: "public-key", alg: -257 },
|
|
56
87
|
],
|
|
57
88
|
authenticatorSelection: {
|
|
58
|
-
authenticatorAttachment: "platform",
|
|
89
|
+
authenticatorAttachment: enrollmentAttachment === "platform" ? "platform" : undefined,
|
|
59
90
|
residentKey: "preferred",
|
|
60
91
|
userVerification: "required",
|
|
61
92
|
},
|
package/dist/webauthn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"webauthn.js","sourceRoot":"","sources":["../src/webauthn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,cAAc,GAAG,GAAG,CAAC;AAsB3B,SAAS,gBAAgB,CAAC,UAA+B;IACvD,OAAO,UAAU,CAAC,yBAAyB,EAAyB,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,UAA+B;IACnD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,YAAY,CAAC,iCAAiC,CAAC,CAAC;IAC9E,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,uBAAuB,CAC9B,UAA+B;IAE/B,MAAM,UAAU,GAAG,UAAU,CAAC,uBAAuB,CAAC;IACtD,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,gBAAgB;QACjE,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,oBAAoB,CAAC,UAA+B;IAC3D,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,0CAA0C,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,SAAqB,CAAC;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,kFAAkF;QAClF,IAAI,KAAK,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACtC,MAAM,YAAY,CAAC,sBAAsB,gBAAgB,QAAQ,CAAC,CAAC;QACrE,CAAC;QACD,SAAS,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAC7C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,gBAAgB,EAAE,KAAK,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;gBACnD,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,cAAc,EAC5D,CAAC;gBACD,MAAM,YAAY,CAAC,4CAA4C,CAAC,CAAC;YACnE,CAAC;YACD,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,KAAK,YAAY,WAAW;YACxC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC;YACvB,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACrE,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,CAAC,2CAA2C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAC1C,MAAM,YAAY,CAAC,sBAAsB,gBAAgB,QAAQ,CAAC,CAAC;IACrE,CAAC;IACD,OAAO;QACL,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC;QACtC,SAAS;QACT,uBAAuB,EAAE,uBAAuB,CAAC,UAAU,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,IAAiB,EACjB,MAAmB,EACnB,oBAA0C;IAE1C,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,YAAY,CAAC,wCAAwC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC3C,MAAM,YAAY,CAAC,2BAA2B,qBAAqB,QAAQ,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,YAAY,CAAC,sCAAsC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAClG,MAAM,YAAY,CAAC,6CAA6C,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;QACrD,MAAM;QACN,SAAS,EAAE;YACT,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;YAClE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE;YAC9C,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI;aAC3C;YACD,gBAAgB,EAAE;gBAChB,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE;gBAC/B,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE;aAClC;YACD,sBAAsB,EAAE;gBACtB,uBAAuB,EAAE,oBAAoB,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBACrF,WAAW,EAAE,WAAW;gBACxB,gBAAgB,EAAE,UAAU;aAC7B;YACD,OAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE;aACX;SAC1C;KACF,CAAC,CAA+B,CAAC;IAElC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,eAAe,CACvB,WAAW,EACX,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC;IACnD,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,wCAAwC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK;QAAE,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAEtE,OAAO,qBAAqB,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAwB,EACxB,aAAuB,EACvB,MAAmB;IAEnB,MAAM,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;QACjD,MAAM;QACN,SAAS,EAAE;YACT,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;YAClE,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,EAAE,YAAY;gBAClB,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAiB;aACnD,CAAC,CAAC;YACH,gBAAgB,EAAE,UAAU;YAC5B,OAAO,EAAE,OAAO,CAAC,SAAS;YAC1B,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE;aACX;SAC1C;KACF,CAAC,CAA+B,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CACvB,WAAW,EACX,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
package/src/kit.ts
CHANGED
|
@@ -127,6 +127,10 @@ export function createPasskeyKeyManager(
|
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
129
|
const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
130
|
+
const enrollmentAttachment = config.enrollmentAttachment ?? "platform";
|
|
131
|
+
if (enrollmentAttachment !== "platform" && enrollmentAttachment !== "any") {
|
|
132
|
+
throw invalidInput("enrollmentAttachment must be platform or any");
|
|
133
|
+
}
|
|
130
134
|
let activeCeremony: ActiveCeremony | null = null;
|
|
131
135
|
|
|
132
136
|
async function runCeremony(
|
|
@@ -198,7 +202,7 @@ export function createPasskeyKeyManager(
|
|
|
198
202
|
} catch {
|
|
199
203
|
// Storage is best-effort and cannot invalidate a successful ceremony.
|
|
200
204
|
}
|
|
201
|
-
if (result.
|
|
205
|
+
if (result.authenticatorAttachment === "platform") {
|
|
202
206
|
try {
|
|
203
207
|
config.storage?.saveLocalCredentialId(result.credentialId);
|
|
204
208
|
} catch {
|
|
@@ -322,7 +326,12 @@ export function createPasskeyKeyManager(
|
|
|
322
326
|
const key = input.key.slice();
|
|
323
327
|
const user = copyUser(input.user);
|
|
324
328
|
const result = await runCeremony("createAndWrapKey", input.signal, (signal) =>
|
|
325
|
-
createPrfCredential(
|
|
329
|
+
createPrfCredential(
|
|
330
|
+
context(profile, relyingPartyName, timeoutMs),
|
|
331
|
+
user,
|
|
332
|
+
signal,
|
|
333
|
+
enrollmentAttachment,
|
|
334
|
+
),
|
|
326
335
|
);
|
|
327
336
|
recordSuccessfulCredential(result);
|
|
328
337
|
const wrappedKey = await wrapKeyWithPRFResult(
|
|
@@ -333,7 +342,11 @@ export function createPasskeyKeyManager(
|
|
|
333
342
|
},
|
|
334
343
|
"createAndWrapKey",
|
|
335
344
|
);
|
|
336
|
-
return {
|
|
345
|
+
return {
|
|
346
|
+
credentialId: result.credentialId,
|
|
347
|
+
wrappedKey,
|
|
348
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
349
|
+
};
|
|
337
350
|
}
|
|
338
351
|
|
|
339
352
|
function prepareRecovery(input: RecoverKeyInput) {
|
|
@@ -392,6 +405,7 @@ export function createPasskeyKeyManager(
|
|
|
392
405
|
return {
|
|
393
406
|
credentialId: result.credentialId,
|
|
394
407
|
prfResult: { output: result.prfOutput.slice() },
|
|
408
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
395
409
|
};
|
|
396
410
|
}
|
|
397
411
|
|
|
@@ -404,7 +418,7 @@ export function createPasskeyKeyManager(
|
|
|
404
418
|
) {
|
|
405
419
|
throw invalidInput("operation must be enroll or recover", "capability");
|
|
406
420
|
}
|
|
407
|
-
return detectCapability(input.operation);
|
|
421
|
+
return detectCapability(input.operation, enrollmentAttachment);
|
|
408
422
|
},
|
|
409
423
|
|
|
410
424
|
createAndWrapKey,
|
|
@@ -442,6 +456,7 @@ export function createPasskeyKeyManager(
|
|
|
442
456
|
{ wrappedKey: wrapped, prfResult: result.prfResult },
|
|
443
457
|
"recoverKey",
|
|
444
458
|
),
|
|
459
|
+
authenticatorAttachment: result.authenticatorAttachment,
|
|
445
460
|
};
|
|
446
461
|
},
|
|
447
462
|
|
|
@@ -463,6 +478,7 @@ export function createPasskeyKeyManager(
|
|
|
463
478
|
},
|
|
464
479
|
"recoverKeyFromCache",
|
|
465
480
|
),
|
|
481
|
+
authenticatorAttachment: null,
|
|
466
482
|
};
|
|
467
483
|
} catch {
|
|
468
484
|
return null;
|
package/src/support.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PasskeyCapability } from "./types.js";
|
|
1
|
+
import type { EnrollmentAttachment, PasskeyCapability } from "./types.js";
|
|
2
2
|
|
|
3
3
|
function hasWebAuthn(operation: "enroll" | "recover"): boolean {
|
|
4
4
|
return (
|
|
@@ -28,9 +28,10 @@ async function prfCapability(): Promise<PasskeyCapability> {
|
|
|
28
28
|
|
|
29
29
|
export async function capability(
|
|
30
30
|
operation: "enroll" | "recover",
|
|
31
|
+
enrollmentAttachment: EnrollmentAttachment,
|
|
31
32
|
): Promise<PasskeyCapability> {
|
|
32
33
|
if (!hasWebAuthn(operation)) return "unsupported";
|
|
33
|
-
if (operation === "recover") return prfCapability();
|
|
34
|
+
if (operation === "recover" || enrollmentAttachment === "any") return prfCapability();
|
|
34
35
|
if (
|
|
35
36
|
typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable !== "function"
|
|
36
37
|
) {
|
package/src/types.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface PasskeyUser {
|
|
|
22
22
|
|
|
23
23
|
export type PasskeyCapability = "supported" | "unsupported" | "unknown";
|
|
24
24
|
export type PasskeyInteraction = "interactive" | "immediatelyAvailable";
|
|
25
|
+
export type EnrollmentAttachment = "platform" | "any";
|
|
26
|
+
export type PasskeyAttachment = "platform" | "cross-platform";
|
|
25
27
|
|
|
26
28
|
export interface CreateAndWrapKeyInput {
|
|
27
29
|
user: PasskeyUser;
|
|
@@ -32,6 +34,7 @@ export interface CreateAndWrapKeyInput {
|
|
|
32
34
|
export interface CreatedWrappedKey {
|
|
33
35
|
credentialId: string;
|
|
34
36
|
wrappedKey: WrappedKey;
|
|
37
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
35
38
|
}
|
|
36
39
|
|
|
37
40
|
export interface RecoverKeyInput {
|
|
@@ -55,6 +58,7 @@ export interface PRFResult {
|
|
|
55
58
|
export interface EvaluatedCredential {
|
|
56
59
|
credentialId: string;
|
|
57
60
|
prfResult: PRFResult;
|
|
61
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
export interface WrapKeyWithPRFResultInput {
|
|
@@ -71,6 +75,7 @@ export interface UnwrapKeyWithPRFResultInput {
|
|
|
71
75
|
export interface RecoveredKey {
|
|
72
76
|
credentialId: string;
|
|
73
77
|
key: Uint8Array;
|
|
78
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
export interface RewrapKeyInput {
|
|
@@ -82,6 +87,7 @@ export interface PasskeyKeyManagerConfig {
|
|
|
82
87
|
relyingPartyName: string;
|
|
83
88
|
timeoutMs?: number;
|
|
84
89
|
storage?: PasskeyKeyStorage;
|
|
90
|
+
enrollmentAttachment?: EnrollmentAttachment;
|
|
85
91
|
}
|
|
86
92
|
|
|
87
93
|
export interface PasskeyKeyManager {
|
package/src/webauthn.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { base64UrlToBytes,
|
|
1
|
+
import { base64UrlToBytes, bytesToBase64Url } from "./codec.js";
|
|
2
2
|
import { invalidInput, PasskeyKeyError } from "./errors.js";
|
|
3
|
-
import type { PasskeyUser } from "./types.js";
|
|
3
|
+
import type { EnrollmentAttachment, PasskeyAttachment, PasskeyUser } from "./types.js";
|
|
4
4
|
|
|
5
5
|
const CHALLENGE_BYTES = 32;
|
|
6
6
|
const MAX_USER_HANDLE_BYTES = 64;
|
|
7
7
|
const PRF_OUTPUT_BYTES = 32;
|
|
8
|
+
const MAX_BYTE_VALUE = 255;
|
|
8
9
|
|
|
9
10
|
export interface CeremonyContext {
|
|
10
11
|
rpId: string;
|
|
@@ -16,13 +17,13 @@ export interface CeremonyContext {
|
|
|
16
17
|
export interface InternalPrfResult {
|
|
17
18
|
credentialId: string;
|
|
18
19
|
prfOutput: Uint8Array;
|
|
19
|
-
|
|
20
|
+
authenticatorAttachment: PasskeyAttachment | null;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
interface PrfExtensionResults {
|
|
23
24
|
prf?: {
|
|
24
25
|
enabled?: boolean;
|
|
25
|
-
results?: { first?:
|
|
26
|
+
results?: { first?: unknown };
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
|
|
@@ -36,19 +37,52 @@ function credentialId(credential: PublicKeyCredential): string {
|
|
|
36
37
|
return bytesToBase64Url(rawId);
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
function authenticatorAttachment(
|
|
41
|
+
credential: PublicKeyCredential,
|
|
42
|
+
): PasskeyAttachment | null {
|
|
43
|
+
const attachment = credential.authenticatorAttachment;
|
|
44
|
+
return attachment === "platform" || attachment === "cross-platform"
|
|
45
|
+
? attachment
|
|
46
|
+
: null;
|
|
47
|
+
}
|
|
48
|
+
|
|
39
49
|
function resultFromCredential(credential: PublicKeyCredential): InternalPrfResult {
|
|
40
50
|
const first = extensionResults(credential).prf?.results?.first;
|
|
41
51
|
if (!first) {
|
|
42
52
|
throw new PasskeyKeyError("unsupported", "the authenticator returned no PRF output");
|
|
43
53
|
}
|
|
44
|
-
|
|
54
|
+
let prfOutput: Uint8Array;
|
|
55
|
+
if (Array.isArray(first)) {
|
|
56
|
+
// 1Password's browser extension can return a plain array instead of BufferSource.
|
|
57
|
+
if (first.length !== PRF_OUTPUT_BYTES) {
|
|
58
|
+
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
59
|
+
}
|
|
60
|
+
prfOutput = new Uint8Array(PRF_OUTPUT_BYTES);
|
|
61
|
+
for (let index = 0; index < PRF_OUTPUT_BYTES; index++) {
|
|
62
|
+
const byte = first[index];
|
|
63
|
+
if (
|
|
64
|
+
!Object.prototype.hasOwnProperty.call(first, index) ||
|
|
65
|
+
!Number.isInteger(byte) || byte < 0 || byte > MAX_BYTE_VALUE
|
|
66
|
+
) {
|
|
67
|
+
throw invalidInput("PRF output must contain only integer bytes");
|
|
68
|
+
}
|
|
69
|
+
prfOutput[index] = byte;
|
|
70
|
+
}
|
|
71
|
+
} else if (first instanceof ArrayBuffer || ArrayBuffer.isView(first)) {
|
|
72
|
+
const bytes = first instanceof ArrayBuffer
|
|
73
|
+
? new Uint8Array(first)
|
|
74
|
+
: new Uint8Array(first.buffer, first.byteOffset, first.byteLength);
|
|
75
|
+
prfOutput = bytes.slice();
|
|
76
|
+
} else {
|
|
77
|
+
throw invalidInput("PRF output must be a buffer or byte array");
|
|
78
|
+
}
|
|
45
79
|
if (prfOutput.length !== PRF_OUTPUT_BYTES) {
|
|
46
80
|
throw invalidInput(`PRF output must be ${PRF_OUTPUT_BYTES} bytes`);
|
|
47
81
|
}
|
|
48
82
|
return {
|
|
49
83
|
credentialId: credentialId(credential),
|
|
50
84
|
prfOutput,
|
|
51
|
-
|
|
85
|
+
authenticatorAttachment: authenticatorAttachment(credential),
|
|
52
86
|
};
|
|
53
87
|
}
|
|
54
88
|
|
|
@@ -56,6 +90,7 @@ export async function createPrfCredential(
|
|
|
56
90
|
context: CeremonyContext,
|
|
57
91
|
user: PasskeyUser,
|
|
58
92
|
signal: AbortSignal,
|
|
93
|
+
enrollmentAttachment: EnrollmentAttachment,
|
|
59
94
|
): Promise<InternalPrfResult> {
|
|
60
95
|
if (!(user?.id instanceof Uint8Array) || user.id.length === 0) {
|
|
61
96
|
throw invalidInput("user.id must be a non-empty Uint8Array");
|
|
@@ -85,7 +120,7 @@ export async function createPrfCredential(
|
|
|
85
120
|
{ type: "public-key", alg: -257 },
|
|
86
121
|
],
|
|
87
122
|
authenticatorSelection: {
|
|
88
|
-
authenticatorAttachment: "platform",
|
|
123
|
+
authenticatorAttachment: enrollmentAttachment === "platform" ? "platform" : undefined,
|
|
89
124
|
residentKey: "preferred",
|
|
90
125
|
userVerification: "required",
|
|
91
126
|
},
|