@atrib/verify 0.5.2 → 0.6.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.
@@ -0,0 +1,423 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ import { base64urlEncode, sha256 } from '@atrib/mcp';
3
+ import { calculateJwkThumbprint, createLocalJWKSet, decodeJwt, decodeProtectedHeader, importJWK, jwtVerify, } from 'jose';
4
+ function asArray(value) {
5
+ if (typeof value === 'string')
6
+ return [value];
7
+ if (Array.isArray(value))
8
+ return value.filter((entry) => typeof entry === 'string');
9
+ return [];
10
+ }
11
+ function asRecord(value) {
12
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
13
+ return null;
14
+ return value;
15
+ }
16
+ function accessTokenHash(accessToken) {
17
+ return base64urlEncode(sha256(new TextEncoder().encode(accessToken)));
18
+ }
19
+ function normalizeScopes(claims) {
20
+ if (!claims)
21
+ return [];
22
+ const scopeValues = [
23
+ ...asArray(claims.scope)
24
+ .flatMap((entry) => entry.split(/\s+/))
25
+ .filter(Boolean),
26
+ ...asArray(claims.scp)
27
+ .flatMap((entry) => entry.split(/\s+/))
28
+ .filter(Boolean),
29
+ ];
30
+ return Array.from(new Set(scopeValues)).sort();
31
+ }
32
+ function normalizeAudience(claims) {
33
+ if (!claims)
34
+ return [];
35
+ return asArray(claims.aud).sort();
36
+ }
37
+ function normalizeResource(claims) {
38
+ if (!claims)
39
+ return [];
40
+ return asArray(claims.resource).sort();
41
+ }
42
+ function normalizeJwks(jwks) {
43
+ return Array.isArray(jwks) ? { keys: jwks } : jwks;
44
+ }
45
+ function claimsFromIntrospection(introspection) {
46
+ const claims = {};
47
+ if (typeof introspection.iss === 'string')
48
+ claims.iss = introspection.iss;
49
+ if (typeof introspection.sub === 'string')
50
+ claims.sub = introspection.sub;
51
+ if (introspection.aud !== undefined)
52
+ claims.aud = introspection.aud;
53
+ if (typeof introspection.exp === 'number')
54
+ claims.exp = introspection.exp;
55
+ if (typeof introspection.iat === 'number')
56
+ claims.iat = introspection.iat;
57
+ if (typeof introspection.nbf === 'number')
58
+ claims.nbf = introspection.nbf;
59
+ if (typeof introspection.jti === 'string')
60
+ claims.jti = introspection.jti;
61
+ if (typeof introspection.scope === 'string')
62
+ claims.scope = introspection.scope;
63
+ if (typeof introspection.client_id === 'string')
64
+ claims.client_id = introspection.client_id;
65
+ if (introspection.resource !== undefined)
66
+ claims.resource = introspection.resource;
67
+ if (introspection.authorization_details !== undefined) {
68
+ claims.authorization_details = introspection.authorization_details;
69
+ }
70
+ if (introspection.cnf !== undefined)
71
+ claims.cnf = introspection.cnf;
72
+ if (introspection.act !== undefined)
73
+ claims.act = introspection.act;
74
+ if (introspection.may_act !== undefined)
75
+ claims.may_act = introspection.may_act;
76
+ return claims;
77
+ }
78
+ function check(type, status, expected, actual, reason) {
79
+ const result = { type, status };
80
+ if (expected !== undefined)
81
+ result.expected = expected;
82
+ if (actual !== undefined)
83
+ result.actual = actual;
84
+ if (reason !== undefined)
85
+ result.reason = reason;
86
+ return result;
87
+ }
88
+ async function resolveClaims(input) {
89
+ const signaturePolicy = input.signaturePolicy ?? 'require';
90
+ const token = {
91
+ jwt_present: typeof input.accessTokenJwt === 'string',
92
+ introspection_present: input.introspection !== undefined,
93
+ verified: null,
94
+ alg: null,
95
+ kid: null,
96
+ claims_verified: input.claimsVerified === true,
97
+ };
98
+ if (input.accessTokenJwt) {
99
+ try {
100
+ const header = decodeProtectedHeader(input.accessTokenJwt);
101
+ token.alg = typeof header.alg === 'string' ? header.alg : null;
102
+ token.kid = typeof header.kid === 'string' ? header.kid : null;
103
+ }
104
+ catch {
105
+ token.alg = null;
106
+ token.kid = null;
107
+ }
108
+ if (input.jwks && signaturePolicy !== 'off') {
109
+ const verifyOptions = {};
110
+ if (input.issuer)
111
+ verifyOptions.issuer = input.issuer;
112
+ if (input.audience)
113
+ verifyOptions.audience = input.audience;
114
+ if (input.clockSkewSeconds !== undefined)
115
+ verifyOptions.clockTolerance = input.clockSkewSeconds;
116
+ if (input.nowSeconds !== undefined) {
117
+ verifyOptions.currentDate = new Date(input.nowSeconds * 1000);
118
+ }
119
+ const verified = await jwtVerify(input.accessTokenJwt, createLocalJWKSet(normalizeJwks(input.jwks)), verifyOptions);
120
+ token.verified = true;
121
+ token.claims_verified = true;
122
+ return { claims: verified.payload, token };
123
+ }
124
+ const decoded = decodeJwt(input.accessTokenJwt);
125
+ token.verified = false;
126
+ token.claims_verified = signaturePolicy === 'off';
127
+ return { claims: decoded, token };
128
+ }
129
+ if (input.introspection) {
130
+ token.verified = input.introspectionVerified === true;
131
+ token.claims_verified = input.introspectionVerified === true;
132
+ return {
133
+ claims: claimsFromIntrospection(input.introspection),
134
+ token,
135
+ };
136
+ }
137
+ return {
138
+ claims: input.claims ?? null,
139
+ token,
140
+ };
141
+ }
142
+ function pushScopeChecks(checks, scopes, requiredScopes) {
143
+ if (!requiredScopes || requiredScopes.length === 0) {
144
+ checks.push(check('scope', 'not_checked'));
145
+ return null;
146
+ }
147
+ const missing = requiredScopes.filter((scope) => !scopes.includes(scope));
148
+ checks.push(check('scope', missing.length === 0 ? 'passed' : 'failed', requiredScopes, scopes, missing.length === 0 ? undefined : `missing scopes: ${missing.join(', ')}`));
149
+ return missing.length === 0;
150
+ }
151
+ function pushAudienceChecks(checks, claims, input) {
152
+ const audience = normalizeAudience(claims);
153
+ const expectedAudience = asArray(input.audience);
154
+ if (expectedAudience.length > 0) {
155
+ const missing = expectedAudience.filter((entry) => !audience.includes(entry));
156
+ checks.push(check('audience', missing.length === 0 ? 'passed' : 'failed', expectedAudience, audience, missing.length === 0 ? undefined : `missing audience: ${missing.join(', ')}`));
157
+ }
158
+ const expectedResource = input.resource ?? input.protectedResourceMetadata?.resource;
159
+ if (expectedResource) {
160
+ const resources = normalizeResource(claims);
161
+ const matchesAudience = audience.includes(expectedResource);
162
+ const matchesResource = resources.includes(expectedResource);
163
+ checks.push(check('resource', matchesAudience || matchesResource ? 'passed' : 'failed', expectedResource, { aud: audience, resource: resources }, matchesAudience || matchesResource
164
+ ? undefined
165
+ : 'resource not present in aud or resource claims'));
166
+ }
167
+ }
168
+ function pushMetadataChecks(checks, claims, metadata) {
169
+ if (!metadata)
170
+ return;
171
+ if (metadata.authorization_servers && metadata.authorization_servers.length > 0) {
172
+ const issuer = typeof claims?.iss === 'string' ? claims.iss : null;
173
+ checks.push(check('protected_resource.authorization_servers', issuer && metadata.authorization_servers.includes(issuer) ? 'passed' : 'failed', metadata.authorization_servers, issuer));
174
+ }
175
+ }
176
+ function pushAuthorizationDetailsChecks(checks, claims, required) {
177
+ if (!required || required.length === 0) {
178
+ checks.push(check('authorization_details', 'not_checked'));
179
+ return;
180
+ }
181
+ const presented = Array.isArray(claims?.authorization_details) ? claims.authorization_details : [];
182
+ for (const constraint of required) {
183
+ const match = presented.some((entry) => authorizationDetailMatches(entry, constraint));
184
+ checks.push(check('authorization_details', match ? 'passed' : 'failed', constraint, presented, match ? undefined : `missing authorization_details type: ${constraint.type}`));
185
+ }
186
+ }
187
+ function authorizationDetailMatches(entry, constraint) {
188
+ if (entry === null || typeof entry !== 'object' || Array.isArray(entry))
189
+ return false;
190
+ const record = entry;
191
+ if (record['type'] !== constraint.type)
192
+ return false;
193
+ if (constraint.actions && constraint.actions.length > 0) {
194
+ const actions = asArray(record['actions']);
195
+ if (constraint.actions.some((action) => !actions.includes(action)))
196
+ return false;
197
+ }
198
+ if (constraint.locations && constraint.locations.length > 0) {
199
+ const locations = asArray(record['locations']);
200
+ if (constraint.locations.some((location) => !locations.includes(location)))
201
+ return false;
202
+ }
203
+ return true;
204
+ }
205
+ function pushIdentityChecks(checks, claims, input) {
206
+ let delegationOk = null;
207
+ if (input.issuer) {
208
+ checks.push(check('issuer', claims?.iss === input.issuer ? 'passed' : 'failed', input.issuer, claims?.iss ?? null));
209
+ }
210
+ if (input.expectedSubject) {
211
+ checks.push(check('subject', claims?.sub === input.expectedSubject ? 'passed' : 'failed', input.expectedSubject, claims?.sub ?? null));
212
+ }
213
+ if (input.expectedClientId) {
214
+ checks.push(check('client_id', claims?.client_id === input.expectedClientId ? 'passed' : 'failed', input.expectedClientId, claims?.client_id ?? null));
215
+ }
216
+ if (input.expectedActorSubject) {
217
+ const actorSubject = claims?.act?.sub ?? claims?.may_act?.sub ?? null;
218
+ delegationOk = actorSubject === input.expectedActorSubject;
219
+ checks.push(check('actor_subject', delegationOk ? 'passed' : 'failed', input.expectedActorSubject, actorSubject));
220
+ }
221
+ if (input.requireCnf || input.requiredCnfJkt) {
222
+ const actual = claims?.cnf?.jkt ?? null;
223
+ const expected = input.requiredCnfJkt ?? 'present';
224
+ const passed = input.requiredCnfJkt
225
+ ? actual === input.requiredCnfJkt
226
+ : typeof actual === 'string';
227
+ checks.push(check('cnf.jkt', passed ? 'passed' : 'failed', expected, actual));
228
+ }
229
+ return delegationOk;
230
+ }
231
+ async function verifyDpopProof(input, claims, requiredCnfJkt, replayCache) {
232
+ const constraints = [];
233
+ const errors = [];
234
+ const dpop = {
235
+ jwt_present: typeof input.proofJwt === 'string' && input.proofJwt.length > 0,
236
+ verified: false,
237
+ alg: null,
238
+ jkt: null,
239
+ jti: null,
240
+ htm: null,
241
+ htu: null,
242
+ };
243
+ try {
244
+ const header = decodeProtectedHeader(input.proofJwt);
245
+ dpop.alg = typeof header.alg === 'string' ? header.alg : null;
246
+ const headerRecord = header;
247
+ const publicJwk = asRecord(headerRecord['jwk']);
248
+ if (!publicJwk) {
249
+ constraints.push(check('dpop.jwk', 'failed', 'present', null, 'missing public jwk'));
250
+ return { dpop, constraints, errors };
251
+ }
252
+ if (header.typ !== 'dpop+jwt') {
253
+ constraints.push(check('dpop.typ', 'failed', 'dpop+jwt', header.typ ?? null));
254
+ }
255
+ else {
256
+ constraints.push(check('dpop.typ', 'passed', 'dpop+jwt', header.typ));
257
+ }
258
+ const key = await importJWK(publicJwk, dpop.alg ?? undefined);
259
+ const verifyOptions = {};
260
+ const nowSeconds = input.nowSeconds;
261
+ if (nowSeconds !== undefined)
262
+ verifyOptions.currentDate = new Date(nowSeconds * 1000);
263
+ if (input.clockSkewSeconds !== undefined) {
264
+ verifyOptions.clockTolerance = input.clockSkewSeconds;
265
+ }
266
+ const verified = await jwtVerify(input.proofJwt, key, verifyOptions);
267
+ dpop.verified = true;
268
+ const payload = verified.payload;
269
+ dpop.htm = typeof payload.htm === 'string' ? payload.htm : null;
270
+ dpop.htu = typeof payload.htu === 'string' ? payload.htu : null;
271
+ dpop.jti = typeof payload.jti === 'string' ? payload.jti : null;
272
+ dpop.jkt = await calculateJwkThumbprint(publicJwk, 'sha256');
273
+ const expectedMethod = input.method.toUpperCase();
274
+ constraints.push(check('dpop.htm', dpop.htm === expectedMethod ? 'passed' : 'failed', expectedMethod, dpop.htm));
275
+ constraints.push(check('dpop.htu', dpop.htu === input.url ? 'passed' : 'failed', input.url, dpop.htu));
276
+ const jtiSeen = dpop.jti !== null && input.seenJtis?.includes(dpop.jti) === true
277
+ ? true
278
+ : dpop.jti !== null && replayCache !== undefined
279
+ ? !(await replayCache.checkAndRemember(replayKey(dpop.jti, dpop, claims), dpopReplayExpiresAtSeconds(payload, input)))
280
+ : false;
281
+ constraints.push(check('dpop.jti', dpop.jti && !jtiSeen ? 'passed' : 'failed', 'present and unseen', dpop.jti, jtiSeen ? 'jti already seen' : dpop.jti ? undefined : 'missing jti'));
282
+ const now = input.nowSeconds ?? Math.floor(Date.now() / 1000);
283
+ const skew = input.clockSkewSeconds ?? 0;
284
+ const maxAge = input.maxAgeSeconds ?? 300;
285
+ const iat = typeof payload.iat === 'number' ? payload.iat : null;
286
+ const iatPassed = iat !== null && iat <= now + skew && now - iat <= maxAge + skew;
287
+ constraints.push(check('dpop.iat', iatPassed ? 'passed' : 'failed', { maxAgeSeconds: maxAge, nowSeconds: now, clockSkewSeconds: skew }, iat));
288
+ const expectedAth = input.expectedAth ?? (input.accessToken ? accessTokenHash(input.accessToken) : undefined);
289
+ if (expectedAth) {
290
+ constraints.push(check('dpop.ath', payload.ath === expectedAth ? 'passed' : 'failed', expectedAth, payload.ath ?? null));
291
+ }
292
+ else {
293
+ constraints.push(check('dpop.ath', 'not_checked'));
294
+ }
295
+ if (input.expectedNonce) {
296
+ constraints.push(check('dpop.nonce', payload.nonce === input.expectedNonce ? 'passed' : 'failed', input.expectedNonce, payload.nonce ?? null));
297
+ }
298
+ const expectedJkt = requiredCnfJkt ?? claims?.cnf?.jkt;
299
+ if (expectedJkt) {
300
+ constraints.push(check('dpop.cnf.jkt', dpop.jkt === expectedJkt ? 'passed' : 'failed', expectedJkt, dpop.jkt));
301
+ }
302
+ else {
303
+ constraints.push(check('dpop.cnf.jkt', 'unresolved', 'access token cnf.jkt', dpop.jkt));
304
+ }
305
+ }
306
+ catch (err) {
307
+ errors.push(`oauth_evidence dpop proof error: ${err.message}`);
308
+ }
309
+ return { dpop, constraints, errors };
310
+ }
311
+ function replayKey(jti, dpop, claims) {
312
+ return {
313
+ jti,
314
+ ...(dpop.jkt !== null ? { jkt: dpop.jkt } : {}),
315
+ ...(dpop.htm !== null ? { htm: dpop.htm } : {}),
316
+ ...(dpop.htu !== null ? { htu: dpop.htu } : {}),
317
+ ...(typeof claims?.iss === 'string' ? { issuer: claims.iss } : {}),
318
+ ...(typeof claims?.client_id === 'string' ? { client_id: claims.client_id } : {}),
319
+ };
320
+ }
321
+ function dpopReplayExpiresAtSeconds(payload, input) {
322
+ const now = input.nowSeconds ?? Math.floor(Date.now() / 1000);
323
+ const skew = input.clockSkewSeconds ?? 0;
324
+ const maxAge = input.maxAgeSeconds ?? 300;
325
+ const iat = typeof payload.iat === 'number' ? payload.iat : now;
326
+ return iat + maxAge + skew;
327
+ }
328
+ export async function verifyOAuthAuthorizationEvidence(input) {
329
+ const errors = [];
330
+ const warnings = [];
331
+ const constraints = [];
332
+ let claims = null;
333
+ let token = {
334
+ jwt_present: false,
335
+ introspection_present: false,
336
+ verified: null,
337
+ alg: null,
338
+ kid: null,
339
+ claims_verified: false,
340
+ };
341
+ let dpop = null;
342
+ try {
343
+ const resolved = await resolveClaims(input);
344
+ claims = resolved.claims;
345
+ token = resolved.token;
346
+ }
347
+ catch (err) {
348
+ errors.push(`oauth_evidence token verification error: ${err.message}`);
349
+ }
350
+ const signaturePolicy = input.signaturePolicy ?? 'require';
351
+ if (!claims) {
352
+ errors.push('oauth_evidence missing access token claims');
353
+ }
354
+ else if (input.introspection && input.introspection.active !== true) {
355
+ errors.push('oauth_evidence introspection inactive');
356
+ }
357
+ else if (!token.claims_verified) {
358
+ if (signaturePolicy === 'require') {
359
+ errors.push('oauth_evidence claims were not verified');
360
+ }
361
+ else if (signaturePolicy === 'best-effort') {
362
+ warnings.push('oauth_evidence claims were not verified');
363
+ }
364
+ }
365
+ const scopes = normalizeScopes(claims);
366
+ const attenuationOk = pushScopeChecks(constraints, scopes, input.requiredScopes);
367
+ pushAudienceChecks(constraints, claims, input);
368
+ pushMetadataChecks(constraints, claims, input.protectedResourceMetadata);
369
+ pushAuthorizationDetailsChecks(constraints, claims, input.requiredAuthorizationDetails);
370
+ const delegationOk = pushIdentityChecks(constraints, claims, input);
371
+ if (input.dpopProof) {
372
+ const dpopProofInput = {
373
+ ...input.dpopProof,
374
+ ...(input.dpopProof.nowSeconds === undefined && input.nowSeconds !== undefined
375
+ ? { nowSeconds: input.nowSeconds }
376
+ : {}),
377
+ ...(input.dpopProof.clockSkewSeconds === undefined && input.clockSkewSeconds !== undefined
378
+ ? { clockSkewSeconds: input.clockSkewSeconds }
379
+ : {}),
380
+ };
381
+ const dpopResult = await verifyDpopProof(dpopProofInput, claims, input.requiredCnfJkt, input.dpopReplayCache);
382
+ dpop = dpopResult.dpop;
383
+ constraints.push(...dpopResult.constraints);
384
+ errors.push(...dpopResult.errors);
385
+ }
386
+ for (const constraint of constraints) {
387
+ if (constraint.status === 'failed') {
388
+ errors.push(`oauth_evidence constraint failed: ${constraint.type}`);
389
+ }
390
+ }
391
+ const audience = normalizeAudience(claims);
392
+ const resource = normalizeResource(claims);
393
+ const issuer = typeof claims?.iss === 'string' ? claims.iss : null;
394
+ const subject = typeof claims?.sub === 'string' ? claims.sub : null;
395
+ const clientId = typeof claims?.client_id === 'string' ? claims.client_id : null;
396
+ return {
397
+ protocol: input.protocol ?? 'oauth2',
398
+ valid: errors.length === 0,
399
+ issuer,
400
+ subject,
401
+ scope: scopes,
402
+ attenuation_ok: attenuationOk,
403
+ delegation_ok: delegationOk,
404
+ constraints,
405
+ errors,
406
+ warnings,
407
+ details: {
408
+ token,
409
+ dpop,
410
+ audience,
411
+ resource,
412
+ client_id: clientId,
413
+ },
414
+ };
415
+ }
416
+ export async function verifyAuthorizationEvidence(evidence) {
417
+ if ('oauth' in evidence) {
418
+ const protocol = evidence.protocol ?? evidence.oauth.protocol;
419
+ return verifyOAuthAuthorizationEvidence(protocol ? { ...evidence.oauth, protocol } : { ...evidence.oauth });
420
+ }
421
+ return verifyOAuthAuthorizationEvidence(evidence);
422
+ }
423
+ //# sourceMappingURL=authorization-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-evidence.js","sourceRoot":"","sources":["../src/authorization-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface DpopReplayCacheKey {
2
+ jti: string;
3
+ jkt?: string | null;
4
+ htm?: string | null;
5
+ htu?: string | null;
6
+ issuer?: string | null;
7
+ client_id?: string | null;
8
+ }
9
+ export interface DpopReplayCache {
10
+ /**
11
+ * Atomically remember this proof key until `expiresAtSeconds`.
12
+ *
13
+ * Returns true when the key was new and is now stored. Returns false when
14
+ * the key was already present and unexpired. Deployments can back this with
15
+ * Redis, Durable Objects, Postgres, or any other shared compare-and-set
16
+ * primitive. The in-memory implementation below is process-local only.
17
+ */
18
+ checkAndRemember(key: DpopReplayCacheKey, expiresAtSeconds: number): boolean | Promise<boolean>;
19
+ }
20
+ export interface MemoryDpopReplayCacheOptions {
21
+ maxEntries?: number;
22
+ nowSeconds?: () => number;
23
+ }
24
+ export declare class MemoryDpopReplayCache implements DpopReplayCache {
25
+ private readonly entries;
26
+ private readonly maxEntries;
27
+ private readonly nowSeconds;
28
+ constructor(options?: MemoryDpopReplayCacheOptions);
29
+ checkAndRemember(key: DpopReplayCacheKey, expiresAtSeconds: number): boolean;
30
+ size(): number;
31
+ private prune;
32
+ private pruneToMax;
33
+ }
34
+ export declare function dpopReplayCacheKeyId(key: DpopReplayCacheKey): string;
35
+ //# sourceMappingURL=dpop-replay-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpop-replay-cache.d.ts","sourceRoot":"","sources":["../src/dpop-replay-cache.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,gBAAgB,CACd,GAAG,EAAE,kBAAkB,EACvB,gBAAgB,EAAE,MAAM,GACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAA;CAC1B;AAED,qBAAa,qBAAsB,YAAW,eAAe;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;gBAE7B,OAAO,GAAE,4BAAiC;IAKtD,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO;IAW5E,IAAI,IAAI,MAAM;IAKd,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,UAAU;CAOnB;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CASpE"}
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ export class MemoryDpopReplayCache {
3
+ entries = new Map();
4
+ maxEntries;
5
+ nowSeconds;
6
+ constructor(options = {}) {
7
+ this.maxEntries = options.maxEntries ?? 10_000;
8
+ this.nowSeconds = options.nowSeconds ?? (() => Math.floor(Date.now() / 1000));
9
+ }
10
+ checkAndRemember(key, expiresAtSeconds) {
11
+ const now = this.nowSeconds();
12
+ this.prune(now);
13
+ const id = dpopReplayCacheKeyId(key);
14
+ const existingExpiry = this.entries.get(id);
15
+ if (existingExpiry !== undefined && existingExpiry > now)
16
+ return false;
17
+ this.entries.set(id, Math.max(expiresAtSeconds, now + 1));
18
+ this.pruneToMax();
19
+ return true;
20
+ }
21
+ size() {
22
+ this.prune(this.nowSeconds());
23
+ return this.entries.size;
24
+ }
25
+ prune(now) {
26
+ for (const [key, expiresAt] of this.entries) {
27
+ if (expiresAt <= now)
28
+ this.entries.delete(key);
29
+ }
30
+ }
31
+ pruneToMax() {
32
+ while (this.entries.size > this.maxEntries) {
33
+ const oldest = this.entries.keys().next().value;
34
+ if (oldest === undefined)
35
+ return;
36
+ this.entries.delete(oldest);
37
+ }
38
+ }
39
+ }
40
+ export function dpopReplayCacheKeyId(key) {
41
+ return JSON.stringify({
42
+ issuer: key.issuer ?? null,
43
+ client_id: key.client_id ?? null,
44
+ jkt: key.jkt ?? null,
45
+ htm: key.htm ?? null,
46
+ htu: key.htu ?? null,
47
+ jti: key.jti,
48
+ });
49
+ }
50
+ //# sourceMappingURL=dpop-replay-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpop-replay-cache.js","sourceRoot":"","sources":["../src/dpop-replay-cache.ts"],"names":[],"mappings":"AAAA,sCAAsC;AA+BtC,MAAM,OAAO,qBAAqB;IACf,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IACnC,UAAU,CAAQ;IAClB,UAAU,CAAc;IAEzC,YAAY,UAAwC,EAAE;QACpD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;QAC9C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAC/E,CAAC;IAED,gBAAgB,CAAC,GAAuB,EAAE,gBAAwB;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACf,MAAM,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC3C,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,GAAG,GAAG;YAAE,OAAO,KAAK,CAAA;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACzD,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,SAAS,IAAI,GAAG;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAC/C,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAM;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAuB;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;QAC1B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;QAChC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CAAA;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  export { AtribVerifier } from './verifier.js';
2
2
  export type { AtribVerifierOptions, CalculateOptions, VerifyRecommendationOptions, } from './verifier.js';
3
3
  export { verifyRecord } from './verify-record.js';
4
- export type { RecordVerificationResult, ProvenanceAnnotation, VerifyRecordOptions, CrossAttestationAnnotation, } from './verify-record.js';
4
+ export type { RecordVerificationResult, ProvenanceAnnotation, VerifyRecordOptions, ResolvedCapabilityFacts, CrossAttestationAnnotation, } from './verify-record.js';
5
+ export { verifyAuthorizationEvidence, verifyOAuthAuthorizationEvidence, } from './authorization-evidence.js';
6
+ export type { AuthorizationEvidenceInput, EvidenceCheckStatus, EvidenceConstraintCheck, EvidenceVerificationBlock, OAuthAccessTokenClaims, OAuthAuthorizationDetailConstraint, OAuthAuthorizationEvidenceInput, OAuthAuthorizationEvidenceVerification, OAuthDpopCheck, OAuthDpopProofInput, OAuthEvidenceProtocol, OAuthProtectedResourceMetadata, OAuthSignaturePolicy, OAuthTokenIntrospectionResponse, OAuthTokenCheck, } from './authorization-evidence.js';
7
+ export { MemoryDpopReplayCache, dpopReplayCacheKeyId, } from './dpop-replay-cache.js';
8
+ export type { DpopReplayCache, DpopReplayCacheKey, MemoryDpopReplayCacheOptions, } from './dpop-replay-cache.js';
9
+ export { introspectOAuthToken, oauthEvidenceFromIntrospectionResult, } from './oauth-introspection.js';
10
+ export type { OAuthIntrospectionClientAuthentication, OAuthIntrospectionOptions, OAuthIntrospectionResult, } from './oauth-introspection.js';
5
11
  export { handoffClaimsFromEvidencePacket, verifyHandoffClaims } from './handoff.js';
6
12
  export type { HandoffBodyVerification, HandoffClaimsFromEvidenceOptions, HandoffClaimInput, HandoffClaimVerification, HandoffEvidenceEntry, HandoffEvidencePacket, HandoffProofVerification, HandoffRejectionReason, HandoffVerificationResult, VerifyHandoffClaimsOptions, } from './handoff.js';
7
13
  export { calculate, DEFAULT_POLICY, isValidPolicy } from './calculate.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,eAAe,CAAA;AAKtB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAK3B,OAAO,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACnF,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,iBAAiB,EACjB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAA;AAGrB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGzE,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAG7D,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAG5F,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC3E,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAGxF,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,wBAAwB,EACxB,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,8BAA8B,EAC9B,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,MAAM,GACP,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,YAAY,EACV,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAG9B,YAAY,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,10 @@ export { AtribVerifier } from './verifier.js';
6
6
  // AtribVerifier.verify which operates on a settlement RecommendationDocument.
7
7
  // Surfaces the implemented D044, D041, D045, D051, D052, and D094 annotations.
8
8
  export { verifyRecord } from './verify-record.js';
9
+ // Generic external authorization evidence checks. Off the atrib record-validity path.
10
+ export { verifyAuthorizationEvidence, verifyOAuthAuthorizationEvidence, } from './authorization-evidence.js';
11
+ export { MemoryDpopReplayCache, dpopReplayCacheKeyId, } from './dpop-replay-cache.js';
12
+ export { introspectOAuthToken, oauthEvidenceFromIntrospectionResult, } from './oauth-introspection.js';
9
13
  // Cross-agent handoff claim verification. Used when one agent receives a
10
14
  // record_hash claim plus private body material from another agent and must
11
15
  // decide whether to link its next record through informed_by.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,+CAA+C;AAE/C,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAO7C,8DAA8D;AAC9D,8EAA8E;AAC9E,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAQjD,yEAAyE;AACzE,2EAA2E;AAC3E,8DAA8D;AAC9D,OAAO,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAcnF,uEAAuE;AACvE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEzE,sDAAsD;AACtD,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAE5B,mDAAmD;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE7D,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAE5F,6BAA6B;AAC7B,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG3E,6EAA6E;AAC7E,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AA6B7B,0DAA0D;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAgCvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,+CAA+C;AAE/C,4BAA4B;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAO7C,8DAA8D;AAC9D,8EAA8E;AAC9E,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AASjD,sFAAsF;AACtF,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,6BAA6B,CAAA;AAmBpC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAO/B,OAAO,EACL,oBAAoB,EACpB,oCAAoC,GACrC,MAAM,0BAA0B,CAAA;AAOjC,yEAAyE;AACzE,2EAA2E;AAC3E,8DAA8D;AAC9D,OAAO,EAAE,+BAA+B,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAcnF,uEAAuE;AACvE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEzE,sDAAsD;AACtD,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAE5B,mDAAmD;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE7D,+BAA+B;AAC/B,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAE5F,6BAA6B;AAC7B,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG3E,6EAA6E;AAC7E,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AA6B7B,0DAA0D;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAgCvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,38 @@
1
+ import type { OAuthAuthorizationEvidenceInput, OAuthTokenIntrospectionResponse } from './authorization-evidence.js';
2
+ export type OAuthIntrospectionClientAuthentication = {
3
+ method: 'none';
4
+ } | {
5
+ method: 'basic';
6
+ clientId: string;
7
+ clientSecret: string;
8
+ } | {
9
+ method: 'bearer';
10
+ token: string;
11
+ } | {
12
+ method: 'headers';
13
+ headers: Record<string, string>;
14
+ };
15
+ export interface OAuthIntrospectionOptions {
16
+ endpoint: string;
17
+ token: string;
18
+ tokenTypeHint?: string;
19
+ clientAuthentication?: OAuthIntrospectionClientAuthentication;
20
+ extraParams?: Record<string, string>;
21
+ expectedIssuer?: string;
22
+ expectedAudience?: string | string[];
23
+ expectedResource?: string;
24
+ timeoutMs?: number;
25
+ signal?: AbortSignal;
26
+ fetchImpl?: typeof fetch;
27
+ }
28
+ export interface OAuthIntrospectionResult {
29
+ ok: boolean;
30
+ endpoint: string;
31
+ introspection?: OAuthTokenIntrospectionResponse;
32
+ introspectionVerified: boolean;
33
+ errors: string[];
34
+ warnings: string[];
35
+ }
36
+ export declare function introspectOAuthToken(options: OAuthIntrospectionOptions): Promise<OAuthIntrospectionResult>;
37
+ export declare function oauthEvidenceFromIntrospectionResult(introspection: OAuthIntrospectionResult, base?: Omit<OAuthAuthorizationEvidenceInput, 'introspection' | 'introspectionVerified'>): OAuthAuthorizationEvidenceInput;
38
+ //# sourceMappingURL=oauth-introspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-introspection.d.ts","sourceRoot":"","sources":["../src/oauth-introspection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,6BAA6B,CAAA;AAEpC,MAAM,MAAM,sCAAsC,GAC9C;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAA;AAE1D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oBAAoB,CAAC,EAAE,sCAAsC,CAAA;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,+BAA+B,CAAA;IAC/C,qBAAqB,EAAE,OAAO,CAAA;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAiDnC;AAED,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,wBAAwB,EACvC,IAAI,GAAE,IAAI,CAAC,+BAA+B,EAAE,eAAe,GAAG,uBAAuB,CAAM,GAC1F,+BAA+B,CASjC"}