From 279abe464e96ee96b7d34a9b7ef95955599203eb Mon Sep 17 00:00:00 2001 From: Timo Glastra Date: Sat, 2 Nov 2024 03:29:01 +0530 Subject: [PATCH] mdoc verification Signed-off-by: Timo Glastra --- agent/package.json | 2 +- agent/src/endpoints.ts | 50 +++++++--- agent/src/issuers/infrastruktur.ts | 2 +- agent/src/verifiers/animo.ts | 69 +++++++++++++ agent/src/verifiers/index.ts | 6 ++ agent/src/verifiers/sixt.ts | 39 ++++++++ agent/src/verifiers/util.ts | 92 ++++++++++++++++++ app/components/VerifyBlock.tsx | 76 ++++++--------- app/components/VerifyTab.tsx | 150 +---------------------------- app/lib/api.ts | 16 ++- pnpm-lock.yaml | 137 +++++++------------------- 11 files changed, 330 insertions(+), 309 deletions(-) create mode 100644 agent/src/verifiers/animo.ts create mode 100644 agent/src/verifiers/index.ts create mode 100644 agent/src/verifiers/sixt.ts create mode 100644 agent/src/verifiers/util.ts diff --git a/agent/package.json b/agent/package.json index 76c164f..fa2ebd3 100644 --- a/agent/package.json +++ b/agent/package.json @@ -6,7 +6,7 @@ "@credo-ts/node": "https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/node?funke", "@credo-ts/openid4vc": "https://gitpkg.vercel.app/animo/aries-framework-javascript/packages/openid4vc?funke", "@hyperledger/aries-askar-nodejs": "^0.2.3", - "@protokoll/mdoc-client": "^0.2.35", + "@protokoll/mdoc-client": "^0.2.36", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.2", diff --git a/agent/src/endpoints.ts b/agent/src/endpoints.ts index 0871894..c838352 100644 --- a/agent/src/endpoints.ts +++ b/agent/src/endpoints.ts @@ -2,9 +2,7 @@ import { DifPresentationExchangeService, JsonTransformer, KeyType, - MdocVerifiablePresentation, - // Mdoc, - // MdocVerifiablePresentation, + MdocDeviceResponse, RecordNotFoundError, W3cJsonLdVerifiablePresentation, W3cJwtVerifiablePresentation, @@ -19,6 +17,7 @@ import { getIssuerIdForCredentialConfigurationId } from './issuer' import { issuers } from './issuers' import { getX509Certificate } from './keyMethods' import { getVerifier } from './verifier' +import { allDefinitions, verifiers } from './verifiers' const zCreateOfferRequest = z.object({ // FIXME: rename offeredCredentials to credentialSupportedIds in AFJ @@ -132,8 +131,21 @@ apiRouter.post('/offers/receive', async (request: Request, response: Response) = }) }) +apiRouter.get('/verifier', async (_, response: Response) => { + return response.json({ + presentationRequests: verifiers.flatMap((i) => + i.presentationRequests.map((c) => { + return { + display: c.name, + id: c.id, + } + }) + ), + }) +}) + const zCreatePresentationRequestBody = z.object({ - presentationDefinition: z.record(z.string(), z.any()), + presentationDefinitionId: z.string(), requestScheme: z.string(), responseMode: z.enum(['direct_post.jwt', 'direct_post']), }) @@ -148,7 +160,13 @@ apiRouter.post('/requests/create', async (request: Request, response: Response) const x509Certificate = getX509Certificate() - const definition = createPresentationRequestBody.presentationDefinition + const definitionId = createPresentationRequestBody.presentationDefinitionId + const definition = allDefinitions.find((d) => d.id === definitionId) + if (!definition) { + return response.status(404).json({ + error: 'Definition not found', + }) + } const key = await agent.context.wallet.createKey({ keyType: KeyType.P256 }) const additionalPayloadClaims = { rp_eph_pub: getJwkFromKey(key).toJson() } @@ -163,8 +181,7 @@ apiRouter.post('/requests/create', async (request: Request, response: Response) issuer: `${AGENT_HOST}/siop/${verifier.verifierId}/authorize`, }, presentationExchange: { - // biome-ignore lint/suspicious/noExplicitAny: - definition: definition as any, + definition, }, additionalPayloadClaims, responseMode: createPresentationRequestBody.responseMode, @@ -209,14 +226,19 @@ apiRouter.get('/requests/:verificationSessionId', async (request, response) => { } } - if (presentation instanceof MdocVerifiablePresentation) { - const deviceSigned = JSON.parse(presentation.deviceSignedBase64Url).deviceSigned - // const disclosedClaims = await Mdoc.getDisclosedClaims(deviceSigned) - // console.log('disclosedClaims', JSON.stringify(disclosedClaims, null, 2)) - + if (presentation instanceof MdocDeviceResponse) { return { - pretty: JsonTransformer.toJSON({}), - encoded: deviceSigned, + pretty: JsonTransformer.toJSON({ + documents: presentation.documents.map((doc) => ({ + doctype: doc.docType, + alg: doc.alg, + base64Url: doc.base64Url, + validityInfo: doc.validityInfo, + deviceSignedNamespaces: doc.deviceSignedNamespaces, + issuerSignedNamespaces: doc.issuerSignedNamespaces, + })), + }), + encoded: presentation.base64Url, } } diff --git a/agent/src/issuers/infrastruktur.ts b/agent/src/issuers/infrastruktur.ts index 32eb6da..89ff5bb 100644 --- a/agent/src/issuers/infrastruktur.ts +++ b/agent/src/issuers/infrastruktur.ts @@ -75,7 +75,7 @@ export const mobileDriversLicenseMdoc = { cryptographic_binding_methods_supported: ['cose_key'], cryptographic_suites_supported: [JwaSignatureAlgorithm.ES256], id: 'mobile-drivers-license-mdoc', - doctype: 'eu.europa.ec.eudi.hiid.1', + doctype: 'org.iso.18013.5.1.mDL.1', display: [mobileDriversLicenseDisplay], } as const satisfies OpenId4VciCredentialSupportedWithId diff --git a/agent/src/verifiers/animo.ts b/agent/src/verifiers/animo.ts new file mode 100644 index 0000000..f6655ff --- /dev/null +++ b/agent/src/verifiers/animo.ts @@ -0,0 +1,69 @@ +import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core' +import { pidMdocInputDescriptor, pidSdJwtInputDescriptor } from './util' + +export const animoVerifier = { + presentationRequests: [ + { + id: '4db74328-9e94-49bb-97b7-bbfcb2d11a06', + name: 'PID - Name and age verification (vc+sd-jwt)', + purpose: 'We need to verify your name and age', + input_descriptors: [ + pidSdJwtInputDescriptor({ + fields: ['given_name', 'family_name', 'age_equal_or_over.21'], + }), + ], + }, + { + id: '1e5fe154-183c-4bf5-b2c8-caa2264f1c99', + name: 'PID - City verification (vc+sd-jwt)', + purpose: 'We need to verify your city', + input_descriptors: [ + pidSdJwtInputDescriptor({ + fields: ['place_of_birth.locality', 'adress.locality'], + }), + ], + }, + { + id: 'f64dc30a-bcd7-48e8-b065-2bc3c7fc9588', + name: 'PID - Age in year and birth family name verification (vc+sd-jwt)', + purpose: 'We need to verify your name and age', + input_descriptors: [ + pidSdJwtInputDescriptor({ + fields: ['age_in_years', 'birth_family_name'], + }), + ], + }, + { + id: '5db54e62-d19d-495a-9d1d-58fac1f89a4d', + name: 'PID - Name and age verification (mso_mdoc)', + purpose: 'We need to verify your name and age', + input_descriptors: [ + pidMdocInputDescriptor({ + fields: ['given_name', 'family_name', 'age_over_21'], + }), + ], + }, + { + id: '8e80930c-6110-407a-a415-04791be81a35', + name: 'PID - City verification (mso_mdoc)', + purpose: 'We need to verify your city', + input_descriptors: [ + pidMdocInputDescriptor({ + fields: ['birth_place', 'resident_city'], + }), + ], + }, + { + id: '7df77c25-01bb-47ac-8778-454cb1031fe5', + name: 'PID - Age in year and birth family name verification (mso_mdoc)', + purpose: 'We need to verify your name and age', + input_descriptors: [ + pidMdocInputDescriptor({ + fields: ['age_in_years', 'family_name_birth'], + }), + ], + }, + ], +} as const satisfies { + presentationRequests: Array +} diff --git a/agent/src/verifiers/index.ts b/agent/src/verifiers/index.ts new file mode 100644 index 0000000..88a0a9b --- /dev/null +++ b/agent/src/verifiers/index.ts @@ -0,0 +1,6 @@ +import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core' +import { animoVerifier } from './animo' +import { sixtVerifier } from './sixt' + +export const verifiers = [animoVerifier, sixtVerifier] +export const allDefinitions = verifiers.flatMap((v): DifPresentationExchangeDefinitionV2[] => v.presentationRequests) diff --git a/agent/src/verifiers/sixt.ts b/agent/src/verifiers/sixt.ts new file mode 100644 index 0000000..abb5463 --- /dev/null +++ b/agent/src/verifiers/sixt.ts @@ -0,0 +1,39 @@ +import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core' +import { mobileDriversLicenseMdoc, mobileDriversLicenseSdJwt } from '../issuers/infrastruktur' +import { mdocInputDescriptor, pidMdocInputDescriptor, pidSdJwtInputDescriptor, sdJwtInputDescriptor } from './util' + +export const sixtVerifier = { + presentationRequests: [ + { + id: '1ad8ea6e-ec51-4e14-b316-dd76a6275480', + name: 'PID and MDL - Rent a Car (vc+sd-jwt)', + purpose: 'To secure your car reservations and finalize the transaction, we require the following attributes', + input_descriptors: [ + sdJwtInputDescriptor({ + vcts: [mobileDriversLicenseSdJwt.vct], + fields: ['document_number', 'portrait', 'issue_date', 'expiry_date', 'issuing_country', 'issuing_authority'], + }), + pidSdJwtInputDescriptor({ + fields: ['given_name', 'family_name', 'birthdate'], + }), + ], + }, + { + id: '479ada7f-fff1-4f4a-ba0b-f0e7a8dbab04', + name: 'PID and MDL - Rent a Car (vc+sd-jwt/mso_mdoc)', + purpose: 'To secure your car reservations and finalize the transaction, we require the following attributes', + input_descriptors: [ + mdocInputDescriptor({ + doctype: mobileDriversLicenseMdoc.doctype, + namespace: mobileDriversLicenseMdoc.doctype, + fields: ['document_number', 'issue_date', 'expiry_date', 'issuing_country', 'issuing_authority'], + }), + pidSdJwtInputDescriptor({ + fields: ['given_name', 'family_name', 'birthdate'], + }), + ], + }, + ], +} as const satisfies { + presentationRequests: Array +} diff --git a/agent/src/verifiers/util.ts b/agent/src/verifiers/util.ts new file mode 100644 index 0000000..0dd7877 --- /dev/null +++ b/agent/src/verifiers/util.ts @@ -0,0 +1,92 @@ +import type { DifPresentationExchangeDefinitionV2 } from '@credo-ts/core' + +export function sdJwtInputDescriptor({ + vcts, + fields, + issuers, +}: { + vcts: string[] + fields: string[] + issuers?: string[] +}): DifPresentationExchangeDefinitionV2['input_descriptors'][number] { + return { + id: crypto.randomUUID(), + format: { + 'vc+sd-jwt': { + 'sd-jwt_alg_values': ['ES256'], + 'kb-jwt_alg_values': ['ES256'], + }, + }, + constraints: { + limit_disclosure: 'required', + fields: [ + ...fields.map((field) => ({ + path: [`$.${field}`], + })), + { + path: ['$.vct'], + filter: { + type: 'string', + enum: vcts, + }, + }, + issuers + ? { + path: ['$.iss'], + filter: { + type: 'string', + enum: issuers, + }, + } + : undefined, + ].filter((f): f is Exclude => f !== undefined), + }, + } +} + +export function mdocInputDescriptor({ + doctype, + namespace, + fields, +}: { + doctype: string + namespace: string + fields: string[] +}): DifPresentationExchangeDefinitionV2['input_descriptors'][number] { + return { + id: doctype, + format: { + mso_mdoc: { + alg: ['ES256'], + }, + }, + constraints: { + limit_disclosure: 'required', + fields: [ + ...fields.map((field) => ({ + path: [`$['${namespace}']['${field}']`], + intent_to_retain: false, + })), + ].filter((f): f is Exclude => f !== undefined), + }, + } +} + +export function pidMdocInputDescriptor({ fields }: { fields: string[] }) { + return mdocInputDescriptor({ + fields, + doctype: 'eu.europa.ec.eudi.pid.1', + namespace: 'eu.europa.ec.eudi.pid.1', + }) +} +export function pidSdJwtInputDescriptor({ fields }: { fields: string[] }) { + return sdJwtInputDescriptor({ + fields, + vcts: ['https://example.bmi.bund.de/credential/pid/1.0', 'urn:eu.europa.ec.eudi:pid:1'], + issuers: [ + 'https://demo.pid-issuer.bundesdruckerei.de/c', + 'https://demo.pid-issuer.bundesdruckerei.de/c1', + 'https://demo.pid-issuer.bundesdruckerei.de/b1', + ], + }) +} diff --git a/app/components/VerifyBlock.tsx b/app/components/VerifyBlock.tsx index d887a85..aa2ae17 100644 --- a/app/components/VerifyBlock.tsx +++ b/app/components/VerifyBlock.tsx @@ -1,9 +1,9 @@ -import { getRequestStatus } from '@/lib/api' +import { getRequestStatus, getVerifier } from '@/lib/api' import { useInterval } from '@/lib/hooks' import { CheckboxIcon, ExclamationTriangleIcon, InfoCircledIcon } from '@radix-ui/react-icons' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@radix-ui/react-tooltip' import Link from 'next/link' -import { type FormEvent, useState } from 'react' +import { type FormEvent, useEffect, useState } from 'react' import QRCode from 'react-qr-code' import { HighLight } from './highLight' import { Alert, AlertDescription, AlertTitle } from './ui/alert' @@ -14,21 +14,17 @@ import { Label } from './ui/label' import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from './ui/select' import { TypographyH3, TypographyH4 } from './ui/typography' -export type CredentialType = 'mdoc' | 'sdjwt' -export type RequestType = 'name_age_over_21' | 'city' | 'age_birth_family_name' export type ResponseMode = 'direct_post' | 'direct_post.jwt' type VerifyBlockProps = { flowName: string x509Certificate?: string createRequest: ({ - credentialType, - requestType, + presentationDefinitionId, requestScheme, responseMode, }: { - credentialType: CredentialType - requestType: RequestType + presentationDefinitionId: string requestScheme: string responseMode: ResponseMode }) => Promise<{ @@ -48,6 +44,12 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam definition?: Record presentations?: Array> }>() + const [verifier, setVerifier] = useState<{ + presentationRequests: Array<{ + id: string + display: string + }> + }>() const [responseMode, setResponseMode] = useState('direct_post.jwt') const enabled = @@ -58,10 +60,13 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam const authorizationRequestUriHasBeenFetched = requestStatus?.responseStatus === 'RequestUriRetrieved' const hasResponse = requestStatus?.responseStatus === 'ResponseVerified' || requestStatus?.responseStatus === 'Error' const isSuccess = requestStatus?.responseStatus === 'ResponseVerified' - const [credentialType, setCredentialType] = useState('sdjwt') - const [requestType, setRequestType] = useState('name_age_over_21') + const [presentationDefinitionId, setPresentationDefinitionId] = useState() const [requestScheme, setRequestScheme] = useState('openid4vp://') + useEffect(() => { + getVerifier().then(setVerifier) + }, []) + useInterval({ callback: async () => { if (!verificationSessionId) return @@ -81,7 +86,11 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam setVerificationSessionId(undefined) setRequestStatus(undefined) - const request = await createRequest({ credentialType, requestType, requestScheme, responseMode }) + const id = presentationDefinitionId ?? verifier?.presentationRequests[0]?.id + if (!id) { + throw new Error('No definition') + } + const request = await createRequest({ presentationDefinitionId: id, requestScheme, responseMode }) setVerificationSessionId(request.verificationSessionId) setAuthorizationRequestUri(request.authorizationRequestUri) @@ -107,45 +116,22 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam {flowName}
- + -
-
- -
@@ -195,6 +181,7 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam + {/* biome-ignore lint/a11y/useKeyWithClickEvents: */}

navigator.clipboard.writeText(e.currentTarget.innerText)} className="text-gray-500 break-all cursor-pointer" @@ -262,6 +249,7 @@ export const VerifyBlock: React.FC = ({ createRequest, flowNam

+ {/* biome-ignore lint/a11y/useKeyWithClickEvents: */}

navigator.clipboard.writeText(e.currentTarget.innerText)} className="text-gray-500 break-all cursor-pointer" diff --git a/app/components/VerifyTab.tsx b/app/components/VerifyTab.tsx index b665737..0fec292 100644 --- a/app/components/VerifyTab.tsx +++ b/app/components/VerifyTab.tsx @@ -1,25 +1,18 @@ import { useEffect, useState } from 'react' -import { createRequest, getIssuer, getX509Certificate } from '../lib/api' -import { type CredentialType, type RequestType, type ResponseMode, VerifyBlock } from './VerifyBlock' - -const randomId = () => (Math.random() + 1).toString(36).substring(7) +import { createRequest, getX509Certificate } from '../lib/api' +import { type ResponseMode, VerifyBlock } from './VerifyBlock' export function VerifyTab() { const [x509Certificate, setX509Certificate] = useState() const createRequestForVerification = async (options: { - credentialType: CredentialType - requestType: RequestType + presentationDefinitionId: string requestScheme: string responseMode: ResponseMode }) => { - const issuer = (await getIssuer()).availableX509Certificates[0] return await createRequest({ requestScheme: options.requestScheme, - presentationDefinition: - options.credentialType === 'sdjwt' - ? getSdJwtPresentationDefinition(issuer, options.requestType) - : getMdocPresentationDefinition(options.requestType), + presentationDefinitionId: options.presentationDefinitionId, responseMode: options.responseMode, }) } @@ -34,138 +27,3 @@ export function VerifyTab() { ) } - -const getSdJwtPresentationDefinition = (issuer: string, requestType: RequestType) => { - const typeFieldsMapping = { - name_age_over_21: [ - { - path: ['$.given_name'], - }, - { - path: ['$.family_name'], - }, - { - path: ['$.age_equal_or_over.21'], - filter: { - type: 'boolean', - const: true, - }, - }, - ], - city: [ - { - path: ['$.place_of_birth.locality'], - }, - { - path: ['$.address.locality'], - }, - ], - age_birth_family_name: [ - { - path: ['$.age_in_years'], - }, - { - path: ['$.birth_family_name'], - }, - ], - } - - return { - id: randomId(), - name: 'Bank account identity verification', - purpose: 'To open a bank account we need to verify your identity.', - input_descriptors: [ - { - id: randomId(), - constraints: { - limit_disclosure: 'required', - fields: [ - ...typeFieldsMapping[requestType], - { - path: ['$.iss'], - filter: { - type: 'string', - enum: [ - 'https://demo.pid-issuer.bundesdruckerei.de/c', - 'https://demo.pid-issuer.bundesdruckerei.de/c1', - 'https://demo.pid-issuer.bundesdruckerei.de/b1', - issuer, - ], - }, - }, - { - path: ['$.vct'], - filter: { - type: 'string', - enum: ['https://example.bmi.bund.de/credential/pid/1.0', 'urn:eu.europa.ec.eudi:pid:1'], - }, - }, - ], - }, - name: 'Bank Account Identity Verification', - purpose: 'To open a bank account we need to verify your identity.', - }, - ], - } -} - -const getMdocPresentationDefinition = (requestType: RequestType) => { - const typeFieldsMapping = { - name_age_over_21: [ - { - path: ["$['eu.europa.ec.eudi.pid.1']['given_name']"], - intent_to_retain: false, - }, - { - path: ["$['eu.europa.ec.eudi.pid.1']['family_name']"], - intent_to_retain: false, - }, - { - path: ["$['eu.europa.ec.eudi.pid.1']['age_over_21']"], - intent_to_retain: false, - }, - ], - city: [ - { - path: ["$['eu.europa.ec.eudi.pid.1']['birth_place']"], - intent_to_retain: false, - }, - { - path: ["$['eu.europa.ec.eudi.pid.1']['resident_city']"], - intent_to_retain: false, - }, - ], - age_birth_family_name: [ - { - path: ["$['eu.europa.ec.eudi.pid.1']['age_in_years']"], - intent_to_retain: false, - }, - { - path: ["$['eu.europa.ec.eudi.pid.1']['family_name_birth']"], - intent_to_retain: false, - }, - ], - } - - return { - id: randomId(), - name: 'Bank account identity verification', - purpose: 'To open a bank account we need to verify your identity.', - input_descriptors: [ - { - id: 'eu.europa.ec.eudi.pid.1', - format: { - mso_mdoc: { - alg: ['ES256', 'ES384', 'ES512', 'EdDSA'], - }, - }, - constraints: { - fields: [...typeFieldsMapping[requestType]], - limit_disclosure: 'required', - }, - name: 'Bank Account Identity Verification', - purpose: 'To open a bank account we need to verify your identity.', - }, - ], - } -} diff --git a/app/lib/api.ts b/app/lib/api.ts index 71eed49..0d21d88 100644 --- a/app/lib/api.ts +++ b/app/lib/api.ts @@ -25,6 +25,16 @@ export async function createOffer({ return response.json() } +export async function getVerifier() { + const response = await fetch(`${NEXT_PUBLIC_API_URL}/api/verifier`) + + if (!response.ok) { + throw new Error('Failed to get verifier') + } + + return response.json() +} + export async function getIssuer() { const response = await fetch(`${NEXT_PUBLIC_API_URL}/api/issuer`) @@ -64,11 +74,11 @@ export async function receiveOffer(offerUri: string) { } export async function createRequest({ - presentationDefinition, + presentationDefinitionId, requestScheme, responseMode, }: { - presentationDefinition: any + presentationDefinitionId: string requestScheme: string responseMode: 'direct_post' | 'direct_post.jwt' }) { @@ -78,7 +88,7 @@ export async function createRequest({ 'Content-Type': 'application/json', }, body: JSON.stringify({ - presentationDefinition, + presentationDefinitionId, requestScheme, responseMode, }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ff68f5..7f11976 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,7 +15,6 @@ overrides: '@sphereon/oid4vci-issuer': https://gitpkg.vercel.app/animo/OID4VC/packages/issuer?funke '@sphereon/oid4vci-client': https://gitpkg.vercel.app/animo/OID4VC/packages/client?funke '@sphereon/jarm': https://gitpkg.vercel.app/animo/OID4VC/packages/jarm?funke - '@sphereon/ssi-types': 0.29.1-unstable.208 importers: @@ -1589,9 +1588,15 @@ packages: '@protokoll/core@0.2.35': resolution: {integrity: sha512-yJyp6iKrqmoMK/ltyGQecwV1Lw5vj6M5lgdKYYHqan2GOwh5PhIjKeptBs8NTSuNawCBJTVlBpbBXsufohJUyg==} + '@protokoll/core@0.2.36': + resolution: {integrity: sha512-4VHOLNX9XiExUXGCGuT1SnbhhJT4RZCRQnQFqFZ1b6bEnxLQvmy8W06ZdZYuXOcW4IdCfWq0qI/wWs+cKOV1Pw==} + '@protokoll/mdoc-client@0.2.35': resolution: {integrity: sha512-pSnPA/ATXp8Mx4LN7oohuHYGYJmMeQtRJF65XdEgvnUHHgjyRHxmTZueXNqd+PFbP4ctqessjfUFhxYs1tDFtQ==} + '@protokoll/mdoc-client@0.2.36': + resolution: {integrity: sha512-8RXjZFLGERBS3qBcnB33Ldjv/HryT2F+gCrvVvzpFi6CvMH29NvuuLxd52GN8JBCNT7r03i/0GPfQX03jidDCg==} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -2020,10 +2025,6 @@ packages: resolution: {integrity: sha512-vix1GplUFc1A9H42r/yXkg7cKYthggyqZEwlFdsBbn4xdZNE+AHVF4N7kPa1pPxipwN3UIHd4XnQ5MJV15mhsQ==} engines: {node: '>=18'} - '@sd-jwt/decode@0.6.1': - resolution: {integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ==} - engines: {node: '>=16'} - '@sd-jwt/decode@0.7.2': resolution: {integrity: sha512-dan2LSvK63SKwb62031G4r7TE4TaiI0EK1KbPXqS+LCXNkNDUHqhtYp9uOpj+grXceCsMtMa2f8VnUfsjmwHHg==} engines: {node: '>=18'} @@ -2032,10 +2033,6 @@ packages: resolution: {integrity: sha512-o/Mg/Zg21poFsPXuxtPD9sdXq2b/0L+rb9gxU2k1rp1aT+DWmqD0k8v0Ttr2tlMc8l1xXQNA8FLXbL1AdLRmbQ==} engines: {node: '>=18'} - '@sd-jwt/present@0.6.1': - resolution: {integrity: sha512-QRD3TUDLj4PqQNZ70bBxh8FLLrOE9mY8V9qiZrJSsaDOLFs2p1CtZG+v9ig62fxFYJZMf4bWKwYjz+qqGAtxCg==} - engines: {node: '>=16'} - '@sd-jwt/present@0.7.2': resolution: {integrity: sha512-mQV85u2+mLLy2VZ9Wx2zpaB6yTDnbhCfWkP7eeCrzJQHBKAAHko8GrylEFmLKewFIcajS/r4lT/zHOsCkp5pZw==} engines: {node: '>=18'} @@ -2044,18 +2041,10 @@ packages: resolution: {integrity: sha512-rryYmnoJHRSNqHcrs0Atta+bfJzU2yT7mYumR2D4lTfxJKWZd0OHHFq57uZSEm/wXPI6uytUJXYbEboCqLUAtw==} engines: {node: '>=18'} - '@sd-jwt/types@0.6.1': - resolution: {integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg==} - engines: {node: '>=16'} - '@sd-jwt/types@0.7.2': resolution: {integrity: sha512-1NRKowiW0ZiB9SGLApLPBH4Xk8gDQJ+nA9NdZ+uy6MmJKLEwjuJxO7yTvRIv/jX/0/Ebh339S7Kq4RD2AiFuRg==} engines: {node: '>=18'} - '@sd-jwt/utils@0.6.1': - resolution: {integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ==} - engines: {node: '>=16'} - '@sd-jwt/utils@0.7.2': resolution: {integrity: sha512-aMPY7uHRMgyI5PlDvEiIc+eBFGC1EM8OCQRiEjJ8HGN0pajWMYj0qwSw7pS90A49/DsYU1a5Zpvb7nyjgGH0Yg==} engines: {node: '>=18'} @@ -2081,9 +2070,6 @@ packages: version: 0.16.0 engines: {node: '>=18'} - '@sphereon/did-uni-client@0.6.3': - resolution: {integrity: sha512-g7LD7ofbE36slHN7Bhr5dwUrj6t0BuZeXBYJMaVY/pOeL1vJxW1cZHbZqu0NSfOmzyBg4nsYVlgTjyi/Aua2ew==} - '@sphereon/jarm@https://gitpkg.vercel.app/animo/OID4VC/packages/jarm?funke': resolution: {tarball: https://gitpkg.vercel.app/animo/OID4VC/packages/jarm?funke} version: 0.16.0 @@ -2091,7 +2077,6 @@ packages: '@sphereon/kmp-mdl-mdoc@0.2.0-SNAPSHOT.22': resolution: {integrity: sha512-uAZZExVy+ug9JLircejWa5eLtAZ7bnBP6xb7DO2+86LRsHNLh2k2jMWJYxp+iWtGHTsh6RYsZl14ScQLvjiQ/A==} - bundledDependencies: [] '@sphereon/oid4vc-common@https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke': resolution: {tarball: https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke} @@ -2121,19 +2106,12 @@ packages: '@sphereon/pex-models@2.3.1': resolution: {integrity: sha512-SByU4cJ0XYA6VZQ/L6lsSiRcFtBPHbFioCeQ4GP7/W/jQ+PSBD7uK2oTnKQ9/0iEiMK/6JYqhKgLs4a9UX3UTQ==} - '@sphereon/pex@5.0.0-unstable.18': - resolution: {integrity: sha512-DOKfmfa549RbX8Bqe4yOE2rjZbCQgoRcHO+i01k+gxubgulPPQvY8k0pmFkMFMgVI5fXCjkI3b3PgQ5u/vpGGw==} + '@sphereon/pex@5.0.0-unstable.25': + resolution: {integrity: sha512-EUWfGa6t20PPkYf+zbfWXhc1sSWiFNywbRah8R6grJPU738pfwWpZPunSEY3x0CoxAVaSVXn91wZ/sxmgPCFkA==} engines: {node: '>=18'} - '@sphereon/pex@5.0.0-unstable.2': - resolution: {integrity: sha512-mA6lY/OBKKzsh4Jf4btm9Tj4ymVsX6xuVATn85LurD4bt3fhZwNJMkxhFy4tT/QyAtp05E4aaEq0wTVvOjVa7w==} - engines: {node: '>=18'} - - '@sphereon/ssi-types@0.29.1-unstable.208': - resolution: {integrity: sha512-3YAFzy//BojsYN+RYoEjndWP3w5a8a3qRZi5dS0Gh6s4yMCiykqTJM1agJVeoaLce8JxFFaCWSpkzwbmJYGTaQ==} - - '@sphereon/wellknown-dids-client@0.1.3': - resolution: {integrity: sha512-TAT24L3RoXD8ocrkTcsz7HuJmgjNjdoV6IXP1p3DdaI/GqkynytXE3J1+F7vUFMRYwY5nW2RaXSgDQhrFJemaA==} + '@sphereon/ssi-types@0.30.2-next.135': + resolution: {integrity: sha512-YLQfFMPUlOJUxHbOS9v01nG3cgLwTk3d95/rTnOmEQx9kXgXjoXdvt7D0uGcMRL3RHeQ9biT/jWY//mDvCirVQ==} '@stablelib/binary@1.0.1': resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} @@ -7325,16 +7303,16 @@ snapshots: '@peculiar/asn1-schema': 2.3.13 '@peculiar/asn1-x509': 2.3.13 '@peculiar/x509': 1.12.3 - '@protokoll/mdoc-client': 0.2.35(typescript@5.3.3) + '@protokoll/mdoc-client': 0.2.36(typescript@5.3.3) '@sd-jwt/core': 0.7.2 '@sd-jwt/decode': 0.7.2 '@sd-jwt/jwt-status-list': 0.7.2 '@sd-jwt/sd-jwt-vc': 0.7.2 '@sd-jwt/types': 0.7.2 '@sd-jwt/utils': 0.7.2 - '@sphereon/pex': 5.0.0-unstable.2 + '@sphereon/pex': 5.0.0-unstable.25 '@sphereon/pex-models': 2.3.1 - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 '@stablelib/ed25519': 1.0.3 '@types/ws': 8.5.12 abort-controller: 3.0.0 @@ -7394,7 +7372,7 @@ snapshots: '@sphereon/oid4vci-client': https://gitpkg.vercel.app/animo/OID4VC/packages/client?funke '@sphereon/oid4vci-common': https://gitpkg.vercel.app/animo/OID4VC/packages/oid4vci-common?funke '@sphereon/oid4vci-issuer': https://gitpkg.vercel.app/animo/OID4VC/packages/issuer?funke - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 class-transformer: 0.5.1 rxjs: 7.8.1 transitivePeerDependencies: @@ -8317,6 +8295,12 @@ snapshots: transitivePeerDependencies: - typescript + '@protokoll/core@0.2.36(typescript@5.3.3)': + dependencies: + valibot: 0.37.0(typescript@5.3.3) + transitivePeerDependencies: + - typescript + '@protokoll/mdoc-client@0.2.35(typescript@5.3.3)': dependencies: '@protokoll/core': 0.2.35(typescript@5.3.3) @@ -8324,6 +8308,13 @@ snapshots: transitivePeerDependencies: - typescript + '@protokoll/mdoc-client@0.2.36(typescript@5.3.3)': + dependencies: + '@protokoll/core': 0.2.36(typescript@5.3.3) + compare-versions: 6.1.1 + transitivePeerDependencies: + - typescript + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} @@ -8890,11 +8881,6 @@ snapshots: '@sd-jwt/types': 0.7.2 '@sd-jwt/utils': 0.7.2 - '@sd-jwt/decode@0.6.1': - dependencies: - '@sd-jwt/types': 0.6.1 - '@sd-jwt/utils': 0.6.1 - '@sd-jwt/decode@0.7.2': dependencies: '@sd-jwt/types': 0.7.2 @@ -8906,12 +8892,6 @@ snapshots: base64url: 3.0.1 pako: 2.1.0 - '@sd-jwt/present@0.6.1': - dependencies: - '@sd-jwt/decode': 0.6.1 - '@sd-jwt/types': 0.6.1 - '@sd-jwt/utils': 0.6.1 - '@sd-jwt/present@0.7.2': dependencies: '@sd-jwt/decode': 0.7.2 @@ -8924,15 +8904,8 @@ snapshots: '@sd-jwt/jwt-status-list': 0.7.2 '@sd-jwt/utils': 0.7.2 - '@sd-jwt/types@0.6.1': {} - '@sd-jwt/types@0.7.2': {} - '@sd-jwt/utils@0.6.1': - dependencies: - '@sd-jwt/types': 0.6.1 - js-base64: 3.7.7 - '@sd-jwt/utils@0.7.2': dependencies: '@sd-jwt/types': 0.7.2 @@ -8962,14 +8935,11 @@ snapshots: '@sphereon/did-auth-siop@https://gitpkg.vercel.app/animo/OID4VC/packages/siop-oid4vp?funke(typescript@5.3.3)': dependencies: '@astronautlabs/jsonpath': 1.1.2 - '@sphereon/did-uni-client': 0.6.3 '@sphereon/jarm': https://gitpkg.vercel.app/animo/OID4VC/packages/jarm?funke(typescript@5.3.3) - '@sphereon/kmp-mdl-mdoc': 0.2.0-SNAPSHOT.22 '@sphereon/oid4vc-common': https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke - '@sphereon/pex': 5.0.0-unstable.18 + '@sphereon/pex': 5.0.0-unstable.25 '@sphereon/pex-models': 2.3.1 - '@sphereon/ssi-types': 0.29.1-unstable.208 - '@sphereon/wellknown-dids-client': 0.1.3 + '@sphereon/ssi-types': 0.30.2-next.135 cross-fetch: 4.0.0 debug: 4.3.7 events: 3.3.0 @@ -8983,13 +8953,6 @@ snapshots: - supports-color - typescript - '@sphereon/did-uni-client@0.6.3': - dependencies: - cross-fetch: 3.1.8 - did-resolver: 4.1.0 - transitivePeerDependencies: - - encoding - '@sphereon/jarm@https://gitpkg.vercel.app/animo/OID4VC/packages/jarm?funke(typescript@5.3.3)': dependencies: '@sphereon/oid4vc-common': https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke @@ -9006,7 +8969,7 @@ snapshots: '@sphereon/oid4vc-common@https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke': dependencies: - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 jwt-decode: 4.0.0 sha.js: 2.4.11 uint8arrays: 3.1.1 @@ -9018,7 +8981,7 @@ snapshots: dependencies: '@sphereon/oid4vc-common': https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke '@sphereon/oid4vci-common': https://gitpkg.vercel.app/animo/OID4VC/packages/oid4vci-common?funke - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 cross-fetch: 3.1.8 debug: 4.3.7 transitivePeerDependencies: @@ -9028,7 +8991,7 @@ snapshots: '@sphereon/oid4vci-common@https://gitpkg.vercel.app/animo/OID4VC/packages/oid4vci-common?funke': dependencies: '@sphereon/oid4vc-common': https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 cross-fetch: 3.1.8 debug: 4.3.7 jwt-decode: 4.0.0 @@ -9042,7 +9005,7 @@ snapshots: dependencies: '@sphereon/oid4vc-common': https://gitpkg.vercel.app/animo/OID4VC/packages/common?funke '@sphereon/oid4vci-common': https://gitpkg.vercel.app/animo/OID4VC/packages/oid4vci-common?funke - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 uuid: 9.0.1 transitivePeerDependencies: - encoding @@ -9050,14 +9013,14 @@ snapshots: '@sphereon/pex-models@2.3.1': {} - '@sphereon/pex@5.0.0-unstable.18': + '@sphereon/pex@5.0.0-unstable.25': dependencies: '@astronautlabs/jsonpath': 1.1.2 '@sd-jwt/decode': 0.7.2 '@sd-jwt/present': 0.7.2 '@sd-jwt/types': 0.7.2 '@sphereon/pex-models': 2.3.1 - '@sphereon/ssi-types': 0.29.1-unstable.208 + '@sphereon/ssi-types': 0.30.2-next.135 ajv: 8.17.1 ajv-formats: 2.1.1(ajv@8.17.1) jwt-decode: 3.1.2 @@ -9066,26 +9029,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@sphereon/pex@5.0.0-unstable.2': + '@sphereon/ssi-types@0.30.2-next.135': dependencies: - '@astronautlabs/jsonpath': 1.1.2 - '@sd-jwt/decode': 0.6.1 - '@sd-jwt/present': 0.6.1 - '@sd-jwt/types': 0.6.1 - '@sphereon/pex-models': 2.3.1 - '@sphereon/ssi-types': 0.29.1-unstable.208 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - jwt-decode: 3.1.2 - nanoid: 3.3.7 - string.prototype.matchall: 4.0.11 - uint8arrays: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@sphereon/ssi-types@0.29.1-unstable.208': - dependencies: - '@sd-jwt/decode': 0.6.1 + '@sd-jwt/decode': 0.7.2 '@sphereon/kmp-mdl-mdoc': 0.2.0-SNAPSHOT.22 debug: 4.3.7 events: 3.3.0 @@ -9093,15 +9039,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@sphereon/wellknown-dids-client@0.1.3': - dependencies: - '@sphereon/ssi-types': 0.29.1-unstable.208 - cross-fetch: 3.1.8 - jwt-decode: 3.1.2 - transitivePeerDependencies: - - encoding - - supports-color - '@stablelib/binary@1.0.1': dependencies: '@stablelib/int': 1.0.1