ubid-common 0.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.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/ParsingEngine.d.ts +3 -0
  4. package/dist/ParsingEngine.d.ts.map +1 -0
  5. package/dist/ParsingEngine.js +25 -0
  6. package/dist/PublicKeyResolverEngine.d.ts +3 -0
  7. package/dist/PublicKeyResolverEngine.d.ts.map +1 -0
  8. package/dist/PublicKeyResolverEngine.js +24 -0
  9. package/dist/VerifyingEngine.d.ts +3 -0
  10. package/dist/VerifyingEngine.d.ts.map +1 -0
  11. package/dist/VerifyingEngine.js +27 -0
  12. package/dist/credential-parsers/MsoMdocParser.d.ts +6 -0
  13. package/dist/credential-parsers/MsoMdocParser.d.ts.map +1 -0
  14. package/dist/credential-parsers/MsoMdocParser.js +164 -0
  15. package/dist/credential-parsers/SDJWTVCParser.d.ts +6 -0
  16. package/dist/credential-parsers/SDJWTVCParser.d.ts.map +1 -0
  17. package/dist/credential-parsers/SDJWTVCParser.js +214 -0
  18. package/dist/credential-verifiers/MsoMdocVerifier.d.ts +8 -0
  19. package/dist/credential-verifiers/MsoMdocVerifier.d.ts.map +1 -0
  20. package/dist/credential-verifiers/MsoMdocVerifier.js +213 -0
  21. package/dist/credential-verifiers/SDJWTVCValidation.d.ts +52 -0
  22. package/dist/credential-verifiers/SDJWTVCValidation.d.ts.map +1 -0
  23. package/dist/credential-verifiers/SDJWTVCValidation.js +248 -0
  24. package/dist/credential-verifiers/SDJWTVCVerifier.d.ts +15 -0
  25. package/dist/credential-verifiers/SDJWTVCVerifier.d.ts.map +1 -0
  26. package/dist/credential-verifiers/SDJWTVCVerifier.js +394 -0
  27. package/dist/defaultHttpClient.d.ts +3 -0
  28. package/dist/defaultHttpClient.d.ts.map +1 -0
  29. package/dist/defaultHttpClient.js +18 -0
  30. package/dist/error.d.ts +134 -0
  31. package/dist/error.d.ts.map +1 -0
  32. package/dist/error.js +160 -0
  33. package/dist/functions/convertDataUriToImage.d.ts +2 -0
  34. package/dist/functions/convertDataUriToImage.d.ts.map +1 -0
  35. package/dist/functions/convertDataUriToImage.js +38 -0
  36. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts +5 -0
  37. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts.map +1 -0
  38. package/dist/functions/convertOpenid4vciToSdjwtvcClaims.js +31 -0
  39. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts +11 -0
  40. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts.map +1 -0
  41. package/dist/functions/convertSdjwtvcToOpenid4vciClaims.js +35 -0
  42. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts +19 -0
  43. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts.map +1 -0
  44. package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.js +56 -0
  45. package/dist/functions/formatDate.d.ts +2 -0
  46. package/dist/functions/formatDate.d.ts.map +1 -0
  47. package/dist/functions/formatDate.js +50 -0
  48. package/dist/functions/index.d.ts +3 -0
  49. package/dist/functions/index.d.ts.map +1 -0
  50. package/dist/functions/index.js +19 -0
  51. package/dist/functions/openID4VCICredentialRendering.d.ts +5 -0
  52. package/dist/functions/openID4VCICredentialRendering.d.ts.map +1 -0
  53. package/dist/functions/openID4VCICredentialRendering.js +93 -0
  54. package/dist/index.d.ts +19 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +35 -0
  57. package/dist/interfaces.d.ts +112 -0
  58. package/dist/interfaces.d.ts.map +1 -0
  59. package/dist/interfaces.js +3 -0
  60. package/dist/rendering.d.ts +3 -0
  61. package/dist/rendering.d.ts.map +1 -0
  62. package/dist/rendering.js +56 -0
  63. package/dist/resolvers/RemoteJwksResolver.d.ts +17 -0
  64. package/dist/resolvers/RemoteJwksResolver.d.ts.map +1 -0
  65. package/dist/resolvers/RemoteJwksResolver.js +138 -0
  66. package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts +710 -0
  67. package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts.map +1 -0
  68. package/dist/schemas/CredentialConfigurationSupportedSchema.js +60 -0
  69. package/dist/schemas/CredentialOfferSchema.d.ts +40 -0
  70. package/dist/schemas/CredentialOfferSchema.d.ts.map +1 -0
  71. package/dist/schemas/CredentialOfferSchema.js +14 -0
  72. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts +49 -0
  73. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts.map +1 -0
  74. package/dist/schemas/OpenidAuthorizationServerMetadataSchema.js +21 -0
  75. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts +1030 -0
  76. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts.map +1 -0
  77. package/dist/schemas/OpenidCredentialIssuerMetadataSchema.js +35 -0
  78. package/dist/schemas/SdJwtVcPayloadSchema.d.ts +79 -0
  79. package/dist/schemas/SdJwtVcPayloadSchema.d.ts.map +1 -0
  80. package/dist/schemas/SdJwtVcPayloadSchema.js +27 -0
  81. package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts +930 -0
  82. package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts.map +1 -0
  83. package/dist/schemas/SdJwtVcTypeMetadataSchema.js +105 -0
  84. package/dist/schemas/index.d.ts +6 -0
  85. package/dist/schemas/index.d.ts.map +1 -0
  86. package/dist/schemas/index.js +22 -0
  87. package/dist/status/TokenStatusListVerifier.d.ts +41 -0
  88. package/dist/status/TokenStatusListVerifier.d.ts.map +1 -0
  89. package/dist/status/TokenStatusListVerifier.js +410 -0
  90. package/dist/trust/AlgorithmPolicy.d.ts +27 -0
  91. package/dist/trust/AlgorithmPolicy.d.ts.map +1 -0
  92. package/dist/trust/AlgorithmPolicy.js +60 -0
  93. package/dist/trust/TrustRegistry.d.ts +49 -0
  94. package/dist/trust/TrustRegistry.d.ts.map +1 -0
  95. package/dist/trust/TrustRegistry.js +114 -0
  96. package/dist/types.d.ts +76 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +10 -0
  99. package/dist/utils/escapeSVG.d.ts +2 -0
  100. package/dist/utils/escapeSVG.d.ts.map +1 -0
  101. package/dist/utils/escapeSVG.js +18 -0
  102. package/dist/utils/getIssuerMetadata.d.ts +8 -0
  103. package/dist/utils/getIssuerMetadata.d.ts.map +1 -0
  104. package/dist/utils/getIssuerMetadata.js +33 -0
  105. package/dist/utils/getSdJwtVcMetadata.d.ts +12 -0
  106. package/dist/utils/getSdJwtVcMetadata.d.ts.map +1 -0
  107. package/dist/utils/getSdJwtVcMetadata.js +274 -0
  108. package/dist/utils/index.d.ts +2 -0
  109. package/dist/utils/index.d.ts.map +1 -0
  110. package/dist/utils/index.js +6 -0
  111. package/dist/utils/matchLocalizedDisplay.d.ts +6 -0
  112. package/dist/utils/matchLocalizedDisplay.d.ts.map +1 -0
  113. package/dist/utils/matchLocalizedDisplay.js +16 -0
  114. package/dist/utils/util.d.ts +6 -0
  115. package/dist/utils/util.d.ts.map +1 -0
  116. package/dist/utils/util.js +53 -0
  117. package/dist/utils/verifyCertificate.d.ts +2 -0
  118. package/dist/utils/verifyCertificate.d.ts.map +1 -0
  119. package/dist/utils/verifyCertificate.js +100 -0
  120. package/dist/utils/verifySRIFromObject.d.ts +10 -0
  121. package/dist/utils/verifySRIFromObject.d.ts.map +1 -0
  122. package/dist/utils/verifySRIFromObject.js +32 -0
  123. package/dist/utils/verifyX5C.d.ts +11 -0
  124. package/dist/utils/verifyX5C.d.ts.map +1 -0
  125. package/dist/utils/verifyX5C.js +19 -0
  126. package/dist/x509/X509ChainVerifier.d.ts +59 -0
  127. package/dist/x509/X509ChainVerifier.d.ts.map +1 -0
  128. package/dist/x509/X509ChainVerifier.js +458 -0
  129. package/package.json +82 -0
@@ -0,0 +1,19 @@
1
+ export * from './rendering';
2
+ export * from './ParsingEngine';
3
+ export * from './credential-parsers/SDJWTVCParser';
4
+ export * from './credential-parsers/MsoMdocParser';
5
+ export * from './VerifyingEngine';
6
+ export * from './credential-verifiers/SDJWTVCVerifier';
7
+ export * from './credential-verifiers/MsoMdocVerifier';
8
+ export * from './PublicKeyResolverEngine';
9
+ export * from './defaultHttpClient';
10
+ export * from './resolvers/RemoteJwksResolver';
11
+ export * from './status/TokenStatusListVerifier';
12
+ export * from './trust/AlgorithmPolicy';
13
+ export * from './trust/TrustRegistry';
14
+ export * from './x509/X509ChainVerifier';
15
+ export * from './interfaces';
16
+ export * from './schemas';
17
+ export * from './utils';
18
+ export * from './functions';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAE5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,mBAAmB,CAAC;AAClC,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AAEzC,cAAc,cAAc,CAAC;AAE7B,cAAc,WAAW,CAAC;AAE1B,cAAc,SAAS,CAAC;AAExB,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./rendering"), exports);
18
+ __exportStar(require("./ParsingEngine"), exports);
19
+ __exportStar(require("./credential-parsers/SDJWTVCParser"), exports);
20
+ __exportStar(require("./credential-parsers/MsoMdocParser"), exports);
21
+ __exportStar(require("./VerifyingEngine"), exports);
22
+ __exportStar(require("./credential-verifiers/SDJWTVCVerifier"), exports);
23
+ __exportStar(require("./credential-verifiers/MsoMdocVerifier"), exports);
24
+ __exportStar(require("./PublicKeyResolverEngine"), exports);
25
+ __exportStar(require("./defaultHttpClient"), exports);
26
+ __exportStar(require("./resolvers/RemoteJwksResolver"), exports);
27
+ __exportStar(require("./status/TokenStatusListVerifier"), exports);
28
+ __exportStar(require("./trust/AlgorithmPolicy"), exports);
29
+ __exportStar(require("./trust/TrustRegistry"), exports);
30
+ __exportStar(require("./x509/X509ChainVerifier"), exports);
31
+ __exportStar(require("./interfaces"), exports);
32
+ __exportStar(require("./schemas"), exports);
33
+ __exportStar(require("./utils"), exports);
34
+ __exportStar(require("./functions"), exports);
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUE0QjtBQUU1QixrREFBZ0M7QUFDaEMscUVBQW1EO0FBQ25ELHFFQUFtRDtBQUVuRCxvREFBa0M7QUFDbEMseUVBQXVEO0FBQ3ZELHlFQUF1RDtBQUV2RCw0REFBMEM7QUFDMUMsc0RBQW9DO0FBQ3BDLGlFQUErQztBQUMvQyxtRUFBaUQ7QUFDakQsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0QywyREFBeUM7QUFFekMsK0NBQTZCO0FBRTdCLDRDQUEwQjtBQUUxQiwwQ0FBd0I7QUFFeEIsOENBQTRCIn0=
@@ -0,0 +1,112 @@
1
+ import { JWK } from "jose";
2
+ import { CredentialParsingError, CredentialVerificationError, PublicKeyResolutionError } from "./error";
3
+ import { Result, ParsedCredential, CredentialClaims, ParserResult, CredentialClaimPath } from "./types";
4
+ export interface CredentialRendering {
5
+ renderSvgTemplate(args: {
6
+ json: any;
7
+ credentialImageSvgTemplate: string;
8
+ sdJwtVcMetadataClaims: any;
9
+ filter?: Array<CredentialClaimPath>;
10
+ }): Promise<string | null>;
11
+ }
12
+ export interface OpenID4VCICredentialRendering {
13
+ renderCustomSvgTemplate(args: {
14
+ signedClaims: CredentialClaims;
15
+ displayConfig: any;
16
+ }): Promise<string>;
17
+ }
18
+ export interface CredentialIssuerInfo {
19
+ credentialIssuerIdentifier: string;
20
+ credentialConfigurationId: string;
21
+ }
22
+ export interface ParsingEngineI {
23
+ register(parser: CredentialParser): void;
24
+ parse({ rawCredential, credentialIssuer }: {
25
+ rawCredential: unknown;
26
+ credentialIssuer?: CredentialIssuerInfo;
27
+ }): Promise<Result<ParsedCredential, CredentialParsingError>>;
28
+ }
29
+ export interface VerifyingEngineI {
30
+ register(credentialVerifier: CredentialVerifier): void;
31
+ verify({ rawCredential, opts }: {
32
+ rawCredential: unknown;
33
+ opts: CredentialVerificationOptions;
34
+ }): Promise<Result<VerifiedCredential, CredentialVerificationError>>;
35
+ }
36
+ export interface PublicKeyResolverEngineI {
37
+ register(resolver: PublicKeyResolver): void;
38
+ resolve(args: PublicKeyResolutionRequest): Promise<Result<{
39
+ jwk: JWK;
40
+ }, PublicKeyResolutionError>>;
41
+ }
42
+ export interface CredentialParser {
43
+ parse(args: {
44
+ rawCredential: unknown;
45
+ credentialIssuer?: CredentialIssuerInfo;
46
+ }): Promise<ParserResult>;
47
+ }
48
+ export interface CredentialVerifier {
49
+ verify(args: {
50
+ rawCredential: unknown;
51
+ opts: CredentialVerificationOptions;
52
+ }): Promise<Result<VerifiedCredential, CredentialVerificationError>>;
53
+ }
54
+ export type CredentialStatus = "valid" | "revoked" | "suspended" | "application-specific";
55
+ export interface VerifiedCredential {
56
+ holderPublicKey: JWK;
57
+ credentialStatus?: CredentialStatus;
58
+ statusListUri?: string;
59
+ statusListIndex?: number;
60
+ }
61
+ export interface CredentialVerificationOptions {
62
+ expectedNonce?: string;
63
+ expectedAudience?: string;
64
+ expectedIssuer?: string;
65
+ expectedCredentialType?: string;
66
+ requiredClaimKeys?: readonly string[];
67
+ requireKeyBinding?: boolean;
68
+ holderNonce?: string;
69
+ responseUri?: string;
70
+ }
71
+ export interface PublicKeyResolver {
72
+ resolve(args: PublicKeyResolutionRequest): Promise<Result<{
73
+ jwk: JWK;
74
+ }, PublicKeyResolutionError>>;
75
+ }
76
+ export type TokenVerificationType = "credential" | "kb-jwt" | "status-list";
77
+ /**
78
+ * `identifier` is the exact issuer identifier. `kid` and `alg` come from the
79
+ * protected JOSE header and must never be inferred from untrusted metadata.
80
+ */
81
+ export interface PublicKeyResolutionRequest {
82
+ identifier: string;
83
+ kid?: string;
84
+ alg?: string;
85
+ tokenType?: TokenVerificationType;
86
+ credentialType?: string;
87
+ }
88
+ export interface HttpClient {
89
+ get(url: string, headers?: Record<string, unknown>, options?: any): Promise<{
90
+ status: number;
91
+ headers: Record<string, unknown>;
92
+ data: unknown;
93
+ }>;
94
+ post(url: string, body: any, headers?: Record<string, unknown>, options?: any): Promise<{
95
+ status: number;
96
+ headers: Record<string, unknown>;
97
+ data: unknown;
98
+ }>;
99
+ }
100
+ export interface Context {
101
+ clockTolerance: number;
102
+ lang: string;
103
+ subtle: SubtleCrypto;
104
+ /**
105
+ * each string is Base64-encoded DER representation without line breaks or headers like -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----
106
+ */
107
+ trustedCertificates: string[];
108
+ config?: {
109
+ vctRegistryUri: string;
110
+ };
111
+ }
112
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,3 @@
1
+ import { CredentialRendering } from './interfaces';
2
+ export declare function CredentialRenderingService(): CredentialRendering;
3
+ //# sourceMappingURL=rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rendering.d.ts","sourceRoot":"","sources":["../src/rendering.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAInD,wBAAgB,0BAA0B,IAAI,mBAAmB,CAoDhE"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CredentialRenderingService = CredentialRenderingService;
7
+ const jsonpointer_1 = __importDefault(require("jsonpointer"));
8
+ const formatDate_1 = require("./functions/formatDate");
9
+ const escapeSVG_1 = require("./utils/escapeSVG");
10
+ function CredentialRenderingService() {
11
+ const renderSvgTemplate = async ({ json, credentialImageSvgTemplate, sdJwtVcMetadataClaims, filter }) => {
12
+ let svgContent = null;
13
+ try {
14
+ svgContent = credentialImageSvgTemplate;
15
+ }
16
+ catch (error) {
17
+ return null; // Return null if fetching fails
18
+ }
19
+ if (svgContent) {
20
+ // Build pathMap from credentialHeader.vctm.claims
21
+ const pathMap = sdJwtVcMetadataClaims.reduce((acc, claim) => {
22
+ if (claim.svg_id && claim.path) {
23
+ acc[claim.svg_id] = claim.path;
24
+ }
25
+ return acc;
26
+ }, {});
27
+ // Regular expression to match {{svg_id}} placeholders
28
+ const regex = /{{([^}]+)}}/g;
29
+ const replacedSvgText = svgContent.replace(regex, (_match, svgId) => {
30
+ // Retrieve the path array for the current svgId from pathMap
31
+ const pathArray = pathMap[svgId];
32
+ if (Array.isArray(pathArray) && filter && !filter.map(f => f.join('.')).includes(pathArray.join('.'))) {
33
+ return '-';
34
+ }
35
+ // If pathArray exists, convert it to a JSON pointer path
36
+ if (Array.isArray(pathArray)) {
37
+ const jsonPointerPath = `/${pathArray.join('/')}`;
38
+ // Retrieve the value from beautifiedForm using jsonpointer
39
+ let value = (0, escapeSVG_1.escapeSVG)(jsonpointer_1.default.get(json, jsonPointerPath));
40
+ if (value !== undefined) {
41
+ value = (0, formatDate_1.formatDate)(value, 'date');
42
+ return value;
43
+ }
44
+ }
45
+ return '-';
46
+ });
47
+ const dataUri = `data:image/svg+xml;utf8,${encodeURIComponent(replacedSvgText)}`;
48
+ return dataUri; // Return the data URI for the SVG
49
+ }
50
+ return null;
51
+ };
52
+ return {
53
+ renderSvgTemplate,
54
+ };
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbmRlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQU1BLGdFQW9EQztBQTFERCw4REFBc0M7QUFDdEMsdURBQW9EO0FBRXBELGlEQUE4QztBQUc5QyxTQUFnQiwwQkFBMEI7SUFDekMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFzSCxFQUFFLEVBQUU7UUFFM04sSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQztZQUNKLFVBQVUsR0FBRywwQkFBMEIsQ0FBQztRQUN6QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQyxDQUFDLGdDQUFnQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQixrREFBa0Q7WUFDbEQsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEtBQVUsRUFBRSxFQUFFO2dCQUNyRSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxzREFBc0Q7WUFDdEQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDO1lBQzdCLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNuRSw2REFBNkQ7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2RyxPQUFPLEdBQUcsQ0FBQztnQkFDWixDQUFDO2dCQUNELHlEQUF5RDtnQkFDekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLE1BQU0sZUFBZSxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUVsRCwyREFBMkQ7b0JBQzNELElBQUksS0FBSyxHQUFHLElBQUEscUJBQVMsRUFBQyxxQkFBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztvQkFFOUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssR0FBRyxJQUFBLHVCQUFVLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO3dCQUNsQyxPQUFPLEtBQUssQ0FBQztvQkFDZCxDQUFDO2dCQUNGLENBQUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLDJCQUEyQixrQkFBa0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE9BQU8sT0FBTyxDQUFDLENBQUMsa0NBQWtDO1FBQ25ELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNiLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTixpQkFBaUI7S0FDakIsQ0FBQTtBQUNGLENBQUMifQ==
@@ -0,0 +1,17 @@
1
+ import { HttpClient, PublicKeyResolver } from "../interfaces";
2
+ import { AlgorithmPolicy } from "../trust/AlgorithmPolicy";
3
+ import { TrustRegistry } from "../trust/TrustRegistry";
4
+ export interface RemoteJwksResolverOptions {
5
+ trustRegistry: TrustRegistry;
6
+ algorithmPolicy: AlgorithmPolicy;
7
+ httpClient: HttpClient;
8
+ cacheTtlMs?: number;
9
+ requestTimeoutMs?: number;
10
+ maxResponseBytes?: number;
11
+ maxKeys?: number;
12
+ maxFetchAttempts?: number;
13
+ retryDelayMs?: number;
14
+ now?: () => number;
15
+ }
16
+ export declare function RemoteJwksResolver(options: RemoteJwksResolverOptions): PublicKeyResolver;
17
+ //# sourceMappingURL=RemoteJwksResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteJwksResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/RemoteJwksResolver.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,UAAU,EAEV,iBAAiB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAsB,MAAM,wBAAwB,CAAC;AAO3E,MAAM,WAAW,yBAAyB;IACzC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAiBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,iBAAiB,CA4HxF"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoteJwksResolver = RemoteJwksResolver;
4
+ const error_1 = require("../error");
5
+ const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;
6
+ const DEFAULT_REQUEST_TIMEOUT_MS = 5_000;
7
+ const DEFAULT_MAX_RESPONSE_BYTES = 256 * 1024;
8
+ const DEFAULT_MAX_KEYS = 100;
9
+ const DEFAULT_MAX_FETCH_ATTEMPTS = 2;
10
+ const DEFAULT_RETRY_DELAY_MS = 250;
11
+ function failure(error) {
12
+ return { success: false, error };
13
+ }
14
+ function isJwk(value) {
15
+ return typeof value === "object" && value !== null && !Array.isArray(value);
16
+ }
17
+ function RemoteJwksResolver(options) {
18
+ const cache = new Map();
19
+ const cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
20
+ const requestTimeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
21
+ const maxResponseBytes = options.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
22
+ const maxKeys = options.maxKeys ?? DEFAULT_MAX_KEYS;
23
+ const maxFetchAttempts = options.maxFetchAttempts ?? DEFAULT_MAX_FETCH_ATTEMPTS;
24
+ const retryDelayMs = options.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS;
25
+ const now = options.now ?? Date.now;
26
+ if (cacheTtlMs < 0 || requestTimeoutMs <= 0 || maxResponseBytes <= 0 || maxKeys <= 0 ||
27
+ !Number.isSafeInteger(maxFetchAttempts) || maxFetchAttempts <= 0 ||
28
+ !Number.isSafeInteger(retryDelayMs) || retryDelayMs < 0) {
29
+ throw new TypeError("Invalid RemoteJwksResolver limits");
30
+ }
31
+ async function fetchJwksOnce(entry) {
32
+ let response;
33
+ try {
34
+ response = await options.httpClient.get(entry.jwksUri, { Accept: "application/json" }, {
35
+ useCache: false,
36
+ timeout: requestTimeoutMs,
37
+ maxRedirects: 0,
38
+ maxContentLength: maxResponseBytes,
39
+ maxBodyLength: maxResponseBytes,
40
+ });
41
+ }
42
+ catch {
43
+ return failure(error_1.PublicKeyResolutionError.RemoteJwksFetchFailed);
44
+ }
45
+ if (!response || response.status !== 200) {
46
+ return failure(error_1.PublicKeyResolutionError.RemoteJwksFetchFailed);
47
+ }
48
+ if (typeof response.data !== "object" || response.data === null) {
49
+ return failure(error_1.PublicKeyResolutionError.InvalidJwksResponse);
50
+ }
51
+ let encodedLength;
52
+ try {
53
+ encodedLength = new TextEncoder().encode(JSON.stringify(response.data)).byteLength;
54
+ }
55
+ catch {
56
+ return failure(error_1.PublicKeyResolutionError.InvalidJwksResponse);
57
+ }
58
+ if (encodedLength > maxResponseBytes) {
59
+ return failure(error_1.PublicKeyResolutionError.InvalidJwksResponse);
60
+ }
61
+ const keys = response.data.keys;
62
+ if (!Array.isArray(keys) || keys.length === 0 || keys.length > maxKeys || !keys.every(isJwk)) {
63
+ return failure(error_1.PublicKeyResolutionError.InvalidJwksResponse);
64
+ }
65
+ const cached = { expiresAt: now() + cacheTtlMs, keys: [...keys] };
66
+ cache.set(entry.issuer, cached);
67
+ return { success: true, value: cached };
68
+ }
69
+ async function fetchJwks(entry) {
70
+ for (let attempt = 1; attempt <= maxFetchAttempts; attempt++) {
71
+ const result = await fetchJwksOnce(entry);
72
+ if (result.success || result.error !== error_1.PublicKeyResolutionError.RemoteJwksFetchFailed) {
73
+ return result;
74
+ }
75
+ if (attempt < maxFetchAttempts && retryDelayMs > 0) {
76
+ await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
77
+ }
78
+ }
79
+ return failure(error_1.PublicKeyResolutionError.RemoteJwksFetchFailed);
80
+ }
81
+ async function getJwks(entry, forceRefresh) {
82
+ const cached = cache.get(entry.issuer);
83
+ if (!forceRefresh && cached && cached.expiresAt > now()) {
84
+ return { success: true, value: cached };
85
+ }
86
+ return fetchJwks(entry);
87
+ }
88
+ return {
89
+ async resolve(request) {
90
+ const entry = options.trustRegistry.get(request.identifier);
91
+ if (!entry)
92
+ return failure(error_1.PublicKeyResolutionError.IssuerNotTrusted);
93
+ if (!request.kid)
94
+ return failure(error_1.PublicKeyResolutionError.MissingKeyIdentifier);
95
+ if (!request.alg)
96
+ return failure(error_1.PublicKeyResolutionError.MissingAlgorithm);
97
+ const tokenType = request.tokenType ?? "credential";
98
+ if (tokenType === "credential" &&
99
+ entry.credentialTypes !== undefined &&
100
+ (!request.credentialType || !entry.credentialTypes.includes(request.credentialType))) {
101
+ return failure(error_1.PublicKeyResolutionError.CredentialTypeNotAllowed);
102
+ }
103
+ const algorithmResult = options.algorithmPolicy.validateAlgorithm({
104
+ entry,
105
+ alg: request.alg,
106
+ tokenType,
107
+ });
108
+ if (!algorithmResult.success)
109
+ return algorithmResult;
110
+ const hadUsableCache = Boolean(cache.get(entry.issuer)?.expiresAt && cache.get(entry.issuer).expiresAt > now());
111
+ let jwksResult = await getJwks(entry, false);
112
+ if (!jwksResult.success)
113
+ return jwksResult;
114
+ let matches = jwksResult.value.keys.filter((key) => key.kid === request.kid);
115
+ if (matches.length === 0 && hadUsableCache) {
116
+ jwksResult = await getJwks(entry, true);
117
+ if (!jwksResult.success)
118
+ return jwksResult;
119
+ matches = jwksResult.value.keys.filter((key) => key.kid === request.kid);
120
+ }
121
+ if (matches.length === 0)
122
+ return failure(error_1.PublicKeyResolutionError.KeyNotFound);
123
+ if (matches.length !== 1)
124
+ return failure(error_1.PublicKeyResolutionError.DuplicateKeyIdentifier);
125
+ const keyResult = options.algorithmPolicy.validateKey({
126
+ entry,
127
+ jwk: matches[0],
128
+ kid: request.kid,
129
+ alg: request.alg,
130
+ tokenType,
131
+ });
132
+ if (!keyResult.success)
133
+ return keyResult;
134
+ return { success: true, value: { jwk: { ...matches[0] } } };
135
+ },
136
+ };
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlSndrc1Jlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jlc29sdmVycy9SZW1vdGVKd2tzUmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0Q0EsZ0RBNEhDO0FBdktELG9DQUFvRDtBQTRCcEQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMzQyxNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQztBQUN6QyxNQUFNLDBCQUEwQixHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFFbkMsU0FBUyxPQUFPLENBQUMsS0FBK0I7SUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEtBQWM7SUFDNUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLE9BQWtDO0lBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFzQixDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUM7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksMEJBQTBCLENBQUM7SUFDaEYsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksMEJBQTBCLENBQUM7SUFDaEYsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxnQkFB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