@sphereon/ssi-sdk.oid4vci-holder 0.33.1-feature.vcdm2.4 → 0.33.1-feature.vcdm2.tsup.18
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/dist/index.cjs +25401 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +786 -0
- package/dist/index.d.ts +785 -11
- package/dist/index.js +25355 -11
- package/dist/index.js.map +1 -1
- package/package.json +44 -34
- package/src/agent/OID4VCIHolder.ts +1 -1
- package/dist/agent/OID4VCIHolder.d.ts +0 -59
- package/dist/agent/OID4VCIHolder.d.ts.map +0 -1
- package/dist/agent/OID4VCIHolder.js +0 -882
- package/dist/agent/OID4VCIHolder.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/link-handler/index.d.ts +0 -31
- package/dist/link-handler/index.d.ts.map +0 -1
- package/dist/link-handler/index.js +0 -71
- package/dist/link-handler/index.js.map +0 -1
- package/dist/listeners/headlessStateNavListener.d.ts +0 -3
- package/dist/listeners/headlessStateNavListener.d.ts.map +0 -1
- package/dist/listeners/headlessStateNavListener.js +0 -32
- package/dist/listeners/headlessStateNavListener.js.map +0 -1
- package/dist/localization/Localization.d.ts +0 -9
- package/dist/localization/Localization.d.ts.map +0 -1
- package/dist/localization/Localization.js +0 -41
- package/dist/localization/Localization.js.map +0 -1
- package/dist/localization/translations/en.json +0 -19
- package/dist/localization/translations/nl.json +0 -18
- package/dist/machines/firstPartyMachine.d.ts +0 -15
- package/dist/machines/firstPartyMachine.d.ts.map +0 -1
- package/dist/machines/firstPartyMachine.js +0 -223
- package/dist/machines/firstPartyMachine.js.map +0 -1
- package/dist/machines/oid4vciMachine.d.ts +0 -7
- package/dist/machines/oid4vciMachine.d.ts.map +0 -1
- package/dist/machines/oid4vciMachine.js +0 -708
- package/dist/machines/oid4vciMachine.js.map +0 -1
- package/dist/mappers/OIDC4VCIBrandingMapper.d.ts +0 -16
- package/dist/mappers/OIDC4VCIBrandingMapper.d.ts.map +0 -1
- package/dist/mappers/OIDC4VCIBrandingMapper.js +0 -229
- package/dist/mappers/OIDC4VCIBrandingMapper.js.map +0 -1
- package/dist/services/FirstPartyMachineServices.d.ts +0 -9
- package/dist/services/FirstPartyMachineServices.d.ts.map +0 -1
- package/dist/services/FirstPartyMachineServices.js +0 -42
- package/dist/services/FirstPartyMachineServices.js.map +0 -1
- package/dist/services/OID4VCIHolderService.d.ts +0 -28
- package/dist/services/OID4VCIHolderService.d.ts.map +0 -1
- package/dist/services/OID4VCIHolderService.js +0 -516
- package/dist/services/OID4VCIHolderService.js.map +0 -1
- package/dist/types/FirstPartyMachine.d.ts +0 -112
- package/dist/types/FirstPartyMachine.d.ts.map +0 -1
- package/dist/types/FirstPartyMachine.js +0 -27
- package/dist/types/FirstPartyMachine.js.map +0 -1
- package/dist/types/IOID4VCIHolder.d.ts +0 -558
- package/dist/types/IOID4VCIHolder.d.ts.map +0 -1
- package/dist/types/IOID4VCIHolder.js +0 -111
- package/dist/types/IOID4VCIHolder.js.map +0 -1
|
@@ -1,516 +0,0 @@
|
|
|
1
|
-
import { LOG } from '@sphereon/oid4vci-client';
|
|
2
|
-
import { getSupportedCredentials, getTypesFromCredentialSupported, getTypesFromObject, OpenId4VCIVersion, } from '@sphereon/oid4vci-common';
|
|
3
|
-
import { KeyUse } from '@sphereon/ssi-sdk-ext.did-resolver-jwk';
|
|
4
|
-
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from '@sphereon/ssi-sdk-ext.did-utils';
|
|
5
|
-
import { isIIdentifier, isManagedIdentifierDidResult, isManagedIdentifierResult, managedIdentifierToJwk, } from '@sphereon/ssi-sdk-ext.identifier-resolution';
|
|
6
|
-
import { keyTypeFromCryptographicSuite } from '@sphereon/ssi-sdk-ext.key-utils';
|
|
7
|
-
import { CredentialMapper, JoseSignatureAlgorithm, mdocDecodedCredentialToUniformCredential, sdJwtDecodedCredentialToUniformCredential, } from '@sphereon/ssi-types';
|
|
8
|
-
import { asArray } from '@veramo/utils';
|
|
9
|
-
import { translate } from '../localization/Localization';
|
|
10
|
-
import { OID4VCIHolderEvent, } from '../types/IOID4VCIHolder';
|
|
11
|
-
import { oid4vciGetCredentialBrandingFrom, sdJwtGetCredentialBrandingFrom, issuerLocaleBrandingFrom } from '../mappers/OIDC4VCIBrandingMapper';
|
|
12
|
-
import { FirstPartyMachine } from '../machines/firstPartyMachine';
|
|
13
|
-
import { FirstPartyMachineStateTypes } from '../types/FirstPartyMachine';
|
|
14
|
-
import { defaultHasher } from '@sphereon/ssi-sdk.core';
|
|
15
|
-
export const getCredentialBranding = async (args) => {
|
|
16
|
-
const { credentialsSupported, context } = args;
|
|
17
|
-
const credentialBranding = {};
|
|
18
|
-
await Promise.all(Object.entries(credentialsSupported).map(async ([configId, credentialsConfigSupported]) => {
|
|
19
|
-
let sdJwtTypeMetadata;
|
|
20
|
-
if (credentialsConfigSupported.format === 'vc+sd-jwt') {
|
|
21
|
-
const vct = credentialsConfigSupported.vct;
|
|
22
|
-
if (vct.startsWith('http')) {
|
|
23
|
-
try {
|
|
24
|
-
sdJwtTypeMetadata = await context.agent.fetchSdJwtTypeMetadataFromVctUrl({ vct });
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
// For now, we are just going to ignore and continue without any branding as we still have a fallback
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
let mappedLocaleBranding = [];
|
|
32
|
-
if (sdJwtTypeMetadata) {
|
|
33
|
-
mappedLocaleBranding = await sdJwtGetCredentialBrandingFrom({
|
|
34
|
-
credentialDisplay: sdJwtTypeMetadata.display,
|
|
35
|
-
claimsMetadata: sdJwtTypeMetadata.claims,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
mappedLocaleBranding = await oid4vciGetCredentialBrandingFrom({
|
|
40
|
-
credentialDisplay: credentialsConfigSupported.display,
|
|
41
|
-
issuerCredentialSubject:
|
|
42
|
-
// @ts-ignore // FIXME SPRIND-123 add proper support for type recognition as claim display can be located elsewhere for v13
|
|
43
|
-
credentialsSupported.claims !== undefined ? credentialsConfigSupported.claims : credentialsConfigSupported.credentialSubject,
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
// TODO we should make the mapper part of the plugin, so that the logic for getting the branding becomes more clear and easier to use
|
|
47
|
-
const localeBranding = await Promise.all(mappedLocaleBranding.map(async (localeBranding) => await context.agent.ibCredentialLocaleBrandingFrom({ localeBranding })));
|
|
48
|
-
const defaultCredentialType = 'VerifiableCredential';
|
|
49
|
-
const configSupportedTypes = getTypesFromCredentialSupported(credentialsConfigSupported);
|
|
50
|
-
const credentialTypes = configSupportedTypes.length === 0 ? asArray(defaultCredentialType) : configSupportedTypes;
|
|
51
|
-
const filteredCredentialTypes = credentialTypes.filter((type) => type !== defaultCredentialType);
|
|
52
|
-
credentialBranding[filteredCredentialTypes[0]] = localeBranding; // TODO for now taking the first type
|
|
53
|
-
}));
|
|
54
|
-
return credentialBranding;
|
|
55
|
-
};
|
|
56
|
-
export const getBasicIssuerLocaleBranding = async (args) => {
|
|
57
|
-
const { display, dynamicRegistrationClientMetadata, context } = args;
|
|
58
|
-
return await Promise.all(display.map(async (issuerDisplay) => {
|
|
59
|
-
// FIXME for now we do not have locale support for dynamicRegistrationClientMetadata, so we add all the metadata to every locale
|
|
60
|
-
const branding = await issuerLocaleBrandingFrom({ issuerDisplay, dynamicRegistrationClientMetadata });
|
|
61
|
-
return context.agent.ibIssuerLocaleBrandingFrom({ localeBranding: branding });
|
|
62
|
-
}));
|
|
63
|
-
};
|
|
64
|
-
export const getCredentialConfigsBasedOnFormatPref = async (args) => {
|
|
65
|
-
const { vcFormatPreferences, credentials } = args;
|
|
66
|
-
const prefConfigs = {};
|
|
67
|
-
Object.entries(credentials).forEach(([key, config]) => {
|
|
68
|
-
const result = !config.format || vcFormatPreferences.map((pref) => pref.toLowerCase()).includes(config.format.toLowerCase());
|
|
69
|
-
if (result) {
|
|
70
|
-
prefConfigs[key] = config;
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
return prefConfigs;
|
|
74
|
-
};
|
|
75
|
-
export const selectCredentialLocaleBranding = async (args) => {
|
|
76
|
-
const { locale, localeBranding } = args;
|
|
77
|
-
return localeBranding?.find((branding) => locale ? branding.locale?.startsWith(locale) || branding.locale === undefined : branding.locale === undefined);
|
|
78
|
-
};
|
|
79
|
-
export const verifyCredentialToAccept = async (args) => {
|
|
80
|
-
const { mappedCredential, hasher, onVerifyEBSICredentialIssuer, schemaValidation, context } = args;
|
|
81
|
-
const credential = mappedCredential.credentialToAccept.credentialResponse.credential;
|
|
82
|
-
if (!credential) {
|
|
83
|
-
return Promise.reject(Error('No credential found in credential response'));
|
|
84
|
-
}
|
|
85
|
-
const wrappedVC = CredentialMapper.toWrappedVerifiableCredential(credential, { hasher: hasher ?? defaultHasher });
|
|
86
|
-
if (wrappedVC.decoded?.iss?.includes('did:ebsi:') ||
|
|
87
|
-
(typeof wrappedVC.decoded?.vc?.issuer === 'string'
|
|
88
|
-
? wrappedVC.decoded?.vc?.issuer?.includes('did:ebsi:')
|
|
89
|
-
: wrappedVC.decoded?.vc?.issuer?.existingInstanceId?.includes('did:ebsi:'))) {
|
|
90
|
-
// TODO: Skipping VC validation for EBSI conformance issued credential, as their Issuer is not present in the ledger (sigh)
|
|
91
|
-
// just calling the verifySchema functionality for ebsi credentials
|
|
92
|
-
await context.agent.cvVerifySchema({ credential, hasher, validationPolicy: schemaValidation });
|
|
93
|
-
if (JSON.stringify(wrappedVC.decoded).includes('vc:ebsi:conformance')) {
|
|
94
|
-
return { source: wrappedVC, error: undefined, result: true, subResults: [] };
|
|
95
|
-
}
|
|
96
|
-
if (onVerifyEBSICredentialIssuer) {
|
|
97
|
-
try {
|
|
98
|
-
await onVerifyEBSICredentialIssuer({
|
|
99
|
-
wrappedVc: wrappedVC,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
catch (e) {
|
|
103
|
-
return { source: wrappedVC, error: e.message, result: true, subResults: [] };
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const verificationResult = await context.agent.cvVerifyCredential({
|
|
108
|
-
credential,
|
|
109
|
-
hasher,
|
|
110
|
-
// TODO WAL-675 we might want to allow these types of options as part of the context, now we have state machines. Allows us to pre-determine whether these policies apply and whether remote context should be fetched
|
|
111
|
-
fetchRemoteContexts: true,
|
|
112
|
-
policies: {
|
|
113
|
-
schemaValidation: schemaValidation,
|
|
114
|
-
credentialStatus: false,
|
|
115
|
-
expirationDate: false,
|
|
116
|
-
issuanceDate: false,
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
if (!verificationResult.result || verificationResult.error) {
|
|
120
|
-
return Promise.reject(Error(verificationResult.error ?? translate('oid4vci_machine_credential_verification_failed_message')));
|
|
121
|
-
}
|
|
122
|
-
return verificationResult;
|
|
123
|
-
};
|
|
124
|
-
export const mapCredentialToAccept = async (args) => {
|
|
125
|
-
const { credentialToAccept, hasher } = args;
|
|
126
|
-
const credentialResponse = credentialToAccept.credentialResponse;
|
|
127
|
-
const verifiableCredential = credentialResponse.credential;
|
|
128
|
-
if (!verifiableCredential) {
|
|
129
|
-
return Promise.reject(Error('No credential found in credential response'));
|
|
130
|
-
}
|
|
131
|
-
const wrappedVerifiableCredential = CredentialMapper.toWrappedVerifiableCredential(verifiableCredential, { hasher });
|
|
132
|
-
let uniformVerifiableCredential;
|
|
133
|
-
if (CredentialMapper.isSdJwtDecodedCredential(wrappedVerifiableCredential.credential)) {
|
|
134
|
-
uniformVerifiableCredential = await sdJwtDecodedCredentialToUniformCredential(wrappedVerifiableCredential.credential);
|
|
135
|
-
}
|
|
136
|
-
else if (CredentialMapper.isSdJwtEncoded(wrappedVerifiableCredential.credential)) {
|
|
137
|
-
if (!hasher) {
|
|
138
|
-
return Promise.reject('a hasher is required for encoded SD-JWT credentials');
|
|
139
|
-
}
|
|
140
|
-
const asyncHasher = (data, algorithm) => Promise.resolve(hasher(data, algorithm));
|
|
141
|
-
const decodedSdJwt = await CredentialMapper.decodeSdJwtVcAsync(wrappedVerifiableCredential.credential, asyncHasher);
|
|
142
|
-
uniformVerifiableCredential = sdJwtDecodedCredentialToUniformCredential(decodedSdJwt);
|
|
143
|
-
}
|
|
144
|
-
else if (CredentialMapper.isMsoMdocDecodedCredential(wrappedVerifiableCredential.credential)) {
|
|
145
|
-
uniformVerifiableCredential = mdocDecodedCredentialToUniformCredential(wrappedVerifiableCredential.credential);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
uniformVerifiableCredential = wrappedVerifiableCredential.credential;
|
|
149
|
-
}
|
|
150
|
-
const correlationId = typeof uniformVerifiableCredential.issuer === 'string'
|
|
151
|
-
? uniformVerifiableCredential.issuer
|
|
152
|
-
: CredentialMapper.isSdJwtDecodedCredential(uniformVerifiableCredential)
|
|
153
|
-
? uniformVerifiableCredential.decodedPayload.iss
|
|
154
|
-
: uniformVerifiableCredential.issuer.id;
|
|
155
|
-
return {
|
|
156
|
-
correlationId,
|
|
157
|
-
credentialToAccept,
|
|
158
|
-
types: credentialToAccept.types,
|
|
159
|
-
rawVerifiableCredential: verifiableCredential,
|
|
160
|
-
uniformVerifiableCredential,
|
|
161
|
-
...(credentialResponse.credential_subject_issuance && { credential_subject_issuance: credentialResponse.credential_subject_issuance }),
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
export const getIdentifierOpts = async (args) => {
|
|
165
|
-
const { issuanceOpt, context } = args;
|
|
166
|
-
const { identifier: identifierArg } = issuanceOpt;
|
|
167
|
-
if (identifierArg && isManagedIdentifierResult(identifierArg)) {
|
|
168
|
-
return identifierArg;
|
|
169
|
-
}
|
|
170
|
-
const { supportedPreferredDidMethod, supportedBindingMethods, keyType = 'Secp256r1', kms = await context.agent.keyManagerGetDefaultKeyManagementSystem(), } = issuanceOpt;
|
|
171
|
-
let identifier;
|
|
172
|
-
if (identifierArg) {
|
|
173
|
-
if (isIIdentifier(identifierArg.identifier)) {
|
|
174
|
-
identifier = await context.agent.identifierManagedGet(identifierArg);
|
|
175
|
-
}
|
|
176
|
-
else if (!identifierArg.method && issuanceOpt.supportedBindingMethods.includes('jwk')) {
|
|
177
|
-
identifier = await managedIdentifierToJwk(identifierArg, context);
|
|
178
|
-
}
|
|
179
|
-
else if (identifierArg.method && !supportedBindingMethods.includes(identifierArg.method)) {
|
|
180
|
-
throw Error(`Supplied identifier method ${identifierArg.method} not supported by the issuer: ${supportedBindingMethods.join(',')}`);
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
identifier = await context.agent.identifierManagedGet(identifierArg);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
const agentContext = { ...context, agent: context.agent };
|
|
187
|
-
if ((!identifierArg || isIIdentifier(identifierArg.identifier)) &&
|
|
188
|
-
supportedPreferredDidMethod &&
|
|
189
|
-
(!supportedBindingMethods || supportedBindingMethods.length === 0 || supportedBindingMethods.filter((method) => method.startsWith('did')))) {
|
|
190
|
-
// previous code for managing DIDs only
|
|
191
|
-
const { result, created } = await getOrCreatePrimaryIdentifier(agentContext, {
|
|
192
|
-
method: supportedPreferredDidMethod,
|
|
193
|
-
createOpts: {
|
|
194
|
-
options: {
|
|
195
|
-
type: issuanceOpt.keyType,
|
|
196
|
-
use: KeyUse.Signature,
|
|
197
|
-
codecName: issuanceOpt.codecName,
|
|
198
|
-
kms: issuanceOpt.kms,
|
|
199
|
-
},
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
identifier = await context.agent.identifierManagedGetByDid({
|
|
203
|
-
identifier: result,
|
|
204
|
-
keyType,
|
|
205
|
-
offlineWhenNoDIDRegistered: result.did.startsWith('did:ebsi:'),
|
|
206
|
-
});
|
|
207
|
-
if (created) {
|
|
208
|
-
await agentContext.agent.emit(OID4VCIHolderEvent.IDENTIFIER_CREATED, { identifier });
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else if (supportedBindingMethods.includes('jwk')) {
|
|
212
|
-
// todo: we probably should do something similar as with DIDs for re-use/new keys
|
|
213
|
-
const key = await context.agent.keyManagerCreate({ type: keyType, kms, meta: { keyAlias: `key_${keyType}_${Date.now()}` } });
|
|
214
|
-
// TODO. Create/move this to identifier service await agentContext.agent.emit(OID4VCIHolderEvent.IDENTIFIER_CREATED, { key })
|
|
215
|
-
identifier = await managedIdentifierToJwk({ method: 'key', identifier: key, kmsKeyRef: key.kid }, context);
|
|
216
|
-
// } else if (supportedBindingMethods.includes('cose_key')) {
|
|
217
|
-
// // TODO COSE HERE
|
|
218
|
-
// throw Error(`Holder currently does not support binding method: ${supportedBindingMethods.join(',')}`)
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
throw Error(`Holder currently does not support binding method: ${supportedBindingMethods.join(',')}`);
|
|
222
|
-
}
|
|
223
|
-
args.issuanceOpt.identifier = identifier;
|
|
224
|
-
return identifier;
|
|
225
|
-
};
|
|
226
|
-
export const getCredentialConfigsSupportedMerged = async (args) => {
|
|
227
|
-
let result = {};
|
|
228
|
-
(await getCredentialConfigsSupported(args)).forEach((supported) => {
|
|
229
|
-
result = { ...result, ...supported };
|
|
230
|
-
});
|
|
231
|
-
return result;
|
|
232
|
-
};
|
|
233
|
-
export const getCredentialConfigsSupported = async (args) => {
|
|
234
|
-
const { types, configurationIds } = args;
|
|
235
|
-
if (Array.isArray(types) && types.length > 0) {
|
|
236
|
-
return Promise.all(types.map((type) => getCredentialConfigsSupportedBySingleTypeOrId({ ...args, types: type })));
|
|
237
|
-
}
|
|
238
|
-
else if (Array.isArray(configurationIds) && configurationIds.length > 0) {
|
|
239
|
-
return Promise.all(configurationIds.map((configurationId) => getCredentialConfigsSupportedBySingleTypeOrId({
|
|
240
|
-
...args,
|
|
241
|
-
configurationId,
|
|
242
|
-
types: undefined,
|
|
243
|
-
})));
|
|
244
|
-
}
|
|
245
|
-
const configs = await getCredentialConfigsSupportedBySingleTypeOrId({
|
|
246
|
-
...args,
|
|
247
|
-
types: undefined,
|
|
248
|
-
configurationId: undefined,
|
|
249
|
-
});
|
|
250
|
-
return configs && Object.keys(configs).length > 0 ? [configs] : [];
|
|
251
|
-
};
|
|
252
|
-
/**
|
|
253
|
-
* Please note that this method only returns configs supported for a single set of credential types or a single config id.
|
|
254
|
-
* If an offer contains multiple formats/types in an array or multiple config ids, you will have to call this method for all of them
|
|
255
|
-
* @param args
|
|
256
|
-
*/
|
|
257
|
-
export const getCredentialConfigsSupportedBySingleTypeOrId = async (args) => {
|
|
258
|
-
const { client, vcFormatPreferences, configurationId } = args;
|
|
259
|
-
let { format = undefined, types = undefined } = args;
|
|
260
|
-
function createIdFromTypes(supported) {
|
|
261
|
-
const format = supported.format;
|
|
262
|
-
const type = getTypesFromObject(supported)?.join() ?? '';
|
|
263
|
-
const id = `${type}:${format}`;
|
|
264
|
-
return id;
|
|
265
|
-
}
|
|
266
|
-
if (configurationId) {
|
|
267
|
-
const allSupported = client.getCredentialsSupported(false);
|
|
268
|
-
return Object.fromEntries(Object.entries(allSupported).filter(([id, supported]) => id === configurationId || supported.id === configurationId || createIdFromTypes(supported) === configurationId));
|
|
269
|
-
}
|
|
270
|
-
if (!types && !client.credentialOffer) {
|
|
271
|
-
return Promise.reject(Error('openID4VCIClient has no credentialOffer and no types where provided'));
|
|
272
|
-
/*} else if (!format && !client.credentialOffer) {
|
|
273
|
-
return Promise.reject(Error('openID4VCIClient has no credentialOffer and no formats where provided'))*/
|
|
274
|
-
}
|
|
275
|
-
// We should always have a credential offer at this point given the above
|
|
276
|
-
if (!Array.isArray(format) && client.credentialOffer) {
|
|
277
|
-
if (client.version() > OpenId4VCIVersion.VER_1_0_09 &&
|
|
278
|
-
typeof client.credentialOffer.credential_offer === 'object' &&
|
|
279
|
-
'credentials' in client.credentialOffer.credential_offer) {
|
|
280
|
-
format = client.credentialOffer.credential_offer.credentials
|
|
281
|
-
.filter((cred) => typeof cred !== 'string')
|
|
282
|
-
.map((cred) => cred.format);
|
|
283
|
-
if (format?.length === 0) {
|
|
284
|
-
format = undefined; // Otherwise we would match nothing
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
const offerSupported = getSupportedCredentials({
|
|
289
|
-
types: types ? [types] : client.getCredentialOfferTypes(),
|
|
290
|
-
format,
|
|
291
|
-
version: client.version(),
|
|
292
|
-
issuerMetadata: client.endpointMetadata.credentialIssuerMetadata,
|
|
293
|
-
});
|
|
294
|
-
let allSupported;
|
|
295
|
-
if (!Array.isArray(offerSupported)) {
|
|
296
|
-
allSupported = offerSupported;
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
allSupported = {};
|
|
300
|
-
offerSupported.forEach((supported) => {
|
|
301
|
-
if (supported.id) {
|
|
302
|
-
allSupported[supported.id] = supported;
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
const id = createIdFromTypes(supported);
|
|
306
|
-
allSupported[id] = supported;
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
let credentialConfigsSupported = await getCredentialConfigsBasedOnFormatPref({
|
|
310
|
-
credentials: allSupported,
|
|
311
|
-
vcFormatPreferences,
|
|
312
|
-
});
|
|
313
|
-
if (!credentialConfigsSupported || Object.keys(credentialConfigsSupported).length === 0) {
|
|
314
|
-
LOG.warning(`No matching supported credential found for ${client.getIssuer()}`);
|
|
315
|
-
}
|
|
316
|
-
if (client.credentialOffer === undefined) {
|
|
317
|
-
return credentialConfigsSupported;
|
|
318
|
-
}
|
|
319
|
-
// Filter configurations based on the credential offer IDs
|
|
320
|
-
const credentialOffer = client.credentialOffer.credential_offer;
|
|
321
|
-
let credentialsToOffer;
|
|
322
|
-
if ('credential_configuration_ids' in credentialOffer) {
|
|
323
|
-
credentialsToOffer = Object.fromEntries(Object.entries(credentialConfigsSupported).filter(([configId, config]) => credentialOffer.credential_configuration_ids.includes(configId)));
|
|
324
|
-
if (Object.keys(credentialsToOffer).length === 0) {
|
|
325
|
-
throw new Error(`No matching supported credential configs found for offer ${credentialOffer.credential_configuration_ids.join(', ')}`);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
else {
|
|
329
|
-
credentialsToOffer = credentialConfigsSupported;
|
|
330
|
-
}
|
|
331
|
-
if (Object.keys(credentialsToOffer).length === 0) {
|
|
332
|
-
// Same check as above, but more generic error message, as it can also apply to below draft 13
|
|
333
|
-
throw new Error(`No matching supported credential configs found for offer`);
|
|
334
|
-
}
|
|
335
|
-
return credentialsToOffer;
|
|
336
|
-
};
|
|
337
|
-
export const getIssuanceOpts = async (args) => {
|
|
338
|
-
const { client, credentialsSupported,
|
|
339
|
-
// serverMetadata,
|
|
340
|
-
context, didMethodPreferences, jwtCryptographicSuitePreferences, jsonldCryptographicSuitePreferences, forceIssuanceOpt, } = args;
|
|
341
|
-
if (credentialsSupported === undefined || Object.keys(credentialsSupported).length === 0) {
|
|
342
|
-
return Promise.reject(Error('No credentials supported'));
|
|
343
|
-
}
|
|
344
|
-
const getIssuanceOpts = Object.values(credentialsSupported).map(async (credentialSupported) => {
|
|
345
|
-
/*if (!serverMetadata?.credentialIssuerMetadata) {
|
|
346
|
-
return await getDefaultIssuanceOpts({ credentialSupported, opts: { client }, context })
|
|
347
|
-
}*/
|
|
348
|
-
const cryptographicSuite = await getIssuanceCryptoSuite({
|
|
349
|
-
credentialSupported,
|
|
350
|
-
client,
|
|
351
|
-
jwtCryptographicSuitePreferences,
|
|
352
|
-
jsonldCryptographicSuitePreferences,
|
|
353
|
-
});
|
|
354
|
-
const { didMethod, methods } = await getIssuanceMethod({
|
|
355
|
-
credentialSupported,
|
|
356
|
-
client,
|
|
357
|
-
didMethodPreferences,
|
|
358
|
-
});
|
|
359
|
-
if (methods.length == 0) {
|
|
360
|
-
console.log(`Could not determine supported cryptographic_binding_methods_supported, will use DIDs`);
|
|
361
|
-
methods.push('did');
|
|
362
|
-
}
|
|
363
|
-
const issuanceOpt = forceIssuanceOpt
|
|
364
|
-
? { ...credentialSupported, ...forceIssuanceOpt }
|
|
365
|
-
: {
|
|
366
|
-
...credentialSupported,
|
|
367
|
-
supportedPreferredDidMethod: didMethod,
|
|
368
|
-
supportedBindingMethods: methods,
|
|
369
|
-
format: credentialSupported.format,
|
|
370
|
-
keyType: client.isEBSI() ? 'Secp256r1' : keyTypeFromCryptographicSuite({ crv: cryptographicSuite }),
|
|
371
|
-
...(client.isEBSI() && { codecName: 'EBSI' }),
|
|
372
|
-
};
|
|
373
|
-
const identifier = await getIdentifierOpts({ issuanceOpt, context });
|
|
374
|
-
if (!client.clientId && isManagedIdentifierDidResult(identifier)) {
|
|
375
|
-
// FIXME: We really should fetch server metadata. Have user select required credentials. Take the first cred to determine a kid when no clientId is present and set that.
|
|
376
|
-
// Needs a preference service for crypto, keys, dids, and clientId, with ecosystem support
|
|
377
|
-
client.clientId = identifier.issuer ?? identifier.did;
|
|
378
|
-
}
|
|
379
|
-
return { ...issuanceOpt, identifier };
|
|
380
|
-
});
|
|
381
|
-
return await Promise.all(getIssuanceOpts);
|
|
382
|
-
};
|
|
383
|
-
export const getIssuanceMethod = async (opts) => {
|
|
384
|
-
const { client, credentialSupported, didMethodPreferences } = opts;
|
|
385
|
-
const { format, cryptographic_binding_methods_supported } = credentialSupported;
|
|
386
|
-
let methods = []; // we use the external identifier method, as we should be supporting all values in the server metadata anyway
|
|
387
|
-
if (cryptographic_binding_methods_supported && Array.isArray(cryptographic_binding_methods_supported)) {
|
|
388
|
-
methods = cryptographic_binding_methods_supported;
|
|
389
|
-
const didMethods = didMethodPreferences.find((method) => cryptographic_binding_methods_supported.includes(`did:${method.toLowerCase() /*.replace('did:', '')*/}`));
|
|
390
|
-
if (didMethods) {
|
|
391
|
-
return { methods, didMethod: didMethods };
|
|
392
|
-
}
|
|
393
|
-
else if (cryptographic_binding_methods_supported.includes('did')) {
|
|
394
|
-
return { methods, didMethod: format ? didMethodPreferences[1] : didMethodPreferences[0] };
|
|
395
|
-
}
|
|
396
|
-
else if (methods.length > 0) {
|
|
397
|
-
return { methods };
|
|
398
|
-
}
|
|
399
|
-
console.warn(`We should have been able to determine cryptographic_binding_methods_supported, will fall back to legacy behaviour. This is likely a bug`);
|
|
400
|
-
}
|
|
401
|
-
if (client.isEBSI()) {
|
|
402
|
-
return { methods: ['did'], didMethod: SupportedDidMethodEnum.DID_KEY };
|
|
403
|
-
}
|
|
404
|
-
// legacy fallback
|
|
405
|
-
methods = ['did'];
|
|
406
|
-
if (!format || (format.includes('jwt') && !format?.includes('jwt_vc_json_ld'))) {
|
|
407
|
-
return { methods, didMethod: format ? didMethodPreferences[1] : didMethodPreferences[0] };
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
// JsonLD
|
|
411
|
-
return { methods, didMethod: didMethodPreferences[0] };
|
|
412
|
-
}
|
|
413
|
-
};
|
|
414
|
-
export const getIssuanceCryptoSuite = async (opts) => {
|
|
415
|
-
const { client, credentialSupported, jwtCryptographicSuitePreferences, jsonldCryptographicSuitePreferences } = opts;
|
|
416
|
-
let signing_algs_supported;
|
|
417
|
-
if ('proof_types_supported' in credentialSupported && credentialSupported.proof_types_supported) {
|
|
418
|
-
if ('jwt' in credentialSupported.proof_types_supported && credentialSupported.proof_types_supported.jwt) {
|
|
419
|
-
signing_algs_supported = credentialSupported.proof_types_supported.jwt.proof_signing_alg_values_supported;
|
|
420
|
-
}
|
|
421
|
-
else if ('ldp_vp' in credentialSupported.proof_types_supported && credentialSupported.proof_types_supported.ldp_vp) {
|
|
422
|
-
signing_algs_supported = credentialSupported.proof_types_supported.ldp_vp.proof_signing_alg_values_supported;
|
|
423
|
-
}
|
|
424
|
-
else if ('cwt' in credentialSupported.proof_types_supported && credentialSupported.proof_types_supported.cwt) {
|
|
425
|
-
signing_algs_supported = credentialSupported.proof_types_supported.cwt.proof_signing_alg_values_supported;
|
|
426
|
-
console.error('cwt proof type not supported. Likely that errors will occur after this point');
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
return Promise.reject(Error(`Unsupported proof_types_supported`));
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
else {
|
|
433
|
-
signing_algs_supported = asArray(
|
|
434
|
-
// @ts-ignore // legacy
|
|
435
|
-
credentialSupported.credential_signing_alg_values_supported ?? credentialSupported.proof_signing_alg_values_supported ?? []);
|
|
436
|
-
}
|
|
437
|
-
// TODO: Return array, so the wallet/user could choose
|
|
438
|
-
switch (credentialSupported.format) {
|
|
439
|
-
// @ts-ignore legacy value
|
|
440
|
-
case 'jwt':
|
|
441
|
-
case 'jwt_vc_json':
|
|
442
|
-
case 'jwt_vc':
|
|
443
|
-
case 'vc+sd-jwt':
|
|
444
|
-
case 'mso_mdoc': {
|
|
445
|
-
const supportedPreferences = jwtCryptographicSuitePreferences.filter((suite) => signing_algs_supported.includes(suite));
|
|
446
|
-
if (supportedPreferences.length > 0) {
|
|
447
|
-
return supportedPreferences[0];
|
|
448
|
-
}
|
|
449
|
-
else if (client.isEBSI()) {
|
|
450
|
-
return JoseSignatureAlgorithm.ES256;
|
|
451
|
-
}
|
|
452
|
-
// if we cannot find supported cryptographic suites, we just try with the first preference
|
|
453
|
-
const fallback = jwtCryptographicSuitePreferences[0];
|
|
454
|
-
console.log(`Warn: We could not determine the crypto suites from the server metadata, and will fallback to a default: ${fallback}`);
|
|
455
|
-
return fallback;
|
|
456
|
-
}
|
|
457
|
-
// @ts-ignore
|
|
458
|
-
case 'ldp':
|
|
459
|
-
// @ts-ignore
|
|
460
|
-
case 'jwt_vc_json_ld':
|
|
461
|
-
case 'ldp_vc': {
|
|
462
|
-
const supportedPreferences = jsonldCryptographicSuitePreferences.filter((suite) => signing_algs_supported.includes(suite));
|
|
463
|
-
if (supportedPreferences.length > 0) {
|
|
464
|
-
return supportedPreferences[0];
|
|
465
|
-
}
|
|
466
|
-
// if we cannot find supported cryptographic suites, we just try with the first preference
|
|
467
|
-
const fallback = jsonldCryptographicSuitePreferences[0];
|
|
468
|
-
console.log(`Warn: We could not determine the crypto suites from the server metadata, and will fallback to a default: ${fallback}`);
|
|
469
|
-
return fallback;
|
|
470
|
-
}
|
|
471
|
-
default:
|
|
472
|
-
return Promise.reject(Error(`Credential format '${credentialSupported.format}' not supported`));
|
|
473
|
-
}
|
|
474
|
-
};
|
|
475
|
-
export const startFirstPartApplicationMachine = async (args, context) => {
|
|
476
|
-
const { openID4VCIClientState, stateNavigationListener, contact } = args;
|
|
477
|
-
if (!openID4VCIClientState) {
|
|
478
|
-
return Promise.reject(Error('Missing openID4VCI client state in context'));
|
|
479
|
-
}
|
|
480
|
-
if (!contact) {
|
|
481
|
-
return Promise.reject(Error('Missing contact in context'));
|
|
482
|
-
}
|
|
483
|
-
const firstPartyMachineInstance = FirstPartyMachine.newInstance({
|
|
484
|
-
openID4VCIClientState,
|
|
485
|
-
contact,
|
|
486
|
-
agentContext: context,
|
|
487
|
-
stateNavigationListener,
|
|
488
|
-
});
|
|
489
|
-
return new Promise((resolve, reject) => {
|
|
490
|
-
try {
|
|
491
|
-
firstPartyMachineInstance.onTransition((state) => {
|
|
492
|
-
if (state.matches(FirstPartyMachineStateTypes.done)) {
|
|
493
|
-
const authorizationCodeResponse = state.context.authorizationCodeResponse;
|
|
494
|
-
if (!authorizationCodeResponse) {
|
|
495
|
-
reject(Error('No authorizationCodeResponse acquired'));
|
|
496
|
-
}
|
|
497
|
-
resolve(authorizationCodeResponse);
|
|
498
|
-
}
|
|
499
|
-
else if (state.matches(FirstPartyMachineStateTypes.aborted)) {
|
|
500
|
-
resolve(FirstPartyMachineStateTypes.aborted);
|
|
501
|
-
}
|
|
502
|
-
else if (state.matches(FirstPartyMachineStateTypes.declined)) {
|
|
503
|
-
resolve(FirstPartyMachineStateTypes.declined);
|
|
504
|
-
}
|
|
505
|
-
else if (state.matches(FirstPartyMachineStateTypes.error)) {
|
|
506
|
-
reject(state.context.error);
|
|
507
|
-
}
|
|
508
|
-
});
|
|
509
|
-
firstPartyMachineInstance.start();
|
|
510
|
-
}
|
|
511
|
-
catch (error) {
|
|
512
|
-
reject(error);
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
|
-
};
|
|
516
|
-
//# sourceMappingURL=OID4VCIHolderService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OID4VCIHolderService.js","sourceRoot":"","sources":["../../src/services/OID4VCIHolderService.ts"],"names":[],"mappings":"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"}
|