import { jest } from '@jest/globals'; import { checkRevocationStatus, validateDcqlVp, validateJsonVC, validateJwtVC, } from '../../src/index.js'; import { Issuer, JsonCredential, } from '../../src/shared/dto/jsonCredential.dto.js'; import { DidPublicKeyResolver } from '../../src/resolvers/didPublicKeyResolver.js'; import { StatusListCredentialFetcher } from '../../src/resolvers/statusListCredentialFetcher.js'; import { EbsiWrapper } from '../../src/shared/middleware/ebsiWrapper.js'; import { VerifiableCredentialsValidator } from '../../src/validators/credential/verifiableCredentialsValidator.js'; import { VerifiablePresentationValidator } from '../../src/validators/presentation/verifiablePresentationValidator.js'; import { decodeJwt } from 'jose'; import { EbsiVerifiableAttestation, ValidationError, } from '@cef-ebsi/verifiable-credential'; import { EbsiPresentationValidator } from '../../src/validators/presentation/ebsiPresentationValidator.js'; describe('vc-vp-validator should', () => { beforeEach(() => { jest.restoreAllMocks(); }); describe('validate credentials', () => { describe('in json format', () => { it('validate a valid json verifiable credential', async () => { const credential: JsonCredential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://api.vidchain.net/api/v1/contexts/v1', ], id: 'urn:uuid:ac6b728b-2241-490d-9b93-8d46c099b4c4', type: ['VerifiableCredential', 'TestType'], issuer: { id: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:2e93cab0-af24-4d72-9bc1-f3b8a5c1135e', name: 'Postman Entity', }, credentialStatus: { type: 'RevocationList2021', id: 'https://staging.vidchain.net/api/v1/revocation/credential-status/status-list/88/credential/50', statusListCredential: 'https://staging.vidchain.net/api/v1/revocation/status-list/88', statusListIndex: '50', }, issuanceDate: '2024-04-08T07:58:34.000Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbrm9DrgkBkYSUCCzbo4y1iQNrhkdDeARGNy8pux37YgL9MhuUiP5cnVhd1uDBXdNViJxwGbrdUPtJ6YYEnDQ8tPWAZUiTpGuQqLW8VAtCsxueo2YGZFVQeoiF8Tc4KGiCTv', name: 'Bianca', age: 30, }, proof: { type: 'JsonWebSignature2020', created: '2024-04-08T07:58:34.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:2e93cab0-af24-4d72-9bc1-f3b8a5c1135e#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MmU5M2NhYjAtYWYyNC00ZDcyLTliYzEtZjNiOGE1YzExMzVlI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvY29udGV4dHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlRlc3RUeXBlIl0sImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MmU5M2NhYjAtYWYyNC00ZDcyLTliYzEtZjNiOGE1YzExMzVlIiwibmFtZSI6IlBvc3RtYW4gRW50aXR5In0sImlkIjoidXJuOnV1aWQ6YWM2YjcyOGItMjI0MS00OTBkLTliOTMtOGQ0NmMwOTliNGM0IiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYnJtOURyZ2tCa1lTVUNDemJvNHkxaVFOcmhrZERlQVJHTnk4cHV4MzdZZ0w5TWh1VWlQNWNuVmhkMXVEQlhkTlZpSnh3R2JyZFVQdEo2WVlFbkRROHRQV0FaVWlUcEd1UXFMVzhWQXRDc3h1ZW8yWUdaRlZRZW9pRjhUYzRLR2lDVHYiLCJuYW1lIjoiQmlhbmNhIiwiYWdlIjozMH0sImNyZWRlbnRpYWxTdGF0dXMiOnsidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImlkIjoiaHR0cHM6Ly9zdGFnaW5nLnZpZGNoYWluLm5ldC9hcGkvdjEvcmV2b2NhdGlvbi9jcmVkZW50aWFsLXN0YXR1cy9zdGF0dXMtbGlzdC84OC9jcmVkZW50aWFsLzUwIiwic3RhdHVzTGlzdENyZWRlbnRpYWwiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0Lzg4Iiwic3RhdHVzTGlzdEluZGV4IjoiNTAifX0sImlhdCI6MTcxMjU2MzExNCwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyZTkzY2FiMC1hZjI0LTRkNzItOWJjMS1mM2I4YTVjMTEzNWUifQ.NUc00DPnPjBPsJyIfC0qAMU__6PmzqcMDLT0spoSyG2OvUmaoR1E9t_O8cHK9m9meA6-S5yD5AT4PwWi9ehuOw', }, }; let calledKid: string; jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .mockImplementation((kid) => { calledKid = kid; return Promise.resolve({ kty: 'EC', x: 'hr2-KYV5akBbCkh0NwcUwFGguXUKJIAPwg4vFhIzvT4', y: '507DwGNcPMm2aSf5edivXyt94BBNHoR9NJQOe9M0Wyk', crv: 'P-256', }); }); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: true, }); expect(calledKid).toContain((credential.issuer as Issuer).id); }); it('not validate a json verifiable credential with invalid signature', async () => { const credential: JsonCredential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://api.vidchain.net/api/v1/contexts/v1', ], id: 'urn:uuid:ac6b728b-2241-490d-9b93-8d46c099b4c4', type: ['VerifiableCredential', 'TestType'], issuer: { id: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:2e93cab0-af24-4d72-9bc1-f3b8a5c1135e', name: 'Postman Entity', }, credentialStatus: { type: 'RevocationList2021', id: 'https://staging.vidchain.net/api/v1/revocation/credential-status/status-list/88/credential/50', statusListCredential: 'https://staging.vidchain.net/api/v1/revocation/status-list/88', statusListIndex: '50', }, issuanceDate: '2024-04-08T07:58:34.000Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbrm9DrgkBkYSUCCzbo4y1iQNrhkdDeARGNy8pux37YgL9MhuUiP5cnVhd1uDBXdNViJxwGbrdUPtJ6YYEnDQ8tPWAZUiTpGuQqLW8VAtCsxueo2YGZFVQeoiF8Tc4KGiCTv', name: 'Bianca', age: 30, }, proof: { type: 'JsonWebSignature2020', created: '2024-04-08T07:58:34.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:2e93cab0-af24-4d72-9bc1-f3b8a5c1135e#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MmU5M2NhYjAtYWYyNC00ZDcyLTliYzEtZjNiOGE1YzExMzVlI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvY29udGV4dHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlRlc3RUeXBlIl0sImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MmU5M2NhYjAtYWYyNC00ZDcyLTliYzEtZjNiOGE1YzExMzVlIiwibmFtZSI6IlBvc3RtYW4gRW50aXR5In0sImlkIjoidXJuOnV1aWQ6YWM2YjcyOGItMjI0MS00OTBkLTliOTMtOGQ0NmMwOTliNGM0IiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYnJtOURyZ2tCa1lTVUNDemJvNHkxaVFOcmhrZERlQVJHTnk4cHV4MzdZZ0w5TWh1VWlQNWNuVmhkMXVEQlhkTlZpSnh3R2JyZFVQdEo2WVlFbkRROHRQV0FaVWlUcEd1UXFMVzhWQXRDc3h1ZW8yWUdaRlZRZW9pRjhUYzRLR2lDVHYiLCJuYW1lIjoiQmlhbmNhIiwiYWdlIjozMH0sImNyZWRlbnRpYWxTdGF0dXMiOnsidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImlkIjoiaHR0cHM6Ly9zdGFnaW5nLnZpZGNoYWluLm5ldC9hcGkvdjEvcmV2b2NhdGlvbi9jcmVkZW50aWFsLXN0YXR1cy9zdGF0dXMtbGlzdC84OC9jcmVkZW50aWFsLzUwIiwic3RhdHVzTGlzdENyZWRlbnRpYWwiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0Lzg4Iiwic3RhdHVzTGlzdEluZGV4IjoiNTAifX0sImlhdCI6MTcxMjU2MzExNCwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyZTkzY2FiMC1hZjI0LTRkNzItOWJjMS1mM2I4YTVjMTEzNWUifQ.NUc00DPnPjBPsJyIfC0qAMU__6PmzqcMDLT0spoSyG2OvUmaoR1E9t_O8cHK9m9meA6-S5yD5AT4PwWi9ehuOw', }, }; let calledKid: string; jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .mockImplementation((kid) => { calledKid = kid; return Promise.resolve({ kty: 'EC', x: 'hr2-KYV5akBbCkh0NwcUwFGguXUKJIAPwg4vFhIzvT4', y: '507WwGNcPMm2aSf5edivXyt94BBNHoR9NJQOe9M0Wyk', crv: 'P-256', }); }); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: [ 'urn:uuid:ac6b728b-2241-490d-9b93-8d46c099b4c4 signature is not correct', ], }); expect(calledKid).toContain((credential.issuer as Issuer).id); }); it('not validate an expired json verifiable credential', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'https://example.com/credential/2390', type: ['VerifiableCredential'], issuer: { id: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb', name: 'Validated ID', }, issuanceDate: '2024-03-22T09:12:29.000Z', validUntil: '2023-12-20T13:07:10Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbt1uLa1XKfUyYPDVcRGaGVzR2jjj8kotjQVSDBFRT8rQttKo5vzubXx5ys6MsroStd1Qzu7SXjKPyugaA6nQCMUirMdQPxK58uCk54ZVnsWW6asnSXpQEon9yHTxFmGaUAG', personIdentifier: 'AB/AB/02635542Y', currentFamilyName: 'Julia', currentGivenName: 'Roberts', birthName: 'Julia', dateOfBirth: '1998-02-14', placeOfBirth: 'Brussels', currentAddress: '44, rue de Fame', gender: 'Female', }, proof: { type: 'JsonWebSignature2020', created: '2024-03-22T09:12:29.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6ZGV2LnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyMTU4MWViYi0wYTBlLTQyNzAtYThhMy01Mzg4ZDFhNDUzZWIja2V5LTAifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vY3JlZGVudGlhbC8yMzkwIiwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtidDF1TGExWEtmVXlZUERWY1JHYUdWelIyampqOGtvdGpRVlNEQkZSVDhyUXR0S281dnp1Ylh4NXlzNk1zcm9TdGQxUXp1N1NYaktQeXVnYUE2blFDTVVpck1kUVB4SzU4dUNrNTRaVm5zV1c2YXNuU1hwUUVvbjl5SFR4Rm1HYVVBRyIsInBlcnNvbklkZW50aWZpZXIiOiJBQi9BQi8wMjYzNTU0MlkiLCJjdXJyZW50RmFtaWx5TmFtZSI6Ikp1bGlhIiwiY3VycmVudEdpdmVuTmFtZSI6IlJvYmVydHMiLCJiaXJ0aE5hbWUiOiJKdWxpYSIsImRhdGVPZkJpcnRoIjoiMTk5OC0wMi0xNCIsInBsYWNlT2ZCaXJ0aCI6IkJydXNzZWxzIiwiY3VycmVudEFkZHJlc3MiOiI0NCwgcnVlIGRlIEZhbWUiLCJnZW5kZXIiOiJGZW1hbGUifSwidmFsaWRVbnRpbCI6IjIwMjMtMTItMjBUMTM6MDc6MTBaIn0sImlhdCI6MTcxMTA5ODc0OSwiaXNzIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiJ9.cjYPY0pX2ZZE01F52GEgf1ZZz2UB22L0RFkehApQzm2FPfrFiNQjanohlQQiC9Irg5KE2CwZaL6dI6KURkwm1w', }, }; const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: ['https://example.com/credential/2390 is expired'], }); expect( jest.spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk').mock .calls.length, ).toStrictEqual(0); }); it('not validate a not valid yet json verifiable credential', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'https://example.com/credential/2390', issuer: { id: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb', name: 'Validated ID', }, type: ['VerifiableCredential'], validFrom: '2123-12-20T13:07:10Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbt1uLa1XKfUyYPDVcRGaGVzR2jjj8kotjQVSDBFRT8rQttKo5vzubXx5ys6MsroStd1Qzu7SXjKPyugaA6nQCMUirMdQPxK58uCk54ZVnsWW6asnSXpQEon9yHTxFmGaUAG', personIdentifier: 'AB/AB/02635542Y', currentFamilyName: 'Julia', currentGivenName: 'Roberts', birthName: 'Julia', dateOfBirth: '1998-02-14', placeOfBirth: 'Brussels', currentAddress: '44, rue de Fame', gender: 'Female', }, validUntil: '2123-12-20T13:07:10Z', proof: { type: 'JsonWebSignature2020', created: '2024-03-22T09:41:04.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6ZGV2LnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyMTU4MWViYi0wYTBlLTQyNzAtYThhMy01Mzg4ZDFhNDUzZWIja2V5LTAifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vY3JlZGVudGlhbC8yMzkwIiwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJ2YWxpZEZyb20iOiIyMTIzLTEyLTIwVDEzOjA3OjEwWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2J0MXVMYTFYS2ZVeVlQRFZjUkdhR1Z6UjJqamo4a290alFWU0RCRlJUOHJRdHRLbzV2enViWHg1eXM2TXNyb1N0ZDFRenU3U1hqS1B5dWdhQTZuUUNNVWlyTWRRUHhLNTh1Q2s1NFpWbnNXVzZhc25TWHBRRW9uOXlIVHhGbUdhVUFHIiwicGVyc29uSWRlbnRpZmllciI6IkFCL0FCLzAyNjM1NTQyWSIsImN1cnJlbnRGYW1pbHlOYW1lIjoiSnVsaWEiLCJjdXJyZW50R2l2ZW5OYW1lIjoiUm9iZXJ0cyIsImJpcnRoTmFtZSI6Ikp1bGlhIiwiZGF0ZU9mQmlydGgiOiIxOTk4LTAyLTE0IiwicGxhY2VPZkJpcnRoIjoiQnJ1c3NlbHMiLCJjdXJyZW50QWRkcmVzcyI6IjQ0LCBydWUgZGUgRmFtZSIsImdlbmRlciI6IkZlbWFsZSJ9LCJ2YWxpZFVudGlsIjoiMjEyMy0xMi0yMFQxMzowNzoxMFoifSwiaWF0IjoxNzExMTAwNDY0LCJpc3MiOiJkaWQ6d2ViOmRldi52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MjE1ODFlYmItMGEwZS00MjcwLWE4YTMtNTM4OGQxYTQ1M2ViIn0.Lm5P3OPm7FIlw1_sDgV4Rz_k2a7M0rP9quzgY2Jr-029OUOuLGI_HSz21F-aKNVsaDcxaVS9MKwF941q7qd7PA', }, }; const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: ['https://example.com/credential/2390 is not yet valid'], }); expect( jest.spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk').mock .calls.length, ).toStrictEqual(0); }); it('not validate a revoked json verifiable credential', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'https://example.com/credential/2390', issuer: { id: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb', name: 'Validated ID', }, type: ['VerifiableCredential'], credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbt1uLa1XKfUyYPDVcRGaGVzR2jjj8kotjQVSDBFRT8rQttKo5vzubXx5ys6MsroStd1Qzu7SXjKPyugaA6nQCMUirMdQPxK58uCk54ZVnsWW6asnSXpQEon9yHTxFmGaUAG', personIdentifier: 'AB/AB/02635542Y', currentFamilyName: 'Julia', currentGivenName: 'Roberts', birthName: 'Julia', dateOfBirth: '1998-02-14', placeOfBirth: 'Brussels', currentAddress: '44, rue de Fame', gender: 'Female', }, credentialStatus: { type: 'RevocationList2021', id: 'https://dev.vidchain.net/api/v1/revocation/credential-status/status-list/270/credential/2', statusListCredential: 'https://dev.vidchain.net/api/v1/revocation/status-list/270', statusListIndex: '2', }, validUntil: '2123-12-20T13:07:10Z', proof: { type: 'JsonWebSignature2020', created: '2024-03-22T09:23:19.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6ZGV2LnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyMTU4MWViYi0wYTBlLTQyNzAtYThhMy01Mzg4ZDFhNDUzZWIja2V5LTAifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vY3JlZGVudGlhbC8yMzkwIiwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtidDF1TGExWEtmVXlZUERWY1JHYUdWelIyampqOGtvdGpRVlNEQkZSVDhyUXR0S281dnp1Ylh4NXlzNk1zcm9TdGQxUXp1N1NYaktQeXVnYUE2blFDTVVpck1kUVB4SzU4dUNrNTRaVm5zV1c2YXNuU1hwUUVvbjl5SFR4Rm1HYVVBRyIsInBlcnNvbklkZW50aWZpZXIiOiJBQi9BQi8wMjYzNTU0MlkiLCJjdXJyZW50RmFtaWx5TmFtZSI6Ikp1bGlhIiwiY3VycmVudEdpdmVuTmFtZSI6IlJvYmVydHMiLCJiaXJ0aE5hbWUiOiJKdWxpYSIsImRhdGVPZkJpcnRoIjoiMTk5OC0wMi0xNCIsInBsYWNlT2ZCaXJ0aCI6IkJydXNzZWxzIiwiY3VycmVudEFkZHJlc3MiOiI0NCwgcnVlIGRlIEZhbWUiLCJnZW5kZXIiOiJGZW1hbGUifSwiY3JlZGVudGlhbFN0YXR1cyI6eyJ0eXBlIjoiUmV2b2NhdGlvbkxpc3QyMDIxIiwiaWQiOiJodHRwczovL2Rldi52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vY3JlZGVudGlhbC1zdGF0dXMvc3RhdHVzLWxpc3QvMjcwL2NyZWRlbnRpYWwvMiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9kZXYudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzI3MCIsInN0YXR1c0xpc3RJbmRleCI6IjIifSwidmFsaWRVbnRpbCI6IjIxMjMtMTItMjBUMTM6MDc6MTBaIn0sImlhdCI6MTcxMTA5OTM5OSwiaXNzIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiJ9.UWMK4q4FpqZ8EIh7zns0LTFEWuet-eY5WF0dQUmI-cRv9sA9CPzLVv63XCpnVBJZMoQuLsy97NLrtTEb-uHpng', }, }; jest .spyOn( StatusListCredentialFetcher.prototype, 'getStatusListCredential', ) .mockImplementation(() => { return Promise.resolve({ '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-status-list-2021/v1', ], id: 'https://api.vidchain.net/api/v1/revocation/status-list/100', type: ['VerifiableCredential', 'StatusList2021Credential'], issuer: 'did:ethr:0x078D7c2922E3f95A35A22C54696D8870b857C3f9', issuanceDate: '2024-02-08T08:42:37.000Z', credentialSubject: { encodedList: 'eJzt1EEOhCAMAMAv0f9/zgSIusVVdD3sYeZC0LZUDJQCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8JsYn0YemzSMFxpiXq9TUY1v1GlM+I1vu2kJdeZe367w2d9XJfZHG4+nZy2G7LuLve/+r+eKtrZ6tE//xd/u5LxOH/Vn9PJ08JPkiivXG6kUWJyYGTw==', id: 'https://api.vidchain.net/api/v1/revocation/status-list/100', type: 'RevocationList2021', }, proof: { type: 'EcdsaSecp256k1Signature2019', created: '2024-02-08T08:42:37.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:ethr:0x078D7c2922E3f95A35A22C54696D8870b857C3f9#P8hKD1/ohhZVzrPQRrb7tMXTC7NoRBWJ/nCJ8flMVPU=', jws: 'eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjoweDA3OEQ3YzI5MjJFM2Y5NUEzNUEyMkM1NDY5NkQ4ODcwYjg1N0MzZjkjUDhoS0QxL29oaFpWenJQUVJyYjd0TVhUQzdOb1JCV0ovbkNKOGZsTVZQVT0iLCJ0eXAiOiJKV1QifQ.eyJpYXQiOjE3MDczODE3NTcsImlzcyI6ImRpZDpldGhyOjB4MDc4RDdjMjkyMkUzZjk1QTM1QTIyQzU0Njk2RDg4NzBiODU3QzNmOSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly93M2lkLm9yZy92Yy1zdGF0dXMtbGlzdC0yMDIxL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImVuY29kZWRMaXN0IjoiZUp6dDFFRU9oQ0FNQU1BdjBmOS96Z1NJdXNWVmREM3NZZVpDa0xaV0RKUUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRDhKc1luMFllbXpTTUZ4cGlYcTlUVVkxdjFHbE0rSTF2dTJrSjk4eTV2MTNsdDdxcVQreUtOeDlPenhXRzdMdUx2ZS8rcitlS3RyWjZ0RS8veGQvdTVMeE9IL1ZuOVBKMDhKUGtpaXZYRzZtc0xKeU1HVGc9PSIsImlkIjoiaHR0cHM6Ly9kZXYudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzEwMCIsInR5cGUiOiJSZXZvY2F0aW9uTGlzdDIwMjEifSwiaWQiOiJodHRwczovL2Rldi52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvMTAwIiwiaXNzdWVkIjoiMjAyNC0wMi0wOFQwODo0MjozNy41MzRaIiwiaXNzdWVyIjoiZGlkOmV0aHI6MHgwNzhEN2MyOTIyRTNmOTVBMzVBMjJDNTQ2OTZEODg3MGI4NTdDM2Y5IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN0YXR1c0xpc3QyMDIxQ3JlZGVudGlhbCJdfX0.qrRScZNnnQ3g0JB04__LOYT5QuvGtEnse7PcmLAtxUcgcZhDI61F_jIoqzZNoSIVnFAXm6HduIMdGBn_VN2zPg', }, }); }); jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .getMockImplementation(); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: ['https://example.com/credential/2390 is revoked'], }); expect( jest.spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk').mock .calls.length, ).toStrictEqual(0); }); it('not validate a revoked json verifiable credential, with a StatusList2021Credential type credential', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'https://example.com/credential/2390', issuer: { id: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb', name: 'Validated ID', }, type: ['VerifiableCredential'], credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbt1uLa1XKfUyYPDVcRGaGVzR2jjj8kotjQVSDBFRT8rQttKo5vzubXx5ys6MsroStd1Qzu7SXjKPyugaA6nQCMUirMdQPxK58uCk54ZVnsWW6asnSXpQEon9yHTxFmGaUAG', personIdentifier: 'AB/AB/02635542Y', currentFamilyName: 'Julia', currentGivenName: 'Roberts', birthName: 'Julia', dateOfBirth: '1998-02-14', placeOfBirth: 'Brussels', currentAddress: '44, rue de Fame', gender: 'Female', }, credentialStatus: { type: 'RevocationList2021', id: 'https://dev.vidchain.net/api/v1/revocation/credential-status/status-list/270/credential/2', statusListCredential: 'https://dev.vidchain.net/api/v1/revocation/status-list/270', statusListIndex: '2', }, validUntil: '2123-12-20T13:07:10Z', proof: { type: 'JsonWebSignature2020', created: '2024-03-22T09:23:19.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6ZGV2LnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyMTU4MWViYi0wYTBlLTQyNzAtYThhMy01Mzg4ZDFhNDUzZWIja2V5LTAifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vY3JlZGVudGlhbC8yMzkwIiwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtidDF1TGExWEtmVXlZUERWY1JHYUdWelIyampqOGtvdGpRVlNEQkZSVDhyUXR0S281dnp1Ylh4NXlzNk1zcm9TdGQxUXp1N1NYaktQeXVnYUE2blFDTVVpck1kUVB4SzU4dUNrNTRaVm5zV1c2YXNuU1hwUUVvbjl5SFR4Rm1HYVVBRyIsInBlcnNvbklkZW50aWZpZXIiOiJBQi9BQi8wMjYzNTU0MlkiLCJjdXJyZW50RmFtaWx5TmFtZSI6Ikp1bGlhIiwiY3VycmVudEdpdmVuTmFtZSI6IlJvYmVydHMiLCJiaXJ0aE5hbWUiOiJKdWxpYSIsImRhdGVPZkJpcnRoIjoiMTk5OC0wMi0xNCIsInBsYWNlT2ZCaXJ0aCI6IkJydXNzZWxzIiwiY3VycmVudEFkZHJlc3MiOiI0NCwgcnVlIGRlIEZhbWUiLCJnZW5kZXIiOiJGZW1hbGUifSwiY3JlZGVudGlhbFN0YXR1cyI6eyJ0eXBlIjoiUmV2b2NhdGlvbkxpc3QyMDIxIiwiaWQiOiJodHRwczovL2Rldi52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vY3JlZGVudGlhbC1zdGF0dXMvc3RhdHVzLWxpc3QvMjcwL2NyZWRlbnRpYWwvMiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9kZXYudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzI3MCIsInN0YXR1c0xpc3RJbmRleCI6IjIifSwidmFsaWRVbnRpbCI6IjIxMjMtMTItMjBUMTM6MDc6MTBaIn0sImlhdCI6MTcxMTA5OTM5OSwiaXNzIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiJ9.UWMK4q4FpqZ8EIh7zns0LTFEWuet-eY5WF0dQUmI-cRv9sA9CPzLVv63XCpnVBJZMoQuLsy97NLrtTEb-uHpng', }, }; jest .spyOn( StatusListCredentialFetcher.prototype, 'getStatusListCredential', ) .mockImplementation(() => { return Promise.resolve({ '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc/status-list/2021/v1', ], id: 'https://staging.vidchain.net/api/v1/revocation/status-list/106', type: ['VerifiableCredential', 'StatusList2021Credential'], issuer: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbo1dbqzwEVdc5TJYJxtxEhzxvogzb8dgjQaRDL9ZaCex3brNBkCoVQpyAEirb1jP5joz47sZgj3xghBNUvPaM8UgEtbBpt96g2UAgcX4caBoP8GiEpczdEr8bKZe4F1ChrC', credentialSubject: { id: 'https://staging.vidchain.net/api/v1/revocation/status-list/106', type: 'StatusList2021Credential', encodedList: 'H4sIAAAAAAAAA+3BIQEAAAACIKf6f4UzLEADAAAAAAAAAAAAAAAAAAAAvA3PduITAEAAAA==', }, proof: { type: 'JsonWebSignature2020', created: '2024-04-10T15:45:41.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbo1dbqzwEVdc5TJYJxtxEhzxvogzb8dgjQaRDL9ZaCex3brNBkCoVQpyAEirb1jP5joz47sZgj3xghBNUvPaM8UgEtbBpt96g2UAgcX4caBoP8GiEpczdEr8bKZe4F1ChrC#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbo1dbqzwEVdc5TJYJxtxEhzxvogzb8dgjQaRDL9ZaCex3brNBkCoVQpyAEirb1jP5joz47sZgj3xghBNUvPaM8UgEtbBpt96g2UAgcX4caBoP8GiEpczdEr8bKZe4F1ChrC', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtibzFkYnF6d0VWZGM1VEpZSnh0eEVoenh2b2d6YjhkZ2pRYVJETDlaYUNleDNick5Ca0NvVlFweUFFaXJiMWpQNWpvejQ3c1pnajN4Z2hCTlV2UGFNOFVnRXRiQnB0OTZnMlVBZ2NYNGNhQm9QOEdpRXBjemRFcjhiS1plNEYxQ2hyQyN6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JvMWRicXp3RVZkYzVUSllKeHR4RWh6eHZvZ3piOGRnalFhUkRMOVphQ2V4M2JyTkJrQ29WUXB5QUVpcmIxalA1am96NDdzWmdqM3hnaEJOVXZQYU04VWdFdGJCcHQ5NmcyVUFnY1g0Y2FCb1A4R2lFcGN6ZEVyOGJLWmU0RjFDaHJDIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNpZC5vcmcvdmMvc3RhdHVzLWxpc3QvMjAyMS92MSJdLCJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvMTA2IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN0YXR1c0xpc3QyMDIxQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYm8xZGJxendFVmRjNVRKWUp4dHhFaHp4dm9nemI4ZGdqUWFSREw5WmFDZXgzYnJOQmtDb1ZRcHlBRWlyYjFqUDVqb3o0N3NaZ2ozeGdoQk5VdlBhTThVZ0V0YkJwdDk2ZzJVQWdjWDRjYUJvUDhHaUVwY3pkRXI4YktaZTRGMUNockMiLCJpc3N1ZWQiOiIyMDI0LTA0LTEwVDE1OjQ1OjM5LjkwMFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvMTA2IiwidHlwZSI6IlN0YXR1c0xpc3QyMDIxQ3JlZGVudGlhbCIsImVuY29kZWRMaXN0IjoiSDRzSUFBQUFBQUFBQSszQklRRUFBQUFDSUtmNmY0VXpMRUFEQUFBQUFBQUFBQUFBQUFBQUFBQUF2QTNQZHVJVEFFQUFBQT09In19LCJpc3MiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYm8xZGJxendFVmRjNVRKWUp4dHhFaHp4dm9nemI4ZGdqUWFSREw5WmFDZXgzYnJOQmtDb1ZRcHlBRWlyYjFqUDVqb3o0N3NaZ2ozeGdoQk5VdlBhTThVZ0V0YkJwdDk2ZzJVQWdjWDRjYUJvUDhHaUVwY3pkRXI4YktaZTRGMUNockMiLCJpYXQiOjE3MTI3NjM5NDF9.-Lw-v-mEwW18ob35h50-ARhdCfgTV16pyVcZzxlbUF2rgpFHpLAXkJSES152M6brRt1hiz84F7_kWeuCW_4UHA', }, }); }); jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .getMockImplementation(); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: ['https://example.com/credential/2390 is revoked'], }); expect( jest.spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk').mock .calls.length, ).toStrictEqual(0); }); it('not validate an expired and not yet valid json verifiable credential', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'https://example.com/credential/2390', issuer: { id: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb', name: 'Validated ID', }, type: ['VerifiableCredential'], validFrom: '2123-12-20T13:07:10Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9Kbt1uLa1XKfUyYPDVcRGaGVzR2jjj8kotjQVSDBFRT8rQttKo5vzubXx5ys6MsroStd1Qzu7SXjKPyugaA6nQCMUirMdQPxK58uCk54ZVnsWW6asnSXpQEon9yHTxFmGaUAG', personIdentifier: 'AB/AB/02635542Y', currentFamilyName: 'Julia', currentGivenName: 'Roberts', birthName: 'Julia', dateOfBirth: '1998-02-14', placeOfBirth: 'Brussels', currentAddress: '44, rue de Fame', gender: 'Female', }, validUntil: '2023-12-20T13:07:10Z', proof: { type: 'JsonWebSignature2020', created: '2024-03-22T09:41:34.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:dev.vidchain.net:api:v1:did-web-resolver:21581ebb-0a0e-4270-a8a3-5388d1a453eb#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6ZGV2LnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjoyMTU4MWViYi0wYTBlLTQyNzAtYThhMy01Mzg4ZDFhNDUzZWIja2V5LTAifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vY3JlZGVudGlhbC8yMzkwIiwiaXNzdWVyIjp7ImlkIjoiZGlkOndlYjpkZXYudmlkY2hhaW4ubmV0OmFwaTp2MTpkaWQtd2ViLXJlc29sdmVyOjIxNTgxZWJiLTBhMGUtNDI3MC1hOGEzLTUzODhkMWE0NTNlYiIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQifSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJ2YWxpZEZyb20iOiIyMTIzLTEyLTIwVDEzOjA3OjEwWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2J0MXVMYTFYS2ZVeVlQRFZjUkdhR1Z6UjJqamo4a290alFWU0RCRlJUOHJRdHRLbzV2enViWHg1eXM2TXNyb1N0ZDFRenU3U1hqS1B5dWdhQTZuUUNNVWlyTWRRUHhLNTh1Q2s1NFpWbnNXVzZhc25TWHBRRW9uOXlIVHhGbUdhVUFHIiwicGVyc29uSWRlbnRpZmllciI6IkFCL0FCLzAyNjM1NTQyWSIsImN1cnJlbnRGYW1pbHlOYW1lIjoiSnVsaWEiLCJjdXJyZW50R2l2ZW5OYW1lIjoiUm9iZXJ0cyIsImJpcnRoTmFtZSI6Ikp1bGlhIiwiZGF0ZU9mQmlydGgiOiIxOTk4LTAyLTE0IiwicGxhY2VPZkJpcnRoIjoiQnJ1c3NlbHMiLCJjdXJyZW50QWRkcmVzcyI6IjQ0LCBydWUgZGUgRmFtZSIsImdlbmRlciI6IkZlbWFsZSJ9LCJ2YWxpZFVudGlsIjoiMjAyMy0xMi0yMFQxMzowNzoxMFoifSwiaWF0IjoxNzExMTAwNDk0LCJpc3MiOiJkaWQ6d2ViOmRldi52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6MjE1ODFlYmItMGEwZS00MjcwLWE4YTMtNTM4OGQxYTQ1M2ViIn0.EFXyhN-a28KEleCaj8jkLu8fYINWHO8wDpCwYZtZZ6NSV8AtXDb8s6VhPYc1cqqVe2lVugvFvojTzbu7Snc5Mg', }, }; const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: false, messages: [ 'https://example.com/credential/2390 is expired', 'https://example.com/credential/2390 is not yet valid', ], }); expect( jest.spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk').mock .calls.length, ).toStrictEqual(0); }); it('not validate a credential with different payload as in the jws', async () => { const credential: JsonCredential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://api.vidchain.net/api/v1/contexts/v1', ], id: 'urn:uuid:2e9319d6-c44e-4d29-b41c-94bbddda7c29', type: ['VerifiableCredential', 'EmailCredential'], issuer: { id: 'did:web:trust.validatedid.com', name: 'Validated ID SL', }, credentialStatus: { type: 'RevocationList2021', id: 'https://api.vidchain.net/api/v1/revocation/credential-status/status-list/36/credential/142', statusListCredential: 'https://api.vidchain.net/api/v1/revocation/status-list/36', statusListIndex: '142', }, issuanceDate: '2024-01-31T18:02:30.000Z', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbsrfrzgYrM2gtte41XCEcyuB7mQvwEAcMpRvT3BR12rQc1AdBpRH7PgDsVbc5vdSFb7GSLN9woDp7MRBfRwt7JZX4JLFQ1ovxqpJn9exdP9Sez9DrMzavBD2MVqfPR85t4L', email: 'example@validatedid.com', }, proof: { type: 'JsonWebSignature2020', created: '2024-01-31T18:02:30.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:trust.validatedid.com#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6dHJ1c3QudmFsaWRhdGVkaWQuY29tI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvY29udGV4dHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkVtYWlsQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6d2ViOnRydXN0LnZhbGlkYXRlZGlkLmNvbSIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQgU0wifSwiaWQiOiJ1cm46dXVpZDoyZTkzMTlkNi1jNDRlLTRkMjktYjQxYy05NGJiZGRkYTdjMjkiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtic3JmcnpnWXJNMmd0dGU0MVhDRWN5dUI3bVF2d0VBY01wUnZUM0JSMTJyUWMxQWRCcFJIN1BnRHNWYmM1dmRTRmI3R1NMTjl3b0RwN01SQmZSd3Q3SlpYNEpMRlExb3Z4cXBKbjlleGRQOVNlejlEck16YXZCRDJNVnFmUFI4NXQ0TCIsImVtYWlsIjoiZGZvbGNoY0Bob3RtYWlsLmNvbSJ9LCJjcmVkZW50aWFsU3RhdHVzIjp7InR5cGUiOiJSZXZvY2F0aW9uTGlzdDIwMjEiLCJpZCI6Imh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvcmV2b2NhdGlvbi9jcmVkZW50aWFsLXN0YXR1cy9zdGF0dXMtbGlzdC8zNi9jcmVkZW50aWFsLzE0MiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9hcGkudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzM2Iiwic3RhdHVzTGlzdEluZGV4IjoiMTQyIn19LCJpYXQiOjE3MDY3MjQxNTAsImlzcyI6ImRpZDp3ZWI6dHJ1c3QudmFsaWRhdGVkaWQuY29tIn0.5g7HR4PbzRrwK_t-ty29UghPJCxufIrPg-t4k9bIscS2oaQi3cgrScUN6XOB6AqBPhT6AJz7sehS-rNxW0Gbdw', }, }; jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .mockImplementation(() => { return Promise.resolve({ kty: 'EC', x: 'gjuALBMqgSNT-Y0WotbN06wZ49DoSyLrzGMUmNL88ZU', y: 'aTV0B0dcuWQz-EBAH9mT-SP3LWvVvp2bk-s4DbuwlEw', crv: 'P-256', }); }); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toStrictEqual({ valid: false, messages: [ 'ValidationError: Mismatch between credential payload and jws. Credential: urn:uuid:2e9319d6-c44e-4d29-b41c-94bbddda7c29', ], }); }); it('validate a valid json verifiable credential with TokenStatusList', async () => { const credential: JsonCredential = { '@context': ['https://www.w3.org/2018/credentials/v1'], id: 'urn:pk:6139', type: ['VerifiableCredential', 'urn:eu.europa.ec.eudi:pid:1'], issuer: 'https://fundic-untautologically-dorethea.ngrok-free.dev/issuance/api/v1/111', credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KboioDj2smo6rsRmaaKShpGcwbagVXtNWRTwhistNNvAcropMobyvywRmXoGgTN6tAf6jfvcayzWjf7VQsf2SnGmNXQgBL7uqTjfUC78xatefHwSuiqDGfSQxeAGjsVqk6PN', }, issuanceDate: '2026-04-09T16:02:03.205Z', expirationDate: '2027-04-09T16:01:03.205Z', validFrom: '2026-04-09T16:01:03.205Z', validUntil: '2027-04-09T16:01:03.205Z', credentialStatus: { id: 'https://fundic-untautologically-dorethea.ngrok-free.dev/issuance/api/v2/111/status_list', type: 'TokenStatusList', statusPurpose: 'revocation', statusListIndex: '28', statusListCredential: 'https://fundic-untautologically-dorethea.ngrok-free.dev/issuance/api/v2/111/status_list', }, proof: { type: 'JsonWebSignature2020', created: '2026-04-09T16:02:03.205Z', verificationMethod: 'https://fundic-untautologically-dorethea.ngrok-free.dev/issuance/api/v1/111/jwks#$8d6674f1-cdfc-4e87-9212-4e124c908b9e', proofPurpose: 'assertionMethod', jws: 'eyJhbGciOiJFUzI1NiIsImtpZCI6IjhkNjY3NGYxLWNkZmMtNGU4Ny05MjEyLTRlMTI0YzkwOGI5ZSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92MS8xMTEiLCJzdWIiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYm9pb0RqMnNtbzZyc1JtYWFLU2hwR2N3YmFnVlh0TldSVHdoaXN0Tk52QWNyb3BNb2J5dnl3Um1Yb0dnVE42dEFmNmpmdmNheXpXamY3VlFzZjJTbkdtTlhRZ0JMN3VxVGpmVUM3OHhhdGVmSHdTdWlxREdmU1F4ZUFHanNWcWs2UE4iLCJleHAiOjE4MDcyODY0NjMsIm5iZiI6MTc3NTc1MDQ2MywiaWF0IjoxNzc1NzUwNTIzLCJqdGkiOiJ1cm46cGs6NjEzOSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sImlkIjoidXJuOnBrOjYxMzkiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwidXJuOmV1LmV1cm9wYS5lYy5ldWRpOnBpZDoxIl0sImlzc3VlciI6Imh0dHBzOi8vZnVuZGljLXVudGF1dG9sb2dpY2FsbHktZG9yZXRoZWEubmdyb2stZnJlZS5kZXYvaXNzdWFuY2UvYXBpL3YxLzExMSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JvaW9EajJzbW82cnNSbWFhS1NocEdjd2JhZ1ZYdE5XUlR3aGlzdE5OdkFjcm9wTW9ieXZ5d1JtWG9HZ1RONnRBZjZqZnZjYXl6V2pmN1ZRc2YyU25HbU5YUWdCTDd1cVRqZlVDNzh4YXRlZkh3U3VpcURHZlNReGVBR2pzVnFrNlBOIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDQtMDlUMTY6MDI6MDMuMjA1WiIsImV4cGlyYXRpb25EYXRlIjoiMjAyNy0wNC0wOVQxNjowMTowMy4yMDVaIiwidmFsaWRGcm9tIjoiMjAyNi0wNC0wOVQxNjowMTowMy4yMDVaIiwidmFsaWRVbnRpbCI6IjIwMjctMDQtMDlUMTY6MDE6MDMuMjA1WiIsImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92Mi8xMTEvc3RhdHVzX2xpc3QiLCJ0eXBlIjoiVG9rZW5TdGF0dXNMaXN0Iiwic3RhdHVzUHVycG9zZSI6InJldm9jYXRpb24iLCJzdGF0dXNMaXN0SW5kZXgiOiIyOCIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9mdW5kaWMtdW50YXV0b2xvZ2ljYWxseS1kb3JldGhlYS5uZ3Jvay1mcmVlLmRldi9pc3N1YW5jZS9hcGkvdjIvMTExL3N0YXR1c19saXN0In19fQ.Mlk8IuX3bDDnCpeoC-twIghWOgAAkqoU48YG5LyxkIU4i3jDhtGwWS_LTjvYoAver6PsHjtAz3YWOajyIqsMnQ', }, }; jest .spyOn( (await import('../../src/resolvers/httpPublicKeyResolver.js')) .HttpPublicKeyResolver.prototype, 'getPublicKeyJwk', ) .mockResolvedValue({ kty: 'EC', kid: '8d6674f1-cdfc-4e87-9212-4e124c908b9e', crv: 'P-256', x: '5cq40xqehES5ZstrBnAZGIDJHU_nozm8pm05J-wDbHc', y: 'XUyffNH71CFjW7ejvSGXDMfvLXEenDngxD_aFJC_ib0', }); jest .spyOn( StatusListCredentialFetcher.prototype, 'getStatusListCredential', ) .mockResolvedValue( 'eyJhbGciOiJub25lIiwidHlwIjoic3RhdHVzbGlzdCtqd3QifQ.eyJzdGF0dXNfbGlzdCI6eyJiaXRzIjoxLCJsc3QiOiJlSnhqWUJqWkFBQUJBQUFCIn19.', ); const validationResponse = await validateJsonVC(credential); expect(validationResponse).toEqual({ valid: true }); }); }); describe('in jwt format', () => { it('validate a valid jwt verifiable credential with did:ebsi', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViI3RCNi1Ub2kxWlJOS3VfREdiZGVrbUxDN2E3TzJ0akRDQ3ZjUFdycklLM2MifQ.eyJqdGkiOiJ1cm46ZGlkOjEyMzQ1NiIsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsImlzcyI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViIiwibmJmIjoxNjM1NzI0ODAwLCJleHAiOjUxMDk0MzY4MDAsImlhdCI6MTYzNTU1MjAwMCwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwiaWQiOiJ1cm46ZGlkOjEyMzQ1NiIsInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQXR0ZXN0YXRpb24iXSwiaXNzdWVyIjoiZGlkOmVic2k6enJybVB1dEpNNWNnZGpHUUY0Y0R5NWIiLCJpc3N1YW5jZURhdGUiOiIyMDIxLTExLTAxVDAwOjAwOjAwWiIsInZhbGlkRnJvbSI6IjIwMjEtMTEtMDFUMDA6MDA6MDBaIiwiaXNzdWVkIjoiMjAyMS0xMC0zMFQwMDowMDowMFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsInBlcnNvbmFsSWRlbnRpZmllciI6IklUL0RFLzEyMzQiLCJmYW1pbHlOYW1lIjoiQ2FzdGFmaW9yaSIsImZpcnN0TmFtZSI6IkJpYW5jYSIsImRhdGVPZkJpcnRoIjoiMTkzMC0xMC0wMSJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9hcGktcGlsb3QuZWJzaS5ldS90cnVzdGVkLXNjaGVtYXMtcmVnaXN0cnkvdjIvc2NoZW1hcy8weDBmNDFhMWY0OTM0ZTExZjhmOThlNDQ0ZWQzNGZiMDQwNjQ1ZGNjMDRjZWFkMmFlMjhmY2EwNjJlYWJmYWMxODEiLCJ0eXBlIjoiRnVsbEpzb25TY2hlbWFWYWxpZGF0b3IyMDIxIn0sImV4cGlyYXRpb25EYXRlIjoiMjEzMS0xMS0zMFQwMDowMDowMFoifX0.yAZ72yi1DC5eEqJ9_O1dQ3VgFB-iT85mUY3SNvEt-Vul_jPKcRsR8ceS1ce08lJUTaM8X3HRMpHPU7qmPkLRvQ'; const decodedCredential = decodeJwt(credential); let calledVc: string; jest .spyOn(EbsiWrapper.prototype, 'validate') .mockImplementation((vc, opts) => { calledVc = vc; return Promise.resolve( decodedCredential as EbsiVerifiableAttestation, ); }); const validationResponse = await validateJwtVC(credential, { ebsiAuthority: 'test', }); expect(calledVc).toEqual(credential); expect( jest.spyOn(VerifiableCredentialsValidator.prototype, 'validate').mock .calls.length, ).toEqual(0); expect(validationResponse).toEqual({ valid: true, }); }); it('validate a valid jwt verifiable credential with TokenStatusList', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsImtpZCI6IjhkNjY3NGYxLWNkZmMtNGU4Ny05MjEyLTRlMTI0YzkwOGI5ZSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92MS8xMTEiLCJzdWIiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYm9pb0RqMnNtbzZyc1JtYWFLU2hwR2N3YmFnVlh0TldSVHdoaXN0Tk52QWNyb3BNb2J5dnl3Um1Yb0dnVE42dEFmNmpmdmNheXpXamY3VlFzZjJTbkdtTlhRZ0JMN3VxVGpmVUM3OHhhdGVmSHdTdWlxREdmU1F4ZUFHanNWcWs2UE4iLCJleHAiOjE4MDczNTk1NjcsIm5iZiI6MTc3NTgyMzU2NywiaWF0IjoxNzc1ODIzNjI3LCJqdGkiOiJ1cm46cGs6NjE1MyIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sImlkIjoidXJuOnBrOjYxNTMiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwidXJuOmV1LmV1cm9wYS5lYy5ldWRpOnBpZDoxIl0sImlzc3VlciI6Imh0dHBzOi8vZnVuZGljLXVudGF1dG9sb2dpY2FsbHktZG9yZXRoZWEubmdyb2stZnJlZS5kZXYvaXNzdWFuY2UvYXBpL3YxLzExMSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JvaW9EajJzbW82cnNSbWFhS1NocEdjd2JhZ1ZYdE5XUlR3aGlzdE5OdkFjcm9wTW9ieXZ5d1JtWG9HZ1RONnRBZjZqZnZjYXl6V2pmN1ZRc2YyU25HbU5YUWdCTDd1cVRqZlVDNzh4YXRlZkh3U3VpcURHZlNReGVBR2pzVnFrNlBOIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDQtMTBUMTI6MjA6MjcuNTA1WiIsImV4cGlyYXRpb25EYXRlIjoiMjAyNy0wNC0xMFQxMjoxOToyNy41MDVaIiwidmFsaWRGcm9tIjoiMjAyNi0wNC0xMFQxMjoxOToyNy41MDVaIiwidmFsaWRVbnRpbCI6IjIwMjctMDQtMTBUMTI6MTk6MjcuNTA1WiIsImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92Mi8xMTEvc3RhdHVzX2xpc3QiLCJ0eXBlIjoiVG9rZW5TdGF0dXNMaXN0Iiwic3RhdHVzUHVycG9zZSI6InJldm9jYXRpb24iLCJzdGF0dXNMaXN0SW5kZXgiOiIzMiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9mdW5kaWMtdW50YXV0b2xvZ2ljYWxseS1kb3JldGhlYS5uZ3Jvay1mcmVlLmRldi9pc3N1YW5jZS9hcGkvdjIvMTExL3N0YXR1c19saXN0In19fQ.cByg_UjPAfcK7gy4jyeT5HwJRD75FHMaegf2pkdU8g9CwVJctljSTl4mkz_TiaVosd3Cx5SWQiFKxA-VjhTu-g'; jest .spyOn( (await import('../../src/resolvers/httpPublicKeyResolver.js')) .HttpPublicKeyResolver.prototype, 'getPublicKeyJwk', ) .mockResolvedValue({ kty: 'EC', kid: '8d6674f1-cdfc-4e87-9212-4e124c908b9e', crv: 'P-256', x: '5cq40xqehES5ZstrBnAZGIDJHU_nozm8pm05J-wDbHc', y: 'XUyffNH71CFjW7ejvSGXDMfvLXEenDngxD_aFJC_ib0', }); jest .spyOn( StatusListCredentialFetcher.prototype, 'getStatusListCredential', ) .mockResolvedValue( 'eyJhbGciOiJub25lIiwidHlwIjoic3RhdHVzbGlzdCtqd3QifQ.eyJzdGF0dXNfbGlzdCI6eyJiaXRzIjoxLCJsc3QiOiJlSnhqWUJqWkFBQUJBQUFCIn19.', ); const validationResponse = await validateJwtVC(credential); expect(validationResponse).toEqual({ valid: true }); }); it('not validate a revoked jwt verifiable credential with TokenStatusList', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsImtpZCI6IjhkNjY3NGYxLWNkZmMtNGU4Ny05MjEyLTRlMTI0YzkwOGI5ZSIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92MS8xMTEiLCJzdWIiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYm9pb0RqMnNtbzZyc1JtYWFLU2hwR2N3YmFnVlh0TldSVHdoaXN0Tk52QWNyb3BNb2J5dnl3Um1Yb0dnVE42dEFmNmpmdmNheXpXamY3VlFzZjJTbkdtTlhRZ0JMN3VxVGpmVUM3OHhhdGVmSHdTdWlxREdmU1F4ZUFHanNWcWs2UE4iLCJleHAiOjE4MDc2MjU0MjMsIm5iZiI6MTc3NjA4OTQyMywiaWF0IjoxNzc2MDg5NDgzLCJqdGkiOiJ1cm46cGs6NjE1NyIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sImlkIjoidXJuOnBrOjYxNTciLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwidXJuOmV1LmV1cm9wYS5lYy5ldWRpOnBpZDoxIl0sImlzc3VlciI6Imh0dHBzOi8vZnVuZGljLXVudGF1dG9sb2dpY2FsbHktZG9yZXRoZWEubmdyb2stZnJlZS5kZXYvaXNzdWFuY2UvYXBpL3YxLzExMSIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JvaW9EajJzbW82cnNSbWFhS1NocEdjd2JhZ1ZYdE5XUlR3aGlzdE5OdkFjcm9wTW9ieXZ5d1JtWG9HZ1RONnRBZjZqZnZjYXl6V2pmN1ZRc2YyU25HbU5YUWdCTDd1cVRqZlVDNzh4YXRlZkh3U3VpcURHZlNReGVBR2pzVnFrNlBOIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjYtMDQtMTNUMTQ6MTE6MjMuNzM3WiIsImV4cGlyYXRpb25EYXRlIjoiMjAyNy0wNC0xM1QxNDoxMDoyMy43MzdaIiwidmFsaWRGcm9tIjoiMjAyNi0wNC0xM1QxNDoxMDoyMy43MzdaIiwidmFsaWRVbnRpbCI6IjIwMjctMDQtMTNUMTQ6MTA6MjMuNzM3WiIsImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92Mi8xMTEvc3RhdHVzX2xpc3QiLCJ0eXBlIjoiVG9rZW5TdGF0dXNMaXN0Iiwic3RhdHVzUHVycG9zZSI6InJldm9jYXRpb24iLCJzdGF0dXNMaXN0SW5kZXgiOiIzNiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9mdW5kaWMtdW50YXV0b2xvZ2ljYWxseS1kb3JldGhlYS5uZ3Jvay1mcmVlLmRldi9pc3N1YW5jZS9hcGkvdjIvMTExL3N0YXR1c19saXN0In19fQ.DTmVqkHgnmLci0Q6QRato13HSzoFtD9biBF2_bBReQ9kWNZiWVa5KtgVAtvzAK7DnoPueVbbBu7V13TWs9HbWw'; jest .spyOn( (await import('../../src/resolvers/httpPublicKeyResolver.js')) .HttpPublicKeyResolver.prototype, 'getPublicKeyJwk', ) .mockResolvedValue({ kty: 'EC', kid: '8d6674f1-cdfc-4e87-9212-4e124c908b9e', crv: 'P-256', x: '5cq40xqehES5ZstrBnAZGIDJHU_nozm8pm05J-wDbHc', y: 'XUyffNH71CFjW7ejvSGXDMfvLXEenDngxD_aFJC_ib0', }); jest .spyOn( StatusListCredentialFetcher.prototype, 'getStatusListCredential', ) .mockResolvedValue( 'eyJhbGciOiJFUzI1NiIsImtpZCI6IjhkNjY3NGYxLWNkZmMtNGU4Ny05MjEyLTRlMTI0YzkwOGI5ZSIsInR5cCI6InN0YXR1c2xpc3Qrand0In0.eyJpc3MiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92MS8xMTEiLCJzdWIiOiJodHRwczovL2Z1bmRpYy11bnRhdXRvbG9naWNhbGx5LWRvcmV0aGVhLm5ncm9rLWZyZWUuZGV2L2lzc3VhbmNlL2FwaS92Mi8xMTEvc3RhdHVzX2xpc3QiLCJzdGF0dXNfbGlzdCI6eyJiaXRzIjoxLCJsc3QiOiJlTnBqWUdCZ2tHQ0FBQUFBekFBWiJ9LCJpYXQiOjE3NzYwOTAwMjh9.RAVr4krqjvqcZTYhitB50iXud44kAF89uKbQGpSG7FrKKbp3e63KC7zKpnsOdJAPKuWSS578YLNB_W12Ppnr8g', ); const validationResponse = await validateJwtVC(credential); expect(validationResponse).toEqual({ valid: false, messages: ['urn:pk:6157 is revoked'], }); }); it('validate a valid jwt verifiable credential with did:key', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWFhd0dSSDhMWFJQMXFwa2JoQVNuZEtIZWlOSGh2emRlaE5mR25CZ1lkeXVlbXpxeFpSTDluN2hnWHlwOWRWR0JaUW00cFZyUk5HYzFxcmlnYU1BNFM5aFNhV21VY0EzVTlKVGVlR3VZVmZpR0tlOGZ4Y28zekxkWHJ2SzhrVDVwZyN6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxYWF3R1JIOExYUlAxcXBrYmhBU25kS0hlaU5IaHZ6ZGVoTmZHbkJnWWR5dWVtenF4WlJMOW43aGdYeXA5ZFZHQlpRbTRwVnJSTkdjMXFyaWdhTUE0UzloU2FXbVVjQTNVOUpUZWVHdVlWZmlHS2U4ZnhjbzN6TGRYcnZLOGtUNXBnIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvY29udGV4dHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlRlc3RUeXBlIl0sImlzc3VlciI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWFhd0dSSDhMWFJQMXFwa2JoQVNuZEtIZWlOSGh2emRlaE5mR25CZ1lkeXVlbXpxeFpSTDluN2hnWHlwOWRWR0JaUW00cFZyUk5HYzFxcmlnYU1BNFM5aFNhV21VY0EzVTlKVGVlR3VZVmZpR0tlOGZ4Y28zekxkWHJ2SzhrVDVwZyIsIm5hbWUiOiJQb3N0bWFuIEVudGl0eSJ9LCJpZCI6InVybjp1dWlkOmM3ZjJmZjg3LThlOGUtNGYwMy04OWI2LWM2NDkxNTg2OGVmNiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JzUG0yeWJXR2twcll6N1E1VzFZYkZycUU3SnBXN0JISkFYYWRqNmgxTWd3ZERTZHJ2b1JNQ3dKZjhFaXNlMnV0V0xiZkRtNmJyM1Jlc0tkR2NYYTRUa2JZb2Zub05RV2hNMmpYNzhqVTFaZUx6d0pRSlFFaXV4SHY0SGhrVkZqMkhBIiwibmFtZSI6IkJpYW5jYSIsImFnZSI6MzB9LCJ2YWxpZFVudGlsIjoiMjAzNC0wMy0yNFQxNTo0MjowNi41MDdaIiwiY3JlZGVudGlhbFN0YXR1cyI6eyJ0eXBlIjoiU3RhdHVzTGlzdDIwMjFFbnRyeSIsImlkIjoiaHR0cHM6Ly9kZXYudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzI4MiMxIiwic3RhdHVzTGlzdENyZWRlbnRpYWwiOiJodHRwczovL2Rldi52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvMjgyIiwic3RhdHVzTGlzdEluZGV4IjoiMSIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIn19LCJpYXQiOjE3MTE0Njc3MjgsImlzcyI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWFhd0dSSDhMWFJQMXFwa2JoQVNuZEtIZWlOSGh2emRlaE5mR25CZ1lkeXVlbXpxeFpSTDluN2hnWHlwOWRWR0JaUW00cFZyUk5HYzFxcmlnYU1BNFM5aFNhV21VY0EzVTlKVGVlR3VZVmZpR0tlOGZ4Y28zekxkWHJ2SzhrVDVwZyJ9.6Tnf6hPuW5dNPGum0bGW5qOOmCtf16UW6yJeljgLAr4py6edNuhvIzfnPoCuAZGcbdQSh1XP-Agk2Sb3nJ1ZQA'; let calledKid: string; jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .mockImplementation((kid) => { calledKid = kid; return Promise.resolve({ crv: 'P-256', kty: 'EC', x: 'Y466Rwve7cKtzmQgB5Qg1vdWmrNOWCpOkuVCQo1zv2w', y: 'rsp9rfsQmwuKG8QZEp2OhpszkI1EKzVRrFsZZpfTecE', }); }); const validationResponse = await validateJwtVC(credential); expect(calledKid).toEqual( 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqaawGRH8LXRP1qpkbhASndKHeiNHhvzdehNfGnBgYdyuemzqxZRL9n7hgXyp9dVGBZQm4pVrRNGc1qrigaMA4S9hSaWmUcA3U9JTeeGuYVfiGKe8fxco3zLdXrvK8kT5pg#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqaawGRH8LXRP1qpkbhASndKHeiNHhvzdehNfGnBgYdyuemzqxZRL9n7hgXyp9dVGBZQm4pVrRNGc1qrigaMA4S9hSaWmUcA3U9JTeeGuYVfiGKe8fxco3zLdXrvK8kT5pg', ); expect( jest.spyOn(EbsiWrapper.prototype, 'validate').mock.calls.length, ).toStrictEqual(0); expect(validationResponse).toEqual({ valid: true, }); }); it('validate a valid jwt verifiable credential with did:web', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6dHJ1c3QudmFsaWRhdGVkaWQuY29tI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvY29udGV4dHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkVtYWlsQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6d2ViOnRydXN0LnZhbGlkYXRlZGlkLmNvbSIsIm5hbWUiOiJWYWxpZGF0ZWQgSUQgU0wifSwiaWQiOiJ1cm46dXVpZDoyZTkzMTlkNi1jNDRlLTRkMjktYjQxYy05NGJiZGRkYTdjMjkiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtic3JmcnpnWXJNMmd0dGU0MVhDRWN5dUI3bVF2d0VBY01wUnZUM0JSMTJyUWMxQWRCcFJIN1BnRHNWYmM1dmRTRmI3R1NMTjl3b0RwN01SQmZSd3Q3SlpYNEpMRlExb3Z4cXBKbjlleGRQOVNlejlEck16YXZCRDJNVnFmUFI4NXQ0TCIsImVtYWlsIjoiZGZvbGNoY0Bob3RtYWlsLmNvbSJ9LCJjcmVkZW50aWFsU3RhdHVzIjp7InR5cGUiOiJSZXZvY2F0aW9uTGlzdDIwMjEiLCJpZCI6Imh0dHBzOi8vYXBpLnZpZGNoYWluLm5ldC9hcGkvdjEvcmV2b2NhdGlvbi9jcmVkZW50aWFsLXN0YXR1cy9zdGF0dXMtbGlzdC8zNi9jcmVkZW50aWFsLzE0MiIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9hcGkudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzM2Iiwic3RhdHVzTGlzdEluZGV4IjoiMTQyIn19LCJpYXQiOjE3MDY3MjQxNTAsImlzcyI6ImRpZDp3ZWI6dHJ1c3QudmFsaWRhdGVkaWQuY29tIn0.5g7HR4PbzRrwK_t-ty29UghPJCxufIrPg-t4k9bIscS2oaQi3cgrScUN6XOB6AqBPhT6AJz7sehS-rNxW0Gbdw'; let calledKid: string; jest .spyOn(DidPublicKeyResolver.prototype, 'getPublicKeyJwk') .mockImplementation((kid) => { calledKid = kid; return Promise.resolve({ kty: 'EC', x: 'gjuALBMqgSNT-Y0WotbN06wZ49DoSyLrzGMUmNL88ZU', y: 'aTV0B0dcuWQz-EBAH9mT-SP3LWvVvp2bk-s4DbuwlEw', crv: 'P-256', }); }); const validationResponse = await validateJwtVC(credential); expect(calledKid).toEqual('did:web:trust.validatedid.com#key-0'); expect( jest.spyOn(EbsiWrapper.prototype, 'validate').mock.calls.length, ).toStrictEqual(0); expect(validationResponse).toEqual({ valid: true, }); }); it('not validate a jwt verifiable credential with invalid signature', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViI3RCNi1Ub2kxWlJOS3VfREdiZGVrbUxDN2E3TzJ0akRDQ3ZjUFdycklLM2MifQ.eyJqzGkiOiJ1cm46ZGlkOjEyMzQ1NiIsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsImlzcyI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViIiwibmJmIjoxNjM1NzI0ODAwLCJleHAiOjUxMDk0MzY4MDAsImlhdCI6MTYzNTU1MjAwMCwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwiaWQiOiJ1cm46ZGlkOjEyMzQ1NiIsInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQXR0ZXN0YXRpb24iXSwiaXNzdWVyIjoiZGlkOmVic2k6enJybVB1dEpNNWNnZGpHUUY0Y0R5NWIiLCJpc3N1YW5jZURhdGUiOiIyMDIxLTExLTAxVDAwOjAwOjAwWiIsInZhbGlkRnJvbSI6IjIwMjEtMTEtMDFUMDA6MDA6MDBaIiwiaXNzdWVkIjoiMjAyMS0xMC0zMFQwMDowMDowMFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsInBlcnNvbmFsSWRlbnRpZmllciI6IklUL0RFLzEyMzQiLCJmYW1pbHlOYW1lIjoiQ2FzdGFmaW9yaSIsImZpcnN0TmFtZSI6IkJpYW5jYSIsImRhdGVPZkJpcnRoIjoiMTkzMC0xMC0wMSJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9hcGktcGlsb3QuZWJzaS5ldS90cnVzdGVkLXNjaGVtYXMtcmVnaXN0cnkvdjIvc2NoZW1hcy8weDBmNDFhMWY0OTM0ZTExZjhmOThlNDQ0ZWQzNGZiMDQwNjQ1ZGNjMDRjZWFkMmFlMjhmY2EwNjJlYWJmYWMxODEiLCJ0eXBlIjoiRnVsbEpzb25TY2hlbWFWYWxpZGF0b3IyMDIxIn0sImV4cGlyYXRpb25EYXRlIjoiMjEzMS0xMS0zMFQwMDowMDowMFoifX0.yAZ72yi1DC5eEqJ9_O1dQ3VgFB-iT85mUY3SNvEt-Vul_jPKcRsR8ceS1ce08lJUTaM8X3HRMpHPU7qmPkLRvQ'; let calledVc: string; jest .spyOn(EbsiWrapper.prototype, 'validate') .mockImplementation((vc, opts) => { calledVc = vc; return Promise.reject({ name: 'ValidationError', message: 'urn:did:123456 signature is not correct', } as ValidationError); }); const validationResponse = await validateJwtVC(credential, { ebsiAuthority: 'test', }); expect(calledVc).toEqual(credential); expect( jest.spyOn(VerifiableCredentialsValidator.prototype, 'validate').mock .calls.length, ).toEqual(0); expect(validationResponse).toEqual({ valid: false, messages: ['urn:did:123456 signature is not correct'], }); }); it('not validate a jwt verifiable credential without ebsiAuthority and did:ebsi issuer', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViI3RCNi1Ub2kxWlJOS3VfREdiZGVrbUxDN2E3TzJ0akRDQ3ZjUFdycklLM2MifQ.eyJqzGkiOiJ1cm46ZGlkOjEyMzQ1NiIsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsImlzcyI6ImRpZDplYnNpOnpycm1QdXRKTTVjZ2RqR1FGNGNEeTViIiwibmJmIjoxNjM1NzI0ODAwLCJleHAiOjUxMDk0MzY4MDAsImlhdCI6MTYzNTU1MjAwMCwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwiaWQiOiJ1cm46ZGlkOjEyMzQ1NiIsInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQXR0ZXN0YXRpb24iXSwiaXNzdWVyIjoiZGlkOmVic2k6enJybVB1dEpNNWNnZGpHUUY0Y0R5NWIiLCJpc3N1YW5jZURhdGUiOiIyMDIxLTExLTAxVDAwOjAwOjAwWiIsInZhbGlkRnJvbSI6IjIwMjEtMTEtMDFUMDA6MDA6MDBaIiwiaXNzdWVkIjoiMjAyMS0xMC0zMFQwMDowMDowMFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCIsInBlcnNvbmFsSWRlbnRpZmllciI6IklUL0RFLzEyMzQiLCJmYW1pbHlOYW1lIjoiQ2FzdGFmaW9yaSIsImZpcnN0TmFtZSI6IkJpYW5jYSIsImRhdGVPZkJpcnRoIjoiMTkzMC0xMC0wMSJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9hcGktcGlsb3QuZWJzaS5ldS90cnVzdGVkLXNjaGVtYXMtcmVnaXN0cnkvdjIvc2NoZW1hcy8weDBmNDFhMWY0OTM0ZTExZjhmOThlNDQ0ZWQzNGZiMDQwNjQ1ZGNjMDRjZWFkMmFlMjhmY2EwNjJlYWJmYWMxODEiLCJ0eXBlIjoiRnVsbEpzb25TY2hlbWFWYWxpZGF0b3IyMDIxIn0sImV4cGlyYXRpb25EYXRlIjoiMjEzMS0xMS0zMFQwMDowMDowMFoifX0.yAZ72yi1DC5eEqJ9_O1dQ3VgFB-iT85mUY3SNvEt-Vul_jPKcRsR8ceS1ce08lJUTaM8X3HRMpHPU7qmPkLRvQ'; const validationResponse = await validateJwtVC(credential, { ebsiAuthority: undefined, }); expect( jest.spyOn(VerifiableCredentialsValidator.prototype, 'validate').mock .calls.length, ).toEqual(0); expect(validationResponse).toEqual({ valid: false, messages: ['ConfigurationError: missing ebsiAuthority'], }); }); }); }); describe('validate presentations', () => { describe('in jwt format', () => { it('validate a valid jwt verifiable presentation using EbsiPresentationValidator', async () => { const presentation = { query_0: [ 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticDdjTFpMUnhzWnVFVGs5Qk5nM29WYVJURFFDTjh1WGF5eHlldDVaY2pnWnh2d251TVhZV0d6czdMeFgxczRHUmJMVUp3RkpIRnpFZU56QnM2VndLOFNKeWpyaUtqRTg2eEtGVEVBd1ZzN3F5U0hrcjhaM3lpbWhzU0w3YmtjTTdOdCN6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JwN2NMWkxSeHNadUVUazlCTmczb1ZhUlREUUNOOHVYYXl4eWV0NVpjamdaeHZ3bnVNWFlXR3pzN0x4WDFzNEdSYkxVSndGSkhGekVlTnpCczZWd0s4U0p5anJpS2pFODZ4S0ZURUF3VnM3cXlTSGtyOFozeWltaHNTTDdia2NNN050In0.eyJpYXQiOjE3MDkxMTQyMzMsImV4cCI6NTEwOTQzNjgwMCwiaXNzIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JwN2NMWkxSeHNadUVUazlCTmczb1ZhUlREUUNOOHVYYXl4eWV0NVpjamdaeHZ3bnVNWFlXR3pzN0x4WDFzNEdSYkxVSndGSkhGekVlTnpCczZWd0s4U0p5anJpS2pFODZ4S0ZURUF3VnM3cXlTSGtyOFozeWltaHNTTDdia2NNN050IiwiYXVkIjoiaHR0cHM6Ly9hcGktY29uZm9ybWFuY2UuZWJzaS5ldS9jb25mb3JtYW5jZS92My9hdXRoLW1vY2siLCJzdWIiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYnA3Y0xaTFJ4c1p1RVRrOUJOZzNvVmFSVERRQ044dVhheXh5ZXQ1WmNqZ1p4dndudU1YWVdHenM3THhYMXM0R1JiTFVKd0ZKSEZ6RWVOekJzNlZ3SzhTSnlqcmlLakU4NnhLRlRFQXdWczdxeVNIa3I4WjN5aW1oc1NMN2JrY003TnQiLCJuYmYiOjE3MDkxMTQyMzMsIm5vbmNlIjoiZDE0NDRkODItZDQ1Zi00MmJmLTkxNzktZTUzOTNmNjBjNTI0Iiwic3RhdGUiOiIwMGYzMTVkNS03NTk5LTQ4MGUtOGM4MC1jMWZlMWNjMDBlMzgiLCJqdGkiOiJ1cm46ZGlkOjgyNjZmNDJiLTFmZjYtNDA3Ni05ZjMyLWExNjc3YWIwYzliZCIsInZwIjp7ImlkIjoidXJuOmRpZDo4MjY2ZjQyYi0xZmY2LTQwNzYtOWYzMi1hMTY3N2FiMGM5YmQiLCJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaG9sZGVyIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JwN2NMWkxSeHNadUVUazlCTmczb1ZhUlREUUNOOHVYYXl4eWV0NVpjamdaeHZ3bnVNWFlXR3pzN0x4WDFzNEdSYkxVSndGSkhGekVlTnpCczZWd0s4U0p5anJpS2pFODZ4S0ZURUF3VnM3cXlTSGtyOFozeWltaHNTTDdia2NNN050IiwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0lzSW10cFpDSTZJbVJwWkRwbFluTnBPbnB5Y20xUWRYUktUVFZqWjJScVIxRkdOR05FZVRWaUkzUkNOaTFVYjJreFdsSk9TM1ZmUkVkaVpHVnJiVXhETjJFM1R6SjBha1JEUTNaalVGZHlja2xMTTJNaWZRLmV5SnFkR2tpT2lKMWNtNDZaR2xrT2pFeU16UTFOaUlzSW5OMVlpSTZJbVJwWkRwclpYazZlakprYlhwRU9ERmpaMUI0T0ZacmFUZEtZblYxVFcxR1dYSlhVR2RaYjNsMGVXdFZXak5sZVhGb2RERnFPVXRpY0RkalRGcE1Vbmh6V25WRlZHczVRazVuTTI5V1lWSlVSRkZEVGpoMVdHRjVlSGxsZERWYVkycG5XbmgyZDI1MVRWaFpWMGQ2Y3pkTWVGZ3hjelJIVW1KTVZVcDNSa3BJUm5wRlpVNTZRbk0yVm5kTE9GTktlV3B5YVV0cVJUZzJlRXRHVkVWQmQxWnpOM0Y1VTBocmNqaGFNM2xwYldoelUwdzNZbXRqVFRkT2RDSXNJbWx6Y3lJNkltUnBaRHBsWW5OcE9ucHljbTFRZFhSS1RUVmpaMlJxUjFGR05HTkVlVFZpSWl3aWJtSm1Jam94TmpNMU56STBPREF3TENKbGVIQWlPalV4TURrME16WTRNREFzSW1saGRDSTZNVFl6TlRVMU1qQXdNQ3dpZG1NaU9uc2lRR052Ym5SbGVIUWlPbHNpYUhSMGNITTZMeTkzZDNjdWR6TXViM0puTHpJd01UZ3ZZM0psWkdWdWRHbGhiSE12ZGpFaVhTd2lhV1FpT2lKMWNtNDZaR2xrT2pFeU16UTFOaUlzSW5SNWNHVWlPbHNpVm1WeWFXWnBZV0pzWlVOeVpXUmxiblJwWVd3aUxDSldaWEpwWm1saFlteGxRWFIwWlhOMFlYUnBiMjRpWFN3aWFYTnpkV1Z5SWpvaVpHbGtPbVZpYzJrNmVuSnliVkIxZEVwTk5XTm5aR3BIVVVZMFkwUjVOV0lpTENKcGMzTjFZVzVqWlVSaGRHVWlPaUl5TURJeExURXhMVEF4VkRBd09qQXdPakF3V2lJc0luWmhiR2xrUm5KdmJTSTZJakl3TWpFdE1URXRNREZVTURBNk1EQTZNREJhSWl3aWFYTnpkV1ZrSWpvaU1qQXlNUzB4TUMwek1GUXdNRG93TURvd01Gb2lMQ0pqY21Wa1pXNTBhV0ZzVTNWaWFtVmpkQ0k2ZXlKcFpDSTZJbVJwWkRwclpYazZlakprYlhwRU9ERmpaMUI0T0ZacmFUZEtZblYxVFcxR1dYSlhVR2RaYjNsMGVXdFZXak5sZVhGb2RERnFPVXRpY0RkalRGcE1Vbmh6V25WRlZHczVRazVuTTI5V1lWSlVSRkZEVGpoMVdHRjVlSGxsZERWYVkycG5XbmgyZDI1MVRWaFpWMGQ2Y3pkTWVGZ3hjelJIVW1KTVZVcDNSa3BJUm5wRlpVNTZRbk0yVm5kTE9GTktlV3B5YVV0cVJUZzJlRXRHVkVWQmQxWnpOM0Y1VTBocmNqaGFNM2xwYldoelUwdzNZbXRqVFRkT2RDSXNJbkJsY25OdmJtRnNTV1JsYm5ScFptbGxjaUk2SWtsVUwwUkZMekV5TXpRaUxDSm1ZVzFwYkhsT1lXMWxJam9pUTJGemRHRm1hVzl5YVNJc0ltWnBjbk4wVG1GdFpTSTZJa0pwWVc1allTSXNJbVJoZEdWUFprSnBjblJvSWpvaU1Ua3pNQzB4TUMwd01TSjlMQ0pqY21Wa1pXNTBhV0ZzVTJOb1pXMWhJanA3SW1sa0lqb2lhSFIwY0hNNkx5OWhjR2t0Y0dsc2IzUXVaV0p6YVM1bGRTOTBjblZ6ZEdWa0xYTmphR1Z0WVhNdGNtVm5hWE4wY25rdmRqSXZjMk5vWlcxaGN5OHdlREJtTkRGaE1XWTBPVE0wWlRFeFpqaG1PVGhsTkRRMFpXUXpOR1ppTURRd05qUTFaR05qTURSalpXRmtNbUZsTWpobVkyRXdOakpsWVdKbVlXTXhPREVpTENKMGVYQmxJam9pUm5Wc2JFcHpiMjVUWTJobGJXRldZV3hwWkdGMGIzSXlNREl4SW4wc0ltVjRjR2x5WVhScGIyNUVZWFJsSWpvaU1qRXpNUzB4TVMwek1GUXdNRG93TURvd01Gb2lmWDAueUFaNzJ5aTFEQzVlRXFKOV9PMWRRM1ZnRkItaVQ4NW1VWTNTTnZFdC1WdWxfalBLY1JzUjhjZVMxY2UwOGxKVVRhTThYM0hSTXBIUFU3cW1Qa0xSdlEiXX19.mEXR5cQHnHnjntnO8JsfaOS1olzawim8T9Tq9Wxm02q7wi-PywBRwapuVyjzCMU4N5Hfqw0l2oI-cPWHj85_wA', ], }; const dcqlQuery = { credentials: [ { id: 'query_0', format: 'ldp_vc', meta: { type_values: [['EmailCredential']], }, }, ], }; jest .spyOn(EbsiPresentationValidator.prototype, 'validate') .mockResolvedValue({ valid: true }); const validationResult = await validateDcqlVp( presentation, 'https://api-conformance.ebsi.eu/conformance/v3/auth-mock', { dcqlQuery, }, ); expect( jest.spyOn(EbsiPresentationValidator.prototype, 'validate').mock.calls .length, ).toEqual(1); expect(validationResult.valid).toBeTruthy(); }); it('validate a valid jwt verifiable presentation using VerifiablePresentationValidator with DCQL', async () => { const presentation = { query_0: [ 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSN6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxZnNxZWhCQlA3a29BZ2RjRzZVZU1IUWdKWnBQSzRKaU5UbVpVYmozSmdlODdlSnh2aVRrc2YyYUF1dUxUTXlhR21FUE45dkVQM1FSUjNBTUFUZVNrV1lDa0xqZXdRNEtuTDY4d2hIM3Vva3BiN2VWa2RCc3Y3cmRNTTNUckEyYk5VIn0.eyJpYXQiOjE3Njg5MDI1NjksImV4cCI6MTc2ODkwMzQ2OSwiaXNzIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxZnNxZWhCQlA3a29BZ2RjRzZVZU1IUWdKWnBQSzRKaU5UbVpVYmozSmdlODdlSnh2aVRrc2YyYUF1dUxUTXlhR21FUE45dkVQM1FSUjNBTUFUZVNrV1lDa0xqZXdRNEtuTDY4d2hIM3Vva3BiN2VWa2RCc3Y3cmRNTTNUckEyYk5VIiwiYXVkIjoiZGVjZW50cmFsaXplZF9pZGVudGlmaWVyOmRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtickRGQmt0bktyR2tva1VTUHJIUm5VZVIyZmdvWnF0VFF0UFVXYmNMeldOVFNFSlVlTTVzdjJUN2U5TG51QzNnVmhMajZjWUd1ZEtxbkJUOUxGcXBYdFJFYzNQbjE4QWIzbjFvM3pYdnhkWm0yelBNU2NnR25rWHc2cEJ1dkRXS2d0TCIsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsIm5iZiI6MTc2ODkwMjU2OSwibm9uY2UiOiJqSDRDZGFySVc5MVkxdG5QNkNpN2lBIiwianRpIjoidXJuOmRpZDpmNGM4MTJkYi00OTMwLTRlZTUtOTc5YS1kMTUwZjIwY2NkZjYiLCJ2cCI6eyJpZCI6InVybjpkaWQ6ZjRjODEyZGItNDkzMC00ZWU1LTk3OWEtZDE1MGYyMGNjZGY2IiwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlUHJlc2VudGF0aW9uIl0sImhvbGRlciI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsInZlcmlmaWFibGVDcmVkZW50aWFsIjpbeyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkVtYWlsQ3JlZGVudGlhbCJdLCJpZCI6InVybjp1dWlkOmMxOGVkYTQ4LTA5MGEtNDk1OS1iZjU4LTJkZWRlODk4NGNhYyIsImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwibmFtZSI6IlZhbGlkYXRlZCBJRCBTTCJ9LCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsImVtYWlsIjoiaXNhYWMub2xsZUBzaWduYXR1cml0LmNvbSJ9LCJwcm9vZiI6eyJ0eXBlIjoiSnNvbldlYlNpZ25hdHVyZTIwMjAiLCJjcmVhdGVkIjoiMjAyNi0wMS0yMFQwOTo0Njo0MC4wMDBaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYja2V5LTAiLCJqd3MiOiJleUpoYkdjaU9pSkZVekkxTmlJc0luUjVjQ0k2SWtwWFZDSXNJbXRwWkNJNkltUnBaRHAzWldJNmMzUmhaMmx1Wnk1MmFXUmphR0ZwYmk1dVpYUTZZWEJwT25ZeE9tUnBaQzEzWldJdGNtVnpiMngyWlhJNlpETmtaalF3T1dRdE1ERTFZaTAwTVdJMExXRmhNekV0WW1RM1pqUXpPRFF3TlRSbUkydGxlUzB3SW4wLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3Zibk12WTNKbFpHVnVkR2xoYkhNdmRqSWlYU3dpYVdRaU9pSjFjbTQ2ZFhWcFpEcGpNVGhsWkdFME9DMHdPVEJoTFRRNU5Ua3RZbVkxT0MweVpHVmtaVGc1T0RSallXTWlMQ0owZVhCbElqcGJJbFpsY21sbWFXRmliR1ZEY21Wa1pXNTBhV0ZzSWl3aVJXMWhhV3hEY21Wa1pXNTBhV0ZzSWwwc0ltTnlaV1JsYm5ScFlXeFRkV0pxWldOMElqcDdJbWxrSWpvaVpHbGtPbXRsZVRwNk1tUnRla1E0TVdOblVIZzRWbXRwTjBwaWRYVk5iVVpaY2xkUVoxbHZlWFI1YTFWYU0yVjVjV2gwTVdvNVMySnhabk54WldoQ1FsQTNhMjlCWjJSalJ6WlZaVTFJVVdkS1duQlFTelJLYVU1VWJWcFZZbW96U21kbE9EZGxTbmgyYVZScmMyWXlZVUYxZFV4VVRYbGhSMjFGVUU0NWRrVlFNMUZTVWpOQlRVRlVaVk5yVjFsRGEweHFaWGRSTkV0dVREWTRkMmhJTTNWdmEzQmlOMlZXYTJSQ2MzWTNjbVJOVFROVWNrRXlZazVWSWl3aVpXMWhhV3dpT2lKcGMyRmhZeTV2Ykd4bFFITnBaMjVoZEhWeWFYUXVZMjl0SW4wc0ltbHpjM1ZsY2lJNmV5SnBaQ0k2SW1ScFpEcDNaV0k2YzNSaFoybHVaeTUyYVdSamFHRnBiaTV1WlhRNllYQnBPbll4T21ScFpDMTNaV0l0Y21WemIyeDJaWEk2WkROa1pqUXdPV1F0TURFMVlpMDBNV0kwTFdGaE16RXRZbVEzWmpRek9EUXdOVFJtSWl3aWJtRnRaU0k2SWxaaGJHbGtZWFJsWkNCSlJDQlRUQ0o5TENKMllXeHBaRVp5YjIwaU9pSXlNREkyTFRBeExUSXdWREE1T2pRMk9qUXdXaUlzSW1OeVpXUmxiblJwWVd4VGRHRjBkWE1pT25zaWFXUWlPaUpvZEhSd2N6b3ZMM04wWVdkcGJtY3RjM1IxWkdsdkxuWnBaR05vWVdsdUxtNWxkQzkyYVdSamNtVmtaVzUwYVdGc2N5MXpkSFZrYVc4dllYQnBMM1l4TDNOMFlYUjFjeTFzYVhOMExXTnlaV1JsYm5ScFlXd3ZPVEVqT0Rjeklpd2ljM1JoZEhWelRHbHpkRU55WldSbGJuUnBZV3dpT2lKb2RIUndjem92TDNOMFlXZHBibWN0YzNSMVpHbHZMblpwWkdOb1lXbHVMbTVsZEM5MmFXUmpjbVZrWlc1MGFXRnNjeTF6ZEhWa2FXOHZZWEJwTDNZeEwzTjBZWFIxY3kxc2FYTjBMV055WldSbGJuUnBZV3d2T1RFaUxDSnpkR0YwZFhOTWFYTjBTVzVrWlhnaU9pSTROek1pTENKMGVYQmxJam9pVW1WMmIyTmhkR2x2Ymt4cGMzUXlNREl4VTNSaGRIVnpJaXdpYzNSaGRIVnpVSFZ5Y0c5elpTSTZJbkpsZG05allYUnBiMjRpZlgwc0ltNWlaaUk2TVRjMk9Ea3dNalF3TUN3aWFYTnpJam9pWkdsa09uZGxZanB6ZEdGbmFXNW5MblpwWkdOb1lXbHVMbTVsZERwaGNHazZkakU2Wkdsa0xYZGxZaTF5WlhOdmJIWmxjanBrTTJSbU5EQTVaQzB3TVRWaUxUUXhZalF0WVdFek1TMWlaRGRtTkRNNE5EQTFOR1lpTENKcFlYUWlPakUzTmpnNU1ESTBNREFzSW5OMVlpSTZJbVJwWkRwclpYazZlakprYlhwRU9ERmpaMUI0T0ZacmFUZEtZblYxVFcxR1dYSlhVR2RaYjNsMGVXdFZXak5sZVhGb2RERnFPVXRpY1daemNXVm9Ra0pRTjJ0dlFXZGtZMGMyVldWTlNGRm5TbHB3VUVzMFNtbE9WRzFhVldKcU0wcG5aVGczWlVwNGRtbFVhM05tTW1GQmRYVk1WRTE1WVVkdFJWQk9PWFpGVUROUlVsSXpRVTFCVkdWVGExZFpRMnRNYW1WM1VUUkxia3cyT0hkb1NETjFiMnR3WWpkbFZtdGtRbk4yTjNKa1RVMHpWSEpCTW1KT1ZTSXNJbXAwYVNJNkluVnlianAxZFdsa09tTXhPR1ZrWVRRNExUQTVNR0V0TkRrMU9TMWlaalU0TFRKa1pXUmxPRGs0TkdOaFl5SjkueEhjYjlrTmVnQmFhaXNEd0dDRVBaMVRLS3NhY3BCd3pPMjRfQWdyOEJRblkzamY1eGNpYnlXam16SW5RMXVnMW40S29uOFdQN2loZGpocFdBQi1JSHcifSwidmFsaWRGcm9tIjoiMjAyNi0wMS0yMFQwOTo0Njo0MFoiLCJjcmVkZW50aWFsU3RhdHVzIjp7ImlkIjoiaHR0cHM6Ly9zdGFnaW5nLXN0dWRpby52aWRjaGFpbi5uZXQvdmlkY3JlZGVudGlhbHMtc3R1ZGlvL2FwaS92MS9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzkxIzg3MyIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9zdGFnaW5nLXN0dWRpby52aWRjaGFpbi5uZXQvdmlkY3JlZGVudGlhbHMtc3R1ZGlvL2FwaS92MS9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzkxIiwic3RhdHVzTGlzdEluZGV4IjoiODczIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMVN0YXR1cyIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIn19XX19.mI6FNdIR5BtriTOLXd-Iw2AhpWnnIRhFpQB_v1xCDXRCnDzMDcf4miyAqbWS1WEIlhqOMxiiREtdr9rc812MFQ', ], }; const dcqlQuery = { credentials: [ { id: 'query_0', format: 'ldp_vc', meta: { type_values: [['EmailCredential']], }, }, ], }; jest .spyOn(VerifiablePresentationValidator.prototype, 'validate') .mockResolvedValue({ valid: true }); const validationResult = await validateDcqlVp( presentation, 'https://staging-studio.vidchain.net/vidcredentials-studio/oidc4vc/v1/verifier/5417af65-6058-4ab4-a891-d0a00353e847', { dcqlQuery, }, ); expect( jest.spyOn(VerifiablePresentationValidator.prototype, 'validate').mock .calls.length, ).toEqual(1); expect(validationResult.valid).toBeTruthy(); }); }); describe('in json format', () => { it('validate a valid json verifiable presentation using VerifiablePresentationValidator', async () => { const presentation = { query_0: [ { id: 'urn:did:f4c812db-4930-4ee5-979a-d150f20ccdf6', '@context': ['https://www.w3.org/2018/credentials/v1'], type: ['VerifiablePresentation'], holder: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqfsqehBBP7koAgdcG6UeMHQgJZpPK4JiNTmZUbj3Jge87eJxviTksf2aAuuLTMyaGmEPN9vEP3QRR3AMATeSkWYCkLjewQ4KnL68whH3uokpb7eVkdBsv7rdMM3TrA2bNU', verifiableCredential: [ { '@context': ['https://www.w3.org/ns/credentials/v2'], type: ['VerifiableCredential', 'EmailCredential'], id: 'urn:uuid:c18eda48-090a-4959-bf58-2dede8984cac', issuer: { id: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f', name: 'Validated ID SL', }, credentialSubject: { id: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqfsqehBBP7koAgdcG6UeMHQgJZpPK4JiNTmZUbj3Jge87eJxviTksf2aAuuLTMyaGmEPN9vEP3QRR3AMATeSkWYCkLjewQ4KnL68whH3uokpb7eVkdBsv7rdMM3TrA2bNU', email: 'isaac.olle@signaturit.com', }, proof: { type: 'JsonWebSignature2020', created: '2026-01-20T09:46:40.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f#key-0', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwiaWQiOiJ1cm46dXVpZDpjMThlZGE0OC0wOTBhLTQ5NTktYmY1OC0yZGVkZTg5ODRjYWMiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRW1haWxDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxZnNxZWhCQlA3a29BZ2RjRzZVZU1IUWdKWnBQSzRKaU5UbVpVYmozSmdlODdlSnh2aVRrc2YyYUF1dUxUTXlhR21FUE45dkVQM1FSUjNBTUFUZVNrV1lDa0xqZXdRNEtuTDY4d2hIM3Vva3BiN2VWa2RCc3Y3cmRNTTNUckEyYk5VIiwiZW1haWwiOiJpc2FhYy5vbGxlQHNpZ25hdHVyaXQuY29tIn0sImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwibmFtZSI6IlZhbGlkYXRlZCBJRCBTTCJ9LCJ2YWxpZEZyb20iOiIyMDI2LTAxLTIwVDA5OjQ2OjQwWiIsImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL3N0YWdpbmctc3R1ZGlvLnZpZGNoYWluLm5ldC92aWRjcmVkZW50aWFscy1zdHVkaW8vYXBpL3YxL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvOTEjODczIiwic3RhdHVzTGlzdENyZWRlbnRpYWwiOiJodHRwczovL3N0YWdpbmctc3R1ZGlvLnZpZGNoYWluLm5ldC92aWRjcmVkZW50aWFscy1zdHVkaW8vYXBpL3YxL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvOTEiLCJzdGF0dXNMaXN0SW5kZXgiOiI4NzMiLCJ0eXBlIjoiUmV2b2NhdGlvbkxpc3QyMDIxU3RhdHVzIiwic3RhdHVzUHVycG9zZSI6InJldm9jYXRpb24ifX0sIm5iZiI6MTc2ODkwMjQwMCwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYiLCJpYXQiOjE3Njg5MDI0MDAsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsImp0aSI6InVybjp1dWlkOmMxOGVkYTQ4LTA5MGEtNDk1OS1iZjU4LTJkZWRlODk4NGNhYyJ9.xHcb9kNegBaaisDwGCEPZ1TKKsacpBwzO24_Agr8BQnY3jf5xcibyWjmzInQ1ug1n4Kon8WP7ihdjhpWAB-IHw', }, validFrom: '2026-01-20T09:46:40Z', credentialStatus: { id: 'https://staging-studio.vidchain.net/vidcredentials-studio/api/v1/status-list-credential/91#873', statusListCredential: 'https://staging-studio.vidchain.net/vidcredentials-studio/api/v1/status-list-credential/91', statusListIndex: '873', type: 'RevocationList2021Status', statusPurpose: 'revocation', }, }, ], proof: { type: 'JsonWebSignature2020', created: '2026-01-20T09:45:10.000Z', proofPurpose: 'assertionMethod', verificationMethod: 'did:key:z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqfsqehBBP7koAgdcG6UeMHQgJZpPK4JiNTmZUbj3Jge87eJxviTksf2aAuuLTMyaGmEPN9vEP3QRR3AMATeSkWYCkLjewQ4KnL68whH3uokpb7eVkdBsv7rdMM3TrA2bNU#z2dmzD81cgPx8Vki7JbuuMmFYrWPgYoytykUZ3eyqht1j9KbqfsqehBBP7koAgdcG6UeMHQgJZpPK4JiNTmZUbj3Jge87eJxviTksf2aAuuLTMyaGmEPN9vEP3QRR3AMATeSkWYCkLjewQ4KnL68whH3uokpb7eVkdBsv7rdMM3TrA2bNU', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSN6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxZnNxZWhCQlA3a29BZ2RjRzZVZU1IUWdKWnBQSzRKaU5UbVpVYmozSmdlODdlSnh2aVRrc2YyYUF1dUxUTXlhR21FUE45dkVQM1FSUjNBTUFUZVNrV1lDa0xqZXdRNEtuTDY4d2hIM3Vva3BiN2VWa2RCc3Y3cmRNTTNUckEyYk5VIn0.eyJpYXQiOjE3Njg5MDI1NjksImV4cCI6MTc2ODkwMzQ2OSwiaXNzIjoiZGlkOmtleTp6MmRtekQ4MWNnUHg4VmtpN0pidXVNbUZZcldQZ1lveXR5a1VaM2V5cWh0MWo5S2JxZnNxZWhCQlA3a29BZ2RjRzZVZU1IUWdKWnBQSzRKaU5UbVpVYmozSmdlODdlSnh2aVRrc2YyYUF1dUxUTXlhR21FUE45dkVQM1FSUjNBTUFUZVNrV1lDa0xqZXdRNEtuTDY4d2hIM3Vva3BiN2VWa2RCc3Y3cmRNTTNUckEyYk5VIiwiYXVkIjoiZGVjZW50cmFsaXplZF9pZGVudGlmaWVyOmRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUtickRGQmt0bktyR2tva1VTUHJIUm5VZVIyZmdvWnF0VFF0UFVXYmNMeldOVFNFSlVlTTVzdjJUN2U5TG51QzNnVmhMajZjWUd1ZEtxbkJUOUxGcXBYdFJFYzNQbjE4QWIzbjFvM3pYdnhkWm0yelBNU2NnR25rWHc2cEJ1dkRXS2d0TCIsInN1YiI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsIm5iZiI6MTc2ODkwMjU2OSwibm9uY2UiOiJqSDRDZGFySVc5MVkxdG5QNkNpN2lBIiwianRpIjoidXJuOmRpZDpmNGM4MTJkYi00OTMwLTRlZTUtOTc5YS1kMTUwZjIwY2NkZjYiLCJ2cCI6eyJpZCI6InVybjpkaWQ6ZjRjODEyZGItNDkzMC00ZWU1LTk3OWEtZDE1MGYyMGNjZGY2IiwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlUHJlc2VudGF0aW9uIl0sImhvbGRlciI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsInZlcmlmaWFibGVDcmVkZW50aWFsIjpbeyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvdjIiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkVtYWlsQ3JlZGVudGlhbCJdLCJpZCI6InVybjp1dWlkOmMxOGVkYTQ4LTA5MGEtNDk1OS1iZjU4LTJkZWRlODk4NGNhYyIsImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwibmFtZSI6IlZhbGlkYXRlZCBJRCBTTCJ9LCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6ejJkbXpEODFjZ1B4OFZraTdKYnV1TW1GWXJXUGdZb3l0eWtVWjNleXFodDFqOUticWZzcWVoQkJQN2tvQWdkY0c2VWVNSFFnSlpwUEs0SmlOVG1aVWJqM0pnZTg3ZUp4dmlUa3NmMmFBdXVMVE15YUdtRVBOOXZFUDNRUlIzQU1BVGVTa1dZQ2tMamV3UTRLbkw2OHdoSDN1b2twYjdlVmtkQnN2N3JkTU0zVHJBMmJOVSIsImVtYWlsIjoiaXNhYWMub2xsZUBzaWduYXR1cml0LmNvbSJ9LCJwcm9vZiI6eyJ0eXBlIjoiSnNvbldlYlNpZ25hdHVyZTIwMjAiLCJjcmVhdGVkIjoiMjAyNi0wMS0yMFQwOTo0Njo0MC4wMDBaIiwicHJvb2ZQdXJwb3NlIjoiYXNzZXJ0aW9uTWV0aG9kIiwidmVyaWZpY2F0aW9uTWV0aG9kIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYja2V5LTAiLCJqd3MiOiJleUpoYkdjaU9pSkZVekkxTmlJc0luUjVjQ0k2SWtwWFZDSXNJbXRwWkNJNkltUnBaRHAzWldJNmMzUmhaMmx1Wnk1MmFXUmphR0ZwYmk1dVpYUTZZWEJwT25ZeE9tUnBaQzEzWldJdGNtVnpiMngyWlhJNlpETmtaalF3T1dRdE1ERTFZaTAwTVdJMExXRmhNekV0WW1RM1pqUXpPRFF3TlRSbUkydGxlUzB3SW4wLmV5SjJZeUk2ZXlKQVkyOXVkR1Y0ZENJNld5Sm9kSFJ3Y3pvdkwzZDNkeTUzTXk1dmNtY3Zibk12WTNKbFpHVnVkR2xoYkhNdmRqSWlYU3dpYVdRaU9pSjFjbTQ2ZFhWcFpEcGpNVGhsWkdFME9DMHdPVEJoTFRRNU5Ua3RZbVkxT0MweVpHVmtaVGc1T0RSallXTWlMQ0owZVhCbElqcGJJbFpsY21sbWFXRmliR1ZEY21Wa1pXNTBhV0ZzSWl3aVJXMWhhV3hEY21Wa1pXNTBhV0ZzSWwwc0ltTnlaV1JsYm5ScFlXeFRkV0pxWldOMElqcDdJbWxrSWpvaVpHbGtPbXRsZVRwNk1tUnRla1E0TVdOblVIZzRWbXRwTjBwaWRYVk5iVVpaY2xkUVoxbHZlWFI1YTFWYU0yVjVjV2gwTVdvNVMySnhabk54WldoQ1FsQTNhMjlCWjJSalJ6WlZaVTFJVVdkS1duQlFTelJLYVU1VWJWcFZZbW96U21kbE9EZGxTbmgyYVZScmMyWXlZVUYxZFV4VVRYbGhSMjFGVUU0NWRrVlFNMUZTVWpOQlRVRlVaVk5yVjFsRGEweHFaWGRSTkV0dVREWTRkMmhJTTNWdmEzQmlOMlZXYTJSQ2MzWTNjbVJOVFROVWNrRXlZazVWSWl3aVpXMWhhV3dpT2lKcGMyRmhZeTV2Ykd4bFFITnBaMjVoZEhWeWFYUXVZMjl0SW4wc0ltbHpjM1ZsY2lJNmV5SnBaQ0k2SW1ScFpEcDNaV0k2YzNSaFoybHVaeTUyYVdSamFHRnBiaTV1WlhRNllYQnBPbll4T21ScFpDMTNaV0l0Y21WemIyeDJaWEk2WkROa1pqUXdPV1F0TURFMVlpMDBNV0kwTFdGaE16RXRZbVEzWmpRek9EUXdOVFJtSWl3aWJtRnRaU0k2SWxaaGJHbGtZWFJsWkNCSlJDQlRUQ0o5TENKMllXeHBaRVp5YjIwaU9pSXlNREkyTFRBeExUSXdWREE1T2pRMk9qUXdXaUlzSW1OeVpXUmxiblJwWVd4VGRHRjBkWE1pT25zaWFXUWlPaUpvZEhSd2N6b3ZMM04wWVdkcGJtY3RjM1IxWkdsdkxuWnBaR05vWVdsdUxtNWxkQzkyYVdSamNtVmtaVzUwYVdGc2N5MXpkSFZrYVc4dllYQnBMM1l4TDNOMFlYUjFjeTFzYVhOMExXTnlaV1JsYm5ScFlXd3ZPVEVqT0Rjeklpd2ljM1JoZEhWelRHbHpkRU55WldSbGJuUnBZV3dpT2lKb2RIUndjem92TDNOMFlXZHBibWN0YzNSMVpHbHZMblpwWkdOb1lXbHVMbTVsZEM5MmFXUmpjbVZrWlc1MGFXRnNjeTF6ZEhWa2FXOHZZWEJwTDNZeEwzTjBZWFIxY3kxc2FYTjBMV055WldSbGJuUnBZV3d2T1RFaUxDSnpkR0YwZFhOTWFYTjBTVzVrWlhnaU9pSTROek1pTENKMGVYQmxJam9pVW1WMmIyTmhkR2x2Ymt4cGMzUXlNREl4VTNSaGRIVnpJaXdpYzNSaGRIVnpVSFZ5Y0c5elpTSTZJbkpsZG05allYUnBiMjRpZlgwc0ltNWlaaUk2TVRjMk9Ea3dNalF3TUN3aWFYTnpJam9pWkdsa09uZGxZanB6ZEdGbmFXNW5MblpwWkdOb1lXbHVMbTVsZERwaGNHazZkakU2Wkdsa0xYZGxZaTF5WlhOdmJIWmxjanBrTTJSbU5EQTVaQzB3TVRWaUxUUXhZalF0WVdFek1TMWlaRGRtTkRNNE5EQTFOR1lpTENKcFlYUWlPakUzTmpnNU1ESTBNREFzSW5OMVlpSTZJbVJwWkRwclpYazZlakprYlhwRU9ERmpaMUI0T0ZacmFUZEtZblYxVFcxR1dYSlhVR2RaYjNsMGVXdFZXak5sZVhGb2RERnFPVXRpY1daemNXVm9Ra0pRTjJ0dlFXZGtZMGMyVldWTlNGRm5TbHB3VUVzMFNtbE9WRzFhVldKcU0wcG5aVGczWlVwNGRtbFVhM05tTW1GQmRYVk1WRTE1WVVkdFJWQk9PWFpGVUROUlVsSXpRVTFCVkdWVGExZFpRMnRNYW1WM1VUUkxia3cyT0hkb1NETjFiMnR3WWpkbFZtdGtRbk4yTjNKa1RVMHpWSEpCTW1KT1ZTSXNJbXAwYVNJNkluVnlianAxZFdsa09tTXhPR1ZrWVRRNExUQTVNR0V0TkRrMU9TMWlaalU0TFRKa1pXUmxPRGs0TkdOaFl5SjkueEhjYjlrTmVnQmFhaXNEd0dDRVBaMVRLS3NhY3BCd3pPMjRfQWdyOEJRblkzamY1eGNpYnlXam16SW5RMXVnMW40S29uOFdQN2loZGpocFdBQi1JSHcifSwidmFsaWRGcm9tIjoiMjAyNi0wMS0yMFQwOTo0Njo0MFoiLCJjcmVkZW50aWFsU3RhdHVzIjp7ImlkIjoiaHR0cHM6Ly9zdGFnaW5nLXN0dWRpby52aWRjaGFpbi5uZXQvdmlkY3JlZGVudGlhbHMtc3R1ZGlvL2FwaS92MS9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzkxIzg3MyIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiaHR0cHM6Ly9zdGFnaW5nLXN0dWRpby52aWRjaGFpbi5uZXQvdmlkY3JlZGVudGlhbHMtc3R1ZGlvL2FwaS92MS9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzkxIiwic3RhdHVzTGlzdEluZGV4IjoiODczIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMVN0YXR1cyIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIn19XX19.mI6FNdIR5BtriTOLXd-Iw2AhpWnnIRhFpQB_v1xCDXRCnDzMDcf4miyAqbWS1WEIlhqOMxiiREtdr9rc812MFQ', }, }, ], }; const dcqlQuery = { credentials: [ { id: 'query_0', format: 'ldp_vc', meta: { type_values: [['EmailCredential']], }, }, ], }; jest .spyOn(VerifiablePresentationValidator.prototype, 'validate') .mockResolvedValue({ valid: true }); const validationResult = await validateDcqlVp( presentation, 'https://staging-studio.vidchain.net/vidcredentials-studio/oidc4vc/v1/verifier/5417af65-6058-4ab4-a891-d0a00353e847', { dcqlQuery }, ); expect(validationResult.valid).toBeTruthy(); expect( jest.spyOn(VerifiablePresentationValidator.prototype, 'validate').mock .calls.length, ).toEqual(1); }); }); }); describe('validate a credential index from a credential revocation status', () => { it('check a valid credential with jwt format', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiI0dqZmZCYlNiaXlxOC1aTTRRTERyQ2czYTRya1VoWDVWa2RHVjh1Y1pTS0UifQ.eyJqdGkiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODciLCJzdWIiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODcjbGlzdCIsImlzcyI6ImRpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiIiwibmJmIjoxNzEyNTM0NTc1LCJpYXQiOjE3MTI1MzQ1NzUsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly93M2lkLm9yZy92Yy9zdGF0dXMtbGlzdC8yMDIxL3YxIl0sImlkIjoiaHR0cHM6Ly9hcGktY29uZm9ybWFuY2UuZWJzaS5ldS90cnVzdGVkLWlzc3VlcnMtcmVnaXN0cnkvdjUvaXNzdWVycy9kaWQ6ZWJzaTp6dVdkQjlWWVRnN0hORjlNN1Jnc2lzYi9wcm94aWVzLzB4NDU3MDI0MDVlM2EyMTYwMDBjMTczMzU0YTc4NmY1ZDM5MWU5OWIyZmQ0MjNjYWE4MDMzNDQ4YWFlYjhmNjY1Zi9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzg3IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN0YXR1c0xpc3QyMDIxQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBdHRlc3RhdGlvbiJdLCJpc3N1ZXIiOiJkaWQ6ZWJzaTp6dVdkQjlWWVRnN0hORjlNN1Jnc2lzYiIsImlzc3VlZCI6IjIwMjQtMDQtMDhUMDA6MDI6NTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODcjbGlzdCIsInR5cGUiOiJTdGF0dXNMaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiSDRzSUFBQUFBQUFBRSszQk1RRUFBQWpBb0VXeGYwb1BRL2dBZFNZQUFBQUFBQUFBQUFBQUFBQUFBQURneXdJWGIvN2FBRUFBQUE9PSIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjQtMDQtMDhUMDA6MDI6NTVaIiwidmFsaWRGcm9tIjoiMjAyNC0wNC0wOFQwMDowMjo1NVoiLCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9hcGktcGlsb3QuZWJzaS5ldS90cnVzdGVkLXNjaGVtYXMtcmVnaXN0cnkvdjMvc2NoZW1hcy96NldXTlZHWmtZQ015VDVZaWZNU2JCeEo1cXJSWTZHVDNQcU5CaDZTYk1RcFciLCJ0eXBlIjoiRnVsbEpzb25TY2hlbWFWYWxpZGF0b3IyMDIxIn19fQ.A8zw4p6xoT-zw1LQJw4HOQE0Z-Eg4V8TewpJx6Dfg6XqehSnCkeZbhFZ6zMD7YWJ3btyiluh7-0K5ewV7MYKVg'; const { revoked } = checkRevocationStatus(1, credential); expect(revoked).toBeFalsy(); }); it('check a revoked credential with jwt format', async () => { const credential = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiI0dqZmZCYlNiaXlxOC1aTTRRTERyQ2czYTRya1VoWDVWa2RHVjh1Y1pTS0UifQ.eyJqdGkiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODciLCJzdWIiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODcjbGlzdCIsImlzcyI6ImRpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiIiwibmJmIjoxNzEyNTM0NTc1LCJpYXQiOjE3MTI1MzQ1NzUsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly93M2lkLm9yZy92Yy9zdGF0dXMtbGlzdC8yMDIxL3YxIl0sImlkIjoiaHR0cHM6Ly9hcGktY29uZm9ybWFuY2UuZWJzaS5ldS90cnVzdGVkLWlzc3VlcnMtcmVnaXN0cnkvdjUvaXNzdWVycy9kaWQ6ZWJzaTp6dVdkQjlWWVRnN0hORjlNN1Jnc2lzYi9wcm94aWVzLzB4NDU3MDI0MDVlM2EyMTYwMDBjMTczMzU0YTc4NmY1ZDM5MWU5OWIyZmQ0MjNjYWE4MDMzNDQ4YWFlYjhmNjY1Zi9zdGF0dXMtbGlzdC1jcmVkZW50aWFsLzg3IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlN0YXR1c0xpc3QyMDIxQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVBdHRlc3RhdGlvbiJdLCJpc3N1ZXIiOiJkaWQ6ZWJzaTp6dVdkQjlWWVRnN0hORjlNN1Jnc2lzYiIsImlzc3VlZCI6IjIwMjQtMDQtMDhUMDA6MDI6NTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL2FwaS1jb25mb3JtYW5jZS5lYnNpLmV1L3RydXN0ZWQtaXNzdWVycy1yZWdpc3RyeS92NS9pc3N1ZXJzL2RpZDplYnNpOnp1V2RCOVZZVGc3SE5GOU03UmdzaXNiL3Byb3hpZXMvMHg0NTcwMjQwNWUzYTIxNjAwMGMxNzMzNTRhNzg2ZjVkMzkxZTk5YjJmZDQyM2NhYTgwMzM0NDhhYWViOGY2NjVmL3N0YXR1cy1saXN0LWNyZWRlbnRpYWwvODcjbGlzdCIsInR5cGUiOiJTdGF0dXNMaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiSDRzSUFBQUFBQUFBRSszQk1RRUFBQWpBb0VXeGYwb1BRL2dBZFNZQUFBQUFBQUFBQUFBQUFBQUFBQURneXdJWGIvN2FBRUFBQUE9PSIsInN0YXR1c1B1cnBvc2UiOiJyZXZvY2F0aW9uIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjQtMDQtMDhUMDA6MDI6NTVaIiwidmFsaWRGcm9tIjoiMjAyNC0wNC0wOFQwMDowMjo1NVoiLCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9hcGktcGlsb3QuZWJzaS5ldS90cnVzdGVkLXNjaGVtYXMtcmVnaXN0cnkvdjMvc2NoZW1hcy96NldXTlZHWmtZQ015VDVZaWZNU2JCeEo1cXJSWTZHVDNQcU5CaDZTYk1RcFciLCJ0eXBlIjoiRnVsbEpzb25TY2hlbWFWYWxpZGF0b3IyMDIxIn19fQ.A8zw4p6xoT-zw1LQJw4HOQE0Z-Eg4V8TewpJx6Dfg6XqehSnCkeZbhFZ6zMD7YWJ3btyiluh7-0K5ewV7MYKVg'; const { revoked } = checkRevocationStatus(66, credential); expect(revoked).toBeTruthy(); }); it('check a valid credential with json format', async () => { const credential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-status-list-2021/v1', ], credentialSubject: { encodedList: 'eJztzEERAAAMAqBK2r/cQvjbQQASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Il2HQ5dogXT', id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', type: 'RevocationList2021', }, id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', issuanceDate: '2024-03-12T11:54:46.000Z', issuer: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f', proof: { created: '2024-03-12T11:54:46.000Z', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNpZC5vcmcvdmMtc3RhdHVzLWxpc3QtMjAyMS92MSJdLCJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvOTEiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiU3RhdHVzTGlzdDIwMjFDcmVkZW50aWFsIl0sImlzc3VlciI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwiaXNzdWVkIjoiMjAyNC0wMy0xMlQxMTo1NDo0NC4yOTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzkxIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiZUp6dHpqRUJBQUFJQTZCS3MzODVFK3pWQnhLUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNVjhCODR0WGhFRjBnPT0ifX0sImlhdCI6MTcxMDI0NDQ4NiwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYifQ.5hTeUpRDzpQuWJDqvvhLgk1GWyopmCBc_Xa1J8GWvJBm8SMyeUTmaq_seZqn0YYkY-fJX3C2ez4zu6g9B6aaOg', proofPurpose: 'assertionMethod', type: 'JsonWebSignature2020', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f#key-0', }, type: ['VerifiableCredential', 'StatusList2021Credential'], }; const { revoked } = checkRevocationStatus(66, credential); expect(revoked).toBeFalsy(); }); it('check a revoked credential with json format', async () => { const credential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-status-list-2021/v1', ], credentialSubject: { encodedList: 'eJztzEERAAAMAqBK2r/cQvjbQQASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Il2HQ5dogXT', id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', type: 'RevocationList2021', }, id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', issuanceDate: '2024-03-12T11:54:46.000Z', issuer: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f', proof: { created: '2024-03-12T11:54:46.000Z', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNpZC5vcmcvdmMtc3RhdHVzLWxpc3QtMjAyMS92MSJdLCJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvOTEiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiU3RhdHVzTGlzdDIwMjFDcmVkZW50aWFsIl0sImlzc3VlciI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwiaXNzdWVkIjoiMjAyNC0wMy0xMlQxMTo1NDo0NC4yOTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzkxIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiZUp6dHpqRUJBQUFJQTZCS3MzODVFK3pWQnhLUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNVjhCODR0WGhFRjBnPT0ifX0sImlhdCI6MTcxMDI0NDQ4NiwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYifQ.5hTeUpRDzpQuWJDqvvhLgk1GWyopmCBc_Xa1J8GWvJBm8SMyeUTmaq_seZqn0YYkY-fJX3C2ez4zu6g9B6aaOg', proofPurpose: 'assertionMethod', type: 'JsonWebSignature2020', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f#key-0', }, type: ['VerifiableCredential', 'StatusList2021Credential'], }; const { revoked } = checkRevocationStatus(64, credential); expect(revoked).toBeTruthy(); }); it('raise an error if the type is not supported', async () => { const credential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-status-list-2021/v1', ], credentialSubject: { encodedList: 'eJztzEERAAAMAqBK2r/cQvjbQQASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Il2HQ5dogXT', id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', type: 'WrongType', }, id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', issuanceDate: '2024-03-12T11:54:46.000Z', issuer: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f', proof: { created: '2024-03-12T11:54:46.000Z', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNpZC5vcmcvdmMtc3RhdHVzLWxpc3QtMjAyMS92MSJdLCJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvOTEiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiU3RhdHVzTGlzdDIwMjFDcmVkZW50aWFsIl0sImlzc3VlciI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwiaXNzdWVkIjoiMjAyNC0wMy0xMlQxMTo1NDo0NC4yOTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzkxIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiZUp6dHpqRUJBQUFJQTZCS3MzODVFK3pWQnhLUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNVjhCODR0WGhFRjBnPT0ifX0sImlhdCI6MTcxMDI0NDQ4NiwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYifQ.5hTeUpRDzpQuWJDqvvhLgk1GWyopmCBc_Xa1J8GWvJBm8SMyeUTmaq_seZqn0YYkY-fJX3C2ez4zu6g9B6aaOg', proofPurpose: 'assertionMethod', type: 'JsonWebSignature2020', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f#key-0', }, type: ['VerifiableCredential', 'StatusList2021Credential'], }; const validationResult = checkRevocationStatus(66, credential); expect(validationResult.revoked).toBeFalsy(); expect(validationResult.message).toBe( 'StatusListType not supported: WrongType', ); }); it('raise an error if the jwt credential is not well formatted', async () => { const credential = 'wrongJWT'; const validationResult = checkRevocationStatus(66, credential); expect(validationResult.revoked).toBeFalsy(); expect(validationResult.message).toBe( 'Invalid Token or Protected Header formatting', ); }); it('raise an error if the json credential is not well formatted', async () => { const credential = { '@context': [ 'https://www.w3.org/2018/credentials/v1', 'https://w3id.org/vc-status-list-2021/v1', ], credentialSubject: { type: 'WrongType', }, id: 'https://staging.vidchain.net/api/v1/revocation/status-list/91', issuanceDate: '2024-03-12T11:54:46.000Z', issuer: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f', proof: { created: '2024-03-12T11:54:46.000Z', jws: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmI2tleS0wIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNpZC5vcmcvdmMtc3RhdHVzLWxpc3QtMjAyMS92MSJdLCJpZCI6Imh0dHBzOi8vc3RhZ2luZy52aWRjaGFpbi5uZXQvYXBpL3YxL3Jldm9jYXRpb24vc3RhdHVzLWxpc3QvOTEiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiU3RhdHVzTGlzdDIwMjFDcmVkZW50aWFsIl0sImlzc3VlciI6ImRpZDp3ZWI6c3RhZ2luZy52aWRjaGFpbi5uZXQ6YXBpOnYxOmRpZC13ZWItcmVzb2x2ZXI6ZDNkZjQwOWQtMDE1Yi00MWI0LWFhMzEtYmQ3ZjQzODQwNTRmIiwiaXNzdWVkIjoiMjAyNC0wMy0xMlQxMTo1NDo0NC4yOTVaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJodHRwczovL3N0YWdpbmcudmlkY2hhaW4ubmV0L2FwaS92MS9yZXZvY2F0aW9uL3N0YXR1cy1saXN0LzkxIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMSIsImVuY29kZWRMaXN0IjoiZUp6dHpqRUJBQUFJQTZCS3MzODVFK3pWQnhLUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNVjhCODR0WGhFRjBnPT0ifX0sImlhdCI6MTcxMDI0NDQ4NiwiaXNzIjoiZGlkOndlYjpzdGFnaW5nLnZpZGNoYWluLm5ldDphcGk6djE6ZGlkLXdlYi1yZXNvbHZlcjpkM2RmNDA5ZC0wMTViLTQxYjQtYWEzMS1iZDdmNDM4NDA1NGYifQ.5hTeUpRDzpQuWJDqvvhLgk1GWyopmCBc_Xa1J8GWvJBm8SMyeUTmaq_seZqn0YYkY-fJX3C2ez4zu6g9B6aaOg', proofPurpose: 'assertionMethod', type: 'JsonWebSignature2020', verificationMethod: 'did:web:staging.vidchain.net:api:v1:did-web-resolver:d3df409d-015b-41b4-aa31-bd7f4384054f#key-0', }, type: ['VerifiableCredential', 'StatusList2021Credential'], }; const validationResult = checkRevocationStatus(66, credential); expect(validationResult.revoked).toBeFalsy(); expect(validationResult.message).toBe( 'StatusListType not supported: WrongType', ); }); }); });