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.
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/dist/ParsingEngine.d.ts +3 -0
- package/dist/ParsingEngine.d.ts.map +1 -0
- package/dist/ParsingEngine.js +25 -0
- package/dist/PublicKeyResolverEngine.d.ts +3 -0
- package/dist/PublicKeyResolverEngine.d.ts.map +1 -0
- package/dist/PublicKeyResolverEngine.js +24 -0
- package/dist/VerifyingEngine.d.ts +3 -0
- package/dist/VerifyingEngine.d.ts.map +1 -0
- package/dist/VerifyingEngine.js +27 -0
- package/dist/credential-parsers/MsoMdocParser.d.ts +6 -0
- package/dist/credential-parsers/MsoMdocParser.d.ts.map +1 -0
- package/dist/credential-parsers/MsoMdocParser.js +164 -0
- package/dist/credential-parsers/SDJWTVCParser.d.ts +6 -0
- package/dist/credential-parsers/SDJWTVCParser.d.ts.map +1 -0
- package/dist/credential-parsers/SDJWTVCParser.js +214 -0
- package/dist/credential-verifiers/MsoMdocVerifier.d.ts +8 -0
- package/dist/credential-verifiers/MsoMdocVerifier.d.ts.map +1 -0
- package/dist/credential-verifiers/MsoMdocVerifier.js +213 -0
- package/dist/credential-verifiers/SDJWTVCValidation.d.ts +52 -0
- package/dist/credential-verifiers/SDJWTVCValidation.d.ts.map +1 -0
- package/dist/credential-verifiers/SDJWTVCValidation.js +248 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.d.ts +15 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.d.ts.map +1 -0
- package/dist/credential-verifiers/SDJWTVCVerifier.js +394 -0
- package/dist/defaultHttpClient.d.ts +3 -0
- package/dist/defaultHttpClient.d.ts.map +1 -0
- package/dist/defaultHttpClient.js +18 -0
- package/dist/error.d.ts +134 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +160 -0
- package/dist/functions/convertDataUriToImage.d.ts +2 -0
- package/dist/functions/convertDataUriToImage.d.ts.map +1 -0
- package/dist/functions/convertDataUriToImage.js +38 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts +5 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.d.ts.map +1 -0
- package/dist/functions/convertOpenid4vciToSdjwtvcClaims.js +31 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts +11 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.d.ts.map +1 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciClaims.js +35 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts +19 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.d.ts.map +1 -0
- package/dist/functions/convertSdjwtvcToOpenid4vciDisplay.js +56 -0
- package/dist/functions/formatDate.d.ts +2 -0
- package/dist/functions/formatDate.d.ts.map +1 -0
- package/dist/functions/formatDate.js +50 -0
- package/dist/functions/index.d.ts +3 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/functions/index.js +19 -0
- package/dist/functions/openID4VCICredentialRendering.d.ts +5 -0
- package/dist/functions/openID4VCICredentialRendering.d.ts.map +1 -0
- package/dist/functions/openID4VCICredentialRendering.js +93 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/interfaces.d.ts +112 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +3 -0
- package/dist/rendering.d.ts +3 -0
- package/dist/rendering.d.ts.map +1 -0
- package/dist/rendering.js +56 -0
- package/dist/resolvers/RemoteJwksResolver.d.ts +17 -0
- package/dist/resolvers/RemoteJwksResolver.d.ts.map +1 -0
- package/dist/resolvers/RemoteJwksResolver.js +138 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts +710 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.d.ts.map +1 -0
- package/dist/schemas/CredentialConfigurationSupportedSchema.js +60 -0
- package/dist/schemas/CredentialOfferSchema.d.ts +40 -0
- package/dist/schemas/CredentialOfferSchema.d.ts.map +1 -0
- package/dist/schemas/CredentialOfferSchema.js +14 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts +49 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/OpenidAuthorizationServerMetadataSchema.js +21 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts +1030 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/OpenidCredentialIssuerMetadataSchema.js +35 -0
- package/dist/schemas/SdJwtVcPayloadSchema.d.ts +79 -0
- package/dist/schemas/SdJwtVcPayloadSchema.d.ts.map +1 -0
- package/dist/schemas/SdJwtVcPayloadSchema.js +27 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts +930 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.d.ts.map +1 -0
- package/dist/schemas/SdJwtVcTypeMetadataSchema.js +105 -0
- package/dist/schemas/index.d.ts +6 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +22 -0
- package/dist/status/TokenStatusListVerifier.d.ts +41 -0
- package/dist/status/TokenStatusListVerifier.d.ts.map +1 -0
- package/dist/status/TokenStatusListVerifier.js +410 -0
- package/dist/trust/AlgorithmPolicy.d.ts +27 -0
- package/dist/trust/AlgorithmPolicy.d.ts.map +1 -0
- package/dist/trust/AlgorithmPolicy.js +60 -0
- package/dist/trust/TrustRegistry.d.ts +49 -0
- package/dist/trust/TrustRegistry.d.ts.map +1 -0
- package/dist/trust/TrustRegistry.js +114 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/utils/escapeSVG.d.ts +2 -0
- package/dist/utils/escapeSVG.d.ts.map +1 -0
- package/dist/utils/escapeSVG.js +18 -0
- package/dist/utils/getIssuerMetadata.d.ts +8 -0
- package/dist/utils/getIssuerMetadata.d.ts.map +1 -0
- package/dist/utils/getIssuerMetadata.js +33 -0
- package/dist/utils/getSdJwtVcMetadata.d.ts +12 -0
- package/dist/utils/getSdJwtVcMetadata.d.ts.map +1 -0
- package/dist/utils/getSdJwtVcMetadata.js +274 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/matchLocalizedDisplay.d.ts +6 -0
- package/dist/utils/matchLocalizedDisplay.d.ts.map +1 -0
- package/dist/utils/matchLocalizedDisplay.js +16 -0
- package/dist/utils/util.d.ts +6 -0
- package/dist/utils/util.d.ts.map +1 -0
- package/dist/utils/util.js +53 -0
- package/dist/utils/verifyCertificate.d.ts +2 -0
- package/dist/utils/verifyCertificate.d.ts.map +1 -0
- package/dist/utils/verifyCertificate.js +100 -0
- package/dist/utils/verifySRIFromObject.d.ts +10 -0
- package/dist/utils/verifySRIFromObject.d.ts.map +1 -0
- package/dist/utils/verifySRIFromObject.js +32 -0
- package/dist/utils/verifyX5C.d.ts +11 -0
- package/dist/utils/verifyX5C.d.ts.map +1 -0
- package/dist/utils/verifyX5C.js +19 -0
- package/dist/x509/X509ChainVerifier.d.ts +59 -0
- package/dist/x509/X509ChainVerifier.d.ts.map +1 -0
- package/dist/x509/X509ChainVerifier.js +458 -0
- 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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
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 '<';
|
|
10
|
+
case '>': return '>';
|
|
11
|
+
case '&': return '&';
|
|
12
|
+
case '"': return '"';
|
|
13
|
+
case "'": return ''';
|
|
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"}
|