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,27 @@
1
+ import type { JWK } from "jose";
2
+ import { PublicKeyResolutionError } from "../error";
3
+ import { Result } from "../types";
4
+ import { TokenVerificationType } from "../interfaces";
5
+ import { TrustRegistryEntry } from "./TrustRegistry";
6
+ export interface AlgorithmRule {
7
+ kty: string;
8
+ crv?: string;
9
+ }
10
+ export type AlgorithmRules = Readonly<Record<string, Readonly<AlgorithmRule>>>;
11
+ export declare class AlgorithmPolicy {
12
+ private readonly rules;
13
+ constructor(rules?: AlgorithmRules);
14
+ validateAlgorithm(args: {
15
+ entry: Readonly<TrustRegistryEntry>;
16
+ alg: string;
17
+ tokenType: TokenVerificationType;
18
+ }): Result<true, PublicKeyResolutionError>;
19
+ validateKey(args: {
20
+ entry: Readonly<TrustRegistryEntry>;
21
+ jwk: JWK;
22
+ kid: string;
23
+ alg: string;
24
+ tokenType: TokenVerificationType;
25
+ }): Result<true, PublicKeyResolutionError>;
26
+ }
27
+ //# sourceMappingURL=AlgorithmPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlgorithmPolicy.d.ts","sourceRoot":"","sources":["../../src/trust/AlgorithmPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAc/E,qBAAa,eAAe;IACf,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,GAAE,cAA8B;IAElE,iBAAiB,CAAC,IAAI,EAAE;QACvB,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACpC,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,qBAAqB,CAAC;KACjC,GAAG,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAQ1C,WAAW,CAAC,IAAI,EAAE;QACjB,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QACpC,GAAG,EAAE,GAAG,CAAC;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,qBAAqB,CAAC;KACjC,GAAG,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC;CAgC1C"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AlgorithmPolicy = void 0;
4
+ const error_1 = require("../error");
5
+ const DEFAULT_RULES = Object.freeze({
6
+ ES256: Object.freeze({ kty: "EC", crv: "P-256" }),
7
+ ES256K: Object.freeze({ kty: "EC", crv: "secp256k1" }),
8
+ EdDSA: Object.freeze({ kty: "OKP", crv: "Ed25519" }),
9
+ });
10
+ const PRIVATE_JWK_PARAMETERS = ["d", "p", "q", "dp", "dq", "qi", "oth", "k"];
11
+ function denied(error) {
12
+ return { success: false, error };
13
+ }
14
+ class AlgorithmPolicy {
15
+ rules;
16
+ constructor(rules = DEFAULT_RULES) {
17
+ this.rules = rules;
18
+ }
19
+ validateAlgorithm(args) {
20
+ const allowed = args.entry.algorithms[args.tokenType];
21
+ if (!this.rules[args.alg] || !allowed?.includes(args.alg)) {
22
+ return denied(error_1.PublicKeyResolutionError.AlgorithmNotAllowed);
23
+ }
24
+ return { success: true, value: true };
25
+ }
26
+ validateKey(args) {
27
+ const algorithmResult = this.validateAlgorithm(args);
28
+ if (!algorithmResult.success)
29
+ return algorithmResult;
30
+ const { jwk, kid, alg, entry } = args;
31
+ const rule = this.rules[alg];
32
+ if (!rule || jwk.kid !== kid || jwk.kty !== rule.kty || (rule.crv !== undefined && jwk.crv !== rule.crv)) {
33
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
34
+ }
35
+ if (entry.activeKids && !entry.activeKids.includes(kid)) {
36
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
37
+ }
38
+ if (jwk.alg !== undefined && jwk.alg !== alg) {
39
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
40
+ }
41
+ if (jwk.use !== undefined && jwk.use !== "sig") {
42
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
43
+ }
44
+ if (jwk.key_ops !== undefined && (!Array.isArray(jwk.key_ops) || !jwk.key_ops.includes("verify"))) {
45
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
46
+ }
47
+ if (PRIVATE_JWK_PARAMETERS.some((parameter) => parameter in jwk)) {
48
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
49
+ }
50
+ if (jwk.kty === "EC" && (typeof jwk.x !== "string" || !jwk.x || typeof jwk.y !== "string" || !jwk.y)) {
51
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
52
+ }
53
+ if (jwk.kty === "OKP" && (typeof jwk.x !== "string" || !jwk.x)) {
54
+ return denied(error_1.PublicKeyResolutionError.KeyNotAllowed);
55
+ }
56
+ return { success: true, value: true };
57
+ }
58
+ }
59
+ exports.AlgorithmPolicy = AlgorithmPolicy;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxnb3JpdGhtUG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RydXN0L0FsZ29yaXRobVBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvQ0FBb0Q7QUFZcEQsTUFBTSxhQUFhLEdBQW1CLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNqRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3RELEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7Q0FDcEQsQ0FBQyxDQUFDO0FBRUgsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQVUsQ0FBQztBQUV0RixTQUFTLE1BQU0sQ0FBQyxLQUErQjtJQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBYSxlQUFlO0lBQ0U7SUFBN0IsWUFBNkIsUUFBd0IsYUFBYTtRQUFyQyxVQUFLLEdBQUwsS0FBSyxDQUFnQztJQUFHLENBQUM7SUFFdEUsaUJBQWlCLENBQUMsSUFJakI7UUFDQSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJ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
@@ -0,0 +1,49 @@
1
+ import { TokenVerificationType } from "../interfaces";
2
+ export type TrustedAlgorithms = Partial<Record<TokenVerificationType, readonly string[]>>;
3
+ export interface TrustRegistryEntry {
4
+ /**
5
+ * Exact `iss` value accepted from a token.
6
+ */
7
+ issuer: string;
8
+ /**
9
+ * Explicit JWKS endpoint. It is never derived from `issuer`.
10
+ */
11
+ jwksUri: string;
12
+ /**
13
+ * Algorithms authorized for each token purpose.
14
+ */
15
+ algorithms: TrustedAlgorithms;
16
+ /**
17
+ * Optional allow-list used during controlled key rotations.
18
+ */
19
+ activeKids?: readonly string[];
20
+ /**
21
+ * Optional credential configurations/vct values governed by this entry.
22
+ */
23
+ credentialTypes?: readonly string[];
24
+ /**
25
+ * Exact Status List Token endpoints authorized for credentials from this
26
+ * issuer. A consumer must never fetch a status URI solely because it
27
+ * appeared in an untrusted credential.
28
+ */
29
+ statusListUris?: readonly string[];
30
+ /**
31
+ * Optional external Status Issuer. When omitted, the credential issuer is
32
+ * also the Status Issuer.
33
+ */
34
+ statusListIssuer?: string;
35
+ }
36
+ export interface TrustRegistryOptions {
37
+ /**
38
+ * Intended only for deterministic local tests and isolated development.
39
+ */
40
+ allowInsecureHttp?: boolean;
41
+ }
42
+ export declare class TrustRegistry {
43
+ private readonly entries;
44
+ private readonly allowInsecureHttp;
45
+ constructor(entries: readonly TrustRegistryEntry[], options?: TrustRegistryOptions);
46
+ get(issuer: string): Readonly<TrustRegistryEntry> | undefined;
47
+ has(issuer: string): boolean;
48
+ }
49
+ //# sourceMappingURL=TrustRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrustRegistry.d.ts","sourceRoot":"","sources":["../../src/trust/TrustRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAE1F,MAAM,WAAW,kBAAkB;IAClC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,EAAE,iBAAiB,CAAC;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;OAEG;IACH,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;;OAIG;IACH,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAqED,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmD;IAC3E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;gBAEhC,OAAO,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,GAAE,oBAAyB;IAgCtF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,SAAS;IAU7D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAG5B"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrustRegistry = void 0;
4
+ function normalizeIssuer(value, allowInsecureHttp) {
5
+ const url = validateUrl(value, allowInsecureHttp, "issuer");
6
+ if (url.search || url.hash) {
7
+ throw new TypeError("A trusted issuer must not contain a query or fragment");
8
+ }
9
+ return url.href.endsWith("/") ? url.href.slice(0, -1) : url.href;
10
+ }
11
+ function normalizeJwksUri(value, allowInsecureHttp) {
12
+ const url = validateUrl(value, allowInsecureHttp, "jwksUri");
13
+ if (url.hash) {
14
+ throw new TypeError("A trusted jwksUri must not contain a fragment");
15
+ }
16
+ return url.href;
17
+ }
18
+ function normalizeStatusListUri(value, allowInsecureHttp) {
19
+ const url = validateUrl(value, allowInsecureHttp, "statusListUri");
20
+ if (url.hash) {
21
+ throw new TypeError("A trusted statusListUri must not contain a fragment");
22
+ }
23
+ return url.href;
24
+ }
25
+ function validateUrl(value, allowInsecureHttp, field) {
26
+ let url;
27
+ try {
28
+ url = new URL(value);
29
+ }
30
+ catch {
31
+ throw new TypeError(`Invalid ${field}`);
32
+ }
33
+ if (url.username || url.password) {
34
+ throw new TypeError(`${field} must not contain user information`);
35
+ }
36
+ if (url.protocol !== "https:" && !(allowInsecureHttp && url.protocol === "http:")) {
37
+ throw new TypeError(`${field} must use HTTPS`);
38
+ }
39
+ return url;
40
+ }
41
+ function uniqueNonEmpty(values, field) {
42
+ if (values === undefined)
43
+ return undefined;
44
+ if (values.length === 0 || values.some((value) => typeof value !== "string" || value.length === 0)) {
45
+ throw new TypeError(`${field} must contain non-empty strings`);
46
+ }
47
+ if (new Set(values).size !== values.length) {
48
+ throw new TypeError(`${field} must not contain duplicates`);
49
+ }
50
+ return Object.freeze([...values]);
51
+ }
52
+ function validateAlgorithms(algorithms) {
53
+ const result = {};
54
+ const tokenTypes = ["credential", "kb-jwt", "status-list"];
55
+ for (const tokenType of tokenTypes) {
56
+ const configured = algorithms[tokenType];
57
+ if (configured !== undefined) {
58
+ const values = uniqueNonEmpty(configured, `algorithms.${tokenType}`);
59
+ if (values)
60
+ result[tokenType] = values;
61
+ }
62
+ }
63
+ if (Object.keys(result).length === 0) {
64
+ throw new TypeError("At least one token algorithm policy is required");
65
+ }
66
+ return Object.freeze(result);
67
+ }
68
+ class TrustRegistry {
69
+ entries = new Map();
70
+ allowInsecureHttp;
71
+ constructor(entries, options = {}) {
72
+ this.allowInsecureHttp = options.allowInsecureHttp === true;
73
+ for (const entry of entries) {
74
+ const issuer = normalizeIssuer(entry.issuer, this.allowInsecureHttp);
75
+ if (this.entries.has(issuer)) {
76
+ throw new TypeError(`Duplicate trusted issuer: ${issuer}`);
77
+ }
78
+ const frozenEntry = Object.freeze({
79
+ issuer,
80
+ jwksUri: normalizeJwksUri(entry.jwksUri, this.allowInsecureHttp),
81
+ algorithms: validateAlgorithms(entry.algorithms),
82
+ activeKids: uniqueNonEmpty(entry.activeKids, "activeKids"),
83
+ credentialTypes: uniqueNonEmpty(entry.credentialTypes, "credentialTypes"),
84
+ statusListUris: entry.statusListUris === undefined
85
+ ? undefined
86
+ : Object.freeze(entry.statusListUris.map((uri) => normalizeStatusListUri(uri, this.allowInsecureHttp))),
87
+ statusListIssuer: entry.statusListIssuer === undefined
88
+ ? undefined
89
+ : normalizeIssuer(entry.statusListIssuer, this.allowInsecureHttp),
90
+ });
91
+ if (frozenEntry.statusListUris !== undefined &&
92
+ (frozenEntry.statusListUris.length === 0 ||
93
+ new Set(frozenEntry.statusListUris).size !== frozenEntry.statusListUris.length)) {
94
+ throw new TypeError("statusListUris must contain unique trusted endpoints");
95
+ }
96
+ this.entries.set(issuer, frozenEntry);
97
+ }
98
+ }
99
+ get(issuer) {
100
+ let normalized;
101
+ try {
102
+ normalized = normalizeIssuer(issuer, this.allowInsecureHttp);
103
+ }
104
+ catch {
105
+ return undefined;
106
+ }
107
+ return this.entries.get(normalized);
108
+ }
109
+ has(issuer) {
110
+ return this.get(issuer) !== undefined;
111
+ }
112
+ }
113
+ exports.TrustRegistry = TrustRegistry;
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJ1c3RSZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cnVzdC9UcnVzdFJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZDQSxTQUFTLGVBQWUsQ0FBQyxLQUFhLEVBQUUsaUJBQTBCO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUQsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ2xFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxpQkFBMEI7SUFDbEUsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxpQkFBMEI7SUFDeEUsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNuRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLE1BQU0s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
@@ -0,0 +1,76 @@
1
+ import { CredentialParsingError } from "./error";
2
+ import { ClaimMetadataEntry } from "./schemas/SdJwtVcTypeMetadataSchema";
3
+ export declare enum VerifiableCredentialFormat {
4
+ VC_SDJWT = "vc+sd-jwt",
5
+ DC_SDJWT = "dc+sd-jwt",
6
+ MSO_MDOC = "mso_mdoc"
7
+ }
8
+ export type CredentialIssuer = {
9
+ id: string;
10
+ name: string;
11
+ };
12
+ export type CredentialClaims = Record<string, unknown>;
13
+ export type Result<T, E> = {
14
+ success: true;
15
+ value: T;
16
+ } | {
17
+ success: false;
18
+ error: E;
19
+ };
20
+ export type ParserResult = {
21
+ success: true;
22
+ value: ParsedCredential;
23
+ } | {
24
+ success: false;
25
+ error: CredentialParsingError;
26
+ };
27
+ export type CredentialPayload = {
28
+ iss: string;
29
+ vct: string;
30
+ [key: string]: unknown;
31
+ };
32
+ export type MetadataError = {
33
+ error: CredentialParsingError;
34
+ };
35
+ export type MetadataWarning = {
36
+ code: CredentialParsingError;
37
+ };
38
+ export type CredentialClaimPath = Array<string>;
39
+ export type CredentialFriendlyNameCallback = (preferredLangs?: string[]) => Promise<string | null>;
40
+ export type ImageDataUriCallback = (filter?: Array<CredentialClaimPath>, preferredLangs?: string[]) => Promise<string | null>;
41
+ export type AugmentedClaimMetadataEntry = ClaimMetadataEntry & {
42
+ required?: boolean;
43
+ };
44
+ export type TypeMetadata = {
45
+ claims?: Array<AugmentedClaimMetadataEntry>;
46
+ };
47
+ export type ParsedCredential = {
48
+ metadata: {
49
+ credential: {
50
+ format: VerifiableCredentialFormat.VC_SDJWT | VerifiableCredentialFormat.DC_SDJWT;
51
+ vct: string;
52
+ name: CredentialFriendlyNameCallback;
53
+ TypeMetadata: TypeMetadata;
54
+ image: {
55
+ dataUri: ImageDataUriCallback;
56
+ };
57
+ } | {
58
+ format: VerifiableCredentialFormat.MSO_MDOC;
59
+ doctype: string;
60
+ name: CredentialFriendlyNameCallback;
61
+ TypeMetadata: TypeMetadata;
62
+ image: {
63
+ dataUri: ImageDataUriCallback;
64
+ };
65
+ };
66
+ issuer: CredentialIssuer;
67
+ };
68
+ validityInfo: {
69
+ validUntil?: Date;
70
+ validFrom?: Date;
71
+ signed?: Date;
72
+ };
73
+ signedClaims: CredentialClaims;
74
+ warnings?: Array<MetadataWarning>;
75
+ };
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VerifiableCredentialFormat = void 0;
4
+ var VerifiableCredentialFormat;
5
+ (function (VerifiableCredentialFormat) {
6
+ VerifiableCredentialFormat["VC_SDJWT"] = "vc+sd-jwt";
7
+ VerifiableCredentialFormat["DC_SDJWT"] = "dc+sd-jwt";
8
+ VerifiableCredentialFormat["MSO_MDOC"] = "mso_mdoc";
9
+ })(VerifiableCredentialFormat || (exports.VerifiableCredentialFormat = VerifiableCredentialFormat = {}));
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsSUFBWSwwQkFJWDtBQUpELFdBQVksMEJBQTBCO0lBQ3JDLG9EQUFzQixDQUFBO0lBQ3RCLG9EQUFzQixDQUFBO0lBQ3RCLG1EQUFxQixDQUFBO0FBQ3RCLENBQUMsRUFKVywwQkFBMEIsMENBQTFCLDBCQUEwQixRQUlyQyJ9
@@ -0,0 +1,2 @@
1
+ export declare function escapeSVG(str: string): string;
2
+ //# sourceMappingURL=escapeSVG.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escapeSVG.d.ts","sourceRoot":"","sources":["../../src/utils/escapeSVG.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,UAapC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeSVG = escapeSVG;
4
+ function escapeSVG(str) {
5
+ if (typeof str !== "string")
6
+ return str;
7
+ return str.replace(/[<>&"']/g, function (match) {
8
+ switch (match) {
9
+ case '<': return '&lt;';
10
+ case '>': return '&gt;';
11
+ case '&': return '&amp;';
12
+ case '"': return '&quot;';
13
+ case "'": return '&apos;';
14
+ default: return match;
15
+ }
16
+ });
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNjYXBlU1ZHLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2VzY2FwZVNWRy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhCQWFDO0FBYkQsU0FBZ0IsU0FBUyxDQUFDLEdBQVc7SUFDcEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFeEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLEtBQUs7UUFDN0MsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNmLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUM7WUFDeEIsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQztZQUN4QixLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1lBQ3pCLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUM7WUFDMUIsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ import { z } from "zod";
2
+ import { OpenidCredentialIssuerMetadataSchema } from "../schemas";
3
+ import type { HttpClient } from "../interfaces";
4
+ import { MetadataWarning } from "../types";
5
+ export declare function getIssuerMetadata(httpClient: HttpClient, issuer: string, warnings: MetadataWarning[], useCache?: boolean): Promise<{
6
+ metadata: z.infer<typeof OpenidCredentialIssuerMetadataSchema> | null;
7
+ }>;
8
+ //# sourceMappingURL=getIssuerMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIssuerMetadata.d.ts","sourceRoot":"","sources":["../../src/utils/getIssuerMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oCAAoC,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,GAAE,OAAc,GACtB,OAAO,CAAC;IACV,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,GAAG,IAAI,CAAC;CACtE,CAAC,CA+BD"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getIssuerMetadata = getIssuerMetadata;
4
+ const schemas_1 = require("../schemas");
5
+ const error_1 = require("../error");
6
+ async function getIssuerMetadata(httpClient, issuer, warnings, useCache = true) {
7
+ const url = `${issuer}/.well-known/openid-credential-issuer`;
8
+ let issuerResponse = null;
9
+ try {
10
+ issuerResponse = await httpClient.get(url, {}, { useCache });
11
+ }
12
+ catch (err) {
13
+ warnings.push({
14
+ code: error_1.CredentialParsingError.FailFetchIssuerMetadata,
15
+ });
16
+ return { metadata: null };
17
+ }
18
+ if (!issuerResponse || issuerResponse.status !== 200 || !issuerResponse.data) {
19
+ warnings.push({
20
+ code: error_1.CredentialParsingError.FailFetchIssuerMetadata,
21
+ });
22
+ return { metadata: null };
23
+ }
24
+ const parsed = schemas_1.OpenidCredentialIssuerMetadataSchema.safeParse(issuerResponse.data);
25
+ if (!parsed.success) {
26
+ warnings.push({
27
+ code: error_1.CredentialParsingError.FailSchemaIssuerMetadata,
28
+ });
29
+ return { metadata: null };
30
+ }
31
+ return { metadata: parsed.data };
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0SXNzdWVyTWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvZ2V0SXNzdWVyTWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSw4Q0FzQ0M7QUEzQ0Qsd0NBQWtFO0FBR2xFLG9DQUFrRDtBQUUzQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3RDLFVBQXNCLEVBQ3RCLE1BQWMsRUFDZCxRQUEyQixFQUMzQixXQUFvQixJQUFJO0lBSXhCLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSx1Q0FBdUMsQ0FBQztJQUU3RCxJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFFMUIsSUFBSSxDQUFDO1FBQ0osY0FBYyxHQUFHLE1BQU0sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNkLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDYixJQUFJLEVBQUUsOEJBQXNCLENBQUMsdUJBQXVCO1NBQ3BELENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksQ0FBQyxjQUFjLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUUsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNiLElBQUksRUFBRSw4QkFBc0IsQ0FBQyx1QkFBdUI7U0FDcEQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsOENBQW9DLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVuRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDYixJQUFJLEVBQUUsOEJBQXNCLENBQUMsd0JBQXdCO1NBQ3JELENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2xDLENBQUMifQ==
@@ -0,0 +1,12 @@
1
+ import { Context, HttpClient } from '../interfaces';
2
+ import { MetadataError, MetadataWarning } from '../types';
3
+ import { CredentialParsingError } from '../error';
4
+ import { TypeMetadata as TypeMetadataSchema } from "../schemas/SdJwtVcTypeMetadataSchema";
5
+ export declare function resolveIssuerMetadata(httpClient: any, issuerUrl: string): Promise<{
6
+ code: CredentialParsingError;
7
+ } | undefined>;
8
+ export declare function getSdJwtVcMetadata(context: Context, httpClient: HttpClient, credential: string, parsedClaims: Record<string, unknown>, warnings?: MetadataWarning[]): Promise<{
9
+ credentialMetadata: TypeMetadataSchema | undefined;
10
+ warnings: MetadataWarning[];
11
+ } | MetadataError>;
12
+ //# sourceMappingURL=getSdJwtVcMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSdJwtVcMetadata.d.ts","sourceRoot":"","sources":["../../src/utils/getSdJwtVcMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAqB,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAA+B,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AA8L1F,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG,SAAS,CAAC,CAwBrI;AAeD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAE,eAAe,EAAO,GAAG,OAAO,CAAC;IAAE,kBAAkB,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC,CA+E5R"}