@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth 0.32.1-next.54 → 0.33.1-feature.vcdm2.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth",
3
- "version": "0.32.1-next.54+3b988a2b",
3
+ "version": "0.33.1-feature.vcdm2.4+9f634bdb",
4
4
  "source": "src/index.ts",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,26 +14,27 @@
14
14
  "build:clean": "tsc --build --clean && tsc --build"
15
15
  },
16
16
  "dependencies": {
17
- "@sphereon/did-auth-siop": "0.16.1-next.339",
18
- "@sphereon/did-auth-siop-adapter": "0.16.1-next.339",
19
- "@sphereon/oid4vc-common": "0.16.1-next.339",
17
+ "@sphereon/did-auth-siop": "0.17.0",
18
+ "@sphereon/did-auth-siop-adapter": "0.17.0",
19
+ "@sphereon/oid4vc-common": "0.17.0",
20
20
  "@sphereon/pex": "5.0.0-unstable.28",
21
- "@sphereon/ssi-sdk-ext.did-utils": "0.27.0",
22
- "@sphereon/ssi-sdk-ext.identifier-resolution": "0.27.0",
23
- "@sphereon/ssi-sdk-ext.jwt-service": "0.27.0",
24
- "@sphereon/ssi-sdk.core": "0.32.1-next.54+3b988a2b",
25
- "@sphereon/ssi-sdk.credential-validation": "0.32.1-next.54+3b988a2b",
26
- "@sphereon/ssi-sdk.kv-store-temp": "0.32.1-next.54+3b988a2b",
27
- "@sphereon/ssi-sdk.mdl-mdoc": "0.32.1-next.54+3b988a2b",
28
- "@sphereon/ssi-sdk.pd-manager": "0.32.1-next.54+3b988a2b",
29
- "@sphereon/ssi-sdk.presentation-exchange": "0.32.1-next.54+3b988a2b",
30
- "@sphereon/ssi-sdk.sd-jwt": "0.32.1-next.54+3b988a2b",
31
- "@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.32.1-next.54+3b988a2b",
32
- "@sphereon/ssi-types": "0.32.1-next.54+3b988a2b",
21
+ "@sphereon/ssi-sdk-ext.did-utils": "0.28.0",
22
+ "@sphereon/ssi-sdk-ext.identifier-resolution": "0.28.0",
23
+ "@sphereon/ssi-sdk-ext.jwt-service": "0.28.0",
24
+ "@sphereon/ssi-sdk.core": "0.33.1-feature.vcdm2.4+9f634bdb",
25
+ "@sphereon/ssi-sdk.credential-validation": "0.33.1-feature.vcdm2.4+9f634bdb",
26
+ "@sphereon/ssi-sdk.kv-store-temp": "0.33.1-feature.vcdm2.4+9f634bdb",
27
+ "@sphereon/ssi-sdk.mdl-mdoc": "0.33.1-feature.vcdm2.4+9f634bdb",
28
+ "@sphereon/ssi-sdk.pd-manager": "0.33.1-feature.vcdm2.4+9f634bdb",
29
+ "@sphereon/ssi-sdk.presentation-exchange": "0.33.1-feature.vcdm2.4+9f634bdb",
30
+ "@sphereon/ssi-sdk.sd-jwt": "0.33.1-feature.vcdm2.4+9f634bdb",
31
+ "@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.33.1-feature.vcdm2.4+9f634bdb",
32
+ "@sphereon/ssi-types": "0.33.1-feature.vcdm2.4+9f634bdb",
33
33
  "@sphereon/wellknown-dids-client": "^0.1.3",
34
34
  "@veramo/core": "4.2.0",
35
35
  "@veramo/credential-w3c": "4.2.0",
36
36
  "cross-fetch": "^3.1.8",
37
+ "dcql": "0.2.19",
37
38
  "uuid": "^9.0.1"
38
39
  },
39
40
  "devDependencies": {
@@ -73,5 +74,5 @@
73
74
  "Authenticator"
74
75
  ],
75
76
  "nx": {},
76
- "gitHead": "3b988a2bb62a7c4534a2670ea3a0985fd93d00f2"
77
+ "gitHead": "9f634bdb714061141e277508c124b08d626f6036"
77
78
  }
@@ -7,8 +7,20 @@ import {
7
7
  VerifiedAuthorizationResponse,
8
8
  } from '@sphereon/did-auth-siop'
9
9
  import { getAgentResolver } from '@sphereon/ssi-sdk-ext.did-utils'
10
- import { AdditionalClaims, CredentialMapper, Hasher, ICredentialSubject, IVerifiableCredential } from '@sphereon/ssi-types'
11
- import { OriginalVerifiablePresentation } from '@sphereon/ssi-types'
10
+ import {
11
+ AdditionalClaims,
12
+ CredentialMapper,
13
+ HasherSync,
14
+ ICredentialSubject,
15
+ IPresentation,
16
+ IVerifiableCredential,
17
+ IVerifiablePresentation,
18
+ JwtDecodedVerifiablePresentation,
19
+ MdocDeviceResponse,
20
+ MdocOid4vpMdocVpToken,
21
+ OriginalVerifiablePresentation,
22
+ SdJwtDecodedVerifiableCredential,
23
+ } from '@sphereon/ssi-types'
12
24
  import { IAgentPlugin } from '@veramo/core'
13
25
  import {
14
26
  AuthorizationResponseStateWithVerifiedData,
@@ -33,6 +45,7 @@ import { RPInstance } from '../RPInstance'
33
45
 
34
46
  import { ISIOPv2RP } from '../types/ISIOPv2RP'
35
47
  import { shaHasher as defaultHasher } from '@sphereon/ssi-sdk.core'
48
+ import { DcqlQuery } from 'dcql'
36
49
 
37
50
  export class SIOPv2RP implements IAgentPlugin {
38
51
  private readonly opts: ISiopv2RPOpts
@@ -117,7 +130,7 @@ export class SIOPv2RP implements IAgentPlugin {
117
130
  args.includeVerifiedData &&
118
131
  args.includeVerifiedData !== VerifiedDataMode.NONE
119
132
  ) {
120
- let hasher: Hasher | undefined
133
+ let hasher: HasherSync | undefined
121
134
  if (
122
135
  CredentialMapper.isSdJwtEncoded(responseState.response.payload.vp_token as OriginalVerifiablePresentation) &&
123
136
  (!rpInstance.rpOptions.credentialOpts?.hasher || typeof rpInstance.rpOptions.credentialOpts?.hasher !== 'function')
@@ -130,14 +143,13 @@ export class SIOPv2RP implements IAgentPlugin {
130
143
  //todo: later we want to conditionally pass in options for mdl-mdoc here
131
144
  hasher,
132
145
  )
133
- const presentation = CredentialMapper.toUniformPresentation(presentationDecoded as OriginalVerifiablePresentation)
134
146
  switch (args.includeVerifiedData) {
135
147
  case VerifiedDataMode.VERIFIED_PRESENTATION:
136
- responseState.response.payload.verifiedData = presentation
148
+ responseState.response.payload.verifiedData = this.presentationOrClaimsFrom(presentationDecoded)
137
149
  break
138
- case VerifiedDataMode.CREDENTIAL_SUBJECT_FLATTENED:
150
+ case VerifiedDataMode.CREDENTIAL_SUBJECT_FLATTENED: // TODO debug cs-flat for SD-JWT
139
151
  const allClaims: AdditionalClaims = {}
140
- for (const credential of presentation.verifiableCredential || []) {
152
+ for (const credential of this.presentationOrClaimsFrom(presentationDecoded).verifiableCredential || []) {
141
153
  const vc = credential as IVerifiableCredential
142
154
  const schemaValidationResult = await context.agent.cvVerifySchema({
143
155
  credential,
@@ -168,6 +180,18 @@ export class SIOPv2RP implements IAgentPlugin {
168
180
  return responseState
169
181
  }
170
182
 
183
+ private presentationOrClaimsFrom = (
184
+ presentationDecoded:
185
+ | JwtDecodedVerifiablePresentation
186
+ | IVerifiablePresentation
187
+ | SdJwtDecodedVerifiableCredential
188
+ | MdocOid4vpMdocVpToken
189
+ | MdocDeviceResponse,
190
+ ): AdditionalClaims | IPresentation =>
191
+ CredentialMapper.isSdJwtDecodedCredential(presentationDecoded)
192
+ ? presentationDecoded.decodedPayload
193
+ : CredentialMapper.toUniformPresentation(presentationDecoded as OriginalVerifiablePresentation)
194
+
171
195
  private async siopUpdateRequestState(args: IUpdateRequestStateArgs, context: IRequiredContext): Promise<AuthorizationRequestState> {
172
196
  if (args.state !== 'sent') {
173
197
  throw Error(`Only 'sent' status is supported for this method at this point`)
@@ -203,7 +227,8 @@ export class SIOPv2RP implements IAgentPlugin {
203
227
  rp.get(context).then((rp) =>
204
228
  rp.verifyAuthorizationResponse(authResponse, {
205
229
  correlationId: args.correlationId,
206
- presentationDefinitions: args.presentationDefinitions,
230
+ ...(args.presentationDefinitions && !args.dcqlQuery ? { presentationDefinitions: args.presentationDefinitions } : {}),
231
+ ...(args.dcqlQuery ? { dcqlQuery: args.dcqlQuery as DcqlQuery } : {}), // TODO BEFORE PR, check compatibility and whether we can remove local type
207
232
  audience: args.audience,
208
233
  }),
209
234
  ),
@@ -213,15 +238,17 @@ export class SIOPv2RP implements IAgentPlugin {
213
238
  private async siopImportDefinitions(args: ImportDefinitionsArgs, context: IRequiredContext): Promise<void> {
214
239
  const { definitions, tenantId, version, versionControlMode } = args
215
240
  await Promise.all(
216
- definitions.map(async (definition) => {
217
- await context.agent.pexValidateDefinition({ definition: definition })
241
+ definitions.map(async (definitionPair) => {
242
+ const definitionPayload = definitionPair.definitionPayload
243
+ await context.agent.pexValidateDefinition({ definition: definitionPayload })
218
244
 
219
- console.log(`persisting definition ${definition.id} / ${definition.name} with versionControlMode ${versionControlMode}`)
245
+ console.log(`persisting definition ${definitionPayload.id} / ${definitionPayload.name} with versionControlMode ${versionControlMode}`)
220
246
  return context.agent.pdmPersistDefinition({
221
247
  definitionItem: {
222
248
  tenantId: tenantId,
223
249
  version: version,
224
- definitionPayload: definition,
250
+ definitionPayload,
251
+ dcqlPayload: definitionPair.dcqlPayload,
225
252
  },
226
253
  opts: { versionControlMode: versionControlMode },
227
254
  })
package/src/functions.ts CHANGED
@@ -16,10 +16,11 @@ import {
16
16
  SupportedVersion,
17
17
  VerifyJwtCallback,
18
18
  } from '@sphereon/did-auth-siop'
19
- import { CreateJwtCallback, JwtHeader, JwtIssuer, JwtPayload } from '@sphereon/oid4vc-common'
19
+ import { CreateJwtCallback, JwtHeader, JwtIssuer, JwtPayload, SigningAlgo } from '@sphereon/oid4vc-common'
20
20
  import { IPresentationDefinition } from '@sphereon/pex'
21
21
  import { getAgentDIDMethods, getAgentResolver } from '@sphereon/ssi-sdk-ext.did-utils'
22
22
  import {
23
+ isExternalIdentifierOIDFEntityIdOpts,
23
24
  isManagedIdentifierDidOpts,
24
25
  isManagedIdentifierDidResult,
25
26
  isManagedIdentifierX5cOpts,
@@ -27,17 +28,16 @@ import {
27
28
  } from '@sphereon/ssi-sdk-ext.identifier-resolution'
28
29
  import { JwtCompactResult } from '@sphereon/ssi-sdk-ext.jwt-service'
29
30
  import { IVerifySdJwtPresentationResult } from '@sphereon/ssi-sdk.sd-jwt'
30
- import { SigningAlgo } from '@sphereon/oid4vc-common'
31
31
  import { CredentialMapper, Hasher, OriginalVerifiableCredential, PresentationSubmission } from '@sphereon/ssi-types'
32
32
  import { IVerifyCallbackArgs, IVerifyCredentialResult, VerifyCallback } from '@sphereon/wellknown-dids-client'
33
33
  // import { KeyAlgo, SuppliedSigner } from '@sphereon/ssi-sdk.core'
34
34
  import { TKeyType } from '@veramo/core'
35
- import { createHash } from 'crypto'
36
35
  import { JWTVerifyOptions } from 'did-jwt'
37
36
  import { Resolvable } from 'did-resolver'
38
37
  import { EventEmitter } from 'events'
39
38
  import { IPEXOptions, IRequiredContext, IRPOptions, ISIOPIdentifierOptions } from './types/ISIOPv2RP'
40
- import { isExternalIdentifierOIDFEntityIdOpts } from '@sphereon/ssi-sdk-ext.identifier-resolution'
39
+ import { DcqlQuery } from 'dcql'
40
+ import { defaultHasher } from '@sphereon/ssi-sdk.core'
41
41
 
42
42
  export function getRequestVersion(rpOptions: IRPOptions): SupportedVersion {
43
43
  if (Array.isArray(rpOptions.supportedVersions) && rpOptions.supportedVersions.length > 0) {
@@ -80,14 +80,14 @@ export function getPresentationVerificationCallback(
80
80
  if (context.agent.mdocOid4vpRPVerify === undefined) {
81
81
  return Promise.reject('ImDLMdoc agent plugin must be enabled to support MsoMdoc types')
82
82
  }
83
- if (!presentationSubmission) {
84
- return Promise.reject('No presentationSubmission present')
83
+ if (presentationSubmission !== undefined && presentationSubmission !== null) {
84
+ const verifyResult = await context.agent.mdocOid4vpRPVerify({
85
+ vp_token: args,
86
+ presentation_submission: presentationSubmission,
87
+ })
88
+ return { verified: !verifyResult.error }
85
89
  }
86
- const verifyResult = await context.agent.mdocOid4vpRPVerify({
87
- vp_token: args,
88
- presentation_submission: presentationSubmission,
89
- })
90
- return { verified: !verifyResult.error }
90
+ throw Error(`mdocOid4vpRPVerify(...) method requires a presentation submission`)
91
91
  }
92
92
 
93
93
  const result = await context.agent.verifyPresentation({
@@ -105,11 +105,13 @@ export async function createRPBuilder(args: {
105
105
  rpOpts: IRPOptions
106
106
  pexOpts?: IPEXOptions | undefined
107
107
  definition?: IPresentationDefinition
108
+ dcql?: DcqlQuery
108
109
  context: IRequiredContext
109
110
  }): Promise<RPBuilder> {
110
111
  const { rpOpts, pexOpts, context } = args
111
112
  const { identifierOpts } = rpOpts
112
113
  let definition: IPresentationDefinition | undefined = args.definition
114
+ let dcqlQuery: DcqlQuery | undefined = args.dcql
113
115
 
114
116
  if (!definition && pexOpts && pexOpts.definitionId) {
115
117
  const presentationDefinitionItems = await context.agent.pdmGetDefinitions({
@@ -122,7 +124,13 @@ export async function createRPBuilder(args: {
122
124
  ],
123
125
  })
124
126
 
125
- definition = presentationDefinitionItems.length > 0 ? presentationDefinitionItems[0].definitionPayload : undefined
127
+ if (presentationDefinitionItems.length > 0) {
128
+ const presentationDefinitionItem = presentationDefinitionItems[0]
129
+ definition = presentationDefinitionItem.definitionPayload
130
+ if (!dcqlQuery && presentationDefinitionItem.dcqlPayload) {
131
+ dcqlQuery = presentationDefinitionItem.dcqlPayload as DcqlQuery // cast from DcqlQueryREST back to valibot DcqlQuery
132
+ }
133
+ }
126
134
  }
127
135
 
128
136
  const didMethods = identifierOpts.supportedDIDMethods ?? (await getAgentDIDMethods(context))
@@ -155,7 +163,7 @@ export async function createRPBuilder(args: {
155
163
  //todo: probably wise to first look and see if we actually need the hasher to begin with
156
164
  let hasher: Hasher | undefined = rpOpts.credentialOpts?.hasher
157
165
  if (!rpOpts.credentialOpts?.hasher || typeof rpOpts.credentialOpts?.hasher !== 'function') {
158
- hasher = (data, algorithm) => createHash(algorithm).update(data).digest()
166
+ hasher = defaultHasher
159
167
  }
160
168
 
161
169
  const builder = RP.builder({ requestVersion: getRequestVersion(rpOpts) })
@@ -217,6 +225,9 @@ export async function createRPBuilder(args: {
217
225
  if (definition) {
218
226
  builder.withPresentationDefinition({ definition }, PropertyTarget.REQUEST_OBJECT)
219
227
  }
228
+ if (dcqlQuery) {
229
+ builder.withDcqlQuery(dcqlQuery)
230
+ }
220
231
 
221
232
  if (rpOpts.responseRedirectUri) {
222
233
  builder.withResponseRedirectUri(rpOpts.responseRedirectUri)
@@ -1,13 +1,10 @@
1
- import { ClientMetadataOpts, VerifyJwtCallback } from '@sphereon/did-auth-siop'
2
- import { IIdentifierResolution, ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution'
3
- import { IAgentContext, ICredentialIssuer, ICredentialVerifier, IDIDManager, IKeyManager, IPluginMethodMap, IResolver } from '@veramo/core'
4
- import { AdditionalClaims, Hasher, W3CVerifiablePresentation } from '@sphereon/ssi-types'
5
1
  import {
6
2
  AuthorizationRequestPayload,
7
3
  AuthorizationRequestState,
8
4
  AuthorizationResponsePayload,
9
5
  AuthorizationResponseState,
10
6
  ClaimPayloadCommonOpts,
7
+ ClientMetadataOpts,
11
8
  IRPSessionManager,
12
9
  PresentationDefinitionWithLocation,
13
10
  PresentationVerificationCallback,
@@ -17,10 +14,12 @@ import {
17
14
  SupportedVersion,
18
15
  VerifiablePresentationTypeFormat,
19
16
  VerifiedAuthorizationResponse,
17
+ VerifyJwtCallback,
20
18
  VPTokenLocation,
21
19
  } from '@sphereon/did-auth-siop'
22
-
23
- import { ExternalIdentifierOIDFEntityIdOpts } from '@sphereon/ssi-sdk-ext.identifier-resolution'
20
+ import { ExternalIdentifierOIDFEntityIdOpts, IIdentifierResolution, ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution'
21
+ import { IAgentContext, ICredentialIssuer, ICredentialVerifier, IDIDManager, IKeyManager, IPluginMethodMap, IResolver } from '@veramo/core'
22
+ import { AdditionalClaims, DcqlQueryREST, HasherSync, W3CVerifiablePresentation } from '@sphereon/ssi-types'
24
23
 
25
24
  import { Resolvable } from 'did-resolver'
26
25
  import { DIDDocument } from '@sphereon/did-uni-client'
@@ -112,10 +111,16 @@ export interface IVerifyAuthResponseStateArgs {
112
111
  correlationId: string
113
112
  audience?: string
114
113
  presentationDefinitions?: PresentationDefinitionWithLocation | PresentationDefinitionWithLocation[]
114
+ dcqlQuery?: DcqlQueryREST
115
+ }
116
+
117
+ export interface IDefinitionPair {
118
+ definitionPayload: IPresentationDefinition
119
+ dcqlPayload?: DcqlQueryREST
115
120
  }
116
121
 
117
122
  export interface ImportDefinitionsArgs {
118
- definitions: Array<IPresentationDefinition>
123
+ definitions: Array<IDefinitionPair>
119
124
  tenantId?: string
120
125
  version?: string
121
126
  versionControlMode?: VersionControlMode
@@ -202,7 +207,7 @@ export interface ISIOPIdentifierOptions extends Omit<IDIDOptions, 'idOpts'> {
202
207
 
203
208
  // todo make the necessary changes for mdl-mdoc types
204
209
  export type CredentialOpts = {
205
- hasher?: Hasher
210
+ hasher?: HasherSync
206
211
  }
207
212
 
208
213
  export interface AuthorizationResponseStateWithVerifiedData extends AuthorizationResponseState {