@pulse-compute/jwt 0.0.0 → 1.0.0-beta.2

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.
Files changed (60) hide show
  1. package/README.md +59 -3
  2. package/as/index.as.ts +388 -0
  3. package/conformance/native-contract.json +53 -0
  4. package/dist/bearer.d.ts +4 -0
  5. package/dist/bearer.d.ts.map +1 -0
  6. package/dist/bearer.js +33 -0
  7. package/dist/bearer.js.map +1 -0
  8. package/dist/crypto-verifier.d.ts +19 -0
  9. package/dist/crypto-verifier.d.ts.map +1 -0
  10. package/dist/crypto-verifier.js +225 -0
  11. package/dist/crypto-verifier.js.map +1 -0
  12. package/dist/errors.d.ts +14 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +65 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/index.d.ts +19 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +21 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/internal/clock.d.ts +7 -0
  21. package/dist/internal/clock.d.ts.map +1 -0
  22. package/dist/internal/clock.js +34 -0
  23. package/dist/internal/clock.js.map +1 -0
  24. package/dist/internal/data.d.ts +12 -0
  25. package/dist/internal/data.d.ts.map +1 -0
  26. package/dist/internal/data.js +86 -0
  27. package/dist/internal/data.js.map +1 -0
  28. package/dist/internal/package-runtime.d.ts +9 -0
  29. package/dist/internal/package-runtime.d.ts.map +1 -0
  30. package/dist/internal/package-runtime.js +14 -0
  31. package/dist/internal/package-runtime.js.map +1 -0
  32. package/dist/internal/registered-claims.d.ts +3 -0
  33. package/dist/internal/registered-claims.d.ts.map +1 -0
  34. package/dist/internal/registered-claims.js +84 -0
  35. package/dist/internal/registered-claims.js.map +1 -0
  36. package/dist/internal/verifier-authority.d.ts +24 -0
  37. package/dist/internal/verifier-authority.d.ts.map +1 -0
  38. package/dist/internal/verifier-authority.js +101 -0
  39. package/dist/internal/verifier-authority.js.map +1 -0
  40. package/dist/options.d.ts +113 -0
  41. package/dist/options.d.ts.map +1 -0
  42. package/dist/options.js +382 -0
  43. package/dist/options.js.map +1 -0
  44. package/dist/provider.d.ts +7 -0
  45. package/dist/provider.d.ts.map +1 -0
  46. package/dist/provider.js +7 -0
  47. package/dist/provider.js.map +1 -0
  48. package/dist/result.d.ts +17 -0
  49. package/dist/result.d.ts.map +1 -0
  50. package/dist/result.js +96 -0
  51. package/dist/result.js.map +1 -0
  52. package/dist/token.d.ts +20 -0
  53. package/dist/token.d.ts.map +1 -0
  54. package/dist/token.js +323 -0
  55. package/dist/token.js.map +1 -0
  56. package/package.json +64 -6
  57. package/pulse.package.json +75 -0
  58. package/pulsewasm.compiler.cjs +1258 -0
  59. package/pulsewasm.manifest.cjs +117 -0
  60. package/pulsewasm.native.cjs +60 -0
@@ -0,0 +1,84 @@
1
+ import { jwtError } from '../errors.js';
2
+ import { jwtOwnDataProperty } from './data.js';
3
+ function requiredClaim(claims, name) {
4
+ const descriptor = Object.getOwnPropertyDescriptor(claims, name);
5
+ return Boolean(descriptor
6
+ && descriptor.enumerable
7
+ && Object.prototype.hasOwnProperty.call(descriptor, 'value')
8
+ && descriptor.value !== undefined);
9
+ }
10
+ function numericClaim(claims, name) {
11
+ const property = jwtOwnDataProperty(claims, name);
12
+ if (!property.valid)
13
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: name });
14
+ const value = property.present ? property.value : undefined;
15
+ if (value === undefined)
16
+ return undefined;
17
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
18
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: name });
19
+ }
20
+ return value;
21
+ }
22
+ function acceptedValues(value) {
23
+ return Array.isArray(value) ? value : [value];
24
+ }
25
+ function validateIssuer(claims, configured) {
26
+ if (configured === undefined)
27
+ return;
28
+ const property = jwtOwnDataProperty(claims, 'iss');
29
+ const issuer = property.valid && property.present ? property.value : undefined;
30
+ if (typeof issuer !== 'string' || !acceptedValues(configured).includes(issuer)) {
31
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'issuer' });
32
+ }
33
+ }
34
+ function validateAudience(claims, configured) {
35
+ if (configured === undefined)
36
+ return;
37
+ const property = jwtOwnDataProperty(claims, 'aud');
38
+ const audience = property.valid && property.present ? property.value : undefined;
39
+ const tokenValues = typeof audience === 'string'
40
+ ? [audience]
41
+ : Array.isArray(audience) && audience.every((entry) => typeof entry === 'string')
42
+ ? audience
43
+ : undefined;
44
+ if (!tokenValues || !tokenValues.some((entry) => acceptedValues(configured).includes(entry))) {
45
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'audience' });
46
+ }
47
+ }
48
+ export function validateRegisteredClaims(claims, options, currentDate) {
49
+ for (const name of options.requiredClaims ?? []) {
50
+ if (!requiredClaim(claims, name)) {
51
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'required-claim', claim: name });
52
+ }
53
+ }
54
+ validateIssuer(claims, options.issuer);
55
+ validateAudience(claims, options.audience);
56
+ const subject = jwtOwnDataProperty(claims, 'sub');
57
+ if (options.subject !== undefined
58
+ && (!subject.valid || !subject.present || subject.value !== options.subject)) {
59
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'subject' });
60
+ }
61
+ const now = currentDate.getTime() / 1000;
62
+ const tolerance = options.clockToleranceSeconds ?? 0;
63
+ const expiresAt = numericClaim(claims, 'exp');
64
+ const notBefore = numericClaim(claims, 'nbf');
65
+ const issuedAt = numericClaim(claims, 'iat');
66
+ if (expiresAt !== undefined && now - tolerance >= expiresAt) {
67
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'expiration' });
68
+ }
69
+ if (notBefore !== undefined && now + tolerance < notBefore) {
70
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'not-before' });
71
+ }
72
+ if (options.maxTokenAgeSeconds !== undefined) {
73
+ if (issuedAt === undefined) {
74
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'issued-at' });
75
+ }
76
+ if (issuedAt > now + tolerance) {
77
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'issued-at' });
78
+ }
79
+ if (now - issuedAt - tolerance > options.maxTokenAgeSeconds) {
80
+ throw jwtError('PULSE_JWT_CLAIMS_INVALID', { category: 'max-token-age' });
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=registered-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registered-claims.js","sourceRoot":"","sources":["../../src/internal/registered-claims.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { JwtClaims, JwtVerifyOptions } from '../options.js';
2
+ import type { JwtWallClockCapture } from './clock.js';
3
+ export interface JwtVerifierInput {
4
+ readonly token: string | undefined;
5
+ readonly options: JwtVerifyOptions;
6
+ }
7
+ export interface JwtClaimsSchemaErrorDetail {
8
+ readonly path?: string;
9
+ readonly expected?: string;
10
+ readonly actualKind?: string;
11
+ }
12
+ export interface JwtVerifierHost {
13
+ readonly captureWallClock?: JwtWallClockCapture;
14
+ readonly resolveSecret?: (binding: string) => string | Uint8Array | undefined | PromiseLike<string | Uint8Array | undefined>;
15
+ readonly validateClaims?: (schemaId: string, claims: JwtClaims, context: Readonly<{
16
+ source: 'jwt-claims';
17
+ }>) => unknown | PromiseLike<unknown>;
18
+ readonly registerSensitiveValue?: (value: string | Uint8Array) => void;
19
+ }
20
+ export declare function verifierHostFunction(host: JwtVerifierHost, name: keyof JwtVerifierHost): Function | undefined;
21
+ export declare function registerSensitive(host: JwtVerifierHost, value: string | Uint8Array): void;
22
+ export declare function registerClaimStrings(host: JwtVerifierHost, value: unknown, depth?: number): void;
23
+ export declare function validateClaimsSchema(claims: JwtClaims, schemaId: string | undefined, host: JwtVerifierHost): Promise<unknown>;
24
+ //# sourceMappingURL=verifier-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier-authority.d.ts","sourceRoot":"","sources":["../../src/internal/verifier-authority.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IAChD,QAAQ,CAAC,aAAa,CAAC,EAAE,CACvB,OAAO,EAAE,MAAM,KACZ,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC;IACpF,QAAQ,CAAC,cAAc,CAAC,EAAE,CACxB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,YAAY,CAAA;KAAE,CAAC,KACxC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,eAAe,GAC1B,QAAQ,GAAG,SAAS,CAUtB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,GAAG,UAAU,GACzB,IAAI,CAQN;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,OAAO,EACd,KAAK,SAAI,GACR,IAAI,CAmBN;AAyCD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,OAAO,CAAC,CAelB"}
@@ -0,0 +1,101 @@
1
+ import { jwtError } from '../errors.js';
2
+ import { isJwtOrdinaryObject, jwtDataEntries, jwtDenseArrayValues, jwtOwnDataProperty, } from './data.js';
3
+ export function verifierHostFunction(host, name) {
4
+ const property = jwtOwnDataProperty(host, name);
5
+ if (!property.valid) {
6
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'verifier-host' });
7
+ }
8
+ if (!property.present || property.value === undefined)
9
+ return undefined;
10
+ if (typeof property.value !== 'function') {
11
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'verifier-host' });
12
+ }
13
+ return property.value;
14
+ }
15
+ export function registerSensitive(host, value) {
16
+ const register = verifierHostFunction(host, 'registerSensitiveValue');
17
+ if (!register)
18
+ return;
19
+ try {
20
+ register(value);
21
+ }
22
+ catch {
23
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'redaction-registration' });
24
+ }
25
+ }
26
+ export function registerClaimStrings(host, value, depth = 0) {
27
+ if (depth > 32)
28
+ return;
29
+ if (typeof value === 'string') {
30
+ if (value.length > 0)
31
+ registerSensitive(host, value);
32
+ return;
33
+ }
34
+ if (!value || typeof value !== 'object')
35
+ return;
36
+ if (Array.isArray(value)) {
37
+ const entries = jwtDenseArrayValues(value);
38
+ if (!entries)
39
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'claim-redaction' });
40
+ for (const entry of entries)
41
+ registerClaimStrings(host, entry, depth + 1);
42
+ return;
43
+ }
44
+ if (!isJwtOrdinaryObject(value)) {
45
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'claim-redaction' });
46
+ }
47
+ const entries = jwtDataEntries(value);
48
+ if (!entries)
49
+ throw jwtError('PULSE_JWT_OPERATION_FAILED', { category: 'claim-redaction' });
50
+ for (const [, entry] of entries)
51
+ registerClaimStrings(host, entry, depth + 1);
52
+ }
53
+ function schemaErrorDetail(schemaId, error) {
54
+ const detail = error && typeof error === 'object'
55
+ ? (Object.getOwnPropertyDescriptor(error, 'detail')?.value
56
+ ?? Object.getOwnPropertyDescriptor(error, 'details')?.value)
57
+ : undefined;
58
+ const record = detail && typeof detail === 'object' && !Array.isArray(detail)
59
+ ? detail
60
+ : {};
61
+ const output = {
62
+ schemaId,
63
+ source: 'jwt-claims',
64
+ };
65
+ const code = error && typeof error === 'object'
66
+ ? Object.getOwnPropertyDescriptor(error, 'code')?.value
67
+ : undefined;
68
+ if (typeof code === 'string' && /^PULSE_[A-Z0-9_]{1,96}$/.test(code))
69
+ output.schemaCode = code;
70
+ const path = Object.getOwnPropertyDescriptor(record, 'path')?.value;
71
+ if (typeof path === 'string' && /^[A-Za-z0-9_$.[\]-]{1,256}$/.test(path)) {
72
+ output.path = path;
73
+ }
74
+ const jsonKinds = new Set([
75
+ 'array', 'boolean', 'integer', 'null', 'number', 'object', 'string',
76
+ ]);
77
+ const expected = Object.getOwnPropertyDescriptor(record, 'expected')?.value;
78
+ if (typeof expected === 'string' && jsonKinds.has(expected)) {
79
+ output.expected = expected;
80
+ }
81
+ const actualKind = Object.getOwnPropertyDescriptor(record, 'actualKind')?.value;
82
+ if (typeof actualKind === 'string' && jsonKinds.has(actualKind)) {
83
+ output.actualKind = actualKind;
84
+ }
85
+ return Object.freeze(output);
86
+ }
87
+ export async function validateClaimsSchema(claims, schemaId, host) {
88
+ if (schemaId === undefined)
89
+ return claims;
90
+ const validateClaims = verifierHostFunction(host, 'validateClaims');
91
+ if (!validateClaims) {
92
+ throw jwtError('PULSE_JWT_TARGET_UNSUPPORTED', { category: 'claims-schema' });
93
+ }
94
+ try {
95
+ return await validateClaims(schemaId, claims, Object.freeze({ source: 'jwt-claims' }));
96
+ }
97
+ catch (error) {
98
+ throw jwtError('PULSE_JWT_CLAIMS_SCHEMA_INVALID', schemaErrorDetail(schemaId, error));
99
+ }
100
+ }
101
+ //# sourceMappingURL=verifier-authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier-authority.js","sourceRoot":"","sources":["../../src/internal/verifier-authority.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMxC,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AA0BnB,MAAM,UAAU,oBAAoB,CAClC,IAAqB,EACrB,IAA2B;IAE3B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACzC,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAqB,EACrB,KAA0B;IAE1B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,IAAI,CAAC;QACH,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAqB,EACrB,KAAc,EACd,KAAK,GAAG,CAAC;IAET,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC5F,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO;QAAE,MAAM,QAAQ,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC5F,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,OAAO;QAAE,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,KAAc;IAEd,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC/C,CAAC,CAAC,CACE,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,KAAK;eACpD,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,CAC5D;QACH,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3E,CAAC,CAAC,MAA2C;QAC7C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAA2B;QACrC,QAAQ;QACR,MAAM,EAAE,YAAY;KACrB,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC7C,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK;QACvD,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;IAC/F,MAAM,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;IACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;KACpE,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAC5E,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC;IAChF,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAiB,EACjB,QAA4B,EAC5B,IAAqB;IAErB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC1C,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACpE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,QAAQ,CAAC,8BAA8B,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,cAAc,CACzB,QAAQ,EACR,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CACxC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,113 @@
1
+ export declare const JWT_ALGORITHMS: readonly ["HS256", "RS256", "ES256", "EdDSA"];
2
+ export type JwtAlgorithm = typeof JWT_ALGORITHMS[number];
3
+ export type JwtJsonPrimitive = string | number | boolean | null;
4
+ export type JwtJsonValue = JwtJsonPrimitive | readonly JwtJsonValue[] | {
5
+ readonly [name: string]: JwtJsonValue;
6
+ };
7
+ export interface JwtClaims {
8
+ readonly [name: string]: JwtJsonValue;
9
+ }
10
+ export interface JwtPublicJwk {
11
+ readonly kty: string;
12
+ readonly use?: string;
13
+ readonly key_ops?: readonly string[];
14
+ readonly alg?: string;
15
+ readonly kid?: string;
16
+ readonly ext?: boolean;
17
+ readonly n?: string;
18
+ readonly e?: string;
19
+ readonly crv?: string;
20
+ readonly x?: string;
21
+ readonly y?: string;
22
+ readonly x5c?: readonly string[];
23
+ readonly x5t?: string;
24
+ readonly 'x5t#S256'?: string;
25
+ }
26
+ export type JwtVerificationKey = {
27
+ readonly type: 'secret';
28
+ readonly binding: string;
29
+ } | {
30
+ readonly type: 'jwk';
31
+ readonly key: JwtPublicJwk;
32
+ } | {
33
+ readonly type: 'jwks';
34
+ readonly keys: readonly JwtPublicJwk[];
35
+ };
36
+ export interface JwtVerifyOptions {
37
+ readonly algorithms: readonly JwtAlgorithm[];
38
+ readonly key: JwtVerificationKey;
39
+ readonly issuer?: string | readonly string[];
40
+ readonly audience?: string | readonly string[];
41
+ readonly subject?: string;
42
+ readonly typ?: string;
43
+ readonly clockToleranceSeconds?: number;
44
+ readonly maxTokenAgeSeconds?: number;
45
+ readonly requiredClaims?: readonly string[];
46
+ readonly claimsSchema?: string;
47
+ }
48
+ export interface NormalizedJwtVerifyOptions {
49
+ readonly algorithms: readonly JwtAlgorithm[];
50
+ readonly key: JwtVerificationKey;
51
+ readonly issuer?: string | readonly string[];
52
+ readonly audience?: string | readonly string[];
53
+ readonly subject?: string;
54
+ readonly typ?: string;
55
+ readonly clockToleranceSeconds?: number;
56
+ readonly maxTokenAgeSeconds?: number;
57
+ readonly requiredClaims?: readonly string[];
58
+ readonly claimsSchema?: string;
59
+ }
60
+ /**
61
+ * G0 contract freeze only. G3 owns making these rules executable.
62
+ *
63
+ * JWT owns public JWK/JWKS shape and deterministic key selection. The
64
+ * crypto-owned adapter owns coordinate/signature decoding into fixed bytes.
65
+ */
66
+ export declare const JWT_ES256_KEY_NORMALIZATION_CONTRACT: Readonly<{
67
+ readonly version: "pulse.jwt.es256-key-normalization.v1";
68
+ readonly status: "executable-g3";
69
+ readonly algorithm: "ES256";
70
+ readonly inlineJwk: Readonly<{
71
+ requiredMembers: readonly ["kty", "crv", "x", "y"];
72
+ optionalMembers: readonly ["alg", "use", "key_ops", "kid"];
73
+ exactValues: Readonly<{
74
+ kty: "EC";
75
+ crv: "P-256";
76
+ alg: "absent-or-ES256";
77
+ use: "absent-or-sig";
78
+ key_ops: "absent-or-exactly-verify";
79
+ }>;
80
+ coordinateEncoding: "canonical-unpadded-base64url";
81
+ coordinateBytes: 32;
82
+ privateMembersRejected: true;
83
+ unknownMembersRejected: true;
84
+ certificateMembersRejected: true;
85
+ }>;
86
+ readonly jwks: Readonly<{
87
+ kind: "bounded-static-inline";
88
+ entriesMaximum: 16;
89
+ remoteDiscovery: false;
90
+ fetch: false;
91
+ cache: false;
92
+ refresh: false;
93
+ duplicateKid: "reject-entire-set";
94
+ selection: "kid-exact-or-single-eligible-key";
95
+ selectedKeyFailure: "terminal-no-retry";
96
+ }>;
97
+ readonly cryptoAdapter: Readonly<{
98
+ publicKeyType: "p256-public-key-bytes";
99
+ publicKeyEncoding: "x-y-big-endian";
100
+ publicKeyBytes: 64;
101
+ signatureEncoding: "jose-r-s-big-endian";
102
+ signatureBytes: 64;
103
+ derAccepted: false;
104
+ highS: "accepted-if-otherwise-valid";
105
+ }>;
106
+ readonly exactSigningInput: true;
107
+ readonly claimsBeforeAuthenticity: false;
108
+ readonly automaticFallback: false;
109
+ }>;
110
+ export declare function normalizeJwtVerifyOptions(value: JwtVerifyOptions): NormalizedJwtVerifyOptions;
111
+ export declare function isJwkCompatibleWithAlgorithm(jwk: JwtPublicJwk, algorithm: JwtAlgorithm): boolean;
112
+ export declare function selectEs256VerificationJwk(key: JwtVerificationKey, kid: string | undefined): JwtPublicJwk;
113
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}