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,59 @@
1
+ import { X509ChainVerificationError } from "../error";
2
+ import type { Result } from "../types";
3
+ export type X509RevocationStatus = "good" | "revoked" | "unknown";
4
+ export interface X509RevocationCheckInput {
5
+ certificateDer: Uint8Array;
6
+ issuerCertificateDer: Uint8Array;
7
+ validationTime: Date;
8
+ }
9
+ export interface X509RevocationChecker {
10
+ check(input: X509RevocationCheckInput): Promise<X509RevocationStatus>;
11
+ }
12
+ export interface X509ChainVerifierPolicy {
13
+ maxChainLength?: number;
14
+ maxCertificateBytes?: number;
15
+ maxTotalBytes?: number;
16
+ requireDigitalSignatureKeyUsage?: boolean;
17
+ requiredExtendedKeyUsages?: readonly string[];
18
+ requireSubjectAlternativeName?: boolean;
19
+ revocationMode?: "disabled" | "required";
20
+ revocationChecker?: X509RevocationChecker;
21
+ }
22
+ export interface X509ChainVerificationInput {
23
+ /**
24
+ * JWS `x5c` order: leaf first, followed by intermediates. A root may be
25
+ * included but is trusted only when it exactly matches a configured anchor.
26
+ */
27
+ x5c: readonly string[];
28
+ /**
29
+ * PEM or Base64 DER trust anchors configured locally by the consumer.
30
+ */
31
+ trustedCertificates: readonly string[];
32
+ /**
33
+ * JOSE algorithm from the protected header. When supplied, the leaf SPKI
34
+ * must have the corresponding key type and curve.
35
+ */
36
+ algorithm?: string;
37
+ /**
38
+ * DNS name or HTTPS issuer URL. Matching uses subjectAltName dNSName only;
39
+ * Common Name fallback is intentionally disabled.
40
+ */
41
+ expectedHostname?: string;
42
+ validationTime?: Date;
43
+ }
44
+ export interface X509ChainVerificationResult {
45
+ leafCertificatePem: string;
46
+ leafCertificateDer: Uint8Array;
47
+ chainLength: number;
48
+ subjectAlternativeNames: readonly string[];
49
+ trustAnchorFingerprintSha256: string;
50
+ }
51
+ export interface X509ChainVerifierI {
52
+ verify(input: X509ChainVerificationInput): Promise<Result<X509ChainVerificationResult, X509ChainVerificationError>>;
53
+ }
54
+ export declare class X509ChainVerifier implements X509ChainVerifierI {
55
+ private readonly policy;
56
+ constructor(policy?: X509ChainVerifierPolicy);
57
+ verify(input: X509ChainVerificationInput): Promise<Result<X509ChainVerificationResult, X509ChainVerificationError>>;
58
+ }
59
+ //# sourceMappingURL=X509ChainVerifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"X509ChainVerifier.d.ts","sourceRoot":"","sources":["../../src/x509/X509ChainVerifier.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA+CvC,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACxC,cAAc,EAAE,UAAU,CAAC;IAC3B,oBAAoB,EAAE,UAAU,CAAC;IACjC,cAAc,EAAE,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,uBAAuB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,yBAAyB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACzC,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;CAC1C;AAaD,MAAM,WAAW,0BAA0B;IAC1C;;;OAGG;IACH,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB;;OAEG;IACH,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC3C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,UAAU,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,4BAA4B,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,CACL,KAAK,EAAE,0BAA0B,GAC/B,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,0BAA0B,CAAC,CAAC,CAAC;CAC5E;AAgQD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,MAAM,GAAE,uBAA4B;IAI1C,MAAM,CACX,KAAK,EAAE,0BAA0B,GAC/B,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,0BAA0B,CAAC,CAAC;CAuN3E"}
@@ -0,0 +1,458 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.X509ChainVerifier = void 0;
40
+ const asn1js = __importStar(require("asn1js"));
41
+ const pkijs = __importStar(require("pkijs"));
42
+ const buffer_1 = require("buffer");
43
+ const uncrypto_1 = __importDefault(require("uncrypto"));
44
+ const error_1 = require("../error");
45
+ const OID = Object.freeze({
46
+ ecPublicKey: "1.2.840.10045.2.1",
47
+ rsaEncryption: "1.2.840.113549.1.1.1",
48
+ ed25519: "1.3.101.112",
49
+ p256: "1.2.840.10045.3.1.7",
50
+ p384: "1.3.132.0.34",
51
+ p521: "1.3.132.0.35",
52
+ secp256k1: "1.3.132.0.10",
53
+ basicConstraints: "2.5.29.19",
54
+ keyUsage: "2.5.29.15",
55
+ extendedKeyUsage: "2.5.29.37",
56
+ subjectAltName: "2.5.29.17",
57
+ anyExtendedKeyUsage: "2.5.29.37.0",
58
+ });
59
+ const WEAK_SIGNATURE_ALGORITHM_OIDS = new Set([
60
+ "1.2.840.113549.1.1.2", // md2WithRSAEncryption
61
+ "1.2.840.113549.1.1.3", // md4WithRSAEncryption
62
+ "1.2.840.113549.1.1.4", // md5WithRSAEncryption
63
+ "1.2.840.113549.1.1.5", // sha1WithRSAEncryption
64
+ "1.2.840.10040.4.3", // dsaWithSha1
65
+ "1.2.840.10045.4.1", // ecdsa-with-SHA1
66
+ ]);
67
+ const SUPPORTED_CRITICAL_EXTENSION_OIDS = new Set([
68
+ "2.5.29.14", // subjectKeyIdentifier
69
+ "2.5.29.15", // keyUsage
70
+ "2.5.29.17", // subjectAltName
71
+ "2.5.29.18", // issuerAltName
72
+ "2.5.29.19", // basicConstraints
73
+ "2.5.29.30", // nameConstraints
74
+ "2.5.29.31", // cRLDistributionPoints
75
+ "2.5.29.32", // certificatePolicies
76
+ "2.5.29.33", // policyMappings
77
+ "2.5.29.35", // authorityKeyIdentifier
78
+ "2.5.29.36", // policyConstraints
79
+ "2.5.29.37", // extendedKeyUsage
80
+ "2.5.29.46", // freshestCRL
81
+ "2.5.29.54", // inhibitAnyPolicy
82
+ ]);
83
+ const DEFAULT_MAX_CHAIN_LENGTH = 8;
84
+ const DEFAULT_MAX_CERTIFICATE_BYTES = 64 * 1024;
85
+ const DEFAULT_MAX_TOTAL_BYTES = 256 * 1024;
86
+ function failure(error) {
87
+ return { success: false, error };
88
+ }
89
+ function positiveInteger(value, fallback, field) {
90
+ const normalized = value ?? fallback;
91
+ if (!Number.isSafeInteger(normalized) || normalized <= 0) {
92
+ throw new TypeError(`${field} must be a positive safe integer`);
93
+ }
94
+ return normalized;
95
+ }
96
+ function normalizePolicy(policy) {
97
+ const requiredExtendedKeyUsages = policy.requiredExtendedKeyUsages ?? [];
98
+ if (requiredExtendedKeyUsages.some((value) => typeof value !== "string" || !/^[0-9]+(?:\.[0-9]+)+$/.test(value)) ||
99
+ new Set(requiredExtendedKeyUsages).size !== requiredExtendedKeyUsages.length) {
100
+ throw new TypeError("requiredExtendedKeyUsages must contain unique OIDs");
101
+ }
102
+ const revocationMode = policy.revocationMode ?? "disabled";
103
+ if (revocationMode === "required" && !policy.revocationChecker) {
104
+ throw new TypeError("revocationChecker is required when revocationMode is required");
105
+ }
106
+ return Object.freeze({
107
+ maxChainLength: positiveInteger(policy.maxChainLength, DEFAULT_MAX_CHAIN_LENGTH, "maxChainLength"),
108
+ maxCertificateBytes: positiveInteger(policy.maxCertificateBytes, DEFAULT_MAX_CERTIFICATE_BYTES, "maxCertificateBytes"),
109
+ maxTotalBytes: positiveInteger(policy.maxTotalBytes, DEFAULT_MAX_TOTAL_BYTES, "maxTotalBytes"),
110
+ requireDigitalSignatureKeyUsage: policy.requireDigitalSignatureKeyUsage !== false,
111
+ requiredExtendedKeyUsages: Object.freeze([...requiredExtendedKeyUsages]),
112
+ requireSubjectAlternativeName: policy.requireSubjectAlternativeName !== false,
113
+ revocationMode,
114
+ revocationChecker: policy.revocationChecker,
115
+ });
116
+ }
117
+ function normalizeBase64Der(value, allowPem) {
118
+ let base64 = value.trim();
119
+ const pemMatch = base64.match(/^-----BEGIN CERTIFICATE-----\s*([A-Za-z0-9+/=\s]+?)\s*-----END CERTIFICATE-----$/);
120
+ if (pemMatch) {
121
+ if (!allowPem)
122
+ return undefined;
123
+ base64 = pemMatch[1].replace(/\s/g, "");
124
+ }
125
+ else if (/\s/.test(base64)) {
126
+ return undefined;
127
+ }
128
+ if (base64.length === 0 ||
129
+ base64.length % 4 !== 0 ||
130
+ !/^[A-Za-z0-9+/]+={0,2}$/.test(base64)) {
131
+ return undefined;
132
+ }
133
+ return base64;
134
+ }
135
+ function parseCertificate(value, allowPem, maxCertificateBytes) {
136
+ const base64 = normalizeBase64Der(value, allowPem);
137
+ if (!base64)
138
+ return undefined;
139
+ let bytes;
140
+ try {
141
+ bytes = new Uint8Array(buffer_1.Buffer.from(base64, "base64"));
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ if (bytes.byteLength === 0 ||
147
+ bytes.byteLength > maxCertificateBytes ||
148
+ buffer_1.Buffer.from(bytes).toString("base64") !== base64) {
149
+ return undefined;
150
+ }
151
+ const der = bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
152
+ const asn1 = asn1js.fromBER(der);
153
+ if (asn1.offset !== der.byteLength || asn1.result.error)
154
+ return undefined;
155
+ try {
156
+ const certificate = new pkijs.Certificate({ schema: asn1.result });
157
+ return {
158
+ certificate,
159
+ der: new Uint8Array(bytes),
160
+ fingerprintKey: buffer_1.Buffer.from(bytes).toString("hex"),
161
+ };
162
+ }
163
+ catch {
164
+ return undefined;
165
+ }
166
+ }
167
+ function toPem(der) {
168
+ const base64 = buffer_1.Buffer.from(der).toString("base64");
169
+ const lines = base64.match(/.{1,64}/g) ?? [];
170
+ return `-----BEGIN CERTIFICATE-----\n${lines.join("\n")}\n-----END CERTIFICATE-----`;
171
+ }
172
+ function extension(certificate, oid) {
173
+ return certificate.extensions?.find((item) => item.extnID === oid);
174
+ }
175
+ function isCertificateAuthority(certificate) {
176
+ const value = extension(certificate, OID.basicConstraints)?.parsedValue;
177
+ return value instanceof pkijs.BasicConstraints && value.cA === true;
178
+ }
179
+ function hasDigitalSignatureKeyUsage(certificate) {
180
+ const value = extension(certificate, OID.keyUsage)?.parsedValue;
181
+ if (!(value instanceof asn1js.BitString))
182
+ return false;
183
+ const bytes = value.valueBlock.valueHexView;
184
+ return bytes.length > 0 && (bytes[0] & 0x80) === 0x80;
185
+ }
186
+ function extendedKeyUsages(certificate) {
187
+ const value = extension(certificate, OID.extendedKeyUsage)?.parsedValue;
188
+ return value instanceof pkijs.ExtKeyUsage ? value.keyPurposes : [];
189
+ }
190
+ function subjectAlternativeNames(certificate) {
191
+ const value = extension(certificate, OID.subjectAltName)?.parsedValue;
192
+ if (!(value instanceof pkijs.AltName))
193
+ return [];
194
+ return Object.freeze(value.altNames
195
+ .filter((name) => name.type === 2 && typeof name.value === "string")
196
+ .map((name) => String(name.value).toLowerCase()));
197
+ }
198
+ function normalizeHostname(value) {
199
+ let hostname = value.trim();
200
+ try {
201
+ hostname = new URL(hostname).hostname;
202
+ }
203
+ catch {
204
+ // A bare DNS name is accepted below.
205
+ }
206
+ hostname = hostname.toLowerCase().replace(/\.$/, "");
207
+ if (hostname.length === 0 ||
208
+ hostname.length > 253 ||
209
+ hostname.includes(":") ||
210
+ hostname.split(".").some((label) => label.length === 0 ||
211
+ label.length > 63 ||
212
+ !/^[a-z0-9-]+$/.test(label) ||
213
+ label.startsWith("-") ||
214
+ label.endsWith("-"))) {
215
+ return undefined;
216
+ }
217
+ return hostname;
218
+ }
219
+ function dnsNameMatches(hostname, certificateName) {
220
+ const pattern = certificateName.toLowerCase().replace(/\.$/, "");
221
+ if (!pattern.includes("*"))
222
+ return pattern === hostname;
223
+ if (!pattern.startsWith("*.") ||
224
+ pattern.indexOf("*", 1) !== -1) {
225
+ return false;
226
+ }
227
+ const suffix = pattern.slice(2);
228
+ const hostnameLabels = hostname.split(".");
229
+ const suffixLabels = suffix.split(".");
230
+ return (suffixLabels.length >= 2 &&
231
+ hostnameLabels.length === suffixLabels.length + 1 &&
232
+ hostnameLabels.slice(1).join(".") === suffix);
233
+ }
234
+ function objectIdentifierValue(value) {
235
+ return value instanceof asn1js.ObjectIdentifier
236
+ ? value.valueBlock.toString()
237
+ : undefined;
238
+ }
239
+ function algorithmMatches(certificate, algorithm) {
240
+ const publicKeyAlgorithm = certificate.subjectPublicKeyInfo.algorithm;
241
+ const keyOid = publicKeyAlgorithm.algorithmId;
242
+ const curveOid = objectIdentifierValue(publicKeyAlgorithm.algorithmParams);
243
+ switch (algorithm) {
244
+ case "ES256":
245
+ return keyOid === OID.ecPublicKey && curveOid === OID.p256;
246
+ case "ES384":
247
+ return keyOid === OID.ecPublicKey && curveOid === OID.p384;
248
+ case "ES512":
249
+ return keyOid === OID.ecPublicKey && curveOid === OID.p521;
250
+ case "ES256K":
251
+ return keyOid === OID.ecPublicKey && curveOid === OID.secp256k1;
252
+ case "RS256":
253
+ case "RS384":
254
+ case "RS512":
255
+ case "PS256":
256
+ case "PS384":
257
+ case "PS512":
258
+ return keyOid === OID.rsaEncryption;
259
+ case "EdDSA":
260
+ return keyOid === OID.ed25519;
261
+ default:
262
+ return false;
263
+ }
264
+ }
265
+ function isWeaklySigned(certificate) {
266
+ return WEAK_SIGNATURE_ALGORITHM_OIDS.has(certificate.signatureAlgorithm.algorithmId);
267
+ }
268
+ function certificateTimeError(certificate, validationTime) {
269
+ if (certificate.notBefore.value.getTime() > validationTime.getTime()) {
270
+ return error_1.X509ChainVerificationError.CertificateNotYetValid;
271
+ }
272
+ if (certificate.notAfter.value.getTime() < validationTime.getTime()) {
273
+ return error_1.X509ChainVerificationError.CertificateExpired;
274
+ }
275
+ return undefined;
276
+ }
277
+ async function sha256Hex(value) {
278
+ const digest = await uncrypto_1.default.subtle.digest("SHA-256", new Uint8Array(value));
279
+ return buffer_1.Buffer.from(digest).toString("hex");
280
+ }
281
+ class X509ChainVerifier {
282
+ policy;
283
+ constructor(policy = {}) {
284
+ this.policy = normalizePolicy(policy);
285
+ }
286
+ async verify(input) {
287
+ if (!Array.isArray(input.x5c) || input.x5c.length === 0) {
288
+ return failure(error_1.X509ChainVerificationError.EmptyChain);
289
+ }
290
+ if (input.x5c.length > this.policy.maxChainLength) {
291
+ return failure(error_1.X509ChainVerificationError.ChainTooLong);
292
+ }
293
+ if (!Array.isArray(input.trustedCertificates) ||
294
+ input.trustedCertificates.length === 0) {
295
+ return failure(error_1.X509ChainVerificationError.NoTrustAnchors);
296
+ }
297
+ const chain = [];
298
+ let totalBytes = 0;
299
+ for (const encodedCertificate of input.x5c) {
300
+ if (typeof encodedCertificate !== "string") {
301
+ return failure(error_1.X509ChainVerificationError.InvalidCertificateEncoding);
302
+ }
303
+ const parsed = parseCertificate(encodedCertificate, false, this.policy.maxCertificateBytes);
304
+ if (!parsed) {
305
+ return failure(error_1.X509ChainVerificationError.InvalidCertificateEncoding);
306
+ }
307
+ totalBytes += parsed.der.byteLength;
308
+ if (totalBytes > this.policy.maxTotalBytes) {
309
+ return failure(error_1.X509ChainVerificationError.ChainTooLarge);
310
+ }
311
+ chain.push(parsed);
312
+ }
313
+ if (new Set(chain.map((item) => item.fingerprintKey)).size !== chain.length) {
314
+ return failure(error_1.X509ChainVerificationError.DuplicateCertificate);
315
+ }
316
+ const trustAnchors = [];
317
+ for (const encodedCertificate of input.trustedCertificates) {
318
+ if (typeof encodedCertificate !== "string") {
319
+ return failure(error_1.X509ChainVerificationError.InvalidTrustAnchor);
320
+ }
321
+ const parsed = parseCertificate(encodedCertificate, true, this.policy.maxCertificateBytes);
322
+ if (!parsed) {
323
+ return failure(error_1.X509ChainVerificationError.InvalidTrustAnchor);
324
+ }
325
+ trustAnchors.push(parsed);
326
+ }
327
+ if (new Set(trustAnchors.map((item) => item.fingerprintKey)).size !==
328
+ trustAnchors.length) {
329
+ return failure(error_1.X509ChainVerificationError.InvalidTrustAnchor);
330
+ }
331
+ for (let index = 0; index < chain.length - 1; index++) {
332
+ if (!chain[index].certificate.issuer.isEqual(chain[index + 1].certificate.subject)) {
333
+ return failure(error_1.X509ChainVerificationError.InvalidChainOrder);
334
+ }
335
+ }
336
+ const validationTime = input.validationTime
337
+ ? new Date(input.validationTime)
338
+ : new Date();
339
+ if (Number.isNaN(validationTime.getTime())) {
340
+ return failure(error_1.X509ChainVerificationError.InvalidValidationTime);
341
+ }
342
+ for (const item of [...chain, ...trustAnchors]) {
343
+ const timeError = certificateTimeError(item.certificate, validationTime);
344
+ if (timeError)
345
+ return failure(timeError);
346
+ }
347
+ if (chain.some((item) => isWeaklySigned(item.certificate))) {
348
+ return failure(error_1.X509ChainVerificationError.WeakCertificateSignature);
349
+ }
350
+ if (chain.some((item) => item.certificate.extensions?.some((item) => item.critical && !SUPPORTED_CRITICAL_EXTENSION_OIDS.has(item.extnID)))) {
351
+ return failure(error_1.X509ChainVerificationError.UnsupportedCriticalExtension);
352
+ }
353
+ const leaf = chain[0].certificate;
354
+ if (isCertificateAuthority(leaf)) {
355
+ return failure(error_1.X509ChainVerificationError.LeafIsCertificateAuthority);
356
+ }
357
+ if (this.policy.requireDigitalSignatureKeyUsage &&
358
+ !hasDigitalSignatureKeyUsage(leaf)) {
359
+ return failure(error_1.X509ChainVerificationError.InvalidLeafKeyUsage);
360
+ }
361
+ if (input.algorithm !== undefined && !algorithmMatches(leaf, input.algorithm)) {
362
+ return failure(error_1.X509ChainVerificationError.AlgorithmMismatch);
363
+ }
364
+ const leafExtendedKeyUsages = extendedKeyUsages(leaf);
365
+ if (this.policy.requiredExtendedKeyUsages.length > 0 &&
366
+ !leafExtendedKeyUsages.includes(OID.anyExtendedKeyUsage) &&
367
+ !this.policy.requiredExtendedKeyUsages.some((oid) => leafExtendedKeyUsages.includes(oid))) {
368
+ return failure(error_1.X509ChainVerificationError.ExtendedKeyUsageMismatch);
369
+ }
370
+ const names = subjectAlternativeNames(leaf);
371
+ if (input.expectedHostname !== undefined) {
372
+ const expectedHostname = normalizeHostname(input.expectedHostname);
373
+ if (!expectedHostname) {
374
+ return failure(error_1.X509ChainVerificationError.InvalidExpectedHostname);
375
+ }
376
+ if ((this.policy.requireSubjectAlternativeName && names.length === 0) ||
377
+ !names.some((name) => dnsNameMatches(expectedHostname, name))) {
378
+ return failure(error_1.X509ChainVerificationError.HostnameMismatch);
379
+ }
380
+ }
381
+ pkijs.setEngine("ubid-x509-webcrypto", uncrypto_1.default, new pkijs.CryptoEngine({
382
+ name: "ubid-x509-webcrypto",
383
+ crypto: uncrypto_1.default,
384
+ subtle: uncrypto_1.default.subtle,
385
+ }));
386
+ let path;
387
+ try {
388
+ const verificationResult = await new pkijs.CertificateChainValidationEngine({
389
+ trustedCerts: trustAnchors.map((item) => item.certificate),
390
+ certs: chain.map((item) => item.certificate).reverse(),
391
+ checkDate: validationTime,
392
+ }).verify();
393
+ if (!verificationResult.result || !verificationResult.certificatePath) {
394
+ console.error("[X509ChainVerifier] PKIjs validation failed", {
395
+ result: verificationResult.result,
396
+ resultCode: verificationResult.resultCode,
397
+ resultMessage: verificationResult.resultMessage,
398
+ inputChainLength: chain.length,
399
+ trustAnchorCount: trustAnchors.length,
400
+ });
401
+ return failure(error_1.X509ChainVerificationError.InvalidCertificateChain);
402
+ }
403
+ path = verificationResult.certificatePath;
404
+ }
405
+ catch (error) {
406
+ console.error("[X509ChainVerifier] PKIjs threw", {
407
+ name: error instanceof Error ? error.name : undefined,
408
+ message: error instanceof Error ? error.message : String(error),
409
+ inputChainLength: chain.length,
410
+ trustAnchorCount: trustAnchors.length,
411
+ });
412
+ return failure(error_1.X509ChainVerificationError.InvalidCertificateChain);
413
+ }
414
+ const trustAnchor = path[path.length - 1];
415
+ const parsedTrustAnchor = trustAnchors.find((item) => item.certificate.tbsView.byteLength === trustAnchor.tbsView.byteLength &&
416
+ item.fingerprintKey === buffer_1.Buffer.from(trustAnchor.toSchema().toBER(false)).toString("hex"));
417
+ if (!parsedTrustAnchor) {
418
+ return failure(error_1.X509ChainVerificationError.UntrustedRoot);
419
+ }
420
+ if (this.policy.revocationMode === "required") {
421
+ const checker = this.policy.revocationChecker;
422
+ if (!checker) {
423
+ return failure(error_1.X509ChainVerificationError.RevocationStatusUnavailable);
424
+ }
425
+ for (let index = 0; index < path.length - 1; index++) {
426
+ let status;
427
+ try {
428
+ status = await checker.check({
429
+ certificateDer: new Uint8Array(path[index].toSchema().toBER(false)),
430
+ issuerCertificateDer: new Uint8Array(path[index + 1].toSchema().toBER(false)),
431
+ validationTime: new Date(validationTime),
432
+ });
433
+ }
434
+ catch {
435
+ return failure(error_1.X509ChainVerificationError.RevocationStatusUnavailable);
436
+ }
437
+ if (status === "revoked") {
438
+ return failure(error_1.X509ChainVerificationError.CertificateRevoked);
439
+ }
440
+ if (status !== "good") {
441
+ return failure(error_1.X509ChainVerificationError.RevocationStatusUnavailable);
442
+ }
443
+ }
444
+ }
445
+ return {
446
+ success: true,
447
+ value: {
448
+ leafCertificatePem: toPem(chain[0].der),
449
+ leafCertificateDer: new Uint8Array(chain[0].der),
450
+ chainLength: path.length,
451
+ subjectAlternativeNames: names,
452
+ trustAnchorFingerprintSha256: await sha256Hex(parsedTrustAnchor.der),
453
+ },
454
+ };
455
+ }
456
+ }
457
+ exports.X509ChainVerifier = X509ChainVerifier;
458
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWDUwOUNoYWluVmVyaWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMveDUwOS9YNTA5Q2hhaW5WZXJpZmllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBaUM7QUFDakMsNkNBQStCO0FBQy9CLG1DQUFnQztBQUNoQyx3REFBaUM7QUFDakMsb0NBQXNEO0FBR3RELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDekIsV0FBVyxFQUFFLG1CQUFtQjtJQUNoQyxhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsSUFBSSxFQUFFLGNBQWM7SUFDcEIsSUFBSSxFQUFFLGNBQWM7SUFDcEIsU0FBUyxFQUFFLGNBQWM7SUFDekIsZ0JBQWdCLEVBQUUsV0FBVztJQUM3QixRQUFRLEVBQUUsV0FBVztJQUNyQixnQkFBZ0IsRUFBRSxXQUFXO0lBQzdCLGNBQWMsRUFBRSxXQUFXO0lBQzNCLG1CQUFtQixFQUFFLGFBQWE7Q0FDbEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSw2QkFBNkIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM3QyxzQkFBc0IsRUFBRSx1QkFBdUI7SUFDL0Msc0JBQXNCLEVBQUUsdUJBQXVCO0lBQy9DLHNCQUFzQixFQUFFLHVCQUF1QjtJQUMvQyxzQkFBc0IsRUFBRSx3QkFBd0I7SUFDaEQsbUJBQW1CLEVBQUUsY0FBYztJQUNuQyxtQkFBbUIsRUFBRSxrQkFBa0I7Q0FDdkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNqRCxXQUFXLEVBQUUsdUJBQXVCO0lBQ3BDLFdBQVcsRUFBRSxXQUFXO0lBQ3hCLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsV0FBVyxFQUFFLGdCQUFnQjtJQUM3QixXQUFXLEVBQUUs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
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "ubid-common",
3
+ "version": "0.1.0",
4
+ "description": "Shared credential parsing, rendering, verification, trust, and cryptographic utility components for the UbID ecosystem.",
5
+ "keywords": [
6
+ "ubid",
7
+ "digital-identity",
8
+ "verifiable-credentials",
9
+ "openid4vci",
10
+ "openid4vp",
11
+ "sd-jwt",
12
+ "mdoc",
13
+ "digital-credentials",
14
+ "identity",
15
+ "verification"
16
+ ],
17
+ "type": "commonjs",
18
+ "main": "./dist/index.js",
19
+ "types": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "require": "./dist/index.js",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/paradigma-cl/ubid-common.git"
34
+ },
35
+ "bugs": {
36
+ "url": "https://github.com/paradigma-cl/ubid-common/issues"
37
+ },
38
+ "homepage": "https://github.com/paradigma-cl/ubid-common#readme",
39
+ "engines": {
40
+ "node": ">=20.19"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public",
44
+ "registry": "https://registry.npmjs.org/"
45
+ },
46
+ "scripts": {
47
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
48
+ "build": "npm run clean && tsc",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "vitest run --maxWorkers=1",
51
+ "test:watch": "vitest",
52
+ "prepack": "npm run build"
53
+ },
54
+ "dependencies": {
55
+ "@auth0/mdl": "^2.2.0",
56
+ "@sd-jwt/core": "^0.10.0",
57
+ "@sd-jwt/sd-jwt-vc": "^0.13.0",
58
+ "asn1js": "^3.0.5",
59
+ "axios": "^1.20.0",
60
+ "buffer": "^6.0.3",
61
+ "cose-kit": "^1.7.1",
62
+ "jose": "^5.9.6",
63
+ "jsonpointer": "^5.0.1",
64
+ "pako": "2.1.0",
65
+ "pkijs": "^3.2.4",
66
+ "uncrypto": "^0.1.3",
67
+ "zod": "^3.24.1"
68
+ },
69
+ "devDependencies": {
70
+ "@sd-jwt/types": "^0.10.0",
71
+ "@types/node": "^22.20.1",
72
+ "@xmldom/xmldom": "^0.9.12",
73
+ "typescript": "^5.9.3",
74
+ "vitest": "^4.1.10"
75
+ },
76
+ "overrides": {
77
+ "ajv": "8.20.0",
78
+ "fast-uri": "3.1.6",
79
+ "form-data": "4.0.6",
80
+ "follow-redirects": "1.16.0"
81
+ }
82
+ }