@sphereon/ssi-sdk.oid4vci-holder 0.34.1-feature.SSISDK.46.45 → 0.34.1-feature.SSISDK.47.154
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 +399 -385
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -6
- package/dist/index.d.ts +9 -6
- package/dist/index.js +510 -496
- package/dist/index.js.map +1 -1
- package/package.json +25 -24
- package/src/agent/OID4VCIHolder.ts +33 -25
- package/src/services/OID4VCIHolderService.ts +48 -44
- package/src/types/FirstPartyMachine.ts +6 -5
- package/src/types/IOID4VCIHolder.ts +3 -1
package/dist/index.js
CHANGED
|
@@ -56,12 +56,13 @@ var require_nl = __commonJS({
|
|
|
56
56
|
|
|
57
57
|
// src/agent/OID4VCIHolder.ts
|
|
58
58
|
import { CredentialOfferClient, MetadataClient, OpenID4VCIClient as OpenID4VCIClient2 } from "@sphereon/oid4vci-client";
|
|
59
|
-
import { DefaultURISchemes, getTypesFromAuthorizationDetails,
|
|
59
|
+
import { DefaultURISchemes, getTypesFromAuthorizationDetails, getTypesFromCredentialSupported as getTypesFromCredentialSupported2, getTypesFromObject as getTypesFromObject2 } from "@sphereon/oid4vci-common";
|
|
60
60
|
import { SupportedDidMethodEnum as SupportedDidMethodEnum2 } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
61
61
|
import { isManagedIdentifierDidOpts, isManagedIdentifierDidResult as isManagedIdentifierDidResult2, isManagedIdentifierJwkResult, isManagedIdentifierKidResult, isManagedIdentifierResult as isManagedIdentifierResult2, isManagedIdentifierX5cOpts, isManagedIdentifierX5cResult } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
62
62
|
import { signatureAlgorithmFromKey } from "@sphereon/ssi-sdk-ext.key-utils";
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
63
|
+
import { defaultHasher as defaultHasher2 } from "@sphereon/ssi-sdk.core";
|
|
64
|
+
import { ConnectionType, CorrelationIdentifierType, CredentialCorrelationType, ensureRawDocument, IdentityOrigin } from "@sphereon/ssi-sdk.data-store";
|
|
65
|
+
import { CredentialMapper as CredentialMapper2, JoseSignatureAlgorithm as JoseSignatureAlgorithm2, Loggers, parseDid, CredentialRole } from "@sphereon/ssi-types";
|
|
65
66
|
import { asArray as asArray2, computeEntryHash } from "@veramo/utils";
|
|
66
67
|
import { decodeJWT } from "did-jwt";
|
|
67
68
|
import { v4 as uuidv42 } from "uuid";
|
|
@@ -149,6 +150,7 @@ var OID4VCIMachineGuards = /* @__PURE__ */ (function(OID4VCIMachineGuards2) {
|
|
|
149
150
|
OID4VCIMachineGuards2["requirePinGuard"] = "oid4vciRequirePinGuard";
|
|
150
151
|
OID4VCIMachineGuards2["requireAuthorizationGuard"] = "oid4vciRequireAuthorizationGuard";
|
|
151
152
|
OID4VCIMachineGuards2["noAuthorizationGuard"] = "oid4vciNoAuthorizationGuard";
|
|
153
|
+
OID4VCIMachineGuards2["hasNonceEndpointGuard"] = "oid4vciHasNonceEndpointGuard ";
|
|
152
154
|
OID4VCIMachineGuards2["hasAuthorizationResponse"] = "oid4vciHasAuthorizationResponse";
|
|
153
155
|
OID4VCIMachineGuards2["hasNoContactIdentityGuard"] = "oid4vciHasNoContactIdentityGuard";
|
|
154
156
|
OID4VCIMachineGuards2["verificationCodeGuard"] = "oid4vciVerificationCodeGuard";
|
|
@@ -976,413 +978,152 @@ var OID4VCIMachine = class {
|
|
|
976
978
|
|
|
977
979
|
// src/services/OID4VCIHolderService.ts
|
|
978
980
|
import { LOG } from "@sphereon/oid4vci-client";
|
|
979
|
-
import { getSupportedCredentials, getTypesFromCredentialSupported, getTypesFromObject
|
|
981
|
+
import { getSupportedCredentials, getTypesFromCredentialSupported, getTypesFromObject } from "@sphereon/oid4vci-common";
|
|
980
982
|
import { KeyUse } from "@sphereon/ssi-sdk-ext.did-resolver-jwk";
|
|
981
983
|
import { getOrCreatePrimaryIdentifier, SupportedDidMethodEnum } from "@sphereon/ssi-sdk-ext.did-utils";
|
|
982
984
|
import { isIIdentifier, isManagedIdentifierDidResult, isManagedIdentifierResult, managedIdentifierToJwk } from "@sphereon/ssi-sdk-ext.identifier-resolution";
|
|
983
985
|
import { keyTypeFromCryptographicSuite } from "@sphereon/ssi-sdk-ext.key-utils";
|
|
986
|
+
import { defaultHasher } from "@sphereon/ssi-sdk.core";
|
|
984
987
|
import { CredentialMapper, JoseSignatureAlgorithm, mdocDecodedCredentialToUniformCredential, sdJwtDecodedCredentialToUniformCredential } from "@sphereon/ssi-types";
|
|
985
988
|
import { asArray } from "@veramo/utils";
|
|
986
989
|
|
|
987
|
-
// src/
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
credentialDisplay
|
|
999
|
-
})
|
|
1000
|
-
}
|
|
990
|
+
// src/machines/firstPartyMachine.ts
|
|
991
|
+
import { assign as assign2, createMachine as createMachine2, interpret as interpret2 } from "xstate";
|
|
992
|
+
import { AuthorizationChallengeError } from "@sphereon/oid4vci-common";
|
|
993
|
+
|
|
994
|
+
// src/services/FirstPartyMachineServices.ts
|
|
995
|
+
import { OpenID4VCIClient } from "@sphereon/oid4vci-client";
|
|
996
|
+
import { v4 as uuidv4 } from "uuid";
|
|
997
|
+
var sendAuthorizationChallengeRequest = /* @__PURE__ */ __name(async (args) => {
|
|
998
|
+
const { openID4VCIClientState, authSession, presentationDuringIssuanceSession } = args;
|
|
999
|
+
const oid4vciClient = await OpenID4VCIClient.fromState({
|
|
1000
|
+
state: openID4VCIClientState
|
|
1001
1001
|
});
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
const localeKey = display.locale || "";
|
|
1007
|
-
localeDisplays.set(localeKey, display);
|
|
1008
|
-
return localeDisplays;
|
|
1009
|
-
}, /* @__PURE__ */ new Map());
|
|
1010
|
-
}, "oid4vciCredentialDisplayLocalesFrom");
|
|
1011
|
-
var oid4vciIssuerCredentialSubjectLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1012
|
-
const { issuerCredentialSubject } = args;
|
|
1013
|
-
const localeClaims = /* @__PURE__ */ new Map();
|
|
1014
|
-
const processClaimObject = /* @__PURE__ */ __name((claim, parentKey = "") => {
|
|
1015
|
-
Object.entries(claim).forEach(([key, value]) => {
|
|
1016
|
-
if (key === "mandatory" || key === "value_type") {
|
|
1017
|
-
return;
|
|
1018
|
-
}
|
|
1019
|
-
if (key === "display" && Array.isArray(value)) {
|
|
1020
|
-
value.forEach(({ name, locale = "" }) => {
|
|
1021
|
-
if (!name) {
|
|
1022
|
-
return;
|
|
1023
|
-
}
|
|
1024
|
-
if (!localeClaims.has(locale)) {
|
|
1025
|
-
localeClaims.set(locale, []);
|
|
1026
|
-
}
|
|
1027
|
-
localeClaims.get(locale).push({
|
|
1028
|
-
key: parentKey,
|
|
1029
|
-
name
|
|
1030
|
-
});
|
|
1031
|
-
});
|
|
1032
|
-
} else if (typeof value === "object" && value !== null) {
|
|
1033
|
-
processClaimObject(value, parentKey ? `${parentKey}.${key}` : key);
|
|
1034
|
-
}
|
|
1035
|
-
});
|
|
1036
|
-
}, "processClaimObject");
|
|
1037
|
-
processClaimObject(issuerCredentialSubject);
|
|
1038
|
-
return localeClaims;
|
|
1039
|
-
}, "oid4vciIssuerCredentialSubjectLocalesFrom");
|
|
1040
|
-
var oid4vciCredentialLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1041
|
-
const { credentialDisplay } = args;
|
|
1042
|
-
return {
|
|
1043
|
-
...credentialDisplay.name && {
|
|
1044
|
-
alias: credentialDisplay.name
|
|
1045
|
-
},
|
|
1046
|
-
...credentialDisplay.locale && {
|
|
1047
|
-
locale: credentialDisplay.locale
|
|
1048
|
-
},
|
|
1049
|
-
...credentialDisplay.logo && {
|
|
1050
|
-
logo: {
|
|
1051
|
-
...(credentialDisplay.logo.url || credentialDisplay.logo.uri) && {
|
|
1052
|
-
uri: credentialDisplay.logo?.url ?? credentialDisplay.logo.uri
|
|
1053
|
-
},
|
|
1054
|
-
...credentialDisplay.logo.alt_text && {
|
|
1055
|
-
alt: credentialDisplay.logo?.alt_text
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1002
|
+
return oid4vciClient.acquireAuthorizationChallengeCode({
|
|
1003
|
+
clientId: oid4vciClient.clientId ?? uuidv4(),
|
|
1004
|
+
...authSession && {
|
|
1005
|
+
authSession
|
|
1058
1006
|
},
|
|
1059
|
-
|
|
1060
|
-
|
|
1007
|
+
...!authSession && openID4VCIClientState.credentialOffer?.preAuthorizedCode && {
|
|
1008
|
+
issuerState: openID4VCIClientState.credentialOffer?.preAuthorizedCode
|
|
1061
1009
|
},
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
color: credentialDisplay.text_color
|
|
1065
|
-
}
|
|
1010
|
+
...!authSession && openID4VCIClientState.credentialOffer?.issuerState && {
|
|
1011
|
+
issuerState: openID4VCIClientState.credentialOffer?.issuerState
|
|
1066
1012
|
},
|
|
1067
|
-
...
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1013
|
+
...presentationDuringIssuanceSession && {
|
|
1014
|
+
presentationDuringIssuanceSession
|
|
1015
|
+
}
|
|
1016
|
+
});
|
|
1017
|
+
}, "sendAuthorizationChallengeRequest");
|
|
1018
|
+
var createConfig = /* @__PURE__ */ __name(async (args, context) => {
|
|
1019
|
+
const { presentationUri } = args;
|
|
1020
|
+
if (!presentationUri) {
|
|
1021
|
+
return Promise.reject(Error("Missing presentation uri in context"));
|
|
1022
|
+
}
|
|
1023
|
+
return context.agent.siopCreateConfig({
|
|
1024
|
+
url: presentationUri
|
|
1025
|
+
});
|
|
1026
|
+
}, "createConfig");
|
|
1027
|
+
var getSiopRequest = /* @__PURE__ */ __name(async (args, context) => {
|
|
1028
|
+
const { didAuthConfig, presentationUri } = args;
|
|
1029
|
+
if (presentationUri === void 0) {
|
|
1030
|
+
return Promise.reject(Error("Missing presentation uri in context"));
|
|
1031
|
+
}
|
|
1032
|
+
if (didAuthConfig === void 0) {
|
|
1033
|
+
return Promise.reject(Error("Missing did auth config in context"));
|
|
1034
|
+
}
|
|
1035
|
+
return context.agent.siopGetSiopRequest({
|
|
1036
|
+
didAuthConfig,
|
|
1037
|
+
url: presentationUri
|
|
1038
|
+
});
|
|
1039
|
+
}, "getSiopRequest");
|
|
1040
|
+
var sendAuthorizationResponse = /* @__PURE__ */ __name(async (args, context) => {
|
|
1041
|
+
const { didAuthConfig, authorizationRequestData, selectedCredentials } = args;
|
|
1042
|
+
const responseData = await context.agent.siopSendResponse({
|
|
1043
|
+
authorizationRequestData,
|
|
1044
|
+
selectedCredentials,
|
|
1045
|
+
didAuthConfig,
|
|
1046
|
+
isFirstParty: true
|
|
1047
|
+
});
|
|
1048
|
+
return responseData.body.presentation_during_issuance_session;
|
|
1049
|
+
}, "sendAuthorizationResponse");
|
|
1050
|
+
|
|
1051
|
+
// src/machines/firstPartyMachine.ts
|
|
1052
|
+
var firstPartyMachineStates = {
|
|
1053
|
+
[FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest]: {
|
|
1054
|
+
id: FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest,
|
|
1055
|
+
invoke: {
|
|
1056
|
+
src: FirstPartyMachineServices.sendAuthorizationChallengeRequest,
|
|
1057
|
+
onDone: {
|
|
1058
|
+
target: FirstPartyMachineStateTypes.done,
|
|
1059
|
+
actions: assign2({
|
|
1060
|
+
authorizationCodeResponse: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "authorizationCodeResponse")
|
|
1061
|
+
})
|
|
1062
|
+
},
|
|
1063
|
+
onError: [
|
|
1064
|
+
{
|
|
1065
|
+
target: FirstPartyMachineStateTypes.createConfig,
|
|
1066
|
+
cond: /* @__PURE__ */ __name((_ctx, _event) => _event.data.error === AuthorizationChallengeError.insufficient_authorization, "cond"),
|
|
1067
|
+
actions: assign2({
|
|
1068
|
+
authSession: /* @__PURE__ */ __name((_ctx, _event) => _event.data.auth_session, "authSession"),
|
|
1069
|
+
presentationUri: /* @__PURE__ */ __name((_ctx, _event) => _event.data.presentation, "presentationUri")
|
|
1070
|
+
})
|
|
1078
1071
|
},
|
|
1079
|
-
|
|
1080
|
-
|
|
1072
|
+
{
|
|
1073
|
+
target: FirstPartyMachineStateTypes.error,
|
|
1074
|
+
actions: assign2({
|
|
1075
|
+
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1076
|
+
title: translate("oid4vci_machine_send_authorization_challenge_request_error_title"),
|
|
1077
|
+
message: _event.data.message,
|
|
1078
|
+
stack: _event.data.stack
|
|
1079
|
+
}), "error")
|
|
1080
|
+
})
|
|
1081
1081
|
}
|
|
1082
|
+
]
|
|
1083
|
+
}
|
|
1084
|
+
},
|
|
1085
|
+
[FirstPartyMachineStateTypes.createConfig]: {
|
|
1086
|
+
id: FirstPartyMachineStateTypes.createConfig,
|
|
1087
|
+
invoke: {
|
|
1088
|
+
src: FirstPartyMachineServices.createConfig,
|
|
1089
|
+
onDone: {
|
|
1090
|
+
target: FirstPartyMachineStateTypes.getSiopRequest,
|
|
1091
|
+
actions: assign2({
|
|
1092
|
+
didAuthConfig: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "didAuthConfig")
|
|
1093
|
+
})
|
|
1094
|
+
},
|
|
1095
|
+
onError: {
|
|
1096
|
+
target: FirstPartyMachineStateTypes.error,
|
|
1097
|
+
actions: assign2({
|
|
1098
|
+
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1099
|
+
title: translate("oid4vci_machine_create_config_error_title"),
|
|
1100
|
+
message: _event.data.message,
|
|
1101
|
+
stack: _event.data.stack
|
|
1102
|
+
}), "error")
|
|
1103
|
+
})
|
|
1082
1104
|
}
|
|
1083
1105
|
}
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
const claims = issuerCredentialSubjectLocales.get(locale);
|
|
1095
|
-
return {
|
|
1096
|
-
...display && await oid4vciCredentialLocaleBrandingFrom({
|
|
1097
|
-
credentialDisplay: display
|
|
1098
|
-
}),
|
|
1099
|
-
...locale.length > 0 && {
|
|
1100
|
-
locale
|
|
1106
|
+
},
|
|
1107
|
+
[FirstPartyMachineStateTypes.getSiopRequest]: {
|
|
1108
|
+
id: FirstPartyMachineStateTypes.getSiopRequest,
|
|
1109
|
+
invoke: {
|
|
1110
|
+
src: FirstPartyMachineServices.getSiopRequest,
|
|
1111
|
+
onDone: {
|
|
1112
|
+
target: FirstPartyMachineStateTypes.selectCredentials,
|
|
1113
|
+
actions: assign2({
|
|
1114
|
+
authorizationRequestData: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "authorizationRequestData")
|
|
1115
|
+
})
|
|
1101
1116
|
},
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
})
|
|
1113
|
-
},
|
|
1114
|
-
...credentialDisplay && {
|
|
1115
|
-
credentialDisplayLocales: await sdJwtCredentialDisplayLocalesFrom({
|
|
1116
|
-
credentialDisplay
|
|
1117
|
-
})
|
|
1118
|
-
}
|
|
1119
|
-
});
|
|
1120
|
-
}, "sdJwtGetCredentialBrandingFrom");
|
|
1121
|
-
var sdJwtCredentialDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1122
|
-
const { credentialDisplay } = args;
|
|
1123
|
-
return credentialDisplay.reduce((localeDisplays, display) => {
|
|
1124
|
-
const localeKey = display.lang || "";
|
|
1125
|
-
localeDisplays.set(localeKey, display);
|
|
1126
|
-
return localeDisplays;
|
|
1127
|
-
}, /* @__PURE__ */ new Map());
|
|
1128
|
-
}, "sdJwtCredentialDisplayLocalesFrom");
|
|
1129
|
-
var sdJwtCredentialClaimLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1130
|
-
const { claimsMetadata } = args;
|
|
1131
|
-
const localeClaims = /* @__PURE__ */ new Map();
|
|
1132
|
-
claimsMetadata.forEach((claim) => {
|
|
1133
|
-
claim.display?.forEach((display) => {
|
|
1134
|
-
const { lang = "", label } = display;
|
|
1135
|
-
const key = claim.path.map((value) => String(value)).join(".");
|
|
1136
|
-
if (!localeClaims.has(lang)) {
|
|
1137
|
-
localeClaims.set(lang, []);
|
|
1138
|
-
}
|
|
1139
|
-
localeClaims.get(lang).push({
|
|
1140
|
-
key,
|
|
1141
|
-
name: label
|
|
1142
|
-
});
|
|
1143
|
-
});
|
|
1144
|
-
});
|
|
1145
|
-
return localeClaims;
|
|
1146
|
-
}, "sdJwtCredentialClaimLocalesFrom");
|
|
1147
|
-
var sdJwtCredentialLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1148
|
-
const { credentialDisplay } = args;
|
|
1149
|
-
return {
|
|
1150
|
-
...credentialDisplay.name && {
|
|
1151
|
-
alias: credentialDisplay.name
|
|
1152
|
-
},
|
|
1153
|
-
...credentialDisplay.lang && {
|
|
1154
|
-
locale: credentialDisplay.lang
|
|
1155
|
-
},
|
|
1156
|
-
...credentialDisplay.rendering?.simple?.logo && {
|
|
1157
|
-
logo: {
|
|
1158
|
-
...credentialDisplay.rendering.simple.logo.uri && {
|
|
1159
|
-
uri: credentialDisplay.rendering.simple.logo.uri
|
|
1160
|
-
},
|
|
1161
|
-
...credentialDisplay.rendering.simple.logo.alt_text && {
|
|
1162
|
-
alt: credentialDisplay.rendering.simple.logo.alt_text
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1165
|
-
},
|
|
1166
|
-
...credentialDisplay.description && {
|
|
1167
|
-
description: credentialDisplay.description
|
|
1168
|
-
},
|
|
1169
|
-
...credentialDisplay.rendering?.simple?.text_color && {
|
|
1170
|
-
text: {
|
|
1171
|
-
color: credentialDisplay.rendering.simple.text_color
|
|
1172
|
-
}
|
|
1173
|
-
},
|
|
1174
|
-
...credentialDisplay.rendering?.simple?.background_color && {
|
|
1175
|
-
background: {
|
|
1176
|
-
color: credentialDisplay.rendering.simple.background_color
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
};
|
|
1180
|
-
}, "sdJwtCredentialLocaleBrandingFrom");
|
|
1181
|
-
var sdJwtCombineDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1182
|
-
const { credentialDisplayLocales = /* @__PURE__ */ new Map(), claimsMetadata = /* @__PURE__ */ new Map() } = args;
|
|
1183
|
-
const locales = Array.from(/* @__PURE__ */ new Set([
|
|
1184
|
-
...claimsMetadata.keys(),
|
|
1185
|
-
...credentialDisplayLocales.keys()
|
|
1186
|
-
]));
|
|
1187
|
-
return Promise.all(locales.map(async (locale) => {
|
|
1188
|
-
const display = credentialDisplayLocales.get(locale);
|
|
1189
|
-
const claims = claimsMetadata.get(locale);
|
|
1190
|
-
return {
|
|
1191
|
-
...display && await sdJwtCredentialLocaleBrandingFrom({
|
|
1192
|
-
credentialDisplay: display
|
|
1193
|
-
}),
|
|
1194
|
-
...locale.length > 0 && {
|
|
1195
|
-
locale
|
|
1196
|
-
},
|
|
1197
|
-
claims
|
|
1198
|
-
};
|
|
1199
|
-
}));
|
|
1200
|
-
}, "sdJwtCombineDisplayLocalesFrom");
|
|
1201
|
-
var issuerLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1202
|
-
const { issuerDisplay, dynamicRegistrationClientMetadata } = args;
|
|
1203
|
-
return {
|
|
1204
|
-
...dynamicRegistrationClientMetadata?.client_name && {
|
|
1205
|
-
alias: dynamicRegistrationClientMetadata.client_name
|
|
1206
|
-
},
|
|
1207
|
-
...issuerDisplay.name && {
|
|
1208
|
-
alias: issuerDisplay.name
|
|
1209
|
-
},
|
|
1210
|
-
...issuerDisplay.locale && {
|
|
1211
|
-
locale: issuerDisplay.locale
|
|
1212
|
-
},
|
|
1213
|
-
...(issuerDisplay.logo || dynamicRegistrationClientMetadata?.logo_uri) && {
|
|
1214
|
-
logo: {
|
|
1215
|
-
...dynamicRegistrationClientMetadata?.logo_uri && {
|
|
1216
|
-
uri: dynamicRegistrationClientMetadata?.logo_uri
|
|
1217
|
-
},
|
|
1218
|
-
...(issuerDisplay.logo?.url || issuerDisplay.logo?.uri) && {
|
|
1219
|
-
uri: issuerDisplay.logo?.url ?? issuerDisplay.logo?.uri
|
|
1220
|
-
},
|
|
1221
|
-
...issuerDisplay.logo?.alt_text && {
|
|
1222
|
-
alt: issuerDisplay.logo?.alt_text
|
|
1223
|
-
}
|
|
1224
|
-
}
|
|
1225
|
-
},
|
|
1226
|
-
...issuerDisplay.description && {
|
|
1227
|
-
description: issuerDisplay.description
|
|
1228
|
-
},
|
|
1229
|
-
...issuerDisplay.text_color && {
|
|
1230
|
-
text: {
|
|
1231
|
-
color: issuerDisplay.text_color
|
|
1232
|
-
}
|
|
1233
|
-
},
|
|
1234
|
-
...dynamicRegistrationClientMetadata?.client_uri && {
|
|
1235
|
-
clientUri: dynamicRegistrationClientMetadata.client_uri
|
|
1236
|
-
},
|
|
1237
|
-
...dynamicRegistrationClientMetadata?.tos_uri && {
|
|
1238
|
-
tosUri: dynamicRegistrationClientMetadata.tos_uri
|
|
1239
|
-
},
|
|
1240
|
-
...dynamicRegistrationClientMetadata?.policy_uri && {
|
|
1241
|
-
policyUri: dynamicRegistrationClientMetadata.policy_uri
|
|
1242
|
-
},
|
|
1243
|
-
...dynamicRegistrationClientMetadata?.contacts && {
|
|
1244
|
-
contacts: dynamicRegistrationClientMetadata.contacts
|
|
1245
|
-
}
|
|
1246
|
-
};
|
|
1247
|
-
}, "issuerLocaleBrandingFrom");
|
|
1248
|
-
|
|
1249
|
-
// src/machines/firstPartyMachine.ts
|
|
1250
|
-
import { assign as assign2, createMachine as createMachine2, interpret as interpret2 } from "xstate";
|
|
1251
|
-
import { AuthorizationChallengeError } from "@sphereon/oid4vci-common";
|
|
1252
|
-
|
|
1253
|
-
// src/services/FirstPartyMachineServices.ts
|
|
1254
|
-
import { OpenID4VCIClient } from "@sphereon/oid4vci-client";
|
|
1255
|
-
import { v4 as uuidv4 } from "uuid";
|
|
1256
|
-
var sendAuthorizationChallengeRequest = /* @__PURE__ */ __name(async (args) => {
|
|
1257
|
-
const { openID4VCIClientState, authSession, presentationDuringIssuanceSession } = args;
|
|
1258
|
-
const oid4vciClient = await OpenID4VCIClient.fromState({
|
|
1259
|
-
state: openID4VCIClientState
|
|
1260
|
-
});
|
|
1261
|
-
return oid4vciClient.acquireAuthorizationChallengeCode({
|
|
1262
|
-
clientId: oid4vciClient.clientId ?? uuidv4(),
|
|
1263
|
-
...authSession && {
|
|
1264
|
-
authSession
|
|
1265
|
-
},
|
|
1266
|
-
...!authSession && openID4VCIClientState.credentialOffer?.preAuthorizedCode && {
|
|
1267
|
-
issuerState: openID4VCIClientState.credentialOffer?.preAuthorizedCode
|
|
1268
|
-
},
|
|
1269
|
-
...!authSession && openID4VCIClientState.credentialOffer?.issuerState && {
|
|
1270
|
-
issuerState: openID4VCIClientState.credentialOffer?.issuerState
|
|
1271
|
-
},
|
|
1272
|
-
...presentationDuringIssuanceSession && {
|
|
1273
|
-
presentationDuringIssuanceSession
|
|
1274
|
-
}
|
|
1275
|
-
});
|
|
1276
|
-
}, "sendAuthorizationChallengeRequest");
|
|
1277
|
-
var createConfig = /* @__PURE__ */ __name(async (args, context) => {
|
|
1278
|
-
const { presentationUri } = args;
|
|
1279
|
-
if (!presentationUri) {
|
|
1280
|
-
return Promise.reject(Error("Missing presentation uri in context"));
|
|
1281
|
-
}
|
|
1282
|
-
return context.agent.siopCreateConfig({
|
|
1283
|
-
url: presentationUri
|
|
1284
|
-
});
|
|
1285
|
-
}, "createConfig");
|
|
1286
|
-
var getSiopRequest = /* @__PURE__ */ __name(async (args, context) => {
|
|
1287
|
-
const { didAuthConfig, presentationUri } = args;
|
|
1288
|
-
if (presentationUri === void 0) {
|
|
1289
|
-
return Promise.reject(Error("Missing presentation uri in context"));
|
|
1290
|
-
}
|
|
1291
|
-
if (didAuthConfig === void 0) {
|
|
1292
|
-
return Promise.reject(Error("Missing did auth config in context"));
|
|
1293
|
-
}
|
|
1294
|
-
return context.agent.siopGetSiopRequest({
|
|
1295
|
-
didAuthConfig,
|
|
1296
|
-
url: presentationUri
|
|
1297
|
-
});
|
|
1298
|
-
}, "getSiopRequest");
|
|
1299
|
-
var sendAuthorizationResponse = /* @__PURE__ */ __name(async (args, context) => {
|
|
1300
|
-
const { didAuthConfig, authorizationRequestData, selectedCredentials } = args;
|
|
1301
|
-
const responseData = await context.agent.siopSendResponse({
|
|
1302
|
-
authorizationRequestData,
|
|
1303
|
-
selectedCredentials,
|
|
1304
|
-
didAuthConfig,
|
|
1305
|
-
isFirstParty: true
|
|
1306
|
-
});
|
|
1307
|
-
return responseData.body.presentation_during_issuance_session;
|
|
1308
|
-
}, "sendAuthorizationResponse");
|
|
1309
|
-
|
|
1310
|
-
// src/machines/firstPartyMachine.ts
|
|
1311
|
-
var firstPartyMachineStates = {
|
|
1312
|
-
[FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest]: {
|
|
1313
|
-
id: FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest,
|
|
1314
|
-
invoke: {
|
|
1315
|
-
src: FirstPartyMachineServices.sendAuthorizationChallengeRequest,
|
|
1316
|
-
onDone: {
|
|
1317
|
-
target: FirstPartyMachineStateTypes.done,
|
|
1318
|
-
actions: assign2({
|
|
1319
|
-
authorizationCodeResponse: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "authorizationCodeResponse")
|
|
1320
|
-
})
|
|
1321
|
-
},
|
|
1322
|
-
onError: [
|
|
1323
|
-
{
|
|
1324
|
-
target: FirstPartyMachineStateTypes.createConfig,
|
|
1325
|
-
cond: /* @__PURE__ */ __name((_ctx, _event) => _event.data.error === AuthorizationChallengeError.insufficient_authorization, "cond"),
|
|
1326
|
-
actions: assign2({
|
|
1327
|
-
authSession: /* @__PURE__ */ __name((_ctx, _event) => _event.data.auth_session, "authSession"),
|
|
1328
|
-
presentationUri: /* @__PURE__ */ __name((_ctx, _event) => _event.data.presentation, "presentationUri")
|
|
1329
|
-
})
|
|
1330
|
-
},
|
|
1331
|
-
{
|
|
1332
|
-
target: FirstPartyMachineStateTypes.error,
|
|
1333
|
-
actions: assign2({
|
|
1334
|
-
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1335
|
-
title: translate("oid4vci_machine_send_authorization_challenge_request_error_title"),
|
|
1336
|
-
message: _event.data.message,
|
|
1337
|
-
stack: _event.data.stack
|
|
1338
|
-
}), "error")
|
|
1339
|
-
})
|
|
1340
|
-
}
|
|
1341
|
-
]
|
|
1342
|
-
}
|
|
1343
|
-
},
|
|
1344
|
-
[FirstPartyMachineStateTypes.createConfig]: {
|
|
1345
|
-
id: FirstPartyMachineStateTypes.createConfig,
|
|
1346
|
-
invoke: {
|
|
1347
|
-
src: FirstPartyMachineServices.createConfig,
|
|
1348
|
-
onDone: {
|
|
1349
|
-
target: FirstPartyMachineStateTypes.getSiopRequest,
|
|
1350
|
-
actions: assign2({
|
|
1351
|
-
didAuthConfig: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "didAuthConfig")
|
|
1352
|
-
})
|
|
1353
|
-
},
|
|
1354
|
-
onError: {
|
|
1355
|
-
target: FirstPartyMachineStateTypes.error,
|
|
1356
|
-
actions: assign2({
|
|
1357
|
-
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1358
|
-
title: translate("oid4vci_machine_create_config_error_title"),
|
|
1359
|
-
message: _event.data.message,
|
|
1360
|
-
stack: _event.data.stack
|
|
1361
|
-
}), "error")
|
|
1362
|
-
})
|
|
1363
|
-
}
|
|
1364
|
-
}
|
|
1365
|
-
},
|
|
1366
|
-
[FirstPartyMachineStateTypes.getSiopRequest]: {
|
|
1367
|
-
id: FirstPartyMachineStateTypes.getSiopRequest,
|
|
1368
|
-
invoke: {
|
|
1369
|
-
src: FirstPartyMachineServices.getSiopRequest,
|
|
1370
|
-
onDone: {
|
|
1371
|
-
target: FirstPartyMachineStateTypes.selectCredentials,
|
|
1372
|
-
actions: assign2({
|
|
1373
|
-
authorizationRequestData: /* @__PURE__ */ __name((_ctx, _event) => _event.data, "authorizationRequestData")
|
|
1374
|
-
})
|
|
1375
|
-
},
|
|
1376
|
-
onError: {
|
|
1377
|
-
target: FirstPartyMachineStateTypes.error,
|
|
1378
|
-
actions: assign2({
|
|
1379
|
-
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1380
|
-
title: translate("siopV2_machine_get_request_error_title"),
|
|
1381
|
-
message: _event.data.message,
|
|
1382
|
-
stack: _event.data.stack
|
|
1383
|
-
}), "error")
|
|
1384
|
-
})
|
|
1385
|
-
}
|
|
1117
|
+
onError: {
|
|
1118
|
+
target: FirstPartyMachineStateTypes.error,
|
|
1119
|
+
actions: assign2({
|
|
1120
|
+
error: /* @__PURE__ */ __name((_ctx, _event) => ({
|
|
1121
|
+
title: translate("siopV2_machine_get_request_error_title"),
|
|
1122
|
+
message: _event.data.message,
|
|
1123
|
+
stack: _event.data.stack
|
|
1124
|
+
}), "error")
|
|
1125
|
+
})
|
|
1126
|
+
}
|
|
1386
1127
|
}
|
|
1387
1128
|
},
|
|
1388
1129
|
[FirstPartyMachineStateTypes.selectCredentials]: {
|
|
@@ -1449,96 +1190,357 @@ var createFirstPartyActivationMachine = /* @__PURE__ */ __name((opts) => {
|
|
|
1449
1190
|
contact: opts.contact,
|
|
1450
1191
|
selectedCredentials: []
|
|
1451
1192
|
};
|
|
1452
|
-
return createMachine2({
|
|
1453
|
-
id: opts?.machineId ?? "FirstParty",
|
|
1454
|
-
predictableActionArguments: true,
|
|
1455
|
-
initial: FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest,
|
|
1456
|
-
context: initialContext,
|
|
1457
|
-
states: firstPartyMachineStates,
|
|
1458
|
-
schema: {
|
|
1459
|
-
events: {},
|
|
1460
|
-
services: {}
|
|
1193
|
+
return createMachine2({
|
|
1194
|
+
id: opts?.machineId ?? "FirstParty",
|
|
1195
|
+
predictableActionArguments: true,
|
|
1196
|
+
initial: FirstPartyMachineStateTypes.sendAuthorizationChallengeRequest,
|
|
1197
|
+
context: initialContext,
|
|
1198
|
+
states: firstPartyMachineStates,
|
|
1199
|
+
schema: {
|
|
1200
|
+
events: {},
|
|
1201
|
+
services: {}
|
|
1202
|
+
}
|
|
1203
|
+
});
|
|
1204
|
+
}, "createFirstPartyActivationMachine");
|
|
1205
|
+
var FirstPartyMachine = class _FirstPartyMachine {
|
|
1206
|
+
static {
|
|
1207
|
+
__name(this, "FirstPartyMachine");
|
|
1208
|
+
}
|
|
1209
|
+
static _instance;
|
|
1210
|
+
static hasInstance() {
|
|
1211
|
+
return _FirstPartyMachine._instance !== void 0;
|
|
1212
|
+
}
|
|
1213
|
+
static get instance() {
|
|
1214
|
+
if (!_FirstPartyMachine._instance) {
|
|
1215
|
+
throw Error("Please initialize ESIMActivation machine first");
|
|
1216
|
+
}
|
|
1217
|
+
return _FirstPartyMachine._instance;
|
|
1218
|
+
}
|
|
1219
|
+
static clearInstance(opts) {
|
|
1220
|
+
const { stop } = opts;
|
|
1221
|
+
if (_FirstPartyMachine.hasInstance()) {
|
|
1222
|
+
if (stop) {
|
|
1223
|
+
_FirstPartyMachine.stopInstance();
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
_FirstPartyMachine._instance = void 0;
|
|
1227
|
+
}
|
|
1228
|
+
static stopInstance() {
|
|
1229
|
+
if (!_FirstPartyMachine.hasInstance()) {
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
_FirstPartyMachine.instance.stop();
|
|
1233
|
+
_FirstPartyMachine._instance = void 0;
|
|
1234
|
+
}
|
|
1235
|
+
static newInstance(opts) {
|
|
1236
|
+
const { agentContext } = opts;
|
|
1237
|
+
const services = {
|
|
1238
|
+
[FirstPartyMachineServices.sendAuthorizationChallengeRequest]: sendAuthorizationChallengeRequest,
|
|
1239
|
+
[FirstPartyMachineServices.createConfig]: (args) => createConfig(args, agentContext),
|
|
1240
|
+
[FirstPartyMachineServices.getSiopRequest]: (args) => getSiopRequest(args, agentContext),
|
|
1241
|
+
[FirstPartyMachineServices.sendAuthorizationResponse]: (args) => sendAuthorizationResponse(args, agentContext)
|
|
1242
|
+
};
|
|
1243
|
+
const newInst = interpret2(createFirstPartyActivationMachine(opts).withConfig({
|
|
1244
|
+
services: {
|
|
1245
|
+
...services,
|
|
1246
|
+
...opts?.services
|
|
1247
|
+
},
|
|
1248
|
+
guards: {
|
|
1249
|
+
...opts?.guards
|
|
1250
|
+
}
|
|
1251
|
+
}));
|
|
1252
|
+
if (typeof opts?.subscription === "function") {
|
|
1253
|
+
newInst.onTransition(opts.subscription);
|
|
1254
|
+
}
|
|
1255
|
+
if (opts?.requireCustomNavigationHook !== true) {
|
|
1256
|
+
newInst.onTransition((snapshot) => {
|
|
1257
|
+
if (opts?.stateNavigationListener) {
|
|
1258
|
+
void opts.stateNavigationListener(newInst, snapshot);
|
|
1259
|
+
}
|
|
1260
|
+
});
|
|
1261
|
+
}
|
|
1262
|
+
return newInst;
|
|
1263
|
+
}
|
|
1264
|
+
static getInstance(opts) {
|
|
1265
|
+
if (!_FirstPartyMachine._instance) {
|
|
1266
|
+
if (opts?.requireExisting === true) {
|
|
1267
|
+
throw Error(`Existing FirstPartyMachine instance requested, but none was created at this point!`);
|
|
1268
|
+
}
|
|
1269
|
+
_FirstPartyMachine._instance = _FirstPartyMachine.newInstance(opts);
|
|
1270
|
+
}
|
|
1271
|
+
return _FirstPartyMachine._instance;
|
|
1272
|
+
}
|
|
1273
|
+
};
|
|
1274
|
+
|
|
1275
|
+
// src/mappers/OIDC4VCIBrandingMapper.ts
|
|
1276
|
+
var oid4vciGetCredentialBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1277
|
+
const { credentialDisplay, issuerCredentialSubject } = args;
|
|
1278
|
+
return oid4vciCombineDisplayLocalesFrom({
|
|
1279
|
+
...issuerCredentialSubject && {
|
|
1280
|
+
issuerCredentialSubjectLocales: await oid4vciIssuerCredentialSubjectLocalesFrom({
|
|
1281
|
+
issuerCredentialSubject
|
|
1282
|
+
})
|
|
1283
|
+
},
|
|
1284
|
+
...credentialDisplay && {
|
|
1285
|
+
credentialDisplayLocales: await oid4vciCredentialDisplayLocalesFrom({
|
|
1286
|
+
credentialDisplay
|
|
1287
|
+
})
|
|
1288
|
+
}
|
|
1289
|
+
});
|
|
1290
|
+
}, "oid4vciGetCredentialBrandingFrom");
|
|
1291
|
+
var oid4vciCredentialDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1292
|
+
const { credentialDisplay } = args;
|
|
1293
|
+
return credentialDisplay.reduce((localeDisplays, display) => {
|
|
1294
|
+
const localeKey = display.locale || "";
|
|
1295
|
+
localeDisplays.set(localeKey, display);
|
|
1296
|
+
return localeDisplays;
|
|
1297
|
+
}, /* @__PURE__ */ new Map());
|
|
1298
|
+
}, "oid4vciCredentialDisplayLocalesFrom");
|
|
1299
|
+
var oid4vciIssuerCredentialSubjectLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1300
|
+
const { issuerCredentialSubject } = args;
|
|
1301
|
+
const localeClaims = /* @__PURE__ */ new Map();
|
|
1302
|
+
const processClaimObject = /* @__PURE__ */ __name((claim, parentKey = "") => {
|
|
1303
|
+
Object.entries(claim).forEach(([key, value]) => {
|
|
1304
|
+
if (key === "mandatory" || key === "value_type") {
|
|
1305
|
+
return;
|
|
1306
|
+
}
|
|
1307
|
+
if (key === "display" && Array.isArray(value)) {
|
|
1308
|
+
value.forEach(({ name, locale = "" }) => {
|
|
1309
|
+
if (!name) {
|
|
1310
|
+
return;
|
|
1311
|
+
}
|
|
1312
|
+
if (!localeClaims.has(locale)) {
|
|
1313
|
+
localeClaims.set(locale, []);
|
|
1314
|
+
}
|
|
1315
|
+
localeClaims.get(locale).push({
|
|
1316
|
+
key: parentKey,
|
|
1317
|
+
name
|
|
1318
|
+
});
|
|
1319
|
+
});
|
|
1320
|
+
} else if (typeof value === "object" && value !== null) {
|
|
1321
|
+
processClaimObject(value, parentKey ? `${parentKey}.${key}` : key);
|
|
1322
|
+
}
|
|
1323
|
+
});
|
|
1324
|
+
}, "processClaimObject");
|
|
1325
|
+
processClaimObject(issuerCredentialSubject);
|
|
1326
|
+
return localeClaims;
|
|
1327
|
+
}, "oid4vciIssuerCredentialSubjectLocalesFrom");
|
|
1328
|
+
var oid4vciCredentialLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1329
|
+
const { credentialDisplay } = args;
|
|
1330
|
+
return {
|
|
1331
|
+
...credentialDisplay.name && {
|
|
1332
|
+
alias: credentialDisplay.name
|
|
1333
|
+
},
|
|
1334
|
+
...credentialDisplay.locale && {
|
|
1335
|
+
locale: credentialDisplay.locale
|
|
1336
|
+
},
|
|
1337
|
+
...credentialDisplay.logo && {
|
|
1338
|
+
logo: {
|
|
1339
|
+
...(credentialDisplay.logo.url || credentialDisplay.logo.uri) && {
|
|
1340
|
+
uri: credentialDisplay.logo?.url ?? credentialDisplay.logo.uri
|
|
1341
|
+
},
|
|
1342
|
+
...credentialDisplay.logo.alt_text && {
|
|
1343
|
+
alt: credentialDisplay.logo?.alt_text
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
},
|
|
1347
|
+
...credentialDisplay.description && {
|
|
1348
|
+
description: credentialDisplay.description
|
|
1349
|
+
},
|
|
1350
|
+
...credentialDisplay.text_color && {
|
|
1351
|
+
text: {
|
|
1352
|
+
color: credentialDisplay.text_color
|
|
1353
|
+
}
|
|
1354
|
+
},
|
|
1355
|
+
...(credentialDisplay.background_image || credentialDisplay.background_color) && {
|
|
1356
|
+
background: {
|
|
1357
|
+
...credentialDisplay.background_image && {
|
|
1358
|
+
image: {
|
|
1359
|
+
...(credentialDisplay.background_image.url || credentialDisplay.background_image.uri) && {
|
|
1360
|
+
uri: credentialDisplay.background_image?.url ?? credentialDisplay.background_image.uri
|
|
1361
|
+
},
|
|
1362
|
+
...credentialDisplay.background_image.alt_text && {
|
|
1363
|
+
alt: credentialDisplay.background_image?.alt_text
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
},
|
|
1367
|
+
...credentialDisplay.background_color && {
|
|
1368
|
+
color: credentialDisplay.background_color
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
};
|
|
1373
|
+
}, "oid4vciCredentialLocaleBrandingFrom");
|
|
1374
|
+
var oid4vciCombineDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1375
|
+
const { credentialDisplayLocales = /* @__PURE__ */ new Map(), issuerCredentialSubjectLocales = /* @__PURE__ */ new Map() } = args;
|
|
1376
|
+
const locales = Array.from(/* @__PURE__ */ new Set([
|
|
1377
|
+
...issuerCredentialSubjectLocales.keys(),
|
|
1378
|
+
...credentialDisplayLocales.keys()
|
|
1379
|
+
]));
|
|
1380
|
+
return Promise.all(locales.map(async (locale) => {
|
|
1381
|
+
const display = credentialDisplayLocales.get(locale);
|
|
1382
|
+
const claims = issuerCredentialSubjectLocales.get(locale);
|
|
1383
|
+
return {
|
|
1384
|
+
...display && await oid4vciCredentialLocaleBrandingFrom({
|
|
1385
|
+
credentialDisplay: display
|
|
1386
|
+
}),
|
|
1387
|
+
...locale.length > 0 && {
|
|
1388
|
+
locale
|
|
1389
|
+
},
|
|
1390
|
+
claims
|
|
1391
|
+
};
|
|
1392
|
+
}));
|
|
1393
|
+
}, "oid4vciCombineDisplayLocalesFrom");
|
|
1394
|
+
var sdJwtGetCredentialBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1395
|
+
const { credentialDisplay, claimsMetadata } = args;
|
|
1396
|
+
return sdJwtCombineDisplayLocalesFrom({
|
|
1397
|
+
...claimsMetadata && {
|
|
1398
|
+
claimsMetadata: await sdJwtCredentialClaimLocalesFrom({
|
|
1399
|
+
claimsMetadata
|
|
1400
|
+
})
|
|
1401
|
+
},
|
|
1402
|
+
...credentialDisplay && {
|
|
1403
|
+
credentialDisplayLocales: await sdJwtCredentialDisplayLocalesFrom({
|
|
1404
|
+
credentialDisplay
|
|
1405
|
+
})
|
|
1461
1406
|
}
|
|
1462
1407
|
});
|
|
1463
|
-
}, "
|
|
1464
|
-
var
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
if (stop) {
|
|
1482
|
-
_FirstPartyMachine.stopInstance();
|
|
1408
|
+
}, "sdJwtGetCredentialBrandingFrom");
|
|
1409
|
+
var sdJwtCredentialDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1410
|
+
const { credentialDisplay } = args;
|
|
1411
|
+
return credentialDisplay.reduce((localeDisplays, display) => {
|
|
1412
|
+
const localeKey = display.lang || "";
|
|
1413
|
+
localeDisplays.set(localeKey, display);
|
|
1414
|
+
return localeDisplays;
|
|
1415
|
+
}, /* @__PURE__ */ new Map());
|
|
1416
|
+
}, "sdJwtCredentialDisplayLocalesFrom");
|
|
1417
|
+
var sdJwtCredentialClaimLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1418
|
+
const { claimsMetadata } = args;
|
|
1419
|
+
const localeClaims = /* @__PURE__ */ new Map();
|
|
1420
|
+
claimsMetadata.forEach((claim) => {
|
|
1421
|
+
claim.display?.forEach((display) => {
|
|
1422
|
+
const { lang = "", label } = display;
|
|
1423
|
+
const key = claim.path.map((value) => String(value)).join(".");
|
|
1424
|
+
if (!localeClaims.has(lang)) {
|
|
1425
|
+
localeClaims.set(lang, []);
|
|
1483
1426
|
}
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
}
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1427
|
+
localeClaims.get(lang).push({
|
|
1428
|
+
key,
|
|
1429
|
+
name: label
|
|
1430
|
+
});
|
|
1431
|
+
});
|
|
1432
|
+
});
|
|
1433
|
+
return localeClaims;
|
|
1434
|
+
}, "sdJwtCredentialClaimLocalesFrom");
|
|
1435
|
+
var sdJwtCredentialLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1436
|
+
const { credentialDisplay } = args;
|
|
1437
|
+
return {
|
|
1438
|
+
...credentialDisplay.name && {
|
|
1439
|
+
alias: credentialDisplay.name
|
|
1440
|
+
},
|
|
1441
|
+
...credentialDisplay.lang && {
|
|
1442
|
+
locale: credentialDisplay.lang
|
|
1443
|
+
},
|
|
1444
|
+
...credentialDisplay.rendering?.simple?.logo && {
|
|
1445
|
+
logo: {
|
|
1446
|
+
...credentialDisplay.rendering.simple.logo.uri && {
|
|
1447
|
+
uri: credentialDisplay.rendering.simple.logo.uri
|
|
1448
|
+
},
|
|
1449
|
+
...credentialDisplay.rendering.simple.logo.alt_text && {
|
|
1450
|
+
alt: credentialDisplay.rendering.simple.logo.alt_text
|
|
1451
|
+
}
|
|
1452
|
+
}
|
|
1453
|
+
},
|
|
1454
|
+
...credentialDisplay.description && {
|
|
1455
|
+
description: credentialDisplay.description
|
|
1456
|
+
},
|
|
1457
|
+
...credentialDisplay.rendering?.simple?.text_color && {
|
|
1458
|
+
text: {
|
|
1459
|
+
color: credentialDisplay.rendering.simple.text_color
|
|
1460
|
+
}
|
|
1461
|
+
},
|
|
1462
|
+
...credentialDisplay.rendering?.simple?.background_color && {
|
|
1463
|
+
background: {
|
|
1464
|
+
color: credentialDisplay.rendering.simple.background_color
|
|
1509
1465
|
}
|
|
1510
|
-
}));
|
|
1511
|
-
if (typeof opts?.subscription === "function") {
|
|
1512
|
-
newInst.onTransition(opts.subscription);
|
|
1513
1466
|
}
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1467
|
+
};
|
|
1468
|
+
}, "sdJwtCredentialLocaleBrandingFrom");
|
|
1469
|
+
var sdJwtCombineDisplayLocalesFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1470
|
+
const { credentialDisplayLocales = /* @__PURE__ */ new Map(), claimsMetadata = /* @__PURE__ */ new Map() } = args;
|
|
1471
|
+
const locales = Array.from(/* @__PURE__ */ new Set([
|
|
1472
|
+
...claimsMetadata.keys(),
|
|
1473
|
+
...credentialDisplayLocales.keys()
|
|
1474
|
+
]));
|
|
1475
|
+
return Promise.all(locales.map(async (locale) => {
|
|
1476
|
+
const display = credentialDisplayLocales.get(locale);
|
|
1477
|
+
const claims = claimsMetadata.get(locale);
|
|
1478
|
+
return {
|
|
1479
|
+
...display && await sdJwtCredentialLocaleBrandingFrom({
|
|
1480
|
+
credentialDisplay: display
|
|
1481
|
+
}),
|
|
1482
|
+
...locale.length > 0 && {
|
|
1483
|
+
locale
|
|
1484
|
+
},
|
|
1485
|
+
claims
|
|
1486
|
+
};
|
|
1487
|
+
}));
|
|
1488
|
+
}, "sdJwtCombineDisplayLocalesFrom");
|
|
1489
|
+
var issuerLocaleBrandingFrom = /* @__PURE__ */ __name(async (args) => {
|
|
1490
|
+
const { issuerDisplay, dynamicRegistrationClientMetadata } = args;
|
|
1491
|
+
return {
|
|
1492
|
+
...dynamicRegistrationClientMetadata?.client_name && {
|
|
1493
|
+
alias: dynamicRegistrationClientMetadata.client_name
|
|
1494
|
+
},
|
|
1495
|
+
...issuerDisplay.name && {
|
|
1496
|
+
alias: issuerDisplay.name
|
|
1497
|
+
},
|
|
1498
|
+
...issuerDisplay.locale && {
|
|
1499
|
+
locale: issuerDisplay.locale
|
|
1500
|
+
},
|
|
1501
|
+
...(issuerDisplay.logo || dynamicRegistrationClientMetadata?.logo_uri) && {
|
|
1502
|
+
logo: {
|
|
1503
|
+
...dynamicRegistrationClientMetadata?.logo_uri && {
|
|
1504
|
+
uri: dynamicRegistrationClientMetadata?.logo_uri
|
|
1505
|
+
},
|
|
1506
|
+
...(issuerDisplay.logo?.url || issuerDisplay.logo?.uri) && {
|
|
1507
|
+
uri: issuerDisplay.logo?.url ?? issuerDisplay.logo?.uri
|
|
1508
|
+
},
|
|
1509
|
+
...issuerDisplay.logo?.alt_text && {
|
|
1510
|
+
alt: issuerDisplay.logo?.alt_text
|
|
1518
1511
|
}
|
|
1519
|
-
});
|
|
1520
|
-
}
|
|
1521
|
-
return newInst;
|
|
1522
|
-
}
|
|
1523
|
-
static getInstance(opts) {
|
|
1524
|
-
if (!_FirstPartyMachine._instance) {
|
|
1525
|
-
if (opts?.requireExisting === true) {
|
|
1526
|
-
throw Error(`Existing FirstPartyMachine instance requested, but none was created at this point!`);
|
|
1527
1512
|
}
|
|
1528
|
-
|
|
1513
|
+
},
|
|
1514
|
+
...issuerDisplay.description && {
|
|
1515
|
+
description: issuerDisplay.description
|
|
1516
|
+
},
|
|
1517
|
+
...issuerDisplay.text_color && {
|
|
1518
|
+
text: {
|
|
1519
|
+
color: issuerDisplay.text_color
|
|
1520
|
+
}
|
|
1521
|
+
},
|
|
1522
|
+
...dynamicRegistrationClientMetadata?.client_uri && {
|
|
1523
|
+
clientUri: dynamicRegistrationClientMetadata.client_uri
|
|
1524
|
+
},
|
|
1525
|
+
...dynamicRegistrationClientMetadata?.tos_uri && {
|
|
1526
|
+
tosUri: dynamicRegistrationClientMetadata.tos_uri
|
|
1527
|
+
},
|
|
1528
|
+
...dynamicRegistrationClientMetadata?.policy_uri && {
|
|
1529
|
+
policyUri: dynamicRegistrationClientMetadata.policy_uri
|
|
1530
|
+
},
|
|
1531
|
+
...dynamicRegistrationClientMetadata?.contacts && {
|
|
1532
|
+
contacts: dynamicRegistrationClientMetadata.contacts
|
|
1529
1533
|
}
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
};
|
|
1534
|
+
};
|
|
1535
|
+
}, "issuerLocaleBrandingFrom");
|
|
1533
1536
|
|
|
1534
1537
|
// src/services/OID4VCIHolderService.ts
|
|
1535
|
-
import { defaultHasher } from "@sphereon/ssi-sdk.core";
|
|
1536
1538
|
var getCredentialBranding = /* @__PURE__ */ __name(async (args) => {
|
|
1537
1539
|
const { credentialsSupported, context } = args;
|
|
1538
1540
|
const credentialBranding = {};
|
|
1539
1541
|
await Promise.all(Object.entries(credentialsSupported).map(async ([configId, credentialsConfigSupported]) => {
|
|
1540
1542
|
let sdJwtTypeMetadata;
|
|
1541
|
-
if (credentialsConfigSupported.format === "
|
|
1543
|
+
if (credentialsConfigSupported.format === "dc+sd-jwt") {
|
|
1542
1544
|
const vct = credentialsConfigSupported.vct;
|
|
1543
1545
|
if (vct.startsWith("http")) {
|
|
1544
1546
|
try {
|
|
@@ -1604,10 +1606,7 @@ var selectCredentialLocaleBranding = /* @__PURE__ */ __name(async (args) => {
|
|
|
1604
1606
|
}, "selectCredentialLocaleBranding");
|
|
1605
1607
|
var verifyCredentialToAccept = /* @__PURE__ */ __name(async (args) => {
|
|
1606
1608
|
const { mappedCredential, hasher, onVerifyEBSICredentialIssuer, schemaValidation, context } = args;
|
|
1607
|
-
const credential = mappedCredential.credentialToAccept.credentialResponse
|
|
1608
|
-
if (!credential) {
|
|
1609
|
-
return Promise.reject(Error("No credential found in credential response"));
|
|
1610
|
-
}
|
|
1609
|
+
const credential = extractCredentialFromResponse(mappedCredential.credentialToAccept.credentialResponse);
|
|
1611
1610
|
const wrappedVC = CredentialMapper.toWrappedVerifiableCredential(credential, {
|
|
1612
1611
|
hasher: hasher ?? defaultHasher
|
|
1613
1612
|
});
|
|
@@ -1659,11 +1658,7 @@ var verifyCredentialToAccept = /* @__PURE__ */ __name(async (args) => {
|
|
|
1659
1658
|
}, "verifyCredentialToAccept");
|
|
1660
1659
|
var mapCredentialToAccept = /* @__PURE__ */ __name(async (args) => {
|
|
1661
1660
|
const { credentialToAccept, hasher } = args;
|
|
1662
|
-
const
|
|
1663
|
-
const verifiableCredential = credentialResponse.credential;
|
|
1664
|
-
if (!verifiableCredential) {
|
|
1665
|
-
return Promise.reject(Error("No credential found in credential response"));
|
|
1666
|
-
}
|
|
1661
|
+
const verifiableCredential = extractCredentialFromResponse(credentialToAccept.credentialResponse);
|
|
1667
1662
|
const wrappedVerifiableCredential = CredentialMapper.toWrappedVerifiableCredential(verifiableCredential, {
|
|
1668
1663
|
hasher
|
|
1669
1664
|
});
|
|
@@ -1683,6 +1678,7 @@ var mapCredentialToAccept = /* @__PURE__ */ __name(async (args) => {
|
|
|
1683
1678
|
uniformVerifiableCredential = wrappedVerifiableCredential.credential;
|
|
1684
1679
|
}
|
|
1685
1680
|
const correlationId = typeof uniformVerifiableCredential.issuer === "string" ? uniformVerifiableCredential.issuer : CredentialMapper.isSdJwtDecodedCredential(uniformVerifiableCredential) ? uniformVerifiableCredential.decodedPayload.iss : uniformVerifiableCredential.issuer.id;
|
|
1681
|
+
const credentialResponse = credentialToAccept.credentialResponse;
|
|
1686
1682
|
return {
|
|
1687
1683
|
correlationId,
|
|
1688
1684
|
credentialToAccept,
|
|
@@ -1694,6 +1690,18 @@ var mapCredentialToAccept = /* @__PURE__ */ __name(async (args) => {
|
|
|
1694
1690
|
}
|
|
1695
1691
|
};
|
|
1696
1692
|
}, "mapCredentialToAccept");
|
|
1693
|
+
var extractCredentialFromResponse = /* @__PURE__ */ __name((credentialResponse) => {
|
|
1694
|
+
let credential;
|
|
1695
|
+
if ("credential" in credentialResponse) {
|
|
1696
|
+
credential = credentialResponse.credential;
|
|
1697
|
+
} else if ("credentials" in credentialResponse && credentialResponse.credentials && Array.isArray(credentialResponse.credentials) && credentialResponse.credentials.length > 0) {
|
|
1698
|
+
credential = credentialResponse.credentials[0].credential;
|
|
1699
|
+
}
|
|
1700
|
+
if (!credential) {
|
|
1701
|
+
throw new Error("No credential found in credential response");
|
|
1702
|
+
}
|
|
1703
|
+
return credential;
|
|
1704
|
+
}, "extractCredentialFromResponse");
|
|
1697
1705
|
var getIdentifierOpts = /* @__PURE__ */ __name(async (args) => {
|
|
1698
1706
|
const { issuanceOpt, context } = args;
|
|
1699
1707
|
const { identifier: identifierArg } = issuanceOpt;
|
|
@@ -1802,24 +1810,22 @@ var getCredentialConfigsSupportedBySingleTypeOrId = /* @__PURE__ */ __name(async
|
|
|
1802
1810
|
}
|
|
1803
1811
|
__name(createIdFromTypes, "createIdFromTypes");
|
|
1804
1812
|
if (configurationId) {
|
|
1805
|
-
|
|
1813
|
+
if (!format) {
|
|
1814
|
+
return Promise.reject(Error("format parameter missing from input"));
|
|
1815
|
+
}
|
|
1816
|
+
const allSupported2 = client.getCredentialsSupported(format);
|
|
1806
1817
|
return Object.fromEntries(Object.entries(allSupported2).filter(([id, supported]) => id === configurationId || supported.id === configurationId || createIdFromTypes(supported) === configurationId));
|
|
1807
1818
|
}
|
|
1808
|
-
if (!
|
|
1809
|
-
return Promise.reject(Error("openID4VCIClient has no credentialOffer
|
|
1819
|
+
if (!client.credentialOffer) {
|
|
1820
|
+
return Promise.reject(Error("openID4VCIClient has no credentialOffer"));
|
|
1810
1821
|
}
|
|
1811
|
-
if (!
|
|
1812
|
-
|
|
1813
|
-
format = client.credentialOffer.credential_offer.credentials.filter((cred) => typeof cred !== "string").map((cred) => cred.format);
|
|
1814
|
-
if (format?.length === 0) {
|
|
1815
|
-
format = void 0;
|
|
1816
|
-
}
|
|
1817
|
-
}
|
|
1822
|
+
if (!types) {
|
|
1823
|
+
return Promise.reject(Error("openID4VCIClient has no types"));
|
|
1818
1824
|
}
|
|
1819
1825
|
const offerSupported = getSupportedCredentials({
|
|
1820
|
-
types:
|
|
1826
|
+
types: [
|
|
1821
1827
|
types
|
|
1822
|
-
]
|
|
1828
|
+
],
|
|
1823
1829
|
format,
|
|
1824
1830
|
version: client.version(),
|
|
1825
1831
|
issuerMetadata: client.endpointMetadata.credentialIssuerMetadata
|
|
@@ -1994,7 +2000,8 @@ var getIssuanceCryptoSuite = /* @__PURE__ */ __name(async (opts) => {
|
|
|
1994
2000
|
case "jwt":
|
|
1995
2001
|
case "jwt_vc_json":
|
|
1996
2002
|
case "jwt_vc":
|
|
1997
|
-
case
|
|
2003
|
+
//case 'vc+sd-jwt': // TODO see SSISDK-52 concerning vc+sd-jwt
|
|
2004
|
+
case "dc+sd-jwt":
|
|
1998
2005
|
case "mso_mdoc": {
|
|
1999
2006
|
const supportedPreferences = jwtCryptographicSuitePreferences.filter((suite) => signing_algs_supported.includes(suite));
|
|
2000
2007
|
if (supportedPreferences.length > 0) {
|
|
@@ -2063,7 +2070,6 @@ var startFirstPartApplicationMachine = /* @__PURE__ */ __name(async (args, conte
|
|
|
2063
2070
|
|
|
2064
2071
|
// src/agent/OID4VCIHolder.ts
|
|
2065
2072
|
import "cross-fetch/polyfill";
|
|
2066
|
-
import { defaultHasher as defaultHasher2 } from "@sphereon/ssi-sdk.core";
|
|
2067
2073
|
var oid4vciHolderContextMethods = [
|
|
2068
2074
|
"cmGetContacts",
|
|
2069
2075
|
"cmGetContact",
|
|
@@ -2079,7 +2085,7 @@ var oid4vciHolderContextMethods = [
|
|
|
2079
2085
|
];
|
|
2080
2086
|
var logger = Loggers.DEFAULT.get("sphereon:oid4vci:holder");
|
|
2081
2087
|
function signCallback(identifier, context, nonce) {
|
|
2082
|
-
return async (jwt, kid) => {
|
|
2088
|
+
return async (jwt, kid, noIssPayloadUpdate) => {
|
|
2083
2089
|
let resolution = await context.agent.identifierManagedGet(identifier);
|
|
2084
2090
|
const jwk = jwt.header.jwk ?? (resolution.method === "jwk" ? resolution.jwk : void 0);
|
|
2085
2091
|
if (!resolution.issuer && !jwt.payload.iss) {
|
|
@@ -2097,7 +2103,7 @@ function signCallback(identifier, context, nonce) {
|
|
|
2097
2103
|
return (await context.agent.jwtCreateJwsCompactSignature({
|
|
2098
2104
|
issuer: {
|
|
2099
2105
|
...resolution,
|
|
2100
|
-
noIssPayloadUpdate: false
|
|
2106
|
+
noIssPayloadUpdate: noIssPayloadUpdate ?? false
|
|
2101
2107
|
},
|
|
2102
2108
|
protectedHeader: header,
|
|
2103
2109
|
payload
|
|
@@ -2132,6 +2138,7 @@ var OID4VCIHolder = class _OID4VCIHolder {
|
|
|
2132
2138
|
oid4vciHolderStoreIssuerBranding: this.oid4vciHolderStoreIssuerBranding.bind(this)
|
|
2133
2139
|
};
|
|
2134
2140
|
vcFormatPreferences = [
|
|
2141
|
+
"dc+sd-jwt",
|
|
2135
2142
|
"vc+sd-jwt",
|
|
2136
2143
|
"mso_mdoc",
|
|
2137
2144
|
"jwt_vc_json",
|
|
@@ -2320,7 +2327,13 @@ var OID4VCIHolder = class _OID4VCIHolder {
|
|
|
2320
2327
|
}
|
|
2321
2328
|
}
|
|
2322
2329
|
if (offer) {
|
|
2323
|
-
|
|
2330
|
+
const credentialsSupported2 = offer.original_credential_offer.credential_configuration_ids.flatMap((configId) => {
|
|
2331
|
+
const config = oid4vciClient.endpointMetadata.credentialIssuerMetadata?.credential_configurations_supported[configId];
|
|
2332
|
+
return config ? [
|
|
2333
|
+
config
|
|
2334
|
+
] : [];
|
|
2335
|
+
});
|
|
2336
|
+
types = credentialsSupported2.map((credentialSupported) => getTypesFromCredentialSupported2(credentialSupported));
|
|
2324
2337
|
} else {
|
|
2325
2338
|
types = asArray2(authorizationRequestOpts.authorizationDetails).map((authReqOpts) => getTypesFromAuthorizationDetails(authReqOpts) ?? []).filter((inner) => inner.length > 0);
|
|
2326
2339
|
}
|
|
@@ -2718,7 +2731,7 @@ var OID4VCIHolder = class _OID4VCIHolder {
|
|
|
2718
2731
|
if (Array.isArray(subjectIssuance?.notification_events_supported)) {
|
|
2719
2732
|
event = subjectIssuance.notification_events_supported.includes("credential_accepted_holder_signed") ? "credential_accepted_holder_signed" : "credential_deleted_holder_signed";
|
|
2720
2733
|
logger.log(`Subject issuance/signing will be used, with event`, event);
|
|
2721
|
-
const issuerVC = mappedCredentialToAccept.credentialToAccept.credentialResponse
|
|
2734
|
+
const issuerVC = extractCredentialFromResponse(mappedCredentialToAccept.credentialToAccept.credentialResponse);
|
|
2722
2735
|
const wrappedIssuerVC = CredentialMapper2.toWrappedVerifiableCredential(issuerVC, {
|
|
2723
2736
|
hasher: this.hasher ?? defaultHasher2
|
|
2724
2737
|
});
|
|
@@ -3089,6 +3102,7 @@ export {
|
|
|
3089
3102
|
RequestType,
|
|
3090
3103
|
SupportedLanguage,
|
|
3091
3104
|
createConfig,
|
|
3105
|
+
extractCredentialFromResponse,
|
|
3092
3106
|
getBasicIssuerLocaleBranding,
|
|
3093
3107
|
getCredentialBranding,
|
|
3094
3108
|
getCredentialConfigsBasedOnFormatPref,
|