@opensyber/tokenforge 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -11
- package/dist/adapters/astro.d.ts +9 -0
- package/dist/adapters/astro.d.ts.map +1 -1
- package/dist/adapters/astro.js +13 -0
- package/dist/adapters/astro.js.map +1 -1
- package/dist/adapters/cloud-v2-bridge.d.ts +8 -0
- package/dist/adapters/cloud-v2-bridge.d.ts.map +1 -0
- package/dist/adapters/cloud-v2-bridge.js +24 -0
- package/dist/adapters/cloud-v2-bridge.js.map +1 -0
- package/dist/adapters/express.d.ts +15 -2
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +38 -0
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts +15 -6
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +38 -0
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/hono.d.ts +12 -0
- package/dist/adapters/hono.d.ts.map +1 -1
- package/dist/adapters/hono.js +13 -0
- package/dist/adapters/hono.js.map +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/nextjs.d.ts +15 -0
- package/dist/adapters/nextjs.d.ts.map +1 -1
- package/dist/adapters/nextjs.js +57 -30
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/sveltekit.d.ts +9 -0
- package/dist/adapters/sveltekit.d.ts.map +1 -1
- package/dist/adapters/sveltekit.js +13 -0
- package/dist/adapters/sveltekit.js.map +1 -1
- package/dist/client/action-signer.d.ts.map +1 -1
- package/dist/client/action-signer.js.map +1 -1
- package/dist/client/binding.d.ts.map +1 -1
- package/dist/client/binding.js.map +1 -1
- package/dist/client/cloud-device.d.ts +54 -0
- package/dist/client/cloud-device.d.ts.map +1 -0
- package/dist/client/cloud-device.js +301 -0
- package/dist/client/cloud-device.js.map +1 -0
- package/dist/client/crypto.d.ts.map +1 -1
- package/dist/client/crypto.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/interceptor.d.ts.map +1 -1
- package/dist/client/interceptor.js +27 -3
- package/dist/client/interceptor.js.map +1 -1
- package/dist/client/signer.d.ts +23 -3
- package/dist/client/signer.d.ts.map +1 -1
- package/dist/client/signer.js +33 -5
- package/dist/client/signer.js.map +1 -1
- package/dist/client/storage.d.ts.map +1 -1
- package/dist/client/storage.js.map +1 -1
- package/dist/client/webauthn.d.ts.map +1 -1
- package/dist/client/webauthn.js.map +1 -1
- package/dist/protocol/v2.d.ts +23 -0
- package/dist/protocol/v2.d.ts.map +1 -0
- package/dist/protocol/v2.js +157 -0
- package/dist/protocol/v2.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.js.map +1 -1
- package/dist/server/action-verify.d.ts.map +1 -1
- package/dist/server/action-verify.js +1 -1
- package/dist/server/action-verify.js.map +1 -1
- package/dist/server/activity-histogram.d.ts +47 -0
- package/dist/server/activity-histogram.d.ts.map +1 -0
- package/dist/server/activity-histogram.js +76 -0
- package/dist/server/activity-histogram.js.map +1 -0
- package/dist/server/aitm-heuristics.d.ts.map +1 -1
- package/dist/server/aitm-heuristics.js.map +1 -1
- package/dist/server/bind-with-id-token.d.ts +55 -0
- package/dist/server/bind-with-id-token.d.ts.map +1 -0
- package/dist/server/bind-with-id-token.js +70 -0
- package/dist/server/bind-with-id-token.js.map +1 -0
- package/dist/server/bound-cookie.d.ts.map +1 -1
- package/dist/server/bound-cookie.js.map +1 -1
- package/dist/server/cbor.d.ts.map +1 -1
- package/dist/server/cbor.js.map +1 -1
- package/dist/server/cloud-bind.d.ts +42 -0
- package/dist/server/cloud-bind.d.ts.map +1 -0
- package/dist/server/cloud-bind.js +387 -0
- package/dist/server/cloud-bind.js.map +1 -0
- package/dist/server/cloud-middleware.d.ts +46 -0
- package/dist/server/cloud-middleware.d.ts.map +1 -0
- package/dist/server/cloud-middleware.js +344 -0
- package/dist/server/cloud-middleware.js.map +1 -0
- package/dist/server/cloud-verify.d.ts +30 -0
- package/dist/server/cloud-verify.d.ts.map +1 -0
- package/dist/server/cloud-verify.js +206 -0
- package/dist/server/cloud-verify.js.map +1 -0
- package/dist/server/dbsc-challenge.d.ts.map +1 -1
- package/dist/server/dbsc-challenge.js.map +1 -1
- package/dist/server/dbsc-endpoint.d.ts +20 -0
- package/dist/server/dbsc-endpoint.d.ts.map +1 -0
- package/dist/server/dbsc-endpoint.js +85 -0
- package/dist/server/dbsc-endpoint.js.map +1 -0
- package/dist/server/dbsc-verify.d.ts +32 -0
- package/dist/server/dbsc-verify.d.ts.map +1 -0
- package/dist/server/dbsc-verify.js +65 -0
- package/dist/server/dbsc-verify.js.map +1 -0
- package/dist/server/identity-profile.d.ts +18 -0
- package/dist/server/identity-profile.d.ts.map +1 -0
- package/dist/server/identity-profile.js +113 -0
- package/dist/server/identity-profile.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/jws-verify.d.ts.map +1 -1
- package/dist/server/jws-verify.js.map +1 -1
- package/dist/server/middleware.d.ts +9 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +60 -20
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/oidc-verify.d.ts +16 -1
- package/dist/server/oidc-verify.d.ts.map +1 -1
- package/dist/server/oidc-verify.js +9 -1
- package/dist/server/oidc-verify.js.map +1 -1
- package/dist/server/policy.d.ts.map +1 -1
- package/dist/server/policy.js.map +1 -1
- package/dist/server/step-up-policy.d.ts.map +1 -1
- package/dist/server/step-up-policy.js.map +1 -1
- package/dist/server/storage/index.d.ts +3 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +2 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/interface.d.ts +73 -0
- package/dist/server/storage/interface.d.ts.map +1 -0
- package/dist/server/storage/interface.js +2 -0
- package/dist/server/storage/interface.js.map +1 -0
- package/dist/server/storage/memory.d.ts +50 -0
- package/dist/server/storage/memory.d.ts.map +1 -0
- package/dist/server/storage/memory.js +121 -0
- package/dist/server/storage/memory.js.map +1 -0
- package/dist/server/webauthn-verify.d.ts.map +1 -1
- package/dist/server/webauthn-verify.js.map +1 -1
- package/dist/server/webhooks.d.ts.map +1 -1
- package/dist/server/webhooks.js.map +1 -1
- package/dist/shared/action-hash.d.ts.map +1 -1
- package/dist/shared/action-hash.js.map +1 -1
- package/dist/shared/identity.d.ts +45 -0
- package/dist/shared/identity.d.ts.map +1 -0
- package/dist/shared/identity.js +176 -0
- package/dist/shared/identity.js.map +1 -0
- package/dist/shared/types-internal.d.ts.map +1 -1
- package/dist/shared/types-internal.js.map +1 -1
- package/dist/shared/types.d.ts +47 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +1 -1
- package/package.json +9 -47
- package/dist/server/trust-score-fixtures.d.ts +0 -9
- package/dist/server/trust-score-fixtures.d.ts.map +0 -1
- package/dist/server/trust-score-fixtures.js +0 -23
- package/dist/server/trust-score-fixtures.js.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.d.ts +0 -8
- package/dist/server/webauthn-verify.test-helpers.d.ts.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.js +0 -39
- package/dist/server/webauthn-verify.test-helpers.js.map +0 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/** Version marker for the canonical Cloud v2 bind identity envelope. */
|
|
2
|
+
export const TOKENFORGE_IDENTITY_PROTOCOL = 'tf-identity-v1';
|
|
3
|
+
const EXTERNAL_USER_REF_PATTERN = /^[A-Za-z0-9_-]{43}$/;
|
|
4
|
+
const EXTERNAL_USER_REF_VERSION_PATTERN = /^[A-Za-z0-9._-]{1,32}$/;
|
|
5
|
+
const PROJECT_ID_PATTERN = /^[A-Za-z0-9_-]{8,256}$/;
|
|
6
|
+
const SOURCE_PATTERN = /^[A-Za-z0-9._:-]{1,64}$/;
|
|
7
|
+
const WORKFORCE_APP_ID_PATTERN = /^[A-Za-z0-9._:/-]{1,256}$/;
|
|
8
|
+
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+$/;
|
|
9
|
+
const IDENTITY_KEYS = new Set([
|
|
10
|
+
'protocol',
|
|
11
|
+
'externalUserRef',
|
|
12
|
+
'externalUserRefVersion',
|
|
13
|
+
'profile',
|
|
14
|
+
'clearProfile',
|
|
15
|
+
'idToken',
|
|
16
|
+
'workforceAppId',
|
|
17
|
+
'userIdSource',
|
|
18
|
+
]);
|
|
19
|
+
const PROFILE_KEYS = new Set(['displayName', 'email']);
|
|
20
|
+
const PROFILE_FIELD_KEYS = new Set(['displayName', 'email']);
|
|
21
|
+
/**
|
|
22
|
+
* Derive a non-reversible, project-scoped user reference with HMAC-SHA-256.
|
|
23
|
+
* The dedicated secret must remain server-side and distinct from API keys.
|
|
24
|
+
*/
|
|
25
|
+
export async function deriveTokenForgeExternalUserRef(input) {
|
|
26
|
+
const version = input.version ?? 'v1';
|
|
27
|
+
if (!(input.correlationSecret instanceof Uint8Array) || input.correlationSecret.byteLength < 32) {
|
|
28
|
+
throw new Error('TokenForge correlation secret must contain at least 32 bytes');
|
|
29
|
+
}
|
|
30
|
+
if (!PROJECT_ID_PATTERN.test(input.projectId)) {
|
|
31
|
+
throw new Error('TokenForge project ID is invalid');
|
|
32
|
+
}
|
|
33
|
+
if (typeof input.canonicalUserId !== 'string' ||
|
|
34
|
+
input.canonicalUserId.length < 1 ||
|
|
35
|
+
input.canonicalUserId.length > 1024 ||
|
|
36
|
+
input.canonicalUserId !== input.canonicalUserId.trim() ||
|
|
37
|
+
containsControlCharacter(input.canonicalUserId)) {
|
|
38
|
+
throw new Error('TokenForge canonical user ID is invalid');
|
|
39
|
+
}
|
|
40
|
+
if (!EXTERNAL_USER_REF_VERSION_PATTERN.test(version)) {
|
|
41
|
+
throw new Error('TokenForge external user reference version is invalid');
|
|
42
|
+
}
|
|
43
|
+
if (!globalThis.crypto?.subtle) {
|
|
44
|
+
throw new Error('TokenForge correlation requires Web Crypto');
|
|
45
|
+
}
|
|
46
|
+
const key = await globalThis.crypto.subtle.importKey('raw', new Uint8Array(input.correlationSecret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
47
|
+
const message = new TextEncoder().encode(`tokenforge:user:v1\0${input.projectId}\0${input.canonicalUserId}`);
|
|
48
|
+
const digest = await globalThis.crypto.subtle.sign('HMAC', key, message);
|
|
49
|
+
return {
|
|
50
|
+
externalUserRef: base64Url(new Uint8Array(digest)),
|
|
51
|
+
externalUserRefVersion: version,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Parse and validate an untrusted Cloud v2 identity envelope. */
|
|
55
|
+
export function validateTokenForgeIdentity(input) {
|
|
56
|
+
const identity = requireRecord(input, 'TokenForge identity');
|
|
57
|
+
rejectUnknownKeys(identity, IDENTITY_KEYS, 'TokenForge identity');
|
|
58
|
+
if (identity.protocol !== TOKENFORGE_IDENTITY_PROTOCOL) {
|
|
59
|
+
throw new Error('Unsupported TokenForge identity protocol');
|
|
60
|
+
}
|
|
61
|
+
if (typeof identity.externalUserRef !== 'string' || !EXTERNAL_USER_REF_PATTERN.test(identity.externalUserRef)) {
|
|
62
|
+
throw new Error('TokenForge external user reference is invalid');
|
|
63
|
+
}
|
|
64
|
+
const output = {
|
|
65
|
+
protocol: TOKENFORGE_IDENTITY_PROTOCOL,
|
|
66
|
+
externalUserRef: identity.externalUserRef,
|
|
67
|
+
};
|
|
68
|
+
if (identity.externalUserRefVersion !== undefined) {
|
|
69
|
+
if (typeof identity.externalUserRefVersion !== 'string' ||
|
|
70
|
+
!EXTERNAL_USER_REF_VERSION_PATTERN.test(identity.externalUserRefVersion)) {
|
|
71
|
+
throw new Error('TokenForge external user reference version is invalid');
|
|
72
|
+
}
|
|
73
|
+
output.externalUserRefVersion = identity.externalUserRefVersion;
|
|
74
|
+
}
|
|
75
|
+
if (identity.profile !== undefined) {
|
|
76
|
+
output.profile = validateProfile(identity.profile);
|
|
77
|
+
}
|
|
78
|
+
if (identity.clearProfile !== undefined) {
|
|
79
|
+
output.clearProfile = validateClearProfile(identity.clearProfile);
|
|
80
|
+
for (const field of output.clearProfile) {
|
|
81
|
+
if (output.profile?.[field] !== undefined) {
|
|
82
|
+
throw new Error(`TokenForge identity cannot set and clear ${field}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (identity.idToken !== undefined) {
|
|
87
|
+
output.idToken = requireBoundedString(identity.idToken, 'TokenForge ID token', 16_384);
|
|
88
|
+
}
|
|
89
|
+
if (identity.workforceAppId !== undefined) {
|
|
90
|
+
if (typeof identity.workforceAppId !== 'string' || !WORKFORCE_APP_ID_PATTERN.test(identity.workforceAppId)) {
|
|
91
|
+
throw new Error('TokenForge workforce application ID is invalid');
|
|
92
|
+
}
|
|
93
|
+
output.workforceAppId = identity.workforceAppId;
|
|
94
|
+
}
|
|
95
|
+
if (identity.userIdSource !== undefined) {
|
|
96
|
+
if (typeof identity.userIdSource !== 'string' || !SOURCE_PATTERN.test(identity.userIdSource)) {
|
|
97
|
+
throw new Error('TokenForge user ID source is invalid');
|
|
98
|
+
}
|
|
99
|
+
output.userIdSource = identity.userIdSource;
|
|
100
|
+
}
|
|
101
|
+
return output;
|
|
102
|
+
}
|
|
103
|
+
function validateClearProfile(input) {
|
|
104
|
+
if (!Array.isArray(input) || input.length < 1 || input.length > PROFILE_FIELD_KEYS.size) {
|
|
105
|
+
throw new Error('TokenForge clearProfile is invalid');
|
|
106
|
+
}
|
|
107
|
+
const fields = input.map((field) => {
|
|
108
|
+
if (typeof field !== 'string' || !PROFILE_FIELD_KEYS.has(field)) {
|
|
109
|
+
throw new Error('TokenForge clearProfile is invalid');
|
|
110
|
+
}
|
|
111
|
+
return field;
|
|
112
|
+
});
|
|
113
|
+
if (new Set(fields).size !== fields.length) {
|
|
114
|
+
throw new Error('TokenForge clearProfile contains duplicate fields');
|
|
115
|
+
}
|
|
116
|
+
return fields;
|
|
117
|
+
}
|
|
118
|
+
function validateProfile(input) {
|
|
119
|
+
const profile = requireRecord(input, 'TokenForge identity profile');
|
|
120
|
+
rejectUnknownKeys(profile, PROFILE_KEYS, 'TokenForge identity profile');
|
|
121
|
+
const output = {};
|
|
122
|
+
if (profile.displayName !== undefined) {
|
|
123
|
+
const displayName = requireBoundedString(profile.displayName, 'TokenForge display name', 200);
|
|
124
|
+
if (containsControlCharacter(displayName)) {
|
|
125
|
+
throw new Error('TokenForge display name contains control characters');
|
|
126
|
+
}
|
|
127
|
+
output.displayName = displayName;
|
|
128
|
+
}
|
|
129
|
+
if (profile.email !== undefined) {
|
|
130
|
+
const email = requireBoundedString(profile.email, 'TokenForge email', 254);
|
|
131
|
+
if (containsControlCharacter(email) || !EMAIL_PATTERN.test(email)) {
|
|
132
|
+
throw new Error('TokenForge email is invalid');
|
|
133
|
+
}
|
|
134
|
+
output.email = email;
|
|
135
|
+
}
|
|
136
|
+
if (output.displayName === undefined && output.email === undefined) {
|
|
137
|
+
throw new Error('TokenForge identity profile must contain displayName or email');
|
|
138
|
+
}
|
|
139
|
+
return output;
|
|
140
|
+
}
|
|
141
|
+
function containsControlCharacter(value) {
|
|
142
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
143
|
+
const code = value.charCodeAt(index);
|
|
144
|
+
if (code <= 0x1f || code === 0x7f)
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
function requireRecord(input, label) {
|
|
150
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
151
|
+
throw new Error(`${label} must be an object`);
|
|
152
|
+
}
|
|
153
|
+
return input;
|
|
154
|
+
}
|
|
155
|
+
function rejectUnknownKeys(input, allowed, label) {
|
|
156
|
+
for (const key of Object.keys(input)) {
|
|
157
|
+
if (!allowed.has(key))
|
|
158
|
+
throw new Error(`${label} contains unsupported field: ${key}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function requireBoundedString(input, label, maxLength) {
|
|
162
|
+
if (typeof input !== 'string' ||
|
|
163
|
+
input.length < 1 ||
|
|
164
|
+
input.length > maxLength ||
|
|
165
|
+
input !== input.trim()) {
|
|
166
|
+
throw new Error(`${label} is invalid`);
|
|
167
|
+
}
|
|
168
|
+
return input;
|
|
169
|
+
}
|
|
170
|
+
function base64Url(bytes) {
|
|
171
|
+
let binary = '';
|
|
172
|
+
for (const byte of bytes)
|
|
173
|
+
binary += String.fromCharCode(byte);
|
|
174
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"../src/","sources":["shared/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-internal.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types-internal.d.ts","sourceRoot":"../src/","sources":["shared/types-internal.ts"],"names":[],"mappings":"AAGA,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvD,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,iCAAiC;AACjC,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;CAC1C;AAED,kCAAkC;AAClC,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iCAAiC;AACjC,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kCAAkC;AAClC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-internal.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types-internal.js","sourceRoot":"../src/","sources":["shared/types-internal.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sEAAsE"}
|
package/dist/shared/types.d.ts
CHANGED
|
@@ -16,12 +16,26 @@ export interface TokenForgeConfig {
|
|
|
16
16
|
nonce?: string;
|
|
17
17
|
timestamp?: string;
|
|
18
18
|
deviceId?: string;
|
|
19
|
+
sessionId?: string;
|
|
20
|
+
version?: string;
|
|
21
|
+
bodyHash?: string;
|
|
19
22
|
};
|
|
20
23
|
/** Enable automatic fetch interception (default: true) */
|
|
21
24
|
autoIntercept?: boolean;
|
|
22
25
|
/** Paths to skip (no signing needed) */
|
|
23
26
|
skipPaths?: string[];
|
|
24
27
|
}
|
|
28
|
+
export { TOKENFORGE_IDENTITY_PROTOCOL, deriveTokenForgeExternalUserRef, validateTokenForgeIdentity, } from './identity.js';
|
|
29
|
+
export type { DerivedExternalUserRef, DeriveExternalUserRefInput, TokenForgeIdentity, TokenForgeIdentityAssurance, TokenForgeIdentityProfile, } from './identity.js';
|
|
30
|
+
/** DBSC (Device Bound Session Credentials) configuration. */
|
|
31
|
+
export interface DbscConfig {
|
|
32
|
+
/** Enable DBSC bound-cookie verification in the pipeline. */
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
/** Cookie name (default: '__Secure-tf-bound'). */
|
|
35
|
+
cookieName?: string;
|
|
36
|
+
/** Cookie rotation interval in seconds (default: 300). */
|
|
37
|
+
rotationInterval?: number;
|
|
38
|
+
}
|
|
25
39
|
/** Configuration for the TokenForge server middleware */
|
|
26
40
|
export interface TokenForgeServerOptions {
|
|
27
41
|
storage: TokenForgeStorageRef;
|
|
@@ -35,10 +49,23 @@ export interface TokenForgeServerOptions {
|
|
|
35
49
|
sessionMaxAge: number;
|
|
36
50
|
/** Nonce expiry in seconds (default: 60) */
|
|
37
51
|
nonceExpiry: number;
|
|
38
|
-
/** Paths that skip TokenForge verification */
|
|
52
|
+
/** Paths that skip TokenForge verification (public allowlist) */
|
|
39
53
|
skipPaths?: string[];
|
|
40
54
|
/** Paths requiring elevated trust (>90) */
|
|
41
55
|
sensitiveOps?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* Behavior when a request cannot be positively verified — missing
|
|
58
|
+
* signature on a protected (non-skip) path, or an unreachable/erroring
|
|
59
|
+
* verification backend.
|
|
60
|
+
*
|
|
61
|
+
* - `'closed'` (default): default-deny. Unsigned protected requests and
|
|
62
|
+
* backend failures are REJECTED. This is the bulletproof posture.
|
|
63
|
+
* - `'open'`: legacy fail-open. Unsigned requests degrade through and
|
|
64
|
+
* backend failures pass. Use only for staged rollout behind an alarm.
|
|
65
|
+
*/
|
|
66
|
+
failMode?: 'closed' | 'open';
|
|
67
|
+
/** DBSC bound-cookie settings (disabled by default). */
|
|
68
|
+
dbsc?: DbscConfig;
|
|
42
69
|
/** Called on security events */
|
|
43
70
|
onSecurityEvent?: (event: SecurityEvent) => Promise<void>;
|
|
44
71
|
/** Email delivery callback for OTP step-up */
|
|
@@ -62,6 +89,7 @@ export interface TokenForgeStorageRef {
|
|
|
62
89
|
getSession(sessionId: string, deviceId: string): Promise<DeviceSession | null>;
|
|
63
90
|
createSession(session: DeviceSession): Promise<void>;
|
|
64
91
|
updateTrustScore(deviceId: string, trustScore: number): Promise<void>;
|
|
92
|
+
updateBoundCookieHash(deviceId: string, hash: string, expiresAt: string): Promise<void>;
|
|
65
93
|
revokeSession(deviceId: string, reason: string): Promise<void>;
|
|
66
94
|
revokeUserSessions(userId: string): Promise<void>;
|
|
67
95
|
listUserSessions(userId: string, limit: number): Promise<DeviceSession[]>;
|
|
@@ -79,6 +107,14 @@ export interface TokenForgeStorageRef {
|
|
|
79
107
|
getChallenge(challengeId: string, userId: string): Promise<unknown>;
|
|
80
108
|
updateChallengeStatus(challengeId: string, status: string, completedAt?: string): Promise<void>;
|
|
81
109
|
countRecentChallenges(userId: string, windowMinutes: number): Promise<number>;
|
|
110
|
+
getActivityHistogram(userId: string): Promise<{
|
|
111
|
+
buckets: number[];
|
|
112
|
+
totalRequests: number;
|
|
113
|
+
} | null>;
|
|
114
|
+
setActivityHistogram(userId: string, histogram: {
|
|
115
|
+
buckets: number[];
|
|
116
|
+
totalRequests: number;
|
|
117
|
+
}): Promise<void>;
|
|
82
118
|
storeOtp(challengeId: string, code: string, ttlSeconds: number): Promise<void>;
|
|
83
119
|
getOtp(challengeId: string): Promise<string | null>;
|
|
84
120
|
deleteOtp(challengeId: string): Promise<void>;
|
|
@@ -96,7 +132,7 @@ export interface SecurityEvent {
|
|
|
96
132
|
metadata: Record<string, unknown>;
|
|
97
133
|
}
|
|
98
134
|
/** All possible security event types */
|
|
99
|
-
export type SecurityEventType = 'DEVICE_BOUND' | 'SIGNATURE_INVALID' | 'IP_CHANGE' | 'GEO_ANOMALY' | 'TRUST_DROP' | 'TRUST_SCORE_CHANGE' | 'SESSION_REVOKED' | 'SESSION_EXPIRED' | 'STEP_UP_TRIGGERED' | 'STEP_UP_COMPLETED' | 'STEP_UP_FAILED' | 'NONCE_REPLAY' | 'DEVICE_MISMATCH' | 'DEVICE_NOT_FOUND' | 'TIMESTAMP_SKEW';
|
|
135
|
+
export type SecurityEventType = 'DEVICE_BOUND' | 'SIGNATURE_INVALID' | 'IP_CHANGE' | 'GEO_ANOMALY' | 'TRUST_DROP' | 'TRUST_SCORE_CHANGE' | 'SESSION_REVOKED' | 'SESSION_EXPIRED' | 'STEP_UP_TRIGGERED' | 'STEP_UP_COMPLETED' | 'STEP_UP_FAILED' | 'NONCE_REPLAY' | 'DEVICE_MISMATCH' | 'DEVICE_NOT_FOUND' | 'TIMESTAMP_SKEW' | 'DBSC_COOKIE_MISSING' | 'DBSC_COOKIE_INVALID';
|
|
100
136
|
/** Signals used by the trust score engine */
|
|
101
137
|
export interface TrustSignals {
|
|
102
138
|
signatureValid: boolean;
|
|
@@ -108,6 +144,11 @@ export interface TrustSignals {
|
|
|
108
144
|
originalFingerprint: string;
|
|
109
145
|
requestTimestamp: number;
|
|
110
146
|
sessionCreatedAt: number;
|
|
147
|
+
/** Activity histogram for time-of-day anomaly detection (optional). */
|
|
148
|
+
activityHistogram?: {
|
|
149
|
+
buckets: number[];
|
|
150
|
+
totalRequests: number;
|
|
151
|
+
};
|
|
111
152
|
}
|
|
112
153
|
/** Breakdown of trust score components */
|
|
113
154
|
export interface ScoreBreakdown {
|
|
@@ -139,6 +180,10 @@ export interface DeviceSession {
|
|
|
139
180
|
revoked: number;
|
|
140
181
|
revoked_reason: string | null;
|
|
141
182
|
created_at: string;
|
|
183
|
+
/** SHA-256 hash of the DBSC bound cookie (if DBSC enabled). */
|
|
184
|
+
bound_cookie_hash?: string | null;
|
|
185
|
+
/** ISO timestamp when the bound cookie expires. */
|
|
186
|
+
bound_cookie_expires_at?: string | null;
|
|
142
187
|
}
|
|
143
188
|
/** Default header names */
|
|
144
189
|
export declare const TF_HEADERS: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"../src/","sources":["shared/types.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/types.js
CHANGED
package/dist/shared/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../src/","sources":["shared/types.ts"],"names":[],"mappings":"AAAA,kCAAkC;AA8BlC,OAAO,EACL,4BAA4B,EAC5B,+BAA+B,EAC/B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAkLvB,2BAA2B;AAC3B,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS,EAAE,gBAAgB;IAC3B,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;CACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensyber/tokenforge",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Device-bound session security — W3C DBSC + ECDSA P-256 signatures + AitM detection. Drop-in for Auth0 / Okta / Clerk / Entra ID.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -40,18 +40,10 @@
|
|
|
40
40
|
"import": "./dist/server/index.js",
|
|
41
41
|
"types": "./dist/server/index.d.ts"
|
|
42
42
|
},
|
|
43
|
-
"./server/internal": {
|
|
44
|
-
"import": "./dist/server/internal.js",
|
|
45
|
-
"types": "./dist/server/internal.d.ts"
|
|
46
|
-
},
|
|
47
43
|
"./server/storage": {
|
|
48
44
|
"import": "./dist/server/storage/index.js",
|
|
49
45
|
"types": "./dist/server/storage/index.d.ts"
|
|
50
46
|
},
|
|
51
|
-
"./storage/internal": {
|
|
52
|
-
"import": "./dist/server/storage/internal.js",
|
|
53
|
-
"types": "./dist/server/storage/internal.d.ts"
|
|
54
|
-
},
|
|
55
47
|
"./webhooks": {
|
|
56
48
|
"import": "./dist/server/webhooks.js",
|
|
57
49
|
"types": "./dist/server/webhooks.d.ts"
|
|
@@ -64,6 +56,14 @@
|
|
|
64
56
|
"import": "./dist/shared/types.js",
|
|
65
57
|
"types": "./dist/shared/types.d.ts"
|
|
66
58
|
},
|
|
59
|
+
"./identity": {
|
|
60
|
+
"import": "./dist/shared/identity.js",
|
|
61
|
+
"types": "./dist/shared/identity.d.ts"
|
|
62
|
+
},
|
|
63
|
+
"./protocol/v2": {
|
|
64
|
+
"import": "./dist/protocol/v2.js",
|
|
65
|
+
"types": "./dist/protocol/v2.d.ts"
|
|
66
|
+
},
|
|
67
67
|
"./hono": {
|
|
68
68
|
"import": "./dist/adapters/hono.js",
|
|
69
69
|
"types": "./dist/adapters/hono.d.ts"
|
|
@@ -91,34 +91,9 @@
|
|
|
91
91
|
},
|
|
92
92
|
"files": [
|
|
93
93
|
"dist",
|
|
94
|
-
"!dist/server/storage/d1.*",
|
|
95
|
-
"!dist/server/storage/postgres.*",
|
|
96
|
-
"!dist/server/storage/redis.*",
|
|
97
|
-
"!dist/server/storage/cloud.*",
|
|
98
|
-
"!dist/server/storage/internal.*",
|
|
99
|
-
"!dist/server/crypto.*",
|
|
100
|
-
"!dist/server/trust-score.*",
|
|
101
|
-
"!dist/server/verify.*",
|
|
102
|
-
"!dist/server/binding.*",
|
|
103
|
-
"!dist/server/step-up.*",
|
|
104
|
-
"!dist/server/totp.*",
|
|
105
|
-
"!dist/server/middleware-internal.*",
|
|
106
|
-
"!dist/server/internal.*",
|
|
107
|
-
"!dist/server/storage/**",
|
|
108
94
|
"README.md",
|
|
109
95
|
"LICENSE.md"
|
|
110
96
|
],
|
|
111
|
-
"scripts": {
|
|
112
|
-
"build": "tsc",
|
|
113
|
-
"dev": "tsc --watch",
|
|
114
|
-
"typecheck": "tsc --noEmit",
|
|
115
|
-
"lint": "eslint",
|
|
116
|
-
"test": "vitest run",
|
|
117
|
-
"test:e2e": "playwright test",
|
|
118
|
-
"test:e2e:ui": "playwright test --ui",
|
|
119
|
-
"clean": "rm -rf dist .turbo",
|
|
120
|
-
"prepublishOnly": "pnpm run clean && pnpm run build"
|
|
121
|
-
},
|
|
122
97
|
"dependencies": {
|
|
123
98
|
"hono": "^4.12.14"
|
|
124
99
|
},
|
|
@@ -129,18 +104,5 @@
|
|
|
129
104
|
"react": {
|
|
130
105
|
"optional": true
|
|
131
106
|
}
|
|
132
|
-
},
|
|
133
|
-
"devDependencies": {
|
|
134
|
-
"@hono/node-server": "^1.19.13",
|
|
135
|
-
"@playwright/test": "^1.58.2",
|
|
136
|
-
"tsx": "^4.20.6",
|
|
137
|
-
"@cloudflare/workers-types": "^4.20250214.0",
|
|
138
|
-
"@eslint/js": "^9.39.0",
|
|
139
|
-
"@types/react": "^19.0.0",
|
|
140
|
-
"eslint": "^9",
|
|
141
|
-
"react": "^19.0.0",
|
|
142
|
-
"typescript": "^5.7.0",
|
|
143
|
-
"typescript-eslint": "^8.0.0",
|
|
144
|
-
"vitest": "^4.0.0"
|
|
145
107
|
}
|
|
146
108
|
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared test signals for `trust-score.test.ts`.
|
|
3
|
-
*
|
|
4
|
-
* Pulled out so the test file fits the 200L cap. Pure factory — no
|
|
5
|
-
* side effects, returns a TrustSignals shape with sensible defaults.
|
|
6
|
-
*/
|
|
7
|
-
import type { TrustSignals } from '../shared/types.js';
|
|
8
|
-
export declare function makeSignals(overrides?: Partial<TrustSignals>): TrustSignals;
|
|
9
|
-
//# sourceMappingURL=trust-score-fixtures.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-score-fixtures.d.ts","sourceRoot":"","sources":["../../src/server/trust-score-fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,WAAW,CAAC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAc/E"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared test signals for `trust-score.test.ts`.
|
|
3
|
-
*
|
|
4
|
-
* Pulled out so the test file fits the 200L cap. Pure factory — no
|
|
5
|
-
* side effects, returns a TrustSignals shape with sensible defaults.
|
|
6
|
-
*/
|
|
7
|
-
import { hashFingerprint } from './trust-score.js';
|
|
8
|
-
export function makeSignals(overrides = {}) {
|
|
9
|
-
const ua = 'Mozilla/5.0 TestAgent';
|
|
10
|
-
return {
|
|
11
|
-
signatureValid: true,
|
|
12
|
-
ipAddress: '192.168.1.10',
|
|
13
|
-
originalIp: '192.168.1.10',
|
|
14
|
-
countryCode: 'US',
|
|
15
|
-
originalCountry: 'US',
|
|
16
|
-
userAgent: ua,
|
|
17
|
-
originalFingerprint: hashFingerprint(ua),
|
|
18
|
-
requestTimestamp: 1000,
|
|
19
|
-
sessionCreatedAt: 900,
|
|
20
|
-
...overrides,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=trust-score-fixtures.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trust-score-fixtures.js","sourceRoot":"","sources":["../../src/server/trust-score-fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,UAAU,WAAW,CAAC,YAAmC,EAAE;IAC/D,MAAM,EAAE,GAAG,uBAAuB,CAAC;IACnC,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,cAAc;QACzB,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,IAAI;QACjB,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,EAAE;QACb,mBAAmB,EAAE,eAAe,CAAC,EAAE,CAAC;QACxC,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,GAAG;QACrB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test-only helpers — inverse of derToRawEcdsa for synthesizing valid
|
|
3
|
-
* assertions in tests. NOT exported from the package.
|
|
4
|
-
*/
|
|
5
|
-
export declare function makeP256Keypair(): Promise<CryptoKeyPair>;
|
|
6
|
-
/** Convert raw r||s ECDSA signature into the DER form WebAuthn produces. */
|
|
7
|
-
export declare function rawToDerEcdsa(raw: Uint8Array): Uint8Array;
|
|
8
|
-
//# sourceMappingURL=webauthn-verify.test-helpers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn-verify.test-helpers.d.ts","sourceRoot":"","sources":["../../src/server/webauthn-verify.test-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAI9D;AAkBD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAYzD"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test-only helpers — inverse of derToRawEcdsa for synthesizing valid
|
|
3
|
-
* assertions in tests. NOT exported from the package.
|
|
4
|
-
*/
|
|
5
|
-
export async function makeP256Keypair() {
|
|
6
|
-
return crypto.subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);
|
|
7
|
-
}
|
|
8
|
-
function stripLeading(b) {
|
|
9
|
-
let i = 0;
|
|
10
|
-
while (i < b.length - 1 && b[i] === 0)
|
|
11
|
-
i++;
|
|
12
|
-
return b.slice(i);
|
|
13
|
-
}
|
|
14
|
-
function derInteger(b) {
|
|
15
|
-
const first = b[0] ?? 0;
|
|
16
|
-
const needsPad = first & 0x80;
|
|
17
|
-
const content = needsPad ? new Uint8Array([0x00, ...b]) : b;
|
|
18
|
-
const out = new Uint8Array(2 + content.length);
|
|
19
|
-
out[0] = 0x02;
|
|
20
|
-
out[1] = content.length;
|
|
21
|
-
out.set(content, 2);
|
|
22
|
-
return out;
|
|
23
|
-
}
|
|
24
|
-
/** Convert raw r||s ECDSA signature into the DER form WebAuthn produces. */
|
|
25
|
-
export function rawToDerEcdsa(raw) {
|
|
26
|
-
const r = stripLeading(raw.slice(0, 32));
|
|
27
|
-
const s = stripLeading(raw.slice(32, 64));
|
|
28
|
-
const rTLV = derInteger(r);
|
|
29
|
-
const sTLV = derInteger(s);
|
|
30
|
-
const body = new Uint8Array(rTLV.length + sTLV.length);
|
|
31
|
-
body.set(rTLV, 0);
|
|
32
|
-
body.set(sTLV, rTLV.length);
|
|
33
|
-
const out = new Uint8Array(2 + body.length);
|
|
34
|
-
out[0] = 0x30;
|
|
35
|
-
out[1] = body.length;
|
|
36
|
-
out.set(body, 2);
|
|
37
|
-
return out;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=webauthn-verify.test-helpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webauthn-verify.test-helpers.js","sourceRoot":"","sources":["../../src/server/webauthn-verify.test-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAC9B,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CACjE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,CAAa;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,CAAC,EAAE,CAAC;IAC3C,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,UAAU,CAAC,CAAa;IAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACvC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjB,OAAO,GAAG,CAAC;AACb,CAAC"}
|