@ibgib/web-gib 0.0.61 → 0.0.63
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/dist/AUTO-GENERATED-version.d.mts +1 -1
- package/dist/AUTO-GENERATED-version.mjs +1 -1
- package/dist/helpers.web.d.mts +20 -3
- package/dist/helpers.web.d.mts.map +1 -1
- package/dist/helpers.web.mjs +84 -3
- package/dist/helpers.web.mjs.map +1 -1
- package/dist/identity/device-delegate-helper.d.mts +48 -0
- package/dist/identity/device-delegate-helper.d.mts.map +1 -1
- package/dist/identity/device-delegate-helper.mjs +86 -2
- package/dist/identity/device-delegate-helper.mjs.map +1 -1
- package/dist/identity/device-delegate.respec.mjs +6 -6
- package/dist/identity/device-delegate.respec.mjs.map +1 -1
- package/dist/identity/passkey-helper.d.mts +77 -0
- package/dist/identity/passkey-helper.d.mts.map +1 -0
- package/dist/identity/passkey-helper.mjs +258 -0
- package/dist/identity/passkey-helper.mjs.map +1 -0
- package/dist/identity/passkey.respec.d.mts +2 -0
- package/dist/identity/passkey.respec.d.mts.map +1 -0
- package/dist/identity/passkey.respec.mjs +169 -0
- package/dist/identity/passkey.respec.mjs.map +1 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.mjs +1 -0
- package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.css +26 -0
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +18 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.html +60 -4
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +518 -74
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +28 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.html +46 -0
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs +1146 -208
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
- package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -1
- package/dist/ui/component/identity/remove-device/remove-device.mjs +1 -0
- package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -1
- package/dist/ui/ui-helpers.d.mts +3 -0
- package/dist/ui/ui-helpers.d.mts.map +1 -1
- package/dist/ui/ui-helpers.mjs +116 -7
- package/dist/ui/ui-helpers.mjs.map +1 -1
- package/package.json +2 -2
- package/src/AUTO-GENERATED-version.mts +1 -1
- package/src/helpers.web.mts +117 -7
- package/src/identity/device-delegate-helper.mts +135 -2
- package/src/identity/device-delegate.respec.mts +6 -6
- package/src/identity/passkey-helper.mts +337 -0
- package/src/identity/passkey.respec.mts +194 -0
- package/src/index.mts +1 -0
- package/src/ui/component/identity/add-device/add-device.mts +1 -0
- package/src/ui/component/identity/keystone-creator/keystone-creator.css +26 -0
- package/src/ui/component/identity/keystone-creator/keystone-creator.html +60 -4
- package/src/ui/component/identity/keystone-creator/keystone-creator.mts +561 -77
- package/src/ui/component/identity/keystone-details/keystone-details.html +46 -0
- package/src/ui/component/identity/keystone-details/keystone-details.mts +1239 -224
- package/src/ui/component/identity/remove-device/remove-device.mts +1 -0
- package/src/ui/ui-helpers.mts +123 -6
- package/tools/auto-generated-agent-skills/skills/ibgib-create-app-server/SKILL.md +50 -0
- package/src/identity/custodian-delegate-helper.mts.bak +0 -7
- package/src/identity/sso/sso-config-helper.mts.bak +0 -52
- package/src/identity/sso/sso-custodian-service.mts.bak +0 -566
- package/src/identity/sso/sso-custodian-service.respec.mts.bak +0 -298
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module identity/passkey-helper
|
|
3
|
+
*
|
|
4
|
+
* WebAuthn Level 3 PRF (Pseudo-Random Function) Passkey helper service.
|
|
5
|
+
* Derives deterministic 256-bit symmetric secrets from hardware biometrics
|
|
6
|
+
* (Touch ID, Windows Hello, Android Biometrics, YubiKey 5Ci) and creates
|
|
7
|
+
* passkey device sync delegates.
|
|
8
|
+
*/
|
|
9
|
+
import { AuthenticatorTransport } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';
|
|
10
|
+
/**
|
|
11
|
+
* Checks if the browser and underlying platform authenticator support WebAuthn PRF.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isPasskeyPrfSupported(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Helper to convert an ArrayBuffer to a lowercase hex string.
|
|
16
|
+
*/
|
|
17
|
+
export declare function bufferToHex(buffer: ArrayBuffer | ArrayBufferLike): string;
|
|
18
|
+
/**
|
|
19
|
+
* Helper to convert a hex string to a Uint8Array.
|
|
20
|
+
*/
|
|
21
|
+
export declare function hexToUint8Array(hex: string): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Helper to normalize a salt string or buffer into a 32-byte Uint8Array for PRF evaluation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeSaltTo32Bytes(salt: string | Uint8Array): Uint8Array;
|
|
26
|
+
/**
|
|
27
|
+
* Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
|
|
31
|
+
*/
|
|
32
|
+
export declare function registerPasskeyCredential({ username, displayName, rpName, rpId, salt, userVerification, authenticatorAttachment, hints, }: {
|
|
33
|
+
username: string;
|
|
34
|
+
displayName?: string;
|
|
35
|
+
rpName?: string;
|
|
36
|
+
rpId?: string;
|
|
37
|
+
salt?: string | Uint8Array;
|
|
38
|
+
userVerification?: UserVerificationRequirement;
|
|
39
|
+
authenticatorAttachment?: AuthenticatorAttachment;
|
|
40
|
+
hints?: ('security-key' | 'client-device' | 'hybrid')[];
|
|
41
|
+
}): Promise<{
|
|
42
|
+
credentialId: string;
|
|
43
|
+
rawId: ArrayBuffer;
|
|
44
|
+
transports: AuthenticatorTransport[];
|
|
45
|
+
passkeySecret?: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Evaluates the PRF extension on a passkey assertion to derive a deterministic 256-bit symmetric secret.
|
|
49
|
+
*/
|
|
50
|
+
export declare function evaluatePasskeyPrf({ salt, credentialId, transports, rpId, userVerification, hints, }: {
|
|
51
|
+
salt: string | Uint8Array;
|
|
52
|
+
credentialId?: string;
|
|
53
|
+
transports?: AuthenticatorTransport[];
|
|
54
|
+
rpId?: string;
|
|
55
|
+
userVerification?: UserVerificationRequirement;
|
|
56
|
+
hints?: ('security-key' | 'client-device' | 'hybrid')[];
|
|
57
|
+
}): Promise<{
|
|
58
|
+
passkeySecret: string;
|
|
59
|
+
credentialId: string;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a Passkey sovereign sync delegate for this device.
|
|
63
|
+
* Standardized format: `passkey-${safeUsername}-${defaultDeviceTag}`
|
|
64
|
+
*/
|
|
65
|
+
export declare function createPasskeyDeviceSyncDelegate({ username, primaryTjpAddr, passkeySecret, transports, metaspace, space, }: {
|
|
66
|
+
username: string;
|
|
67
|
+
primaryTjpAddr: string;
|
|
68
|
+
passkeySecret: string;
|
|
69
|
+
transports?: AuthenticatorTransport[];
|
|
70
|
+
metaspace?: any;
|
|
71
|
+
space?: any;
|
|
72
|
+
}): Promise<{
|
|
73
|
+
delegateKeystone: any;
|
|
74
|
+
deviceTag: string;
|
|
75
|
+
delegateSecret: string;
|
|
76
|
+
}>;
|
|
77
|
+
//# sourceMappingURL=passkey-helper.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey-helper.d.mts","sourceRoot":"","sources":["../../src/identity/passkey-helper.mts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,sBAAsB,EAAwB,MAAM,kDAAkD,CAAC;AAGhH;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAoB9D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,MAAM,CAIzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOvD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAgB5E;AAED;;GAEG;AACH;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,EAC5C,QAAQ,EACR,WAAsB,EACtB,MAAgB,EAChB,IAAI,EACJ,IAAI,EACJ,gBAA8B,EAC9B,uBAAuB,EACvB,KAAmD,GACtD,EAAE;IACC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC3B,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAC/C,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,KAAK,CAAC,EAAE,CAAC,cAAc,GAAG,eAAe,GAAG,QAAQ,CAAC,EAAE,CAAC;CAC3D,GAAG,OAAO,CAAC;IACR,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,sBAAsB,EAAE,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC,CA0ED;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,EACrC,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,gBAA8B,EAC9B,KAAmD,GACtD,EAAE;IACC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAC/C,KAAK,CAAC,EAAE,CAAC,cAAc,GAAG,eAAe,GAAG,QAAQ,CAAC,EAAE,CAAC;CAC3D,GAAG,OAAO,CAAC;IACR,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACxB,CAAC,CAkFD;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CAAC,EAClD,QAAQ,EACR,cAAc,EACd,aAAa,EACb,UAAU,EACV,SAAS,EACT,KAAK,GACR,EAAE;IACC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACtC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,KAAK,CAAC,EAAE,GAAG,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,gBAAgB,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CA4BhF"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module identity/passkey-helper
|
|
3
|
+
*
|
|
4
|
+
* WebAuthn Level 3 PRF (Pseudo-Random Function) Passkey helper service.
|
|
5
|
+
* Derives deterministic 256-bit symmetric secrets from hardware biometrics
|
|
6
|
+
* (Touch ID, Windows Hello, Android Biometrics, YubiKey 5Ci) and creates
|
|
7
|
+
* passkey device sync delegates.
|
|
8
|
+
*/
|
|
9
|
+
import { extractErrorMsg, getSaferSubstring } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
10
|
+
import { deriveDelegateSecret, createSyncDelegateKeystone } from '@ibgib/core-gib/dist/keystone/delegate/delegate-helpers.mjs';
|
|
11
|
+
import { generateDefaultDeviceTag, setDeviceDelegateSecret } from './device-delegate-helper.mjs';
|
|
12
|
+
/**
|
|
13
|
+
* Checks if the browser and underlying platform authenticator support WebAuthn PRF.
|
|
14
|
+
*/
|
|
15
|
+
export async function isPasskeyPrfSupported() {
|
|
16
|
+
try {
|
|
17
|
+
if (typeof window === 'undefined' || !window.PublicKeyCredential) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (typeof window.PublicKeyCredential.getClientCapabilities === 'function') {
|
|
21
|
+
const caps = await window.PublicKeyCredential.getClientCapabilities();
|
|
22
|
+
if (caps && caps['prf']) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Fallback: check if PublicKeyCredential exists and platform authenticator is available
|
|
27
|
+
if (typeof PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable === 'function') {
|
|
28
|
+
const isPlatformAvailable = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
|
|
29
|
+
return isPlatformAvailable;
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Helper to convert an ArrayBuffer to a lowercase hex string.
|
|
39
|
+
*/
|
|
40
|
+
export function bufferToHex(buffer) {
|
|
41
|
+
return Array.from(new Uint8Array(buffer))
|
|
42
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
43
|
+
.join('');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Helper to convert a hex string to a Uint8Array.
|
|
47
|
+
*/
|
|
48
|
+
export function hexToUint8Array(hex) {
|
|
49
|
+
const cleanHex = hex.replace(/[^0-9a-fA-F]/g, '');
|
|
50
|
+
const bytes = new Uint8Array(Math.floor(cleanHex.length / 2));
|
|
51
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
52
|
+
bytes[i] = parseInt(cleanHex.substr(i * 2, 2), 16);
|
|
53
|
+
}
|
|
54
|
+
return bytes;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Helper to normalize a salt string or buffer into a 32-byte Uint8Array for PRF evaluation.
|
|
58
|
+
*/
|
|
59
|
+
export function normalizeSaltTo32Bytes(salt) {
|
|
60
|
+
if (salt instanceof Uint8Array) {
|
|
61
|
+
if (salt.length === 32)
|
|
62
|
+
return salt;
|
|
63
|
+
const result = new Uint8Array(32);
|
|
64
|
+
result.set(salt.subarray(0, 32));
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
// If hex string of length 64 (32 bytes)
|
|
68
|
+
if (/^[0-9a-fA-F]{64}$/.test(salt)) {
|
|
69
|
+
return hexToUint8Array(salt);
|
|
70
|
+
}
|
|
71
|
+
// Text string: encode and pad/slice to 32 bytes
|
|
72
|
+
const encoded = new TextEncoder().encode(salt);
|
|
73
|
+
const result = new Uint8Array(32);
|
|
74
|
+
result.set(encoded.subarray(0, 32));
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
|
|
79
|
+
*/
|
|
80
|
+
/**
|
|
81
|
+
* Creates and registers a new WebAuthn resident passkey credential with PRF enabled.
|
|
82
|
+
*/
|
|
83
|
+
export async function registerPasskeyCredential({ username, displayName = username, rpName = 'ibgib', rpId, salt, userVerification = 'preferred', authenticatorAttachment, hints = ['security-key', 'client-device', 'hybrid'], }) {
|
|
84
|
+
const lc = `[registerPasskeyCredential]`;
|
|
85
|
+
try {
|
|
86
|
+
if (typeof window === 'undefined' || !navigator.credentials?.create) {
|
|
87
|
+
throw new Error('WebAuthn is not supported in this browser environment.');
|
|
88
|
+
}
|
|
89
|
+
const effectiveRpId = rpId || (typeof window !== 'undefined' ? window.location.hostname : undefined);
|
|
90
|
+
const challenge = crypto.getRandomValues(new Uint8Array(32));
|
|
91
|
+
const userId = new TextEncoder().encode(username.slice(0, 64));
|
|
92
|
+
const saltBuffer = salt ? normalizeSaltTo32Bytes(salt) : undefined;
|
|
93
|
+
const prfExtension = saltBuffer
|
|
94
|
+
? { eval: { first: saltBuffer } }
|
|
95
|
+
: {};
|
|
96
|
+
const credential = await navigator.credentials.create({
|
|
97
|
+
publicKey: {
|
|
98
|
+
challenge,
|
|
99
|
+
rp: {
|
|
100
|
+
name: rpName,
|
|
101
|
+
...(effectiveRpId ? { id: effectiveRpId } : {})
|
|
102
|
+
},
|
|
103
|
+
user: {
|
|
104
|
+
id: userId,
|
|
105
|
+
name: username,
|
|
106
|
+
displayName
|
|
107
|
+
},
|
|
108
|
+
pubKeyCredParams: [
|
|
109
|
+
{ alg: -7, type: 'public-key' }, // ES256 (ECDSA P-256)
|
|
110
|
+
{ alg: -257, type: 'public-key' }, // RS256 (RSA)
|
|
111
|
+
{ alg: -8, type: 'public-key' }, // Ed25519
|
|
112
|
+
],
|
|
113
|
+
authenticatorSelection: {
|
|
114
|
+
residentKey: 'required',
|
|
115
|
+
userVerification,
|
|
116
|
+
...(authenticatorAttachment ? { authenticatorAttachment } : {})
|
|
117
|
+
},
|
|
118
|
+
...(hints && hints.length > 0 ? { hints } : {}),
|
|
119
|
+
extensions: {
|
|
120
|
+
prf: prfExtension
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
if (!credential) {
|
|
125
|
+
throw new Error('Passkey creation was cancelled or failed.');
|
|
126
|
+
}
|
|
127
|
+
const credentialId = bufferToHex(credential.rawId);
|
|
128
|
+
const response = credential.response;
|
|
129
|
+
const transports = (typeof response.getTransports === 'function')
|
|
130
|
+
? response.getTransports()
|
|
131
|
+
: [];
|
|
132
|
+
const extResults = credential.getClientExtensionResults?.() || {};
|
|
133
|
+
console.log(`${lc} WebAuthn registration clientExtensionResults:`, extResults);
|
|
134
|
+
let passkeySecret;
|
|
135
|
+
if (extResults.prf?.results?.first) {
|
|
136
|
+
passkeySecret = bufferToHex(extResults.prf.results.first);
|
|
137
|
+
console.log(`${lc} Evaluated PRF directly during create!`);
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
credentialId,
|
|
141
|
+
rawId: credential.rawId,
|
|
142
|
+
transports,
|
|
143
|
+
passkeySecret
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Evaluates the PRF extension on a passkey assertion to derive a deterministic 256-bit symmetric secret.
|
|
153
|
+
*/
|
|
154
|
+
export async function evaluatePasskeyPrf({ salt, credentialId, transports, rpId, userVerification = 'preferred', hints = ['security-key', 'client-device', 'hybrid'], }) {
|
|
155
|
+
const lc = `[evaluatePasskeyPrf]`;
|
|
156
|
+
try {
|
|
157
|
+
if (typeof window === 'undefined' || !navigator.credentials?.get) {
|
|
158
|
+
throw new Error('WebAuthn is not supported in this browser environment.');
|
|
159
|
+
}
|
|
160
|
+
const effectiveRpId = rpId || (typeof window !== 'undefined' ? window.location.hostname : undefined);
|
|
161
|
+
const challenge = crypto.getRandomValues(new Uint8Array(32));
|
|
162
|
+
const saltBuffer = normalizeSaltTo32Bytes(salt);
|
|
163
|
+
let credentialIdBase64Url = undefined;
|
|
164
|
+
let allowCredentials = undefined;
|
|
165
|
+
if (credentialId) {
|
|
166
|
+
const rawBytes = hexToUint8Array(credentialId);
|
|
167
|
+
allowCredentials = [{
|
|
168
|
+
id: rawBytes.buffer,
|
|
169
|
+
type: 'public-key',
|
|
170
|
+
...(transports && transports.length > 0 ? { transports } : {})
|
|
171
|
+
}];
|
|
172
|
+
let binary = '';
|
|
173
|
+
for (let i = 0; i < rawBytes.byteLength; i++) {
|
|
174
|
+
binary += String.fromCharCode(rawBytes[i]);
|
|
175
|
+
}
|
|
176
|
+
credentialIdBase64Url = btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
177
|
+
}
|
|
178
|
+
const prfExtension = {
|
|
179
|
+
eval: {
|
|
180
|
+
first: saltBuffer
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
if (credentialIdBase64Url) {
|
|
184
|
+
prfExtension.evalByCredential = {
|
|
185
|
+
[credentialIdBase64Url]: {
|
|
186
|
+
first: saltBuffer
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const assertion = await navigator.credentials.get({
|
|
191
|
+
publicKey: {
|
|
192
|
+
challenge,
|
|
193
|
+
...(effectiveRpId ? { rpId: effectiveRpId } : {}),
|
|
194
|
+
allowCredentials,
|
|
195
|
+
userVerification,
|
|
196
|
+
...(hints && hints.length > 0 ? { hints } : {}),
|
|
197
|
+
extensions: {
|
|
198
|
+
prf: prfExtension
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
if (!assertion) {
|
|
203
|
+
throw new Error('Passkey authentication was cancelled or failed.');
|
|
204
|
+
}
|
|
205
|
+
const resolvedCredentialId = bufferToHex(assertion.rawId);
|
|
206
|
+
const extResults = assertion.getClientExtensionResults?.() || {};
|
|
207
|
+
console.log(`${lc} WebAuthn assertion clientExtensionResults:`, JSON.stringify(extResults), extResults);
|
|
208
|
+
let prfResult = extResults.prf?.results?.first;
|
|
209
|
+
if (!prfResult && credentialIdBase64Url && extResults.prf?.resultsByCredential?.[credentialIdBase64Url]?.first) {
|
|
210
|
+
prfResult = extResults.prf.resultsByCredential[credentialIdBase64Url].first;
|
|
211
|
+
console.log(`${lc} Extracted PRF result from resultsByCredential!`);
|
|
212
|
+
}
|
|
213
|
+
if (!prfResult) {
|
|
214
|
+
console.error(`${lc} Extension results did not contain PRF evaluation:`, JSON.stringify(extResults), extResults);
|
|
215
|
+
throw new Error('Authenticator did not return a PRF evaluation. PRF extension may not be supported on this authenticator.');
|
|
216
|
+
}
|
|
217
|
+
const passkeySecret = bufferToHex(prfResult);
|
|
218
|
+
return {
|
|
219
|
+
passkeySecret,
|
|
220
|
+
credentialId: resolvedCredentialId
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Creates a Passkey sovereign sync delegate for this device.
|
|
230
|
+
* Standardized format: `passkey-${safeUsername}-${defaultDeviceTag}`
|
|
231
|
+
*/
|
|
232
|
+
export async function createPasskeyDeviceSyncDelegate({ username, primaryTjpAddr, passkeySecret, transports, metaspace, space, }) {
|
|
233
|
+
const delegateSecret = await deriveDelegateSecret({ masterSecret: passkeySecret });
|
|
234
|
+
await setDeviceDelegateSecret({ primaryTjpAddr, delegateSecret });
|
|
235
|
+
const safeUser = getSaferSubstring({ text: username, length: 8, keepLiterals: ['-'] }) || 'user';
|
|
236
|
+
const defaultDeviceTag = generateDefaultDeviceTag();
|
|
237
|
+
const deviceTag = `passkey-${safeUser}-${defaultDeviceTag}`;
|
|
238
|
+
const sovereignSyncProfileName = process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC;
|
|
239
|
+
if (!sovereignSyncProfileName || !sovereignSyncProfileName.trim()) {
|
|
240
|
+
throw new Error('KEYSTONE_PROFILE_SOVEREIGN_SYNC environment variable is missing.');
|
|
241
|
+
}
|
|
242
|
+
const delegateKeystone = await createSyncDelegateKeystone({
|
|
243
|
+
profileName: sovereignSyncProfileName.trim(),
|
|
244
|
+
username,
|
|
245
|
+
deviceTag,
|
|
246
|
+
primaryTjpAddr,
|
|
247
|
+
delegateSecret,
|
|
248
|
+
additionalFrameDetails: {
|
|
249
|
+
client: 'space-gib-web',
|
|
250
|
+
role: 'passkey-sync',
|
|
251
|
+
...(transports && transports.length > 0 ? { transports } : {})
|
|
252
|
+
},
|
|
253
|
+
metaspace,
|
|
254
|
+
space,
|
|
255
|
+
});
|
|
256
|
+
return { delegateKeystone, deviceTag, delegateSecret };
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=passkey-helper.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey-helper.mjs","sourceRoot":"","sources":["../../src/identity/passkey-helper.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.respec.d.mts","sourceRoot":"","sources":["../../src/identity/passkey.respec.mts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { respecfully, ifWe, iReckon } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
2
|
+
import { getIbGibGlobalThis_IbGib } from '../helpers.mjs';
|
|
3
|
+
import { bufferToHex, hexToUint8Array, normalizeSaltTo32Bytes, isPasskeyPrfSupported, createPasskeyDeviceSyncDelegate } from './passkey-helper.mjs';
|
|
4
|
+
import { getDeviceDelegateSecret } from './device-delegate-helper.mjs';
|
|
5
|
+
const sir = `[${import.meta.url}]`;
|
|
6
|
+
// Initialize global db & store names for tests
|
|
7
|
+
const globalThisIbGib = getIbGibGlobalThis_IbGib();
|
|
8
|
+
globalThisIbGib.dbName_hack = 'space_gib_db';
|
|
9
|
+
globalThisIbGib.storeName_hack = 'space_gib_store';
|
|
10
|
+
// Mock storage substrate for Node test environment
|
|
11
|
+
const inMemoryStore = new Map();
|
|
12
|
+
if (typeof globalThis.indexedDB === 'undefined') {
|
|
13
|
+
globalThis.indexedDB = {
|
|
14
|
+
open: (dbName) => {
|
|
15
|
+
const req = {};
|
|
16
|
+
setTimeout(() => {
|
|
17
|
+
const db = {
|
|
18
|
+
objectStoreNames: { contains: () => true },
|
|
19
|
+
transaction: (storeName) => ({
|
|
20
|
+
objectStore: (sName) => ({
|
|
21
|
+
get: (key) => {
|
|
22
|
+
const getReq = {};
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
const val = inMemoryStore.get(key);
|
|
25
|
+
getReq.result = val !== undefined ? { value: val } : undefined;
|
|
26
|
+
if (getReq.onsuccess)
|
|
27
|
+
getReq.onsuccess({ target: getReq });
|
|
28
|
+
}, 0);
|
|
29
|
+
return getReq;
|
|
30
|
+
},
|
|
31
|
+
put: (datum) => {
|
|
32
|
+
const putReq = {};
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
inMemoryStore.set(datum.key, datum.value);
|
|
35
|
+
if (putReq.onsuccess)
|
|
36
|
+
putReq.onsuccess({ target: putReq });
|
|
37
|
+
}, 0);
|
|
38
|
+
return putReq;
|
|
39
|
+
},
|
|
40
|
+
delete: (key) => {
|
|
41
|
+
const delReq = {};
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
inMemoryStore.delete(key);
|
|
44
|
+
if (delReq.onsuccess)
|
|
45
|
+
delReq.onsuccess({ target: delReq });
|
|
46
|
+
}, 0);
|
|
47
|
+
return delReq;
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
}),
|
|
51
|
+
close: () => { }
|
|
52
|
+
};
|
|
53
|
+
req.result = db;
|
|
54
|
+
if (req.onsuccess)
|
|
55
|
+
req.onsuccess({ target: req });
|
|
56
|
+
}, 0);
|
|
57
|
+
return req;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Setup environment profile
|
|
62
|
+
process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC = 'sync-profile.dev';
|
|
63
|
+
class MockIbGibSpace {
|
|
64
|
+
name;
|
|
65
|
+
store = new Map();
|
|
66
|
+
ib = 'witness space mock-space mock_space_id user';
|
|
67
|
+
constructor(name = "mock_space") {
|
|
68
|
+
this.name = name;
|
|
69
|
+
}
|
|
70
|
+
async put({ ibGib }) {
|
|
71
|
+
const addr = `${ibGib.ib}^${ibGib.gib}`;
|
|
72
|
+
this.store.set(addr, JSON.parse(JSON.stringify(ibGib)));
|
|
73
|
+
}
|
|
74
|
+
async get({ addr }) {
|
|
75
|
+
const data = this.store.get(addr);
|
|
76
|
+
return data ? JSON.parse(JSON.stringify(data)) : null;
|
|
77
|
+
}
|
|
78
|
+
async argy({ argData, ibGibs }) {
|
|
79
|
+
return {
|
|
80
|
+
ib: 'arg^gib',
|
|
81
|
+
gib: 'arg_gib',
|
|
82
|
+
data: argData,
|
|
83
|
+
ibGibs,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
async witness(arg) {
|
|
87
|
+
return { data: { success: true } };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
class MockMetaspaceService {
|
|
91
|
+
space;
|
|
92
|
+
constructor(space) {
|
|
93
|
+
this.space = space;
|
|
94
|
+
}
|
|
95
|
+
async getLocalUserSpace({ lock } = {}) {
|
|
96
|
+
return this.space;
|
|
97
|
+
}
|
|
98
|
+
async put(args) {
|
|
99
|
+
const target = args.space || this.space;
|
|
100
|
+
return target.put(args);
|
|
101
|
+
}
|
|
102
|
+
async registerNewIbGib({ ibGib }) {
|
|
103
|
+
return this.put({ ibGib });
|
|
104
|
+
}
|
|
105
|
+
async get(args) {
|
|
106
|
+
const target = args.space || this.space;
|
|
107
|
+
if (args.addr) {
|
|
108
|
+
const x = await target.get({ addr: args.addr });
|
|
109
|
+
return { success: !!x, ibGibs: x ? [x] : [] };
|
|
110
|
+
}
|
|
111
|
+
return { success: true, ibGibs: [] };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const mockSpace = new MockIbGibSpace();
|
|
115
|
+
const mockMetaspace = new MockMetaspaceService(mockSpace);
|
|
116
|
+
await respecfully(sir, 'Passkey WebAuthn PRF Helper Service', async () => {
|
|
117
|
+
await ifWe(sir, 'bufferToHex and hexToUint8Array roundtrip correctly', async () => {
|
|
118
|
+
const originalBytes = new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef]);
|
|
119
|
+
const hex = bufferToHex(originalBytes.buffer);
|
|
120
|
+
iReckon(sir, hex).willEqual('deadbeef0123456789abcdef');
|
|
121
|
+
const roundtripBytes = hexToUint8Array(hex);
|
|
122
|
+
iReckon(sir, roundtripBytes.length).willEqual(originalBytes.length);
|
|
123
|
+
for (let i = 0; i < originalBytes.length; i++) {
|
|
124
|
+
iReckon(sir, roundtripBytes[i]).willEqual(originalBytes[i]);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
await ifWe(sir, 'normalizeSaltTo32Bytes normalizes various salt inputs to 32 bytes', async () => {
|
|
128
|
+
// 1. Hex string of 64 chars (32 bytes)
|
|
129
|
+
const hex64 = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
|
|
130
|
+
const normHex = normalizeSaltTo32Bytes(hex64);
|
|
131
|
+
iReckon(sir, normHex.length).willEqual(32);
|
|
132
|
+
iReckon(sir, bufferToHex(normHex.buffer)).willEqual(hex64);
|
|
133
|
+
// 2. Text string
|
|
134
|
+
const textSalt = 'ibgib_passkey_salt_domain_123';
|
|
135
|
+
const normText = normalizeSaltTo32Bytes(textSalt);
|
|
136
|
+
iReckon(sir, normText.length).willEqual(32);
|
|
137
|
+
// 3. Uint8Array
|
|
138
|
+
const rawBytes = new Uint8Array(32);
|
|
139
|
+
rawBytes.fill(0x42);
|
|
140
|
+
const normRaw = normalizeSaltTo32Bytes(rawBytes);
|
|
141
|
+
iReckon(sir, normRaw.length).willEqual(32);
|
|
142
|
+
iReckon(sir, normRaw[0]).willEqual(0x42);
|
|
143
|
+
});
|
|
144
|
+
await ifWe(sir, 'isPasskeyPrfSupported evaluates capabilities cleanly', async () => {
|
|
145
|
+
// In Node environment without window
|
|
146
|
+
const supported = await isPasskeyPrfSupported();
|
|
147
|
+
iReckon(sir, typeof supported).willEqual('boolean');
|
|
148
|
+
});
|
|
149
|
+
await ifWe(sir, 'createPasskeyDeviceSyncDelegate creates standard passkey sync delegate', async () => {
|
|
150
|
+
const username = 'alice';
|
|
151
|
+
const primaryTjpAddr = 'keystone^alice_primary_tjp.addr';
|
|
152
|
+
const passkeySecret = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
|
|
153
|
+
const { delegateKeystone, deviceTag, delegateSecret } = await createPasskeyDeviceSyncDelegate({
|
|
154
|
+
username,
|
|
155
|
+
primaryTjpAddr,
|
|
156
|
+
passkeySecret,
|
|
157
|
+
transports: ['internal'],
|
|
158
|
+
metaspace: mockMetaspace,
|
|
159
|
+
space: mockSpace,
|
|
160
|
+
});
|
|
161
|
+
iReckon(sir, delegateKeystone).asTo('delegateKeystone is generated').isGonnaBeTruthy();
|
|
162
|
+
iReckon(sir, deviceTag.startsWith('passkey-alice-')).asTo('deviceTag follows passkey naming format').isGonnaBeTrue();
|
|
163
|
+
iReckon(sir, delegateSecret).asTo('delegateSecret is derived').isGonnaBeTruthy();
|
|
164
|
+
// Verify stored in IndexedDB
|
|
165
|
+
const storedSecret = await getDeviceDelegateSecret({ primaryTjpAddr });
|
|
166
|
+
iReckon(sir, storedSecret).willEqual(delegateSecret);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=passkey.respec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passkey.respec.mjs","sourceRoot":"","sources":["../../src/identity/passkey.respec.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,IAAI,EAAa,OAAO,EAAE,MAAM,kDAAkD,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACH,WAAW,EACX,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EAGrB,+BAA+B,EAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,MAAM,GAAG,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC;AAEnC,+CAA+C;AAC/C,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;AACnD,eAAe,CAAC,WAAW,GAAG,cAAc,CAAC;AAC7C,eAAe,CAAC,cAAc,GAAG,iBAAiB,CAAC;AAEnD,mDAAmD;AACnD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;IAC7C,UAAkB,CAAC,SAAS,GAAG;QAC5B,IAAI,EAAE,CAAC,MAAc,EAAE,EAAE;YACrB,MAAM,GAAG,GAAQ,EAAE,CAAC;YACpB,UAAU,CAAC,GAAG,EAAE;gBACZ,MAAM,EAAE,GAAG;oBACP,gBAAgB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;oBAC1C,WAAW,EAAE,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC;wBACjC,WAAW,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;4BAC7B,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE;gCACjB,MAAM,MAAM,GAAQ,EAAE,CAAC;gCACvB,UAAU,CAAC,GAAG,EAAE;oCACZ,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oCACnC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oCAC/D,IAAI,MAAM,CAAC,SAAS;wCAAE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gCAC/D,CAAC,EAAE,CAAC,CAAC,CAAC;gCACN,OAAO,MAAM,CAAC;4BAClB,CAAC;4BACD,GAAG,EAAE,CAAC,KAAU,EAAE,EAAE;gCAChB,MAAM,MAAM,GAAQ,EAAE,CAAC;gCACvB,UAAU,CAAC,GAAG,EAAE;oCACZ,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oCAC1C,IAAI,MAAM,CAAC,SAAS;wCAAE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gCAC/D,CAAC,EAAE,CAAC,CAAC,CAAC;gCACN,OAAO,MAAM,CAAC;4BAClB,CAAC;4BACD,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE;gCACpB,MAAM,MAAM,GAAQ,EAAE,CAAC;gCACvB,UAAU,CAAC,GAAG,EAAE;oCACZ,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oCAC1B,IAAI,MAAM,CAAC,SAAS;wCAAE,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gCAC/D,CAAC,EAAE,CAAC,CAAC,CAAC;gCACN,OAAO,MAAM,CAAC;4BAClB,CAAC;yBACJ,CAAC;qBACL,CAAC;oBACF,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;iBAClB,CAAC;gBACF,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;gBAChB,IAAI,GAAG,CAAC,SAAS;oBAAE,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC;AAED,4BAA4B;AAC5B,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,kBAAkB,CAAC;AAEjE,MAAM,cAAc;IAIG,IAAI;IAHvB,KAAK,GAAG,IAAI,GAAG,EAAe,CAAC;IAC/B,EAAE,GAAW,6CAA6C,CAAC;IAE3D,YAAmB,IAAI,GAAW,YAAY;oBAA3B,IAAI;IAA2B,CAAC;IAEnD,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAkB;QAC/B,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAoB;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAoC;QAC5D,OAAO;YACH,EAAE,EAAE,SAAS;YACb,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,OAAO;YACb,MAAM;SACT,CAAC;IACN,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAQ;QAClB,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACvC,CAAC;CACJ;AAED,MAAM,oBAAoB;IACH,KAAK;IAAxB,YAAmB,KAAqB;qBAArB,KAAK;IAAoB,CAAC;IAE7C,KAAK,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,GAAuB,EAAE;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAS;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAkB;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAsD;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;CACJ;AAED,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;AACvC,MAAM,aAAa,GAAG,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAE1D,MAAM,WAAW,CAAC,GAAG,EAAE,qCAAqC,EAAE,KAAK,IAAI,EAAE;IAErE,MAAM,IAAI,CAAC,GAAG,EAAE,qDAAqD,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/G,MAAM,GAAG,GAAG,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAExD,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,EAAE,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAC5F,uCAAuC;QACvC,MAAM,KAAK,GAAG,kEAAkE,CAAC;QACjF,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE3D,iBAAiB;QACjB,MAAM,QAAQ,GAAG,+BAA+B,CAAC;QACjD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE5C,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,EAAE,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAC/E,qCAAqC;QACrC,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,EAAE,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,MAAM,cAAc,GAAG,iCAAiC,CAAC;QACzD,MAAM,aAAa,GAAG,kEAAkE,CAAC;QAEzF,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,+BAA+B,CAAC;YAC1F,QAAQ;YACR,cAAc;YACd,aAAa;YACb,UAAU,EAAE,CAAC,UAAU,CAAC;YACxB,SAAS,EAAE,aAAoB;YAC/B,KAAK,EAAE,SAAgB;SAC1B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,eAAe,EAAE,CAAC;QACvF,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrH,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,eAAe,EAAE,CAAC;QAEjF,6BAA6B;QAC7B,MAAM,YAAY,GAAG,MAAM,uBAAuB,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/dist/index.d.mts
CHANGED
|
@@ -14,6 +14,7 @@ export * from "./api/ibgib-api-bridge.mjs";
|
|
|
14
14
|
export * from "./identity/keystone-sync-service.mjs";
|
|
15
15
|
export * from "./identity/device-delegate-helper.mjs";
|
|
16
16
|
export * from "./identity/sso-popup-helper.mjs";
|
|
17
|
+
export * from "./identity/passkey-helper.mjs";
|
|
17
18
|
export * from "./ui/component/identity/index.mjs";
|
|
18
19
|
export * from "./ui/ui-constants.mjs";
|
|
19
20
|
export * from "./ui/ui-types.mjs";
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAG9B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAG9B,cAAc,4BAA4B,CAAC;AAG3C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAG9C,cAAc,mCAAmC,CAAC;AAGlD,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -16,6 +16,7 @@ export * from "./api/ibgib-api-bridge.mjs";
|
|
|
16
16
|
export * from "./identity/keystone-sync-service.mjs";
|
|
17
17
|
export * from "./identity/device-delegate-helper.mjs";
|
|
18
18
|
export * from "./identity/sso-popup-helper.mjs";
|
|
19
|
+
export * from "./identity/passkey-helper.mjs";
|
|
19
20
|
// Identity UI components
|
|
20
21
|
export * from "./ui/component/identity/index.mjs";
|
|
21
22
|
// UI constants & types
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAE9B,kBAAkB;AAClB,cAAc,4BAA4B,CAAC;AAE3C,2BAA2B;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wCAAwC,CAAC;AAEvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAE9B,kBAAkB;AAClB,cAAc,4BAA4B,CAAC;AAE3C,2BAA2B;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAE9C,yBAAyB;AACzB,cAAc,mCAAmC,CAAC;AAElD,uBAAuB;AACvB,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-device.d.mts","sourceRoot":"","sources":["../../../../../src/ui/component/identity/add-device/add-device.mts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAc3D,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAG,MAAM,yCAAyC,CAAC;AAChH,OAAO,EACH,YAAY,EAAE,6BAA6B,EAC3C,qCAAqC,EACxC,MAAM,2BAA2B,CAAC;AASnC,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,6BAA6B;IACrE,SAAS,CAAC,EAAE,EAAE,MAAM,CAA8B;IAElD,WAAW,CAAC,EAAE,MAAM,CAAgD;IACpE,aAAa,SAA6B;IAE1C,cAKC;IAEK,cAAc,CAAC,EACjB,IAAI,EACJ,SAAS,EACZ,EAAE;QACC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,SAAS,CAAC;KACxB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CASzC;CACJ;AAED,UAAU,iBAAkB,SAAQ,YAAY;IAC5C,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,oBAAoB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,EAAE,iBAAiB,CAAC;IAChC,eAAe,EAAE,gBAAgB,CAAC;IAClC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,uBAAuB,EAAE,cAAc,CAAC;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,iBAAiB,CAAC;IACjC,wBAAwB,EAAE,cAAc,CAAC;IACzC,aAAa,EAAE,gBAAgB,CAAC;IAChC,oBAAoB,EAAE,iBAAiB,CAAC;IACxC,cAAc,EAAE,gBAAgB,CAAC;IACjC,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,EAAE,oBAAoB,CAAC;IACjC,YAAY,EAAE,cAAc,CAAC;IAC7B,cAAc,EAAE,WAAW,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,0BACT,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,CACzD,YAAW,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAkC;IAGtD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,sBAAsB,CAAC,CAAmB;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAiB;IAE7C,cAEC;IAEc,UAAU,CAAC,IAAI,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;IAEc,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCtC;IAEc,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;IAED,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,YAAY;IAiBpB,UAAgB,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,QAAQ,iBA2D7D;IAMD,UAAgB,mBAAmB,kBAgElC;IAED,UAAgB,gBAAgB,kBA2G/B;YAMa,mCAAmC;IAiFjD,UAAgB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"add-device.d.mts","sourceRoot":"","sources":["../../../../../src/ui/component/identity/add-device/add-device.mts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAc3D,OAAO,EAAE,6BAA6B,EAAE,qBAAqB,EAAG,MAAM,yCAAyC,CAAC;AAChH,OAAO,EACH,YAAY,EAAE,6BAA6B,EAC3C,qCAAqC,EACxC,MAAM,2BAA2B,CAAC;AASnC,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAE5D;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,6BAA6B;IACrE,SAAS,CAAC,EAAE,EAAE,MAAM,CAA8B;IAElD,WAAW,CAAC,EAAE,MAAM,CAAgD;IACpE,aAAa,SAA6B;IAE1C,cAKC;IAEK,cAAc,CAAC,EACjB,IAAI,EACJ,SAAS,EACZ,EAAE;QACC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,SAAS,CAAC;KACxB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CASzC;CACJ;AAED,UAAU,iBAAkB,SAAQ,YAAY;IAC5C,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,UAAU,EAAE,oBAAoB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,EAAE,iBAAiB,CAAC;IAChC,eAAe,EAAE,gBAAgB,CAAC;IAClC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,uBAAuB,EAAE,cAAc,CAAC;IACxC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,iBAAiB,CAAC;IACjC,wBAAwB,EAAE,cAAc,CAAC;IACzC,aAAa,EAAE,gBAAgB,CAAC;IAChC,oBAAoB,EAAE,iBAAiB,CAAC;IACxC,cAAc,EAAE,gBAAgB,CAAC;IACjC,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,EAAE,oBAAoB,CAAC;IACjC,YAAY,EAAE,cAAc,CAAC;IAC7B,cAAc,EAAE,WAAW,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,0BACT,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,CACzD,YAAW,6BAA6B,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErE,SAAS,CAAC,EAAE,EAAE,MAAM,CAAkC;IAGtD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,sBAAsB,CAAC,CAAmB;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAiB;IAE7C,cAEC;IAEc,UAAU,CAAC,IAAI,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF;IAEc,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCtC;IAEc,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;IAED,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,YAAY;IAiBpB,UAAgB,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,QAAQ,iBA2D7D;IAMD,UAAgB,mBAAmB,kBAgElC;IAED,UAAgB,gBAAgB,kBA2G/B;YAMa,mCAAmC;IAiFjD,UAAgB,uBAAuB,kBAmItC;YAMa,wBAAwB;IAoGtC,UAAyB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjD;IAEc,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;CACJ"}
|
|
@@ -489,6 +489,7 @@ export class AddDeviceComponentInstance extends IbGibFormInstanceBase {
|
|
|
489
489
|
parentKeystone: primaryKeystone,
|
|
490
490
|
delegateKeystone,
|
|
491
491
|
masterSecret,
|
|
492
|
+
signingPoolId: 'manage',
|
|
492
493
|
allowedVerbs: [KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT],
|
|
493
494
|
metaspace,
|
|
494
495
|
space,
|