@verana-labs/vs-agent-plugin-openid4vc 1.11.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 (51) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +193 -0
  3. package/build/config.d.ts +5 -0
  4. package/build/config.js +279 -0
  5. package/build/config.js.map +1 -0
  6. package/build/index.d.ts +12 -0
  7. package/build/index.js +28 -0
  8. package/build/index.js.map +1 -0
  9. package/build/nestjs/IssuerController.d.ts +8 -0
  10. package/build/nestjs/IssuerController.js +66 -0
  11. package/build/nestjs/IssuerController.js.map +1 -0
  12. package/build/nestjs/OpenId4VcPlugin.d.ts +3 -0
  13. package/build/nestjs/OpenId4VcPlugin.js +61 -0
  14. package/build/nestjs/OpenId4VcPlugin.js.map +1 -0
  15. package/build/nestjs/VerifierController.d.ts +8 -0
  16. package/build/nestjs/VerifierController.js +66 -0
  17. package/build/nestjs/VerifierController.js.map +1 -0
  18. package/build/nestjs/dto.d.ts +7 -0
  19. package/build/nestjs/dto.js +34 -0
  20. package/build/nestjs/dto.js.map +1 -0
  21. package/build/sdk/setupOpenId4Vc.d.ts +18 -0
  22. package/build/sdk/setupOpenId4Vc.js +111 -0
  23. package/build/sdk/setupOpenId4Vc.js.map +1 -0
  24. package/build/services/CertificateService.d.ts +22 -0
  25. package/build/services/CertificateService.js +249 -0
  26. package/build/services/CertificateService.js.map +1 -0
  27. package/build/services/IssuerService.d.ts +47 -0
  28. package/build/services/IssuerService.js +185 -0
  29. package/build/services/IssuerService.js.map +1 -0
  30. package/build/services/VerifierService.d.ts +57 -0
  31. package/build/services/VerifierService.js +289 -0
  32. package/build/services/VerifierService.js.map +1 -0
  33. package/build/trust/CertificateTrust.d.ts +7 -0
  34. package/build/trust/CertificateTrust.js +29 -0
  35. package/build/trust/CertificateTrust.js.map +1 -0
  36. package/build/trust/TrustClient.d.ts +12 -0
  37. package/build/trust/TrustClient.js +120 -0
  38. package/build/trust/TrustClient.js.map +1 -0
  39. package/build/trust/keyBinding.d.ts +14 -0
  40. package/build/trust/keyBinding.js +171 -0
  41. package/build/trust/keyBinding.js.map +1 -0
  42. package/build/trust/types.d.ts +28 -0
  43. package/build/trust/types.js +3 -0
  44. package/build/trust/types.js.map +1 -0
  45. package/build/trust/verdict.d.ts +2 -0
  46. package/build/trust/verdict.js +13 -0
  47. package/build/trust/verdict.js.map +1 -0
  48. package/build/types.d.ts +55 -0
  49. package/build/types.js +3 -0
  50. package/build/types.js.map +1 -0
  51. package/package.json +47 -0
@@ -0,0 +1,18 @@
1
+ import type { OpenId4VcPluginOptions } from '../types';
2
+ import { X509Module } from '@credo-ts/core';
3
+ import { OpenId4VcModule, type OpenId4VciCredentialRequestToCredentialMapper } from '@credo-ts/openid4vc';
4
+ import { type Express } from 'express';
5
+ export interface OpenId4VcIssuerRequestMapper {
6
+ mapCredentialRequest: OpenId4VciCredentialRequestToCredentialMapper;
7
+ getVctMetadata: (configurationId: string) => Record<string, unknown> | undefined;
8
+ }
9
+ export interface OpenId4VcAgentModules {
10
+ [key: string]: unknown;
11
+ openId4Vc: OpenId4VcModule<null, null>;
12
+ x509: X509Module;
13
+ }
14
+ export interface OpenId4VcSdkPlugin {
15
+ modules: OpenId4VcAgentModules;
16
+ publicMiddleware: Express;
17
+ }
18
+ export declare function setupOpenId4Vc(options: OpenId4VcPluginOptions, getIssuerService?: () => OpenId4VcIssuerRequestMapper): OpenId4VcSdkPlugin;
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupOpenId4Vc = setupOpenId4Vc;
7
+ const core_1 = require("@credo-ts/core");
8
+ const openid4vc_1 = require("@credo-ts/openid4vc");
9
+ const express_1 = __importDefault(require("express"));
10
+ const CertificateTrust_1 = require("../trust/CertificateTrust");
11
+ const ATTESTATION_AUTH_METHOD = 'attest_jwt_client_auth';
12
+ const ATTESTATION_ALGORITHMS = ['ES256'];
13
+ function setupOpenId4Vc(options, getIssuerService) {
14
+ var _a, _b;
15
+ const walletAttestationCertificates = (_a = options.issuer) === null || _a === void 0 ? void 0 : _a.walletAttestationCertificates;
16
+ const walletAttestationEnabled = ((_b = options.issuer) === null || _b === void 0 ? void 0 : _b.requireWalletAttestation) === true && Boolean(walletAttestationCertificates === null || walletAttestationCertificates === void 0 ? void 0 : walletAttestationCertificates.length);
17
+ if (walletAttestationEnabled && walletAttestationCertificates) {
18
+ assertValidWalletAttestationCertificates(walletAttestationCertificates);
19
+ }
20
+ const app = (0, express_1.default)();
21
+ if (walletAttestationEnabled)
22
+ app.use(advertiseWalletAttestationMetadata);
23
+ if (options.issuer) {
24
+ app.get('/oid4vc/vct/:configurationId', (request, response, next) => {
25
+ try {
26
+ if (!getIssuerService)
27
+ throw new Error('OpenID4VC issuer service is not initialized');
28
+ const metadata = getIssuerService().getVctMetadata(request.params.configurationId);
29
+ if (!metadata) {
30
+ response.status(404).json({ message: 'credential configuration not found' });
31
+ return;
32
+ }
33
+ response.json(metadata);
34
+ }
35
+ catch (error) {
36
+ next(error);
37
+ }
38
+ });
39
+ }
40
+ const moduleOptions = Object.assign(Object.assign({
41
+ // Credo declares Express 5, while VS Agent mounts the compatible Express 4 application.
42
+ app: app }, (options.issuer
43
+ ? {
44
+ issuer: {
45
+ baseUrl: `${options.publicApiBaseUrl}/oid4vci`,
46
+ walletAttestationsRequired: walletAttestationEnabled,
47
+ credentialRequestToCredentialMapper: input => {
48
+ if (!getIssuerService) {
49
+ throw new Error('OpenID4VC issuer service is not initialized');
50
+ }
51
+ return getIssuerService().mapCredentialRequest(input);
52
+ },
53
+ },
54
+ }
55
+ : {})), (options.verifier ? { verifier: { baseUrl: `${options.publicApiBaseUrl}/oid4vp` } } : {}));
56
+ return {
57
+ modules: {
58
+ openId4Vc: new openid4vc_1.OpenId4VcModule(moduleOptions),
59
+ x509: new core_1.X509Module({
60
+ getTrustedCertificatesForVerification: (_agentContext, { certificateChain, verification }) => (0, CertificateTrust_1.trustedCertificatesForVerification)(options, {
61
+ type: verification.type,
62
+ certificateChain,
63
+ }),
64
+ }),
65
+ },
66
+ publicMiddleware: app,
67
+ };
68
+ }
69
+ function assertValidWalletAttestationCertificates(certificates) {
70
+ certificates.forEach((certificate, index) => {
71
+ try {
72
+ core_1.X509Certificate.fromEncodedCertificate(certificate);
73
+ }
74
+ catch (_a) {
75
+ throw new Error(`issuer.walletAttestationCertificates[${index}] must be a valid X.509 certificate`);
76
+ }
77
+ });
78
+ }
79
+ function advertiseWalletAttestationMetadata(request, response, next) {
80
+ if (request.method !== 'GET' || !isAuthorizationServerMetadataPath(request.path)) {
81
+ next();
82
+ return;
83
+ }
84
+ const send = response.send.bind(response);
85
+ response.send = ((body) => send(typeof body === 'string' ? withWalletAttestationMetadata(body) : body));
86
+ next();
87
+ }
88
+ function withWalletAttestationMetadata(body) {
89
+ try {
90
+ const metadata = JSON.parse(body);
91
+ if (!isRecord(metadata))
92
+ return body;
93
+ const methods = Array.isArray(metadata.token_endpoint_auth_methods_supported)
94
+ ? metadata.token_endpoint_auth_methods_supported.filter((method) => typeof method === 'string')
95
+ : [];
96
+ if (!methods.includes(ATTESTATION_AUTH_METHOD))
97
+ methods.push(ATTESTATION_AUTH_METHOD);
98
+ return JSON.stringify(Object.assign(Object.assign({}, metadata), { token_endpoint_auth_methods_supported: methods, client_attestation_signing_alg_values_supported: ATTESTATION_ALGORITHMS, client_attestation_pop_signing_alg_values_supported: ATTESTATION_ALGORITHMS }));
99
+ }
100
+ catch (_a) {
101
+ return body;
102
+ }
103
+ }
104
+ function isAuthorizationServerMetadataPath(path) {
105
+ return (path.startsWith('/.well-known/oauth-authorization-server/') ||
106
+ path.endsWith('/.well-known/oauth-authorization-server'));
107
+ }
108
+ function isRecord(value) {
109
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
110
+ }
111
+ //# sourceMappingURL=setupOpenId4Vc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupOpenId4Vc.js","sourceRoot":"","sources":["../../src/sdk/setupOpenId4Vc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { OpenId4VcSigningOptions } from '../types';
2
+ import { type BaseAgent, X509Certificate } from '@credo-ts/core';
3
+ export type SigningRole = 'issuer' | 'verifier';
4
+ type CertificateAgent = Pick<BaseAgent, 'genericRecords' | 'kms' | 'x509'> & {
5
+ did?: string;
6
+ publicApiBaseUrl?: string;
7
+ };
8
+ export interface SigningCertificateHandle {
9
+ certificate: X509Certificate;
10
+ chain: X509Certificate[];
11
+ keyId: string;
12
+ development: boolean;
13
+ }
14
+ type DevelopmentDidAgent = {
15
+ did?: string;
16
+ dids: Pick<BaseAgent['dids'], 'resolve' | 'update'>;
17
+ };
18
+ export declare function loadSigningCertificate(agent: CertificateAgent, signing: OpenId4VcSigningOptions, publicApiBaseUrl?: string | undefined, role?: SigningRole): Promise<SigningCertificateHandle>;
19
+ export declare function didFromValidatedCertificate(certificate: X509Certificate): string;
20
+ export declare function publishDevelopmentSigningKey(agent: DevelopmentDidAgent, signingCertificate: SigningCertificateHandle, role: SigningRole): Promise<void>;
21
+ export declare function assertCertificateChainUsable(chain: X509Certificate[], now?: Date): void;
22
+ export {};
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadSigningCertificate = loadSigningCertificate;
4
+ exports.didFromValidatedCertificate = didFromValidatedCertificate;
5
+ exports.publishDevelopmentSigningKey = publishDevelopmentSigningKey;
6
+ exports.assertCertificateChainUsable = assertCertificateChainUsable;
7
+ const core_1 = require("@credo-ts/core");
8
+ const node_crypto_1 = require("node:crypto");
9
+ const DEVELOPMENT_CERTIFICATE_VALIDITY_MS = 365 * 24 * 60 * 60 * 1000;
10
+ const DEVELOPMENT_RECORD_PREFIX = 'openid4vc-development-signing';
11
+ async function loadSigningCertificate(agent, signing, publicApiBaseUrl = agent.publicApiBaseUrl, role = 'issuer') {
12
+ if (signing.configured) {
13
+ return await loadConfiguredSigningCertificate(agent, signing.configured);
14
+ }
15
+ return await loadDevelopmentSigningCertificate(agent, signing.development, publicApiBaseUrl, role);
16
+ }
17
+ function didFromValidatedCertificate(certificate) {
18
+ const did = certificate.sanUriNames.map(uri => { var _a; return (_a = (0, core_1.tryParseDid)(uri)) === null || _a === void 0 ? void 0 : _a.did; }).find(value => value !== undefined);
19
+ if (!did) {
20
+ throw new Error('certificate does not contain a DID URI SAN');
21
+ }
22
+ return did;
23
+ }
24
+ async function publishDevelopmentSigningKey(agent, signingCertificate, role) {
25
+ var _a, _b, _c, _d, _e;
26
+ if (!signingCertificate.development)
27
+ return;
28
+ const did = agent.did;
29
+ if (!did)
30
+ throw new Error('development signing key publication requires an agent DID');
31
+ let resolution;
32
+ try {
33
+ resolution = await agent.dids.resolve(did);
34
+ }
35
+ catch (_f) {
36
+ throw new Error('development signing key DID resolution failed');
37
+ }
38
+ if (((_a = resolution.didResolutionMetadata) === null || _a === void 0 ? void 0 : _a.error) || !resolution.didDocument) {
39
+ throw new Error('development signing key DID resolution failed');
40
+ }
41
+ if (resolution.didDocument.id !== did) {
42
+ throw new Error('development signing key DID resolution returned a different DID');
43
+ }
44
+ const methodId = `${did}#openid4vc-development-${role}`;
45
+ const purpose = role === 'issuer' ? 'assertionMethod' : 'authentication';
46
+ const publicJwk = canonicalP256PublicJwk(signingCertificate.certificate.publicJwk.toJson());
47
+ const existingMethod = (_b = resolution.didDocument.verificationMethod) === null || _b === void 0 ? void 0 : _b.find(method => method.id === methodId);
48
+ const relationship = (_c = resolution.didDocument[purpose]) !== null && _c !== void 0 ? _c : [];
49
+ if (existingMethod &&
50
+ equalVerificationMethodJwk(existingMethod, publicJwk) &&
51
+ relationship.some(method => (typeof method === 'string' ? method : method.id) === methodId)) {
52
+ return;
53
+ }
54
+ const didDocument = core_1.DidDocument.fromJSON(resolution.didDocument.toJSON());
55
+ didDocument.verificationMethod = [
56
+ ...((_d = didDocument.verificationMethod) !== null && _d !== void 0 ? _d : []).filter(method => method.id !== methodId),
57
+ new core_1.VerificationMethod({
58
+ id: methodId,
59
+ type: 'JsonWebKey2020',
60
+ controller: did,
61
+ publicKeyJwk: publicJwk,
62
+ }),
63
+ ];
64
+ didDocument[purpose] = [
65
+ ...((_e = didDocument[purpose]) !== null && _e !== void 0 ? _e : []).filter(method => (typeof method === 'string' ? method : method.id) !== methodId),
66
+ methodId,
67
+ ];
68
+ let update;
69
+ try {
70
+ update = await agent.dids.update({ did, didDocument });
71
+ }
72
+ catch (_g) {
73
+ throw new Error('development signing key DID update failed');
74
+ }
75
+ if (update.didState.state !== 'finished') {
76
+ throw new Error('development signing key DID update failed');
77
+ }
78
+ if (update.didState.did !== did || update.didState.didDocument.id !== did) {
79
+ throw new Error('development signing key DID update returned a different DID');
80
+ }
81
+ }
82
+ async function loadConfiguredSigningCertificate(agent, configured) {
83
+ var _a;
84
+ if (configured.certificateChain.length === 0) {
85
+ throw new Error('configured certificate chain must not be empty');
86
+ }
87
+ const chain = configured.certificateChain.map(encoded => core_1.X509Certificate.fromEncodedCertificate(encoded));
88
+ assertCertificateChainUsable(chain);
89
+ const configuredChainEndpoint = configured.certificateChain[configured.certificateChain.length - 1];
90
+ // This trust endpoint is operator-configured signing material, never a peer-provided chain.
91
+ const validatedRootToLeafChain = await agent.x509.validateCertificateChain({
92
+ certificateChain: configured.certificateChain,
93
+ trustedCertificates: [configuredChainEndpoint],
94
+ allowNonRootTrustedCertificate: true,
95
+ });
96
+ const validatedChain = [...validatedRootToLeafChain].reverse();
97
+ if (validatedChain.length !== chain.length ||
98
+ validatedChain.some((certificate, index) => !certificate.equal(chain[index]))) {
99
+ throw new Error('configured certificate chain must be ordered leaf-first');
100
+ }
101
+ const certificate = validatedChain[0];
102
+ if (certificate.subject === certificate.issuer) {
103
+ throw new Error('configured leaf certificate must not be self-signed');
104
+ }
105
+ const privatePublicJwk = canonicalP256PublicJwk(configured.privateJwk);
106
+ const certificatePublicJwk = canonicalP256PublicJwk(certificate.publicJwk.toJson());
107
+ if (!equalPublicJwk(privatePublicJwk, certificatePublicJwk)) {
108
+ throw new Error('configured private key does not match the leaf certificate');
109
+ }
110
+ const keyId = (_a = configured.privateJwk.kid) !== null && _a !== void 0 ? _a : core_1.Kms.PublicJwk.fromPublicJwk(privatePublicJwk).legacyKeyId;
111
+ let storedPublicJwk;
112
+ try {
113
+ storedPublicJwk = await agent.kms.getPublicKey({ keyId });
114
+ }
115
+ catch (error) {
116
+ if (!(error instanceof core_1.Kms.KeyManagementKeyNotFoundError))
117
+ throw error;
118
+ const imported = await agent.kms.importKey({
119
+ privateJwk: Object.assign(Object.assign({}, configured.privateJwk), { kid: keyId }),
120
+ });
121
+ storedPublicJwk = imported.publicJwk;
122
+ }
123
+ if (!equalPublicJwk(canonicalP256PublicJwk(storedPublicJwk), privatePublicJwk)) {
124
+ throw new Error('stored KMS key does not match the configured private key');
125
+ }
126
+ certificate.keyId = keyId;
127
+ return { certificate, chain: validatedChain, keyId, development: false };
128
+ }
129
+ async function loadDevelopmentSigningCertificate(agent, development, publicApiBaseUrl, role = 'issuer') {
130
+ if (development.enabled !== true) {
131
+ throw new Error('development certificate mode must be explicitly enabled');
132
+ }
133
+ if (!agent.did || !(0, core_1.tryParseDid)(agent.did)) {
134
+ throw new Error('development certificate mode requires an agent DID');
135
+ }
136
+ if (!publicApiBaseUrl) {
137
+ throw new Error('development certificate mode requires publicApiBaseUrl');
138
+ }
139
+ const hostname = hostnameFromPublicApiBaseUrl(publicApiBaseUrl);
140
+ const recordId = developmentRecordId(agent.did, hostname, development.commonName, role);
141
+ const existing = await agent.genericRecords.findById(recordId);
142
+ if (existing) {
143
+ const stored = parseDevelopmentRecord(existing.content);
144
+ const certificate = core_1.X509Certificate.fromEncodedCertificate(stored.certificate);
145
+ assertCertificateChainUsable([certificate]);
146
+ assertDevelopmentCertificateIdentity(certificate, agent.did, hostname);
147
+ const storedPublicJwk = await agent.kms.getPublicKey({ keyId: stored.keyId });
148
+ if (!equalPublicJwk(canonicalP256PublicJwk(storedPublicJwk), canonicalP256PublicJwk(certificate.publicJwk.toJson()))) {
149
+ throw new Error('stored development KMS key does not match its certificate');
150
+ }
151
+ certificate.keyId = stored.keyId;
152
+ return { certificate, chain: [certificate], keyId: stored.keyId, development: true };
153
+ }
154
+ const { keyId, publicJwk } = await agent.kms.createKey({ type: { kty: 'EC', crv: 'P-256' } });
155
+ const authorityKey = core_1.Kms.PublicJwk.fromPublicJwk(publicJwk);
156
+ const now = new Date();
157
+ const certificate = await agent.x509.createCertificate({
158
+ serialNumber: (0, node_crypto_1.createHash)('sha256').update(keyId).digest('hex').slice(0, 32),
159
+ authorityKey,
160
+ issuer: { commonName: development.commonName },
161
+ validity: {
162
+ notBefore: new Date(now.getTime() - 60000),
163
+ notAfter: new Date(now.getTime() + DEVELOPMENT_CERTIFICATE_VALIDITY_MS),
164
+ },
165
+ extensions: {
166
+ subjectKeyIdentifier: { include: true },
167
+ authorityKeyIdentifier: { include: true },
168
+ keyUsage: { usages: [core_1.X509KeyUsage.DigitalSignature] },
169
+ basicConstraints: { ca: false },
170
+ subjectAlternativeName: {
171
+ name: [
172
+ { type: 'url', value: agent.did },
173
+ { type: 'dns', value: hostname },
174
+ ],
175
+ },
176
+ },
177
+ });
178
+ certificate.keyId = keyId;
179
+ await agent.genericRecords.save({
180
+ id: recordId,
181
+ content: { certificate: certificate.toString('base64'), keyId },
182
+ });
183
+ return { certificate, chain: [certificate], keyId, development: true };
184
+ }
185
+ function assertCertificateChainUsable(chain, now = new Date()) {
186
+ for (const certificate of chain) {
187
+ if (certificate.data.notAfter.getTime() < now.getTime()) {
188
+ throw new Error('certificate chain contains an expired certificate');
189
+ }
190
+ if (certificate.data.notBefore.getTime() > now.getTime()) {
191
+ throw new Error('certificate chain contains a certificate that is not yet valid');
192
+ }
193
+ }
194
+ }
195
+ function assertDevelopmentCertificateIdentity(certificate, expectedDid, expectedHostname) {
196
+ if (certificate.subject !== certificate.issuer) {
197
+ throw new Error('stored development certificate is not self-signed');
198
+ }
199
+ if (didFromValidatedCertificate(certificate) !== expectedDid) {
200
+ throw new Error('stored development certificate DID does not match the agent DID');
201
+ }
202
+ if (!certificate.sanDnsNames.includes(expectedHostname)) {
203
+ throw new Error('stored development certificate DNS SAN does not match publicApiBaseUrl');
204
+ }
205
+ }
206
+ function canonicalP256PublicJwk(jwk) {
207
+ if (!isRecord(jwk))
208
+ throw new Error('certificate signing key must be a P-256 key');
209
+ if (jwk.kty !== 'EC' || jwk.crv !== 'P-256' || typeof jwk.x !== 'string' || typeof jwk.y !== 'string') {
210
+ throw new Error('certificate signing key must be a P-256 key');
211
+ }
212
+ return { kty: 'EC', crv: 'P-256', x: jwk.x, y: jwk.y };
213
+ }
214
+ function equalPublicJwk(left, right) {
215
+ return left.kty === right.kty && left.crv === right.crv && left.x === right.x && left.y === right.y;
216
+ }
217
+ function equalVerificationMethodJwk(method, expected) {
218
+ try {
219
+ return equalPublicJwk(canonicalP256PublicJwk(method.publicKeyJwk), expected);
220
+ }
221
+ catch (_a) {
222
+ return false;
223
+ }
224
+ }
225
+ function hostnameFromPublicApiBaseUrl(publicApiBaseUrl) {
226
+ try {
227
+ const hostname = new URL(publicApiBaseUrl).hostname;
228
+ if (!hostname)
229
+ throw new Error();
230
+ return hostname;
231
+ }
232
+ catch (_a) {
233
+ throw new Error('development certificate mode requires a valid publicApiBaseUrl');
234
+ }
235
+ }
236
+ function developmentRecordId(did, hostname, commonName, role) {
237
+ const suffix = (0, node_crypto_1.createHash)('sha256').update(`${did}\0${hostname}\0${commonName}\0${role}`).digest('hex');
238
+ return `${DEVELOPMENT_RECORD_PREFIX}:${suffix}`;
239
+ }
240
+ function parseDevelopmentRecord(content) {
241
+ if (typeof content.certificate !== 'string' || typeof content.keyId !== 'string') {
242
+ throw new Error('stored development certificate record is invalid');
243
+ }
244
+ return { certificate: content.certificate, keyId: content.keyId };
245
+ }
246
+ function isRecord(value) {
247
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
248
+ }
249
+ //# sourceMappingURL=CertificateService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificateService.js","sourceRoot":"","sources":["../../src/services/CertificateService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { OpenId4VcPluginOptions } from '../types';
2
+ import type { BaseAgent, SdJwtVcTypeMetadata } from '@credo-ts/core';
3
+ import type { OpenId4VcIssuanceSessionRecord, OpenId4VcIssuerApi, OpenId4VciCredentialRequestToCredentialMapper } from '@credo-ts/openid4vc';
4
+ type IssuerApi = Pick<OpenId4VcIssuerApi, 'getIssuerByIssuerId' | 'createIssuer' | 'updateIssuerMetadata' | 'createCredentialOffer' | 'getIssuanceSessionById'>;
5
+ export type OpenId4VcIssuerAgent = Pick<BaseAgent, 'dids' | 'genericRecords' | 'kms' | 'x509'> & {
6
+ did?: string;
7
+ modules: {
8
+ openId4Vc?: {
9
+ issuer?: IssuerApi;
10
+ };
11
+ };
12
+ };
13
+ export interface OpenId4VcOfferResult {
14
+ credentialOffer: string;
15
+ issuanceSessionId: string;
16
+ }
17
+ export interface OpenId4VcOfferState {
18
+ id: string;
19
+ state: OpenId4VcIssuanceSessionRecord['state'];
20
+ createdAt: Date;
21
+ expiresAt?: Date;
22
+ }
23
+ export declare class OpenId4VcIssuerRequestError extends Error {
24
+ }
25
+ export declare class OpenId4VcOfferNotFoundError extends Error {
26
+ }
27
+ export declare class IssuerService {
28
+ private readonly agent;
29
+ private readonly options;
30
+ private initialization?;
31
+ private signingCertificate?;
32
+ private initialized;
33
+ constructor(agent: OpenId4VcIssuerAgent, options: OpenId4VcPluginOptions);
34
+ ensureInitialized(): Promise<void>;
35
+ createOffer(credentialConfigurationId: string, inputClaims: unknown): Promise<OpenId4VcOfferResult>;
36
+ getOfferState(id: string): Promise<OpenId4VcOfferState>;
37
+ getVctMetadata(configurationId: string): SdJwtVcTypeMetadata | undefined;
38
+ mapCredentialRequest: OpenId4VciCredentialRequestToCredentialMapper;
39
+ private initialize;
40
+ private createOrUpdateIssuer;
41
+ private credentialConfigurationsSupported;
42
+ private issuerApi;
43
+ private issuerOptions;
44
+ private signingCertificateHandle;
45
+ private assertInitialized;
46
+ }
47
+ export {};