@credo-ts/core 0.7.4 → 0.7.5-alpha-20261030145251
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DcqlService.d.mts","names":[],"sources":["../../../src/modules/dcql/DcqlService.ts"],"mappings":";;;;;;;;;;;;iBAqEiB;;;;;;;;;;EAUf,UAAU;;qBAIC;;;;;UAKG;UAwGN;EAsCK,gCACX,cAAc,cACd,cAAc,wBACd,iBAAiB,mCAChB,QAAQ;EA+GE,yBAAyB,cAAc,cAAc,WAAW,YAAY,QAAQ;;;;;;;;;;;UA4LzF;EAwCK,4BACX,cAAc,cACd,kBAAkB,kBAClB,WAAW,YAAS;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"DcqlService.d.mts","names":[],"sources":["../../../src/modules/dcql/DcqlService.ts"],"mappings":";;;;;;;;;;;;iBAqEiB;;;;;;;;;;EAUf,UAAU;;qBAIC;;;;;UAKG;UAwGN;EAsCK,gCACX,cAAc,cACd,cAAc,wBACd,iBAAiB,mCAChB,QAAQ;EA+GE,yBAAyB,cAAc,cAAc,WAAW,YAAY,QAAQ;;;;;;;;;;;UA4LzF;EAwCK,4BACX,cAAc,cACd,kBAAkB,kBAClB,WAAW,YAAS;;;;;;;;;;YAsgBo8o8B;YAAwD;;;;;;;;;;;YAAoZ,4CAAC;;;;;;;;;;;YAAyW,8BAAC;;;cAAoH;;;;;;;;;YAA0S,+BAAC;;;cAAqH;;;;;;;;;cAAoW,qCAAC;cAA2E;;;;;;;;;YAAyR,mCAAC;;;cAAgJ,qCAAC;;;;;;;;;;;;;;;;;;;;;;;;QAA04B,oCAAC;;;;;YAAyM;YAAwD;;;;;;;;;;;YAAoZ,4CAAC;;;;;;;;;;YAAgW;;;;;;;;;;;;YAAqZ,8BAAC;;;cAAoH;;;;;;;;;YAA0S,+BAAC;;;cAAqH;;;;;;;;;cAAoW,qCAAC;cAA2E;;;;;;;;;YAAyR,mCAAC;;;cAAgJ,qCAAC;;;;;;;;YAA+S,8BAAC;;;cAAoH;;;;;;;;;;;;cAA+Z;;;;;;YAAyM;;;;cAA+L,qCAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAwoC;QAA4C,oCAAC;;;;;YAAyM;YAAwD;;;;;;;;;;;YAAoZ,4CAAC;;;;;;;;;;YAAgW;;;;;;;;;;;;YAAqZ,8BAAC;;;cAAoH;;;;;;;;;YAA0S,+BAAC;;;cAAqH;;;;;;;;;cAAoW,qCAAC;cAA2E;;;;;;;;;YAAyR,mCAAC;;;cAAgJ,qCAAC;;;;;;;;YAA+S,8BAAC;;;cAAoH;;;;;;;;;;;;cAA+Z;;;;;;YAAyM;;;;cAA+L,qCAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAkrC;;;;;;;UAvcxvj9B;UAQA;;;;;EAqDD,4BACL,iBAAiB,qBACf,YAAuD,yCACxD;EAwEI,kBAAkB,WAAW,YAAY,UAAU,kBAAkB;EAM/D,mBACX,cAAc,cACd;IACE,6BAA6B;IAC7B;IACA;IACA,wBAAwB;MAEzB;IACD,kBAAkB;IAClB,yBAAyB;;UAmOnB;UAaA;UAIA;UAIM;UAoBN"}
|
|
@@ -80,7 +80,7 @@ let DcqlService = class DcqlService {
|
|
|
80
80
|
if (formats.has("ldp_vc")) {
|
|
81
81
|
const w3cRecords = await w3cCredentialRepository.findByQuery(agentContext, {
|
|
82
82
|
claimFormat: "ldp_vc",
|
|
83
|
-
$or: dcqlQuery.credentials.flatMap((c) => c.format === "
|
|
83
|
+
$or: dcqlQuery.credentials.flatMap((c) => c.format === "ldp_vc" ? c.meta.type_values : []).map((typeValues) => ({ expandedTypes: typeValues }))
|
|
84
84
|
});
|
|
85
85
|
allRecords.push(...w3cRecords);
|
|
86
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DcqlService.mjs","names":["getDcqlVcPresentationsToCreate"],"sources":["../../../src/modules/dcql/DcqlService.ts"],"sourcesContent":["import {\n DcqlCredential,\n DcqlCredentialQuery,\n DcqlMdocCredential,\n DcqlPresentationResult,\n DcqlQuery,\n DcqlSdJwtVcCredential,\n DcqlW3cVcCredential,\n} from 'dcql'\nimport type { AgentContext } from '../../agent'\nimport { injectable } from '../../plugins'\nimport { isNonEmptyArray, type JsonObject, type JsonValue, mapNonEmptyArray } from '../../types'\nimport { asArray, JsonTransformer, TypedArrayEncoder } from '../../utils'\nimport {\n CredentialMultiInstanceUseMode,\n canUseInstanceFromCredentialRecord,\n useInstanceFromCredentialRecord,\n} from '../../utils/credentialUse'\nimport { DidsApi, getPublicJwkFromVerificationMethod, VerificationMethod } from '../dids'\nimport type { VerifiableCredential, VerifiablePresentation } from '../dif-presentation-exchange/index'\nimport {\n Mdoc,\n MdocApi,\n MdocDeviceResponse,\n type MdocNameSpaces,\n MdocRecord,\n type MdocSessionTranscriptOptions,\n} from '../mdoc'\nimport { SdJwtVcApi, SdJwtVcRecord, SdJwtVcService } from '../sd-jwt-vc'\nimport {\n applyDisclosuresForPaths,\n buildDisclosureFrameForPayload,\n buildPresentationFrameForPaths,\n type ClaimPath,\n getClaimPathsForDcqlClaimSet,\n} from '../sd-jwt-vc/disclosureFrame'\nimport {\n ClaimFormat,\n SignatureSuiteRegistry,\n W3cCredentialRecord,\n W3cCredentialRepository,\n W3cCredentialService,\n W3cJsonLdCredentialService,\n W3cJsonLdVerifiableCredential,\n W3cPresentation,\n W3cV2Credential,\n W3cV2CredentialRecord,\n W3cV2CredentialRepository,\n W3cV2CredentialService,\n W3cV2EnvelopedVerifiableCredential,\n W3cV2JwtVerifiableCredential,\n W3cV2Presentation,\n type W3cV2VerifiableCredential,\n} from '../vc'\nimport { purposes } from '../vc/linked-data-proofs/adapters/jsonld-signatures-adapter'\nimport { W3cV2SdJwtCredentialService, W3cV2SdJwtVerifiableCredential } from '../vc/sd-jwt-vc'\nimport { X509Certificate } from '../x509'\nimport { DcqlError } from './DcqlError'\nimport type {\n DcqlCredentialsForRequest,\n DcqlEncodedPresentations,\n DcqlFailedCredential,\n DcqlPresentation,\n DcqlQueryResult,\n DcqlSelectiveDisclosure,\n DcqlValidCredential,\n} from './models'\nimport { dcqlGetPresentationsToCreate as getDcqlVcPresentationsToCreate } from './utils'\n\nexport interface DcqlSelectCredentialsForRequestOptions {\n /**\n * The usage mode to apply to the credentials when selecting credentials.\n *\n * If an usage mode is selected that require a new instance to be used, and there's no\n * new instances available, an error will be thrown.\n *\n * It does not actually select the credential from the record yet, it just filters\n * out records that don't match the filter.\n */\n useMode?: CredentialMultiInstanceUseMode\n}\n\n@injectable()\nexport class DcqlService {\n /**\n * Queries the wallet for credentials that match the given dcql query. This only does an initial query based on the\n * schema of the input descriptors. It does not do any further filtering based on the constraints in the input descriptors.\n */\n private async queryCredentialsForDcqlQuery(\n agentContext: AgentContext,\n dcqlQuery: DcqlQuery\n ): Promise<Array<SdJwtVcRecord | W3cCredentialRecord | W3cV2CredentialRecord | MdocRecord>> {\n const formats = new Set(dcqlQuery.credentials.map((c) => c.format))\n const allRecords: Array<SdJwtVcRecord | W3cCredentialRecord | W3cV2CredentialRecord | MdocRecord> = []\n\n const mdocDoctypes = dcqlQuery.credentials\n .filter((credentialQuery) => credentialQuery.format === 'mso_mdoc')\n .map((c) => c.meta?.doctype_value)\n\n const mdocApi = this.getMdocApi(agentContext)\n if (mdocDoctypes.every((doctype) => doctype !== undefined)) {\n const mdocRecords = await mdocApi.findAllByQuery({\n $or: mdocDoctypes.map((docType) => ({\n docType: docType,\n })),\n })\n allRecords.push(...mdocRecords)\n } else if (formats.has('mso_mdoc')) {\n const mdocRecords = await mdocApi.getAll()\n allRecords.push(...mdocRecords)\n }\n\n const sdJwts = dcqlQuery.credentials.filter(\n (credentialQuery): credentialQuery is DcqlCredentialQuery.SdJwtVc =>\n (credentialQuery.format === 'vc+sd-jwt' && !(credentialQuery.meta && 'type_values' in credentialQuery.meta)) ||\n credentialQuery.format === 'dc+sd-jwt'\n )\n\n const sdJwtVctValues = sdJwts.flatMap((c) => c.meta?.vct_values)\n\n const sdJwtVcApi = this.getSdJwtVcApi(agentContext)\n if (sdJwtVctValues.every((vct) => vct !== undefined)) {\n const sdjwtVcRecords = await sdJwtVcApi.findAllByQuery({\n $or: [\n // Look for direct vct match\n ...sdJwtVctValues.map((vct) => ({\n vct,\n })),\n // Or an extended vct value\n ...sdJwtVctValues.map((vct) => ({\n extendedVctValues: [vct],\n })),\n ],\n })\n allRecords.push(...sdjwtVcRecords)\n } else if (sdJwts.length > 0) {\n const sdJwtVcRecords = await sdJwtVcApi.getAll()\n allRecords.push(...sdJwtVcRecords)\n }\n\n const w3cCredentialRepository = agentContext.dependencyManager.resolve(W3cCredentialRepository)\n if (formats.has('jwt_vc_json')) {\n const w3cRecords = await w3cCredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.JwtVc,\n\n // For jwt_vc_json we query the non-expanded types\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'jwt_vc_json' ? c.meta.type_values : []))\n .map((typeValues) => ({\n types: typeValues,\n })),\n })\n allRecords.push(...w3cRecords)\n }\n\n if (formats.has('ldp_vc')) {\n const w3cRecords = await w3cCredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.LdpVc,\n\n // For LDP_VC we query the expanded types\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'jwt_vc_json' ? c.meta.type_values : []))\n .map((typeValues) => ({\n expandedTypes: typeValues,\n })),\n })\n allRecords.push(...w3cRecords)\n }\n\n const w3cSdJwts = dcqlQuery.credentials.filter(\n (credentialQuery): credentialQuery is DcqlCredentialQuery.W3cVc & { format: 'vc+sd-jwt' } =>\n credentialQuery.format === 'vc+sd-jwt' && !!credentialQuery.meta && 'type_values' in credentialQuery.meta\n )\n\n if (w3cSdJwts.length > 0) {\n const w3cV2CredentialRepository = agentContext.dependencyManager.resolve(W3cV2CredentialRepository)\n\n const w3cV2Records = await w3cV2CredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.SdJwtW3cVc,\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'vc+sd-jwt' && c.meta && 'type_values' in c.meta ? c.meta.type_values : []))\n .map((typeValues) => ({\n types: typeValues,\n })),\n })\n\n allRecords.push(...w3cV2Records)\n }\n\n return allRecords\n }\n\n private getAuthorityForCredential(\n credential: VerifiableCredential | W3cV2EnvelopedVerifiableCredential\n ): DcqlCredential['authority'] {\n if (credential.claimFormat === ClaimFormat.SdJwtDc) {\n const akiValues = (credential.header.x5c as string[] | undefined)\n ?.map((c) => {\n const akiHex = X509Certificate.fromEncodedCertificate(c).authorityKeyIdentifier\n return akiHex ? TypedArrayEncoder.toBase64Url(TypedArrayEncoder.fromHex(akiHex)) : undefined\n })\n .filter((aki) => aki !== undefined)\n\n return akiValues && isNonEmptyArray(akiValues)\n ? ({\n type: 'aki',\n values: akiValues,\n } as const)\n : undefined\n }\n\n if (credential.claimFormat === ClaimFormat.MsoMdoc) {\n const akiValues = credential.issuerSignedCertificateChain\n .map((c) => {\n const akiHex = X509Certificate.fromRawCertificate(c).authorityKeyIdentifier\n return akiHex ? TypedArrayEncoder.toBase64Url(TypedArrayEncoder.fromHex(akiHex)) : undefined\n })\n .filter((aki) => aki !== undefined)\n\n return akiValues && isNonEmptyArray(akiValues)\n ? ({\n type: 'aki',\n values: akiValues,\n } as const)\n : undefined\n }\n\n return undefined\n }\n\n public async getDcqlCredentialRepresentation(\n agentContext: AgentContext,\n presentation: VerifiablePresentation,\n queryCredential: DcqlQuery['credentials'][number]\n ): Promise<DcqlCredential> {\n // SD-JWT credential can be used as both dc+sd-jwt and vc+sd-jwt\n // At some point we might want to look at the header value of the sd-jwt (vc+sd-jwt vc dc+sd-jwt)\n if (presentation.claimFormat === ClaimFormat.SdJwtDc) {\n const requestedVcts = queryCredential.format === 'dc+sd-jwt' ? queryCredential.meta?.vct_values : undefined\n\n let presentationVctValues = [presentation.payload.vct]\n // FIXME: we should probably add an option whether to resolve VCT if we didn't get a direct hit\n if (!requestedVcts?.includes(presentation.payload.vct)) {\n const typeMetadataChain = await agentContext\n .resolve(SdJwtVcService)\n .fetchTypeMetadata(agentContext, presentation, {\n throwErrorOnFetchError: false,\n throwErrorOnUnsupportedVctValue: false,\n })\n\n if (typeMetadataChain) {\n presentationVctValues = typeMetadataChain?.vctValues\n }\n }\n\n return {\n credential_format: queryCredential.format === 'dc+sd-jwt' ? 'dc+sd-jwt' : 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(presentation),\n cryptographic_holder_binding: presentation.kbJwt !== undefined,\n vct:\n presentationVctValues.find((presentationVctValue) => requestedVcts?.includes(presentationVctValue)) ??\n presentation.payload.vct,\n claims: presentation.prettyClaims as DcqlSdJwtVcCredential.Claims,\n } satisfies DcqlSdJwtVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.MsoMdoc) {\n if (!presentation.deviceResponse.documents || presentation.deviceResponse.documents.length !== 1) {\n throw new DcqlError('MDOC presentations must contain exactly one document')\n }\n\n return {\n cryptographic_holder_binding: true,\n credential_format: 'mso_mdoc',\n authority: this.getAuthorityForCredential(new Mdoc(presentation.deviceResponse.documents[0].issuerSigned)),\n doctype: presentation.deviceResponse.documents[0].docType,\n namespaces: Object.entries(\n Object.fromEntries(\n presentation.deviceResponse.documents[0].issuerSigned.issuerNamespaces?.issuerNamespaces ?? []\n )\n ).reduce(\n (prev, [key, value]) => ({\n // biome-ignore lint/performance/noAccumulatingSpread: time complexity not relevant here\n ...prev,\n [key]: value.reduce<Record<string, unknown>>(\n // biome-ignore lint/performance/noAccumulatingSpread: time complexity not relevant here\n (prev, curr) => ({ ...prev, [curr.elementIdentifier]: curr.elementValue }),\n {}\n ),\n }),\n {}\n ),\n } satisfies DcqlMdocCredential\n }\n if (presentation.claimFormat === ClaimFormat.JwtVp) {\n const vc = Array.isArray(presentation.verifiableCredential)\n ? presentation.verifiableCredential[0]\n : presentation.verifiableCredential\n\n return {\n cryptographic_holder_binding: hasHolderBinding(undefined, vc.credentialSubjectIds),\n credential_format: 'jwt_vc_json',\n authority: this.getAuthorityForCredential(vc),\n claims: vc.jsonCredential as { [key: string]: JsonValue },\n type: vc.type,\n } satisfies DcqlW3cVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.LdpVp) {\n const vc = Array.isArray(presentation.verifiableCredential)\n ? (presentation.verifiableCredential[0] as W3cJsonLdVerifiableCredential)\n : (presentation.verifiableCredential as W3cJsonLdVerifiableCredential)\n\n const w3cJsonLdCredentialService = agentContext.dependencyManager.resolve(W3cJsonLdCredentialService)\n const expandedTypes = await w3cJsonLdCredentialService.getExpandedTypesForCredential(agentContext, vc)\n\n return {\n cryptographic_holder_binding: hasHolderBinding(undefined, vc.credentialSubjectIds),\n credential_format: 'ldp_vc',\n authority: this.getAuthorityForCredential(vc),\n claims: vc.jsonCredential as DcqlW3cVcCredential.Claims,\n type: expandedTypes,\n } satisfies DcqlW3cVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.SdJwtW3cVp) {\n const firstEntry = Array.isArray(presentation.resolvedPresentation.verifiableCredential)\n ? presentation.resolvedPresentation.verifiableCredential[0]\n : presentation.resolvedPresentation.verifiableCredential\n\n if (!(firstEntry instanceof W3cV2EnvelopedVerifiableCredential)) {\n throw new DcqlError(\n 'Expected an EnvelopedVerifiableCredential entry for vc+sd-jwt presentation claim extraction'\n )\n }\n\n return {\n cryptographic_holder_binding: hasW3cV2HolderBinding(firstEntry.envelopedCredential),\n credential_format: 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(firstEntry),\n type: asArray(firstEntry.resolvedCredential.type),\n claims: firstEntry.resolvedCredential.toJSON() as { [key: string]: JsonValue },\n } satisfies DcqlW3cVcCredential\n }\n\n throw new DcqlError('Unsupported claim format for presentation')\n }\n\n public async getCredentialsForRequest(agentContext: AgentContext, dcqlQuery: DcqlQuery): Promise<DcqlQueryResult> {\n const credentialRecords = await this.queryCredentialsForDcqlQuery(agentContext, dcqlQuery)\n const credentialRecordsWithFormatDuplicates: typeof credentialRecords = []\n const parsedQuery = DcqlQuery.parse(dcqlQuery)\n\n const dcqlCredentials: DcqlCredential[] = credentialRecords.flatMap((record): DcqlCredential | DcqlCredential[] => {\n if (record.type === 'MdocRecord') {\n credentialRecordsWithFormatDuplicates.push(record)\n\n // We always extract the first mdoc for querying\n const mdoc = record.firstCredential\n\n return {\n authority: this.getAuthorityForCredential(mdoc),\n credential_format: 'mso_mdoc',\n doctype: mdoc.docType,\n namespaces: mdoc.issuerSignedNamespaces,\n cryptographic_holder_binding: true,\n } satisfies DcqlCredential\n }\n\n if (record.type === 'SdJwtVcRecord') {\n const sdJwtVc = record.firstCredential\n const claims = sdJwtVc.prettyClaims as DcqlSdJwtVcCredential.Claims\n\n // To keep correct mapping of input credential index, we add it multiple times here:\n // - for dc+sd-jwt and vc+sd-jwt\n // - for each extended VCT (until we have multi-vct support in DCQL)\n credentialRecordsWithFormatDuplicates.push(\n record,\n record,\n ...record.extendedVctValues.map(() => record),\n ...record.extendedVctValues.map(() => record)\n )\n\n return [\n {\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'dc+sd-jwt',\n vct: record.getTags().vct,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n } satisfies DcqlSdJwtVcCredential,\n ...record.extendedVctValues.map(\n (extendedVctValue) =>\n ({\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'dc+sd-jwt',\n vct: extendedVctValue,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n }) satisfies DcqlSdJwtVcCredential\n ),\n {\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'vc+sd-jwt',\n vct: record.getTags().vct,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n } satisfies DcqlSdJwtVcCredential,\n ...record.extendedVctValues.map(\n (extendedVctValue) =>\n ({\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'vc+sd-jwt',\n vct: extendedVctValue,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n }) satisfies DcqlSdJwtVcCredential\n ),\n ] satisfies DcqlSdJwtVcCredential[]\n }\n\n if (record.type === 'W3cCredentialRecord') {\n const firstCredential = record.firstCredential\n credentialRecordsWithFormatDuplicates.push(record)\n if (firstCredential.claimFormat === ClaimFormat.LdpVc) {\n return {\n credential_format: 'ldp_vc',\n authority: this.getAuthorityForCredential(firstCredential),\n type: record.getTags().expandedTypes ?? [],\n claims: firstCredential.jsonCredential as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasHolderBinding(undefined, firstCredential.credentialSubjectIds),\n } satisfies DcqlW3cVcCredential\n }\n\n return {\n credential_format: 'jwt_vc_json',\n authority: this.getAuthorityForCredential(firstCredential),\n type: firstCredential.type,\n claims: firstCredential.jsonCredential as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasHolderBinding(undefined, firstCredential.credentialSubjectIds),\n } satisfies DcqlW3cVcCredential\n }\n\n if (record.type === 'W3cV2CredentialRecord') {\n credentialRecordsWithFormatDuplicates.push(record)\n const firstCredential = record.firstCredential\n\n return {\n credential_format: 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(firstCredential),\n type: asArray(firstCredential.resolvedCredential.type),\n claims: firstCredential.resolvedCredential.toJSON() as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasW3cV2HolderBinding(firstCredential),\n } satisfies DcqlW3cVcCredential\n }\n\n throw new DcqlError('Unsupported record type')\n })\n\n const queryResult = DcqlQuery.query(parsedQuery, dcqlCredentials)\n\n const matchesWithRecord = Object.fromEntries(\n Object.entries(queryResult.credential_matches).map(([credential_query_id, result]) => {\n const failedCredentials = result.failed_credentials\n ? mapNonEmptyArray(result.failed_credentials, (credential) => {\n const record = credentialRecordsWithFormatDuplicates[credential.input_credential_index]\n const updatedCredential: DcqlFailedCredential = {\n ...credential,\n record,\n claims: credential.claims.success\n ? {\n ...credential.claims,\n success: true,\n valid_claim_sets: mapNonEmptyArray(credential.claims.valid_claim_sets, (claimSet) => ({\n ...claimSet,\n ...this.getDisclosedClaimSetOutput(record, claimSet, parsedQuery, credential_query_id),\n })),\n }\n : credential.claims,\n }\n return updatedCredential\n })\n : undefined\n\n // If not success, valid_credentials will be undefined, so we only have to map failed_credentials\n if (!result.success) {\n return [\n credential_query_id,\n {\n ...result,\n failed_credentials: failedCredentials,\n },\n ]\n }\n\n return [\n credential_query_id,\n {\n ...result,\n failed_credentials: failedCredentials,\n valid_credentials: mapNonEmptyArray(result.valid_credentials, (credential) => {\n const record = credentialRecordsWithFormatDuplicates[credential.input_credential_index]\n const updatedCredential: DcqlValidCredential = {\n ...credential,\n record,\n claims: {\n ...credential.claims,\n valid_claim_sets: mapNonEmptyArray(credential.claims.valid_claim_sets, (claimSet) => ({\n ...claimSet,\n ...this.getDisclosedClaimSetOutput(record, claimSet, parsedQuery, credential_query_id),\n })),\n },\n }\n return updatedCredential\n }),\n },\n ]\n })\n )\n\n return {\n ...queryResult,\n credential_matches: matchesWithRecord,\n }\n }\n\n /**\n * What a selectively disclosable credential discloses for the output of a claim set.\n *\n * The output of DCQL only holds the requested claims, while a claim that is not selectively\n * disclosable is always disclosed. So the output is replaced with the claims as the verifier receives\n * them, and `disclosed_paths` added: the paths to those claims in the credential, which are what to\n * disclose when presenting it.\n *\n * Other credentials disclose the output as it is.\n */\n private getDisclosedClaimSetOutput(\n record: DcqlValidCredential['record'],\n claimSet: { output: unknown; valid_claim_indexes?: number[] },\n dcqlQuery: DcqlQuery.Output,\n credentialQueryId: string\n ) {\n // The paths of the claims queries of the claim set, each with the elements a `null` in it selects\n const getClaimPaths = () => {\n const claimsQueries = dcqlQuery.credentials.find((credential) => credential.id === credentialQueryId)?.claims\n const claimsQueryPaths = (claimSet.valid_claim_indexes ?? []).flatMap((index) => {\n const claimsQuery = claimsQueries?.[index]\n // Note path is an array again, we use flatmap, so wrap it in another array, so that if\n // no value is returned ([]) it is not included as undefined in the array\n return claimsQuery && 'path' in claimsQuery ? [claimsQuery.path] : []\n })\n\n return getClaimPathsForDcqlClaimSet(claimsQueryPaths, claimSet.output)\n }\n\n if (record.type === 'SdJwtVcRecord') {\n const { prettyClaims, disclosedPaths } = applyDisclosuresForPaths(record.encoded, getClaimPaths())\n\n return { output: prettyClaims as { [key: string]: JsonValue }, disclosed_paths: disclosedPaths }\n }\n\n if (record.type === 'W3cV2CredentialRecord' && record.firstCredential instanceof W3cV2SdJwtVerifiableCredential) {\n const { prettyClaims, disclosedPaths } = applyDisclosuresForPaths(record.firstCredential.encoded, getClaimPaths())\n\n return {\n // The same shape as the claims DCQL was queried with, which are the credential's JSON\n output: JsonTransformer.fromJSON(prettyClaims, W3cV2Credential, { validate: false }).toJSON() as {\n [key: string]: JsonValue\n },\n disclosed_paths: disclosedPaths,\n }\n }\n\n return {}\n }\n\n public async assertValidDcqlPresentation(\n agentContext: AgentContext,\n dcqlPresentation: DcqlPresentation,\n dcqlQuery: DcqlQuery\n ) {\n const internalDcqlPresentation = Object.fromEntries(\n await Promise.all(\n Object.entries(dcqlPresentation).map(async ([credentialId, presentations]) => {\n const queryCredential = dcqlQuery.credentials.find((c) => c.id === credentialId)\n if (!queryCredential) {\n throw new DcqlError(\n `DCQL presentation contains presentation entry for credential id '${credentialId}', but this id is not present in the DCQL query`\n )\n }\n\n return [\n credentialId,\n await Promise.all(\n presentations.map((presentation) =>\n this.getDcqlCredentialRepresentation(agentContext, presentation, queryCredential)\n )\n ),\n ]\n })\n )\n )\n\n const presentationResult = DcqlPresentationResult.fromDcqlPresentation(internalDcqlPresentation, { dcqlQuery })\n\n if (!presentationResult.can_be_satisfied) {\n throw new DcqlError('Presentations do not satisfy the DCQL query.', {\n additionalMessages: Object.entries(presentationResult.credential_matches ?? {})\n .flatMap(([queryId, match]) =>\n match.success\n ? undefined\n : !match.failed_credentials\n ? `Unable to match query credential '${queryId}'. No prsentations provided`\n : match.failed_credentials.map(\n (failedCredential) =>\n `Presentation at index ${failedCredential.input_credential_index} does not match query credential '${queryId}'. ${JSON.stringify(\n {\n ...(failedCredential.claims.success\n ? {}\n : { claims: failedCredential.claims.failed_claim_sets.map((cs) => cs.issues) }),\n ...(failedCredential.trusted_authorities.success\n ? {}\n : {\n trusted_authorities:\n failedCredential.trusted_authorities.failed_trusted_authorities.map(\n (ta) => ta.issues\n ),\n }),\n ...(failedCredential.meta.success ? {} : { meta: failedCredential.meta.issues }),\n },\n null,\n 2\n )}`\n )\n )\n .filter((message) => message !== undefined),\n })\n }\n\n return presentationResult\n }\n\n private getSelectiveDisclosure(validCredential: DcqlValidCredential): DcqlSelectiveDisclosure {\n const [{ output, disclosed_paths }] = validCredential.claims.valid_claim_sets\n\n return disclosed_paths\n ? { disclosedPaths: disclosed_paths, disclosedPayload: output as JsonObject }\n : { disclosedPayload: output as JsonObject }\n }\n\n private dcqlCredentialForRequestForValidCredential(validCredential: DcqlValidCredential) {\n if (validCredential.record.type === 'MdocRecord') {\n return {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.claims.valid_claim_sets[0].output as MdocNameSpaces,\n } as const\n }\n if (validCredential.record.type === 'SdJwtVcRecord') {\n return {\n claimFormat: ClaimFormat.SdJwtDc,\n credentialRecord: validCredential.record,\n ...this.getSelectiveDisclosure(validCredential),\n } as const\n }\n\n if (validCredential.record.type === 'W3cCredentialRecord') {\n return {\n claimFormat: validCredential.record.firstCredential.claimFormat,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.record.firstCredential.jsonCredential as JsonObject,\n } as const\n }\n\n if (validCredential.record.type === 'W3cV2CredentialRecord') {\n const claimFormat = validCredential.record.firstCredential.claimFormat\n\n if (claimFormat === ClaimFormat.DiVc) {\n throw new DcqlError('DCQL credential selection does not support W3C V2 Data Integrity credentials yet')\n }\n\n if (claimFormat === ClaimFormat.SdJwtW3cVc) {\n return {\n claimFormat,\n credentialRecord: validCredential.record,\n ...this.getSelectiveDisclosure(validCredential),\n } as const\n }\n\n return {\n claimFormat,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.claims.valid_claim_sets[0].output as JsonObject,\n } as const\n }\n\n throw new DcqlError('Unsupported record type for DCQL')\n }\n\n /**\n * Selects the credentials to use based on the output from `getCredentialsForRequest`\n * Use this method if you don't want to manually select the credentials yourself.\n */\n public selectCredentialsForRequest(\n dcqlQueryResult: DcqlQueryResult,\n { useMode = CredentialMultiInstanceUseMode.NewOrFirst }: DcqlSelectCredentialsForRequestOptions = {}\n ): DcqlCredentialsForRequest {\n if (!dcqlQueryResult.can_be_satisfied) {\n throw new DcqlError(\n 'Cannot select the credentials for the dcql query presentation if the request cannot be satisfied'\n )\n }\n\n const credentials: DcqlCredentialsForRequest = {}\n\n if (dcqlQueryResult.credential_sets) {\n credentialSetLoop: for (const credentialSet of dcqlQueryResult.credential_sets) {\n // undefined defaults to true\n if (credentialSet.required === false) continue\n const fullfillableOptions = credentialSet.matching_options\n\n if (!fullfillableOptions) {\n throw new DcqlError('Invalid dcql query result. No option is fullfillable')\n }\n\n for (const fullfillableOption of fullfillableOptions) {\n const optionMatches = fullfillableOption.map((credentialQueryId) => {\n const credentialMatch = dcqlQueryResult.credential_matches[credentialQueryId]\n if (!credentialMatch.success) return undefined\n const match = credentialMatch.valid_credentials.find((match: DcqlValidCredential) =>\n canUseInstanceFromCredentialRecord({ credentialRecord: match.record, useMode })\n )\n\n if (!match) return undefined\n return {\n match,\n credentialQueryId,\n }\n })\n\n if (optionMatches.every((c) => c !== undefined)) {\n for (const { match, credentialQueryId } of optionMatches) {\n credentials[credentialQueryId] = [this.dcqlCredentialForRequestForValidCredential(match)]\n }\n\n continue credentialSetLoop\n }\n }\n\n throw new DcqlError(\n 'Unable to select credentials for credential set. No new credential instance available on any of the available credentials.'\n )\n }\n } else {\n for (const credentialQuery of dcqlQueryResult.credentials) {\n const credentialMatch = dcqlQueryResult.credential_matches[credentialQuery.id]\n if (!credentialMatch.success) {\n throw new DcqlError(\n `Invalid dcql query result for credential query id '${credentialQuery.id}'. Cannot auto-select credentials`\n )\n }\n\n const credential = credentialMatch.valid_credentials.find((match: DcqlValidCredential) =>\n canUseInstanceFromCredentialRecord({ credentialRecord: match.record, useMode })\n )\n if (!credential) {\n throw new DcqlError(\n `Unable to select credential for credential query id '${credentialQuery.id}'. No new credential instance available on any of the available credentials.`\n )\n }\n\n credentials[credentialQuery.id] = [this.dcqlCredentialForRequestForValidCredential(credential)]\n }\n }\n\n return credentials\n }\n\n public validateDcqlQuery(dcqlQuery: DcqlQuery | DcqlQuery.Input | unknown): DcqlQuery {\n const parsed = DcqlQuery.parse(dcqlQuery as DcqlQuery)\n DcqlQuery.validate(parsed)\n return parsed\n }\n\n public async createPresentation(\n agentContext: AgentContext,\n options: {\n credentialQueryToCredential: DcqlCredentialsForRequest\n challenge: string\n domain?: string\n mdocSessionTranscript?: MdocSessionTranscriptOptions\n }\n ): Promise<{\n dcqlPresentation: DcqlPresentation\n encodedDcqlPresentation: DcqlEncodedPresentations\n }> {\n const { domain, challenge, mdocSessionTranscript } = options\n\n const dcqlPresentation: DcqlPresentation = {}\n const encodedDcqlPresentation: DcqlEncodedPresentations = {}\n const vcPresentationsToCreate = getDcqlVcPresentationsToCreate(options.credentialQueryToCredential)\n\n for (const [credentialQueryId, presentationsToCreate] of Object.entries(vcPresentationsToCreate)) {\n for (const presentationToCreate of presentationsToCreate) {\n let createdPresentation: VerifiablePresentation\n let encodedCreatedPresentation: string | Record<string, unknown>\n\n if (presentationToCreate.claimFormat === ClaimFormat.MsoMdoc) {\n const mdocRecord = presentationToCreate.credentialRecord\n if (!mdocSessionTranscript) {\n throw new DcqlError('Missing mdoc session transcript options for creating MDOC presentation.')\n }\n\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: mdocRecord,\n })\n\n const deviceResponse = await MdocDeviceResponse.createDeviceResponse(agentContext, {\n mdocs: [credentialInstance],\n documentRequests: [\n {\n docType: mdocRecord.getTags().docType,\n nameSpaces: Object.fromEntries(\n Object.entries(presentationToCreate.disclosedPayload).map(([key, value]) => {\n // FIXME: we need the DCQL query here to get the intent_to_retain from query (currently hardcoded to false)\n return [key, Object.fromEntries(Object.entries(value).map(([key]) => [key, false]))]\n })\n ),\n },\n ],\n sessionTranscriptOptions: mdocSessionTranscript,\n })\n const deviceResponseBase64Url = deviceResponse.encoded\n\n encodedCreatedPresentation = deviceResponseBase64Url\n createdPresentation = MdocDeviceResponse.fromBase64Url(deviceResponseBase64Url)\n } else if (presentationToCreate.claimFormat === ClaimFormat.SdJwtDc) {\n if (!domain) {\n throw new DcqlError('Missing domain property for creating SdJwtVc presentation.')\n }\n\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n const presentationFrame = this.getPresentationFrame(\n typeof credentialInstance === 'string' ? credentialInstance : credentialInstance.compact,\n presentationToCreate\n )\n\n const sdJwtVcApi = this.getSdJwtVcApi(agentContext)\n const presentation = await sdJwtVcApi.present({\n sdJwtVc: credentialInstance,\n presentationFrame,\n verifierMetadata: {\n audience: domain,\n nonce: challenge,\n issuedAt: Math.floor(Date.now() / 1000),\n },\n additionalPayload: presentationToCreate.additionalPayload,\n })\n\n encodedCreatedPresentation = presentation\n createdPresentation = sdJwtVcApi.fromCompact(presentation)\n } else if (presentationToCreate.claimFormat === ClaimFormat.JwtVp) {\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n if (!credentialInstance.credentialSubjectIds[0]) {\n throw new DcqlError('Cannot create presentation for credentials without subject id')\n }\n\n // Determine a suitable verification method for the presentation\n const verificationMethod = await this.getVerificationMethodForSubjectId(\n agentContext,\n credentialInstance.credentialSubjectIds[0]\n )\n\n const w3cCredentialService = agentContext.resolve(W3cCredentialService)\n const w3cPresentation = new W3cPresentation({\n verifiableCredential: [credentialInstance],\n holder: verificationMethod.controller,\n })\n\n const publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n\n const signedPresentation = await w3cCredentialService.signPresentation<ClaimFormat.JwtVp>(agentContext, {\n format: ClaimFormat.JwtVp,\n alg: publicJwk.signatureAlgorithm,\n verificationMethod: verificationMethod.id,\n presentation: w3cPresentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.LdpVp) {\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n if (!credentialInstance.credentialSubjectIds[0]) {\n throw new DcqlError('Cannot create presentation for credentials without subject id')\n }\n\n // Determine a suitable verification method for the presentation\n const verificationMethod = await this.getVerificationMethodForSubjectId(\n agentContext,\n credentialInstance.credentialSubjectIds[0]\n )\n\n const w3cCredentialService = agentContext.resolve(W3cCredentialService)\n const w3cPresentation = new W3cPresentation({\n verifiableCredential: [credentialInstance],\n holder: verificationMethod.controller,\n })\n\n const signedPresentation = await w3cCredentialService.signPresentation(agentContext, {\n format: ClaimFormat.LdpVp,\n // TODO: we should move the check for which proof to use for a presentation to earlier\n // as then we know when determining which VPs to submit already if the proof types are supported\n // by the verifier, and we can then just add this to the vpToCreate interface\n proofType: this.getProofTypeForLdpVc(agentContext, verificationMethod),\n proofPurpose: new purposes.AuthenticationProofPurpose({ challenge, domain }),\n verificationMethod: verificationMethod.id,\n presentation: w3cPresentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.JwtW3cVp) {\n const w3cV2CredentialService = agentContext.resolve(W3cV2CredentialService)\n const firstCredential = presentationToCreate.credentialRecord.firstCredential\n\n if (firstCredential.claimFormat === ClaimFormat.DiVc) {\n throw new DcqlError('DCQL JWT W3C VP creation does not support W3C V2 Data Integrity credentials yet')\n }\n\n const w3cV2Presentation = new W3cV2Presentation({\n holder: firstCredential.resolvedCredential.credentialSubjectIds[0],\n verifiableCredential: [W3cV2EnvelopedVerifiableCredential.fromVerifiableCredential(firstCredential)],\n })\n\n const signedPresentation = await w3cV2CredentialService.signPresentation<ClaimFormat.JwtW3cVp>(agentContext, {\n format: ClaimFormat.JwtW3cVp,\n presentation: w3cV2Presentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.SdJwtW3cVp) {\n const presentationFrame = this.getPresentationFrame(\n presentationToCreate.credentialRecord.firstCredential.encoded,\n presentationToCreate\n )\n if (!domain) {\n throw new DcqlError('Missing domain property for creating SdJwtVc presentation.')\n }\n\n const w3cV2SdJwtCredentialService = agentContext.resolve(W3cV2SdJwtCredentialService)\n const sdJwtVc = await w3cV2SdJwtCredentialService.present(agentContext, {\n credential: presentationToCreate.credentialRecord.firstCredential.encoded,\n presentationFrame,\n })\n\n const w3cV2CredentialService = agentContext.resolve(W3cV2CredentialService)\n const w3cV2Presentation = new W3cV2Presentation({\n holder: presentationToCreate.credentialRecord.firstCredential.resolvedCredential.credentialSubjectIds[0],\n verifiableCredential: [W3cV2EnvelopedVerifiableCredential.fromVerifiableCredential(sdJwtVc)],\n })\n\n const signedPresentation = await w3cV2CredentialService.signPresentation<ClaimFormat.SdJwtW3cVp>(\n agentContext,\n {\n format: ClaimFormat.SdJwtW3cVp,\n presentation: w3cV2Presentation,\n challenge,\n domain,\n }\n )\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else {\n throw new DcqlError('Unsupported presentation format.')\n }\n\n if (!dcqlPresentation[credentialQueryId]) {\n dcqlPresentation[credentialQueryId] = [createdPresentation]\n } else {\n dcqlPresentation[credentialQueryId].push(createdPresentation)\n }\n\n if (!encodedDcqlPresentation[credentialQueryId]) {\n encodedDcqlPresentation[credentialQueryId] = [encodedCreatedPresentation]\n } else {\n encodedDcqlPresentation[credentialQueryId].push(encodedCreatedPresentation)\n }\n }\n }\n\n return {\n dcqlPresentation,\n encodedDcqlPresentation,\n }\n }\n\n private getPresentationFrame(\n compactSdJwt: string,\n { disclosedPaths, disclosedPayload }: { disclosedPaths?: ClaimPath[]; disclosedPayload?: JsonObject }\n ) {\n if (disclosedPaths) return buildPresentationFrameForPaths(compactSdJwt, disclosedPaths)\n // DisclosedPayload will be removed in future version\n if (disclosedPayload) return buildDisclosureFrameForPayload(disclosedPayload)\n\n throw new DcqlError(\n 'Either disclosedPaths or disclosedPayload is required to present a selectively disclosable credential.'\n )\n }\n\n private getSdJwtVcApi(agentContext: AgentContext) {\n return agentContext.dependencyManager.resolve(SdJwtVcApi)\n }\n\n private getMdocApi(agentContext: AgentContext) {\n return agentContext.dependencyManager.resolve(MdocApi)\n }\n\n private async getVerificationMethodForSubjectId(agentContext: AgentContext, subjectId: string) {\n const didsApi = agentContext.dependencyManager.resolve(DidsApi)\n\n if (!subjectId.startsWith('did:')) {\n throw new DcqlError(`Only dids are supported as credentialSubject id. ${subjectId} is not a valid did`)\n }\n\n const didDocument = await didsApi.resolveDidDocument(subjectId)\n\n if (!didDocument.authentication || didDocument.authentication.length === 0) {\n throw new DcqlError(`No authentication verificationMethods found for did ${subjectId} in did document`)\n }\n\n // the signature suite to use for the presentation is dependant on the credentials we share.\n // 1. Get the verification method for this given proof purpose in this DID document\n const [verificationMethod] = didDocument.findVerificationMethodsByPurpose(['authentication'])\n return verificationMethod\n }\n\n // FIXME: We need to take into account OpenID4VP metadata (probably providing supported/allowed algs to the DCQL create presentation method)\n private getProofTypeForLdpVc(agentContext: AgentContext, verificationMethod: VerificationMethod) {\n // For each of the supported algs, find the key types, then find the proof types\n const signatureSuiteRegistry = agentContext.dependencyManager.resolve(SignatureSuiteRegistry)\n\n const publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n const supportedSignatureSuites = signatureSuiteRegistry.getAllByPublicJwkType(publicJwk)\n if (supportedSignatureSuites.length === 0) {\n throw new DcqlError(\n `Couldn't find a supported signature suite for the given jwk ${publicJwk.jwkTypeHumanDescription}`\n )\n }\n\n return supportedSignatureSuites[0].proofType\n }\n}\n\n/**\n * A credential is bound to its holder through a key (`cnf`) or its subject. Verifying a presentation\n * checks that the presenter proves the binding. A subject id that is not a DID also counts, so such\n * a credential can't be presented.\n */\nfunction hasHolderBinding(cnf: unknown, credentialSubjectIds: string[]) {\n return cnf !== undefined || credentialSubjectIds.length > 0\n}\n\nfunction hasW3cV2HolderBinding(credential: W3cV2VerifiableCredential) {\n const cnf =\n credential instanceof W3cV2SdJwtVerifiableCredential\n ? credential.sdJwt.prettyClaims.cnf\n : credential instanceof W3cV2JwtVerifiableCredential\n ? credential.jwt.payload.additionalClaims.cnf\n : undefined\n\n return hasHolderBinding(cnf, credential.resolvedCredential.credentialSubjectIds)\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DcqlService.mjs","names":["getDcqlVcPresentationsToCreate"],"sources":["../../../src/modules/dcql/DcqlService.ts"],"sourcesContent":["import {\n DcqlCredential,\n DcqlCredentialQuery,\n DcqlMdocCredential,\n DcqlPresentationResult,\n DcqlQuery,\n DcqlSdJwtVcCredential,\n DcqlW3cVcCredential,\n} from 'dcql'\nimport type { AgentContext } from '../../agent'\nimport { injectable } from '../../plugins'\nimport { isNonEmptyArray, type JsonObject, type JsonValue, mapNonEmptyArray } from '../../types'\nimport { asArray, JsonTransformer, TypedArrayEncoder } from '../../utils'\nimport {\n CredentialMultiInstanceUseMode,\n canUseInstanceFromCredentialRecord,\n useInstanceFromCredentialRecord,\n} from '../../utils/credentialUse'\nimport { DidsApi, getPublicJwkFromVerificationMethod, VerificationMethod } from '../dids'\nimport type { VerifiableCredential, VerifiablePresentation } from '../dif-presentation-exchange/index'\nimport {\n Mdoc,\n MdocApi,\n MdocDeviceResponse,\n type MdocNameSpaces,\n MdocRecord,\n type MdocSessionTranscriptOptions,\n} from '../mdoc'\nimport { SdJwtVcApi, SdJwtVcRecord, SdJwtVcService } from '../sd-jwt-vc'\nimport {\n applyDisclosuresForPaths,\n buildDisclosureFrameForPayload,\n buildPresentationFrameForPaths,\n type ClaimPath,\n getClaimPathsForDcqlClaimSet,\n} from '../sd-jwt-vc/disclosureFrame'\nimport {\n ClaimFormat,\n SignatureSuiteRegistry,\n W3cCredentialRecord,\n W3cCredentialRepository,\n W3cCredentialService,\n W3cJsonLdCredentialService,\n W3cJsonLdVerifiableCredential,\n W3cPresentation,\n W3cV2Credential,\n W3cV2CredentialRecord,\n W3cV2CredentialRepository,\n W3cV2CredentialService,\n W3cV2EnvelopedVerifiableCredential,\n W3cV2JwtVerifiableCredential,\n W3cV2Presentation,\n type W3cV2VerifiableCredential,\n} from '../vc'\nimport { purposes } from '../vc/linked-data-proofs/adapters/jsonld-signatures-adapter'\nimport { W3cV2SdJwtCredentialService, W3cV2SdJwtVerifiableCredential } from '../vc/sd-jwt-vc'\nimport { X509Certificate } from '../x509'\nimport { DcqlError } from './DcqlError'\nimport type {\n DcqlCredentialsForRequest,\n DcqlEncodedPresentations,\n DcqlFailedCredential,\n DcqlPresentation,\n DcqlQueryResult,\n DcqlSelectiveDisclosure,\n DcqlValidCredential,\n} from './models'\nimport { dcqlGetPresentationsToCreate as getDcqlVcPresentationsToCreate } from './utils'\n\nexport interface DcqlSelectCredentialsForRequestOptions {\n /**\n * The usage mode to apply to the credentials when selecting credentials.\n *\n * If an usage mode is selected that require a new instance to be used, and there's no\n * new instances available, an error will be thrown.\n *\n * It does not actually select the credential from the record yet, it just filters\n * out records that don't match the filter.\n */\n useMode?: CredentialMultiInstanceUseMode\n}\n\n@injectable()\nexport class DcqlService {\n /**\n * Queries the wallet for credentials that match the given dcql query. This only does an initial query based on the\n * schema of the input descriptors. It does not do any further filtering based on the constraints in the input descriptors.\n */\n private async queryCredentialsForDcqlQuery(\n agentContext: AgentContext,\n dcqlQuery: DcqlQuery\n ): Promise<Array<SdJwtVcRecord | W3cCredentialRecord | W3cV2CredentialRecord | MdocRecord>> {\n const formats = new Set(dcqlQuery.credentials.map((c) => c.format))\n const allRecords: Array<SdJwtVcRecord | W3cCredentialRecord | W3cV2CredentialRecord | MdocRecord> = []\n\n const mdocDoctypes = dcqlQuery.credentials\n .filter((credentialQuery) => credentialQuery.format === 'mso_mdoc')\n .map((c) => c.meta?.doctype_value)\n\n const mdocApi = this.getMdocApi(agentContext)\n if (mdocDoctypes.every((doctype) => doctype !== undefined)) {\n const mdocRecords = await mdocApi.findAllByQuery({\n $or: mdocDoctypes.map((docType) => ({\n docType: docType,\n })),\n })\n allRecords.push(...mdocRecords)\n } else if (formats.has('mso_mdoc')) {\n const mdocRecords = await mdocApi.getAll()\n allRecords.push(...mdocRecords)\n }\n\n const sdJwts = dcqlQuery.credentials.filter(\n (credentialQuery): credentialQuery is DcqlCredentialQuery.SdJwtVc =>\n (credentialQuery.format === 'vc+sd-jwt' && !(credentialQuery.meta && 'type_values' in credentialQuery.meta)) ||\n credentialQuery.format === 'dc+sd-jwt'\n )\n\n const sdJwtVctValues = sdJwts.flatMap((c) => c.meta?.vct_values)\n\n const sdJwtVcApi = this.getSdJwtVcApi(agentContext)\n if (sdJwtVctValues.every((vct) => vct !== undefined)) {\n const sdjwtVcRecords = await sdJwtVcApi.findAllByQuery({\n $or: [\n // Look for direct vct match\n ...sdJwtVctValues.map((vct) => ({\n vct,\n })),\n // Or an extended vct value\n ...sdJwtVctValues.map((vct) => ({\n extendedVctValues: [vct],\n })),\n ],\n })\n allRecords.push(...sdjwtVcRecords)\n } else if (sdJwts.length > 0) {\n const sdJwtVcRecords = await sdJwtVcApi.getAll()\n allRecords.push(...sdJwtVcRecords)\n }\n\n const w3cCredentialRepository = agentContext.dependencyManager.resolve(W3cCredentialRepository)\n if (formats.has('jwt_vc_json')) {\n const w3cRecords = await w3cCredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.JwtVc,\n\n // For jwt_vc_json we query the non-expanded types\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'jwt_vc_json' ? c.meta.type_values : []))\n .map((typeValues) => ({\n types: typeValues,\n })),\n })\n allRecords.push(...w3cRecords)\n }\n\n if (formats.has('ldp_vc')) {\n const w3cRecords = await w3cCredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.LdpVc,\n\n // For LDP_VC we query the expanded types\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'ldp_vc' ? c.meta.type_values : []))\n .map((typeValues) => ({\n expandedTypes: typeValues,\n })),\n })\n allRecords.push(...w3cRecords)\n }\n\n const w3cSdJwts = dcqlQuery.credentials.filter(\n (credentialQuery): credentialQuery is DcqlCredentialQuery.W3cVc & { format: 'vc+sd-jwt' } =>\n credentialQuery.format === 'vc+sd-jwt' && !!credentialQuery.meta && 'type_values' in credentialQuery.meta\n )\n\n if (w3cSdJwts.length > 0) {\n const w3cV2CredentialRepository = agentContext.dependencyManager.resolve(W3cV2CredentialRepository)\n\n const w3cV2Records = await w3cV2CredentialRepository.findByQuery(agentContext, {\n claimFormat: ClaimFormat.SdJwtW3cVc,\n $or: dcqlQuery.credentials\n .flatMap((c) => (c.format === 'vc+sd-jwt' && c.meta && 'type_values' in c.meta ? c.meta.type_values : []))\n .map((typeValues) => ({\n types: typeValues,\n })),\n })\n\n allRecords.push(...w3cV2Records)\n }\n\n return allRecords\n }\n\n private getAuthorityForCredential(\n credential: VerifiableCredential | W3cV2EnvelopedVerifiableCredential\n ): DcqlCredential['authority'] {\n if (credential.claimFormat === ClaimFormat.SdJwtDc) {\n const akiValues = (credential.header.x5c as string[] | undefined)\n ?.map((c) => {\n const akiHex = X509Certificate.fromEncodedCertificate(c).authorityKeyIdentifier\n return akiHex ? TypedArrayEncoder.toBase64Url(TypedArrayEncoder.fromHex(akiHex)) : undefined\n })\n .filter((aki) => aki !== undefined)\n\n return akiValues && isNonEmptyArray(akiValues)\n ? ({\n type: 'aki',\n values: akiValues,\n } as const)\n : undefined\n }\n\n if (credential.claimFormat === ClaimFormat.MsoMdoc) {\n const akiValues = credential.issuerSignedCertificateChain\n .map((c) => {\n const akiHex = X509Certificate.fromRawCertificate(c).authorityKeyIdentifier\n return akiHex ? TypedArrayEncoder.toBase64Url(TypedArrayEncoder.fromHex(akiHex)) : undefined\n })\n .filter((aki) => aki !== undefined)\n\n return akiValues && isNonEmptyArray(akiValues)\n ? ({\n type: 'aki',\n values: akiValues,\n } as const)\n : undefined\n }\n\n return undefined\n }\n\n public async getDcqlCredentialRepresentation(\n agentContext: AgentContext,\n presentation: VerifiablePresentation,\n queryCredential: DcqlQuery['credentials'][number]\n ): Promise<DcqlCredential> {\n // SD-JWT credential can be used as both dc+sd-jwt and vc+sd-jwt\n // At some point we might want to look at the header value of the sd-jwt (vc+sd-jwt vc dc+sd-jwt)\n if (presentation.claimFormat === ClaimFormat.SdJwtDc) {\n const requestedVcts = queryCredential.format === 'dc+sd-jwt' ? queryCredential.meta?.vct_values : undefined\n\n let presentationVctValues = [presentation.payload.vct]\n // FIXME: we should probably add an option whether to resolve VCT if we didn't get a direct hit\n if (!requestedVcts?.includes(presentation.payload.vct)) {\n const typeMetadataChain = await agentContext\n .resolve(SdJwtVcService)\n .fetchTypeMetadata(agentContext, presentation, {\n throwErrorOnFetchError: false,\n throwErrorOnUnsupportedVctValue: false,\n })\n\n if (typeMetadataChain) {\n presentationVctValues = typeMetadataChain?.vctValues\n }\n }\n\n return {\n credential_format: queryCredential.format === 'dc+sd-jwt' ? 'dc+sd-jwt' : 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(presentation),\n cryptographic_holder_binding: presentation.kbJwt !== undefined,\n vct:\n presentationVctValues.find((presentationVctValue) => requestedVcts?.includes(presentationVctValue)) ??\n presentation.payload.vct,\n claims: presentation.prettyClaims as DcqlSdJwtVcCredential.Claims,\n } satisfies DcqlSdJwtVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.MsoMdoc) {\n if (!presentation.deviceResponse.documents || presentation.deviceResponse.documents.length !== 1) {\n throw new DcqlError('MDOC presentations must contain exactly one document')\n }\n\n return {\n cryptographic_holder_binding: true,\n credential_format: 'mso_mdoc',\n authority: this.getAuthorityForCredential(new Mdoc(presentation.deviceResponse.documents[0].issuerSigned)),\n doctype: presentation.deviceResponse.documents[0].docType,\n namespaces: Object.entries(\n Object.fromEntries(\n presentation.deviceResponse.documents[0].issuerSigned.issuerNamespaces?.issuerNamespaces ?? []\n )\n ).reduce(\n (prev, [key, value]) => ({\n // biome-ignore lint/performance/noAccumulatingSpread: time complexity not relevant here\n ...prev,\n [key]: value.reduce<Record<string, unknown>>(\n // biome-ignore lint/performance/noAccumulatingSpread: time complexity not relevant here\n (prev, curr) => ({ ...prev, [curr.elementIdentifier]: curr.elementValue }),\n {}\n ),\n }),\n {}\n ),\n } satisfies DcqlMdocCredential\n }\n if (presentation.claimFormat === ClaimFormat.JwtVp) {\n const vc = Array.isArray(presentation.verifiableCredential)\n ? presentation.verifiableCredential[0]\n : presentation.verifiableCredential\n\n return {\n cryptographic_holder_binding: hasHolderBinding(undefined, vc.credentialSubjectIds),\n credential_format: 'jwt_vc_json',\n authority: this.getAuthorityForCredential(vc),\n claims: vc.jsonCredential as { [key: string]: JsonValue },\n type: vc.type,\n } satisfies DcqlW3cVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.LdpVp) {\n const vc = Array.isArray(presentation.verifiableCredential)\n ? (presentation.verifiableCredential[0] as W3cJsonLdVerifiableCredential)\n : (presentation.verifiableCredential as W3cJsonLdVerifiableCredential)\n\n const w3cJsonLdCredentialService = agentContext.dependencyManager.resolve(W3cJsonLdCredentialService)\n const expandedTypes = await w3cJsonLdCredentialService.getExpandedTypesForCredential(agentContext, vc)\n\n return {\n cryptographic_holder_binding: hasHolderBinding(undefined, vc.credentialSubjectIds),\n credential_format: 'ldp_vc',\n authority: this.getAuthorityForCredential(vc),\n claims: vc.jsonCredential as DcqlW3cVcCredential.Claims,\n type: expandedTypes,\n } satisfies DcqlW3cVcCredential\n }\n if (presentation.claimFormat === ClaimFormat.SdJwtW3cVp) {\n const firstEntry = Array.isArray(presentation.resolvedPresentation.verifiableCredential)\n ? presentation.resolvedPresentation.verifiableCredential[0]\n : presentation.resolvedPresentation.verifiableCredential\n\n if (!(firstEntry instanceof W3cV2EnvelopedVerifiableCredential)) {\n throw new DcqlError(\n 'Expected an EnvelopedVerifiableCredential entry for vc+sd-jwt presentation claim extraction'\n )\n }\n\n return {\n cryptographic_holder_binding: hasW3cV2HolderBinding(firstEntry.envelopedCredential),\n credential_format: 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(firstEntry),\n type: asArray(firstEntry.resolvedCredential.type),\n claims: firstEntry.resolvedCredential.toJSON() as { [key: string]: JsonValue },\n } satisfies DcqlW3cVcCredential\n }\n\n throw new DcqlError('Unsupported claim format for presentation')\n }\n\n public async getCredentialsForRequest(agentContext: AgentContext, dcqlQuery: DcqlQuery): Promise<DcqlQueryResult> {\n const credentialRecords = await this.queryCredentialsForDcqlQuery(agentContext, dcqlQuery)\n const credentialRecordsWithFormatDuplicates: typeof credentialRecords = []\n const parsedQuery = DcqlQuery.parse(dcqlQuery)\n\n const dcqlCredentials: DcqlCredential[] = credentialRecords.flatMap((record): DcqlCredential | DcqlCredential[] => {\n if (record.type === 'MdocRecord') {\n credentialRecordsWithFormatDuplicates.push(record)\n\n // We always extract the first mdoc for querying\n const mdoc = record.firstCredential\n\n return {\n authority: this.getAuthorityForCredential(mdoc),\n credential_format: 'mso_mdoc',\n doctype: mdoc.docType,\n namespaces: mdoc.issuerSignedNamespaces,\n cryptographic_holder_binding: true,\n } satisfies DcqlCredential\n }\n\n if (record.type === 'SdJwtVcRecord') {\n const sdJwtVc = record.firstCredential\n const claims = sdJwtVc.prettyClaims as DcqlSdJwtVcCredential.Claims\n\n // To keep correct mapping of input credential index, we add it multiple times here:\n // - for dc+sd-jwt and vc+sd-jwt\n // - for each extended VCT (until we have multi-vct support in DCQL)\n credentialRecordsWithFormatDuplicates.push(\n record,\n record,\n ...record.extendedVctValues.map(() => record),\n ...record.extendedVctValues.map(() => record)\n )\n\n return [\n {\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'dc+sd-jwt',\n vct: record.getTags().vct,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n } satisfies DcqlSdJwtVcCredential,\n ...record.extendedVctValues.map(\n (extendedVctValue) =>\n ({\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'dc+sd-jwt',\n vct: extendedVctValue,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n }) satisfies DcqlSdJwtVcCredential\n ),\n {\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'vc+sd-jwt',\n vct: record.getTags().vct,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n } satisfies DcqlSdJwtVcCredential,\n ...record.extendedVctValues.map(\n (extendedVctValue) =>\n ({\n authority: this.getAuthorityForCredential(sdJwtVc),\n credential_format: 'vc+sd-jwt',\n vct: extendedVctValue,\n claims,\n cryptographic_holder_binding: sdJwtVc.holder !== undefined,\n }) satisfies DcqlSdJwtVcCredential\n ),\n ] satisfies DcqlSdJwtVcCredential[]\n }\n\n if (record.type === 'W3cCredentialRecord') {\n const firstCredential = record.firstCredential\n credentialRecordsWithFormatDuplicates.push(record)\n if (firstCredential.claimFormat === ClaimFormat.LdpVc) {\n return {\n credential_format: 'ldp_vc',\n authority: this.getAuthorityForCredential(firstCredential),\n type: record.getTags().expandedTypes ?? [],\n claims: firstCredential.jsonCredential as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasHolderBinding(undefined, firstCredential.credentialSubjectIds),\n } satisfies DcqlW3cVcCredential\n }\n\n return {\n credential_format: 'jwt_vc_json',\n authority: this.getAuthorityForCredential(firstCredential),\n type: firstCredential.type,\n claims: firstCredential.jsonCredential as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasHolderBinding(undefined, firstCredential.credentialSubjectIds),\n } satisfies DcqlW3cVcCredential\n }\n\n if (record.type === 'W3cV2CredentialRecord') {\n credentialRecordsWithFormatDuplicates.push(record)\n const firstCredential = record.firstCredential\n\n return {\n credential_format: 'vc+sd-jwt',\n authority: this.getAuthorityForCredential(firstCredential),\n type: asArray(firstCredential.resolvedCredential.type),\n claims: firstCredential.resolvedCredential.toJSON() as DcqlW3cVcCredential.Claims,\n cryptographic_holder_binding: hasW3cV2HolderBinding(firstCredential),\n } satisfies DcqlW3cVcCredential\n }\n\n throw new DcqlError('Unsupported record type')\n })\n\n const queryResult = DcqlQuery.query(parsedQuery, dcqlCredentials)\n\n const matchesWithRecord = Object.fromEntries(\n Object.entries(queryResult.credential_matches).map(([credential_query_id, result]) => {\n const failedCredentials = result.failed_credentials\n ? mapNonEmptyArray(result.failed_credentials, (credential) => {\n const record = credentialRecordsWithFormatDuplicates[credential.input_credential_index]\n const updatedCredential: DcqlFailedCredential = {\n ...credential,\n record,\n claims: credential.claims.success\n ? {\n ...credential.claims,\n success: true,\n valid_claim_sets: mapNonEmptyArray(credential.claims.valid_claim_sets, (claimSet) => ({\n ...claimSet,\n ...this.getDisclosedClaimSetOutput(record, claimSet, parsedQuery, credential_query_id),\n })),\n }\n : credential.claims,\n }\n return updatedCredential\n })\n : undefined\n\n // If not success, valid_credentials will be undefined, so we only have to map failed_credentials\n if (!result.success) {\n return [\n credential_query_id,\n {\n ...result,\n failed_credentials: failedCredentials,\n },\n ]\n }\n\n return [\n credential_query_id,\n {\n ...result,\n failed_credentials: failedCredentials,\n valid_credentials: mapNonEmptyArray(result.valid_credentials, (credential) => {\n const record = credentialRecordsWithFormatDuplicates[credential.input_credential_index]\n const updatedCredential: DcqlValidCredential = {\n ...credential,\n record,\n claims: {\n ...credential.claims,\n valid_claim_sets: mapNonEmptyArray(credential.claims.valid_claim_sets, (claimSet) => ({\n ...claimSet,\n ...this.getDisclosedClaimSetOutput(record, claimSet, parsedQuery, credential_query_id),\n })),\n },\n }\n return updatedCredential\n }),\n },\n ]\n })\n )\n\n return {\n ...queryResult,\n credential_matches: matchesWithRecord,\n }\n }\n\n /**\n * What a selectively disclosable credential discloses for the output of a claim set.\n *\n * The output of DCQL only holds the requested claims, while a claim that is not selectively\n * disclosable is always disclosed. So the output is replaced with the claims as the verifier receives\n * them, and `disclosed_paths` added: the paths to those claims in the credential, which are what to\n * disclose when presenting it.\n *\n * Other credentials disclose the output as it is.\n */\n private getDisclosedClaimSetOutput(\n record: DcqlValidCredential['record'],\n claimSet: { output: unknown; valid_claim_indexes?: number[] },\n dcqlQuery: DcqlQuery.Output,\n credentialQueryId: string\n ) {\n // The paths of the claims queries of the claim set, each with the elements a `null` in it selects\n const getClaimPaths = () => {\n const claimsQueries = dcqlQuery.credentials.find((credential) => credential.id === credentialQueryId)?.claims\n const claimsQueryPaths = (claimSet.valid_claim_indexes ?? []).flatMap((index) => {\n const claimsQuery = claimsQueries?.[index]\n // Note path is an array again, we use flatmap, so wrap it in another array, so that if\n // no value is returned ([]) it is not included as undefined in the array\n return claimsQuery && 'path' in claimsQuery ? [claimsQuery.path] : []\n })\n\n return getClaimPathsForDcqlClaimSet(claimsQueryPaths, claimSet.output)\n }\n\n if (record.type === 'SdJwtVcRecord') {\n const { prettyClaims, disclosedPaths } = applyDisclosuresForPaths(record.encoded, getClaimPaths())\n\n return { output: prettyClaims as { [key: string]: JsonValue }, disclosed_paths: disclosedPaths }\n }\n\n if (record.type === 'W3cV2CredentialRecord' && record.firstCredential instanceof W3cV2SdJwtVerifiableCredential) {\n const { prettyClaims, disclosedPaths } = applyDisclosuresForPaths(record.firstCredential.encoded, getClaimPaths())\n\n return {\n // The same shape as the claims DCQL was queried with, which are the credential's JSON\n output: JsonTransformer.fromJSON(prettyClaims, W3cV2Credential, { validate: false }).toJSON() as {\n [key: string]: JsonValue\n },\n disclosed_paths: disclosedPaths,\n }\n }\n\n return {}\n }\n\n public async assertValidDcqlPresentation(\n agentContext: AgentContext,\n dcqlPresentation: DcqlPresentation,\n dcqlQuery: DcqlQuery\n ) {\n const internalDcqlPresentation = Object.fromEntries(\n await Promise.all(\n Object.entries(dcqlPresentation).map(async ([credentialId, presentations]) => {\n const queryCredential = dcqlQuery.credentials.find((c) => c.id === credentialId)\n if (!queryCredential) {\n throw new DcqlError(\n `DCQL presentation contains presentation entry for credential id '${credentialId}', but this id is not present in the DCQL query`\n )\n }\n\n return [\n credentialId,\n await Promise.all(\n presentations.map((presentation) =>\n this.getDcqlCredentialRepresentation(agentContext, presentation, queryCredential)\n )\n ),\n ]\n })\n )\n )\n\n const presentationResult = DcqlPresentationResult.fromDcqlPresentation(internalDcqlPresentation, { dcqlQuery })\n\n if (!presentationResult.can_be_satisfied) {\n throw new DcqlError('Presentations do not satisfy the DCQL query.', {\n additionalMessages: Object.entries(presentationResult.credential_matches ?? {})\n .flatMap(([queryId, match]) =>\n match.success\n ? undefined\n : !match.failed_credentials\n ? `Unable to match query credential '${queryId}'. No prsentations provided`\n : match.failed_credentials.map(\n (failedCredential) =>\n `Presentation at index ${failedCredential.input_credential_index} does not match query credential '${queryId}'. ${JSON.stringify(\n {\n ...(failedCredential.claims.success\n ? {}\n : { claims: failedCredential.claims.failed_claim_sets.map((cs) => cs.issues) }),\n ...(failedCredential.trusted_authorities.success\n ? {}\n : {\n trusted_authorities:\n failedCredential.trusted_authorities.failed_trusted_authorities.map(\n (ta) => ta.issues\n ),\n }),\n ...(failedCredential.meta.success ? {} : { meta: failedCredential.meta.issues }),\n },\n null,\n 2\n )}`\n )\n )\n .filter((message) => message !== undefined),\n })\n }\n\n return presentationResult\n }\n\n private getSelectiveDisclosure(validCredential: DcqlValidCredential): DcqlSelectiveDisclosure {\n const [{ output, disclosed_paths }] = validCredential.claims.valid_claim_sets\n\n return disclosed_paths\n ? { disclosedPaths: disclosed_paths, disclosedPayload: output as JsonObject }\n : { disclosedPayload: output as JsonObject }\n }\n\n private dcqlCredentialForRequestForValidCredential(validCredential: DcqlValidCredential) {\n if (validCredential.record.type === 'MdocRecord') {\n return {\n claimFormat: ClaimFormat.MsoMdoc,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.claims.valid_claim_sets[0].output as MdocNameSpaces,\n } as const\n }\n if (validCredential.record.type === 'SdJwtVcRecord') {\n return {\n claimFormat: ClaimFormat.SdJwtDc,\n credentialRecord: validCredential.record,\n ...this.getSelectiveDisclosure(validCredential),\n } as const\n }\n\n if (validCredential.record.type === 'W3cCredentialRecord') {\n return {\n claimFormat: validCredential.record.firstCredential.claimFormat,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.record.firstCredential.jsonCredential as JsonObject,\n } as const\n }\n\n if (validCredential.record.type === 'W3cV2CredentialRecord') {\n const claimFormat = validCredential.record.firstCredential.claimFormat\n\n if (claimFormat === ClaimFormat.DiVc) {\n throw new DcqlError('DCQL credential selection does not support W3C V2 Data Integrity credentials yet')\n }\n\n if (claimFormat === ClaimFormat.SdJwtW3cVc) {\n return {\n claimFormat,\n credentialRecord: validCredential.record,\n ...this.getSelectiveDisclosure(validCredential),\n } as const\n }\n\n return {\n claimFormat,\n credentialRecord: validCredential.record,\n disclosedPayload: validCredential.claims.valid_claim_sets[0].output as JsonObject,\n } as const\n }\n\n throw new DcqlError('Unsupported record type for DCQL')\n }\n\n /**\n * Selects the credentials to use based on the output from `getCredentialsForRequest`\n * Use this method if you don't want to manually select the credentials yourself.\n */\n public selectCredentialsForRequest(\n dcqlQueryResult: DcqlQueryResult,\n { useMode = CredentialMultiInstanceUseMode.NewOrFirst }: DcqlSelectCredentialsForRequestOptions = {}\n ): DcqlCredentialsForRequest {\n if (!dcqlQueryResult.can_be_satisfied) {\n throw new DcqlError(\n 'Cannot select the credentials for the dcql query presentation if the request cannot be satisfied'\n )\n }\n\n const credentials: DcqlCredentialsForRequest = {}\n\n if (dcqlQueryResult.credential_sets) {\n credentialSetLoop: for (const credentialSet of dcqlQueryResult.credential_sets) {\n // undefined defaults to true\n if (credentialSet.required === false) continue\n const fullfillableOptions = credentialSet.matching_options\n\n if (!fullfillableOptions) {\n throw new DcqlError('Invalid dcql query result. No option is fullfillable')\n }\n\n for (const fullfillableOption of fullfillableOptions) {\n const optionMatches = fullfillableOption.map((credentialQueryId) => {\n const credentialMatch = dcqlQueryResult.credential_matches[credentialQueryId]\n if (!credentialMatch.success) return undefined\n const match = credentialMatch.valid_credentials.find((match: DcqlValidCredential) =>\n canUseInstanceFromCredentialRecord({ credentialRecord: match.record, useMode })\n )\n\n if (!match) return undefined\n return {\n match,\n credentialQueryId,\n }\n })\n\n if (optionMatches.every((c) => c !== undefined)) {\n for (const { match, credentialQueryId } of optionMatches) {\n credentials[credentialQueryId] = [this.dcqlCredentialForRequestForValidCredential(match)]\n }\n\n continue credentialSetLoop\n }\n }\n\n throw new DcqlError(\n 'Unable to select credentials for credential set. No new credential instance available on any of the available credentials.'\n )\n }\n } else {\n for (const credentialQuery of dcqlQueryResult.credentials) {\n const credentialMatch = dcqlQueryResult.credential_matches[credentialQuery.id]\n if (!credentialMatch.success) {\n throw new DcqlError(\n `Invalid dcql query result for credential query id '${credentialQuery.id}'. Cannot auto-select credentials`\n )\n }\n\n const credential = credentialMatch.valid_credentials.find((match: DcqlValidCredential) =>\n canUseInstanceFromCredentialRecord({ credentialRecord: match.record, useMode })\n )\n if (!credential) {\n throw new DcqlError(\n `Unable to select credential for credential query id '${credentialQuery.id}'. No new credential instance available on any of the available credentials.`\n )\n }\n\n credentials[credentialQuery.id] = [this.dcqlCredentialForRequestForValidCredential(credential)]\n }\n }\n\n return credentials\n }\n\n public validateDcqlQuery(dcqlQuery: DcqlQuery | DcqlQuery.Input | unknown): DcqlQuery {\n const parsed = DcqlQuery.parse(dcqlQuery as DcqlQuery)\n DcqlQuery.validate(parsed)\n return parsed\n }\n\n public async createPresentation(\n agentContext: AgentContext,\n options: {\n credentialQueryToCredential: DcqlCredentialsForRequest\n challenge: string\n domain?: string\n mdocSessionTranscript?: MdocSessionTranscriptOptions\n }\n ): Promise<{\n dcqlPresentation: DcqlPresentation\n encodedDcqlPresentation: DcqlEncodedPresentations\n }> {\n const { domain, challenge, mdocSessionTranscript } = options\n\n const dcqlPresentation: DcqlPresentation = {}\n const encodedDcqlPresentation: DcqlEncodedPresentations = {}\n const vcPresentationsToCreate = getDcqlVcPresentationsToCreate(options.credentialQueryToCredential)\n\n for (const [credentialQueryId, presentationsToCreate] of Object.entries(vcPresentationsToCreate)) {\n for (const presentationToCreate of presentationsToCreate) {\n let createdPresentation: VerifiablePresentation\n let encodedCreatedPresentation: string | Record<string, unknown>\n\n if (presentationToCreate.claimFormat === ClaimFormat.MsoMdoc) {\n const mdocRecord = presentationToCreate.credentialRecord\n if (!mdocSessionTranscript) {\n throw new DcqlError('Missing mdoc session transcript options for creating MDOC presentation.')\n }\n\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: mdocRecord,\n })\n\n const deviceResponse = await MdocDeviceResponse.createDeviceResponse(agentContext, {\n mdocs: [credentialInstance],\n documentRequests: [\n {\n docType: mdocRecord.getTags().docType,\n nameSpaces: Object.fromEntries(\n Object.entries(presentationToCreate.disclosedPayload).map(([key, value]) => {\n // FIXME: we need the DCQL query here to get the intent_to_retain from query (currently hardcoded to false)\n return [key, Object.fromEntries(Object.entries(value).map(([key]) => [key, false]))]\n })\n ),\n },\n ],\n sessionTranscriptOptions: mdocSessionTranscript,\n })\n const deviceResponseBase64Url = deviceResponse.encoded\n\n encodedCreatedPresentation = deviceResponseBase64Url\n createdPresentation = MdocDeviceResponse.fromBase64Url(deviceResponseBase64Url)\n } else if (presentationToCreate.claimFormat === ClaimFormat.SdJwtDc) {\n if (!domain) {\n throw new DcqlError('Missing domain property for creating SdJwtVc presentation.')\n }\n\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n const presentationFrame = this.getPresentationFrame(\n typeof credentialInstance === 'string' ? credentialInstance : credentialInstance.compact,\n presentationToCreate\n )\n\n const sdJwtVcApi = this.getSdJwtVcApi(agentContext)\n const presentation = await sdJwtVcApi.present({\n sdJwtVc: credentialInstance,\n presentationFrame,\n verifierMetadata: {\n audience: domain,\n nonce: challenge,\n issuedAt: Math.floor(Date.now() / 1000),\n },\n additionalPayload: presentationToCreate.additionalPayload,\n })\n\n encodedCreatedPresentation = presentation\n createdPresentation = sdJwtVcApi.fromCompact(presentation)\n } else if (presentationToCreate.claimFormat === ClaimFormat.JwtVp) {\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n if (!credentialInstance.credentialSubjectIds[0]) {\n throw new DcqlError('Cannot create presentation for credentials without subject id')\n }\n\n // Determine a suitable verification method for the presentation\n const verificationMethod = await this.getVerificationMethodForSubjectId(\n agentContext,\n credentialInstance.credentialSubjectIds[0]\n )\n\n const w3cCredentialService = agentContext.resolve(W3cCredentialService)\n const w3cPresentation = new W3cPresentation({\n verifiableCredential: [credentialInstance],\n holder: verificationMethod.controller,\n })\n\n const publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n\n const signedPresentation = await w3cCredentialService.signPresentation<ClaimFormat.JwtVp>(agentContext, {\n format: ClaimFormat.JwtVp,\n alg: publicJwk.signatureAlgorithm,\n verificationMethod: verificationMethod.id,\n presentation: w3cPresentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.LdpVp) {\n const { credentialInstance } = await useInstanceFromCredentialRecord({\n agentContext,\n useMode: presentationToCreate.useMode,\n credentialRecord: presentationToCreate.credentialRecord,\n })\n\n if (!credentialInstance.credentialSubjectIds[0]) {\n throw new DcqlError('Cannot create presentation for credentials without subject id')\n }\n\n // Determine a suitable verification method for the presentation\n const verificationMethod = await this.getVerificationMethodForSubjectId(\n agentContext,\n credentialInstance.credentialSubjectIds[0]\n )\n\n const w3cCredentialService = agentContext.resolve(W3cCredentialService)\n const w3cPresentation = new W3cPresentation({\n verifiableCredential: [credentialInstance],\n holder: verificationMethod.controller,\n })\n\n const signedPresentation = await w3cCredentialService.signPresentation(agentContext, {\n format: ClaimFormat.LdpVp,\n // TODO: we should move the check for which proof to use for a presentation to earlier\n // as then we know when determining which VPs to submit already if the proof types are supported\n // by the verifier, and we can then just add this to the vpToCreate interface\n proofType: this.getProofTypeForLdpVc(agentContext, verificationMethod),\n proofPurpose: new purposes.AuthenticationProofPurpose({ challenge, domain }),\n verificationMethod: verificationMethod.id,\n presentation: w3cPresentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.JwtW3cVp) {\n const w3cV2CredentialService = agentContext.resolve(W3cV2CredentialService)\n const firstCredential = presentationToCreate.credentialRecord.firstCredential\n\n if (firstCredential.claimFormat === ClaimFormat.DiVc) {\n throw new DcqlError('DCQL JWT W3C VP creation does not support W3C V2 Data Integrity credentials yet')\n }\n\n const w3cV2Presentation = new W3cV2Presentation({\n holder: firstCredential.resolvedCredential.credentialSubjectIds[0],\n verifiableCredential: [W3cV2EnvelopedVerifiableCredential.fromVerifiableCredential(firstCredential)],\n })\n\n const signedPresentation = await w3cV2CredentialService.signPresentation<ClaimFormat.JwtW3cVp>(agentContext, {\n format: ClaimFormat.JwtW3cVp,\n presentation: w3cV2Presentation,\n challenge,\n domain,\n })\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else if (presentationToCreate.claimFormat === ClaimFormat.SdJwtW3cVp) {\n const presentationFrame = this.getPresentationFrame(\n presentationToCreate.credentialRecord.firstCredential.encoded,\n presentationToCreate\n )\n if (!domain) {\n throw new DcqlError('Missing domain property for creating SdJwtVc presentation.')\n }\n\n const w3cV2SdJwtCredentialService = agentContext.resolve(W3cV2SdJwtCredentialService)\n const sdJwtVc = await w3cV2SdJwtCredentialService.present(agentContext, {\n credential: presentationToCreate.credentialRecord.firstCredential.encoded,\n presentationFrame,\n })\n\n const w3cV2CredentialService = agentContext.resolve(W3cV2CredentialService)\n const w3cV2Presentation = new W3cV2Presentation({\n holder: presentationToCreate.credentialRecord.firstCredential.resolvedCredential.credentialSubjectIds[0],\n verifiableCredential: [W3cV2EnvelopedVerifiableCredential.fromVerifiableCredential(sdJwtVc)],\n })\n\n const signedPresentation = await w3cV2CredentialService.signPresentation<ClaimFormat.SdJwtW3cVp>(\n agentContext,\n {\n format: ClaimFormat.SdJwtW3cVp,\n presentation: w3cV2Presentation,\n challenge,\n domain,\n }\n )\n\n encodedCreatedPresentation = signedPresentation.encoded\n createdPresentation = signedPresentation\n } else {\n throw new DcqlError('Unsupported presentation format.')\n }\n\n if (!dcqlPresentation[credentialQueryId]) {\n dcqlPresentation[credentialQueryId] = [createdPresentation]\n } else {\n dcqlPresentation[credentialQueryId].push(createdPresentation)\n }\n\n if (!encodedDcqlPresentation[credentialQueryId]) {\n encodedDcqlPresentation[credentialQueryId] = [encodedCreatedPresentation]\n } else {\n encodedDcqlPresentation[credentialQueryId].push(encodedCreatedPresentation)\n }\n }\n }\n\n return {\n dcqlPresentation,\n encodedDcqlPresentation,\n }\n }\n\n private getPresentationFrame(\n compactSdJwt: string,\n { disclosedPaths, disclosedPayload }: { disclosedPaths?: ClaimPath[]; disclosedPayload?: JsonObject }\n ) {\n if (disclosedPaths) return buildPresentationFrameForPaths(compactSdJwt, disclosedPaths)\n // DisclosedPayload will be removed in future version\n if (disclosedPayload) return buildDisclosureFrameForPayload(disclosedPayload)\n\n throw new DcqlError(\n 'Either disclosedPaths or disclosedPayload is required to present a selectively disclosable credential.'\n )\n }\n\n private getSdJwtVcApi(agentContext: AgentContext) {\n return agentContext.dependencyManager.resolve(SdJwtVcApi)\n }\n\n private getMdocApi(agentContext: AgentContext) {\n return agentContext.dependencyManager.resolve(MdocApi)\n }\n\n private async getVerificationMethodForSubjectId(agentContext: AgentContext, subjectId: string) {\n const didsApi = agentContext.dependencyManager.resolve(DidsApi)\n\n if (!subjectId.startsWith('did:')) {\n throw new DcqlError(`Only dids are supported as credentialSubject id. ${subjectId} is not a valid did`)\n }\n\n const didDocument = await didsApi.resolveDidDocument(subjectId)\n\n if (!didDocument.authentication || didDocument.authentication.length === 0) {\n throw new DcqlError(`No authentication verificationMethods found for did ${subjectId} in did document`)\n }\n\n // the signature suite to use for the presentation is dependant on the credentials we share.\n // 1. Get the verification method for this given proof purpose in this DID document\n const [verificationMethod] = didDocument.findVerificationMethodsByPurpose(['authentication'])\n return verificationMethod\n }\n\n // FIXME: We need to take into account OpenID4VP metadata (probably providing supported/allowed algs to the DCQL create presentation method)\n private getProofTypeForLdpVc(agentContext: AgentContext, verificationMethod: VerificationMethod) {\n // For each of the supported algs, find the key types, then find the proof types\n const signatureSuiteRegistry = agentContext.dependencyManager.resolve(SignatureSuiteRegistry)\n\n const publicJwk = getPublicJwkFromVerificationMethod(verificationMethod)\n const supportedSignatureSuites = signatureSuiteRegistry.getAllByPublicJwkType(publicJwk)\n if (supportedSignatureSuites.length === 0) {\n throw new DcqlError(\n `Couldn't find a supported signature suite for the given jwk ${publicJwk.jwkTypeHumanDescription}`\n )\n }\n\n return supportedSignatureSuites[0].proofType\n }\n}\n\n/**\n * A credential is bound to its holder through a key (`cnf`) or its subject. Verifying a presentation\n * checks that the presenter proves the binding. A subject id that is not a DID also counts, so such\n * a credential can't be presented.\n */\nfunction hasHolderBinding(cnf: unknown, credentialSubjectIds: string[]) {\n return cnf !== undefined || credentialSubjectIds.length > 0\n}\n\nfunction hasW3cV2HolderBinding(credential: W3cV2VerifiableCredential) {\n const cnf =\n credential instanceof W3cV2SdJwtVerifiableCredential\n ? credential.sdJwt.prettyClaims.cnf\n : credential instanceof W3cV2JwtVerifiableCredential\n ? credential.jwt.payload.additionalClaims.cnf\n : undefined\n\n return hasHolderBinding(cnf, credential.resolvedCredential.credentialSubjectIds)\n}\n"],"mappings":"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"}
|