diff --git a/lib/evaluation/evaluationClientWrapper.ts b/lib/evaluation/evaluationClientWrapper.ts index dd3f0ef4..17358770 100644 --- a/lib/evaluation/evaluationClientWrapper.ts +++ b/lib/evaluation/evaluationClientWrapper.ts @@ -970,7 +970,9 @@ export class EvaluationClientWrapper { if (foundIndex === -1) { throw new Error('index is not right'); } - selectResults.vcIndexes?.push(foundIndex); + selectResults.vcIndexes + ? !selectResults.vcIndexes.includes(foundIndex) && selectResults.vcIndexes.push(foundIndex) + : (selectResults.vcIndexes = [foundIndex]); }); } } diff --git a/test/PEX.spec.ts b/test/PEX.spec.ts index 52337f1b..c0f3307f 100644 --- a/test/PEX.spec.ts +++ b/test/PEX.spec.ts @@ -8,11 +8,12 @@ import { IProofType, IVerifiableCredential, IVerifiablePresentation, + OriginalVerifiableCredential, WrappedVerifiablePresentation, WrappedW3CVerifiableCredential, } from '@sphereon/ssi-types'; -import { PEX, PEXv2, Status, Validated } from '../lib'; +import { IPresentationDefinition, PEX, PEXv2, Status, Validated } from '../lib'; import { PresentationEvaluationResults } from '../lib/evaluation/core'; import { PresentationSubmissionLocation, VerifiablePresentationResult } from '../lib/signing/types'; import { SSITypesBuilder } from '../lib/types'; @@ -1184,4 +1185,34 @@ describe('evaluate', () => { }, ]); }); + + it('should map the sd-jwt credential correctly with the indices of selecFrom result', () => { + const sdJwt: OriginalVerifiableCredential = + 'eyJ4NWMiOlsiTUlJQ2REQ0NBaHVnQXdJQkFnSUJBakFLQmdncWhrak9QUVFEQWpDQmlERUxNQWtHQTFVRUJoTUNSRVV4RHpBTkJnTlZCQWNNQmtKbGNteHBiakVkTUJzR0ExVUVDZ3dVUW5WdVpHVnpaSEoxWTJ0bGNtVnBJRWR0WWtneEVUQVBCZ05WQkFzTUNGUWdRMU1nU1VSRk1UWXdOQVlEVlFRRERDMVRVRkpKVGtRZ1JuVnVhMlVnUlZWRVNTQlhZV3hzWlhRZ1VISnZkRzkwZVhCbElFbHpjM1ZwYm1jZ1EwRXdIaGNOTWpRd05UTXhNRGd4TXpFM1doY05NalV3TnpBMU1EZ3hNekUzV2pCc01Rc3dDUVlEVlFRR0V3SkVSVEVkTUJzR0ExVUVDZ3dVUW5WdVpHVnpaSEoxWTJ0bGNtVnBJRWR0WWtneENqQUlCZ05WQkFzTUFVa3hNakF3QmdOVkJBTU1LVk5RVWtsT1JDQkdkVzVyWlNCRlZVUkpJRmRoYkd4bGRDQlFjbTkwYjNSNWNHVWdTWE56ZFdWeU1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRU9GQnE0WU1LZzR3NWZUaWZzeXR3QnVKZi83RTdWaFJQWGlObTUyUzNxMUVUSWdCZFh5REsza1Z4R3hnZUhQaXZMUDN1dU12UzZpREVjN3FNeG12ZHVLT0JrRENCalRBZEJnTlZIUTRFRmdRVWlQaENrTEVyRFhQTFcyL0owV1ZlZ2h5dyttSXdEQVlEVlIwVEFRSC9CQUl3QURBT0JnTlZIUThCQWY4RUJBTUNCNEF3TFFZRFZSMFJCQ1l3SklJaVpHVnRieTV3YVdRdGFYTnpkV1Z5TG1KMWJtUmxjMlJ5ZFdOclpYSmxhUzVrWlRBZkJnTlZIU01FR0RBV2dCVFVWaGpBaVRqb0RsaUVHTWwyWXIrcnU4V1F2akFLQmdncWhrak9QUVFEQWdOSEFEQkVBaUFiZjVUemtjUXpoZldvSW95aTFWTjdkOEk5QnNGS20xTVdsdVJwaDJieUdRSWdLWWtkck5mMnhYUGpWU2JqVy9VLzVTNXZBRUM1WHhjT2FudXNPQnJvQmJVPSIsIk1JSUNlVENDQWlDZ0F3SUJBZ0lVQjVFOVFWWnRtVVljRHRDaktCL0gzVlF2NzJnd0NnWUlLb1pJemowRUF3SXdnWWd4Q3pBSkJnTlZCQVlUQWtSRk1ROHdEUVlEVlFRSERBWkNaWEpzYVc0eEhUQWJCZ05WQkFvTUZFSjFibVJsYzJSeWRXTnJaWEpsYVNCSGJXSklNUkV3RHdZRFZRUUxEQWhVSUVOVElFbEVSVEUyTURRR0ExVUVBd3d0VTFCU1NVNUVJRVoxYm10bElFVlZSRWtnVjJGc2JHVjBJRkJ5YjNSdmRIbHdaU0JKYzNOMWFXNW5JRU5CTUI0WERUSTBNRFV6TVRBMk5EZ3dPVm9YRFRNME1EVXlPVEEyTkRnd09Wb3dnWWd4Q3pBSkJnTlZCQVlUQWtSRk1ROHdEUVlEVlFRSERBWkNaWEpzYVc0eEhUQWJCZ05WQkFvTUZFSjFibVJsYzJSeWRXTnJaWEpsYVNCSGJXSklNUkV3RHdZRFZRUUxEQWhVSUVOVElFbEVSVEUyTURRR0ExVUVBd3d0VTFCU1NVNUVJRVoxYm10bElFVlZSRWtnVjJGc2JHVjBJRkJ5YjNSdmRIbHdaU0JKYzNOMWFXNW5JRU5CTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFWUd6ZHdGRG5jNytLbjVpYkF2Q09NOGtlNzdWUXhxZk1jd1pMOElhSUErV0NST2NDZm1ZL2dpSDkycU1ydTVwL2t5T2l2RTBSQy9JYmRNT052RG9VeWFObU1HUXdIUVlEVlIwT0JCWUVGTlJXR01DSk9PZ09XSVFZeVhaaXY2dTd4WkMrTUI4R0ExVWRJd1FZTUJhQUZOUldHTUNKT09nT1dJUVl5WFppdjZ1N3haQytNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTBjQU1FUUNJR0VtN3drWktIdC9hdGI0TWRGblhXNnlybndNVVQydTEzNmdkdGwxMFk2aEFpQnVURnF2Vll0aDFyYnh6Q1AweFdaSG1RSzlrVnl4bjhHUGZYMjdFSXp6c3c9PSJdLCJraWQiOiJNSUdVTUlHT3BJR0xNSUdJTVFzd0NRWURWUVFHRXdKRVJURVBNQTBHQTFVRUJ3d0dRbVZ5YkdsdU1SMHdHd1lEVlFRS0RCUkNkVzVrWlhOa2NuVmphMlZ5WldrZ1IyMWlTREVSTUE4R0ExVUVDd3dJVkNCRFV5QkpSRVV4TmpBMEJnTlZCQU1NTFZOUVVrbE9SQ0JHZFc1clpTQkZWVVJKSUZkaGJHeGxkQ0JRY205MGIzUjVjR1VnU1hOemRXbHVaeUJEUVFJQkFnPT0iLCJ0eXAiOiJ2YytzZC1qd3QiLCJhbGciOiJFUzI1NiJ9.eyJwbGFjZV9vZl9iaXJ0aCI6eyJfc2QiOlsiODhTejY5dlo1ZzFXdUZFUUpyQzBqY0c2WEVoa1Mwd1ppR0NGQ29xU3FzOCJdfSwiX3NkIjpbIjJZemluX0V0WkVSellUQlVhUW1ZbEpxd3VyUEt3SGJkaW9PN1o5QmF5N0UiLCJFdEFFdmoyb2FIQzFReEtOalZEWkxqeWtINVhYWGY1d25tRGlqMDJ0NnM4IiwiTEJ3UjlrdE1tdWVQd3A4NmNVM2hIMV9MNTNCY0dNWjl6QmU4RE9jZ2pTOCIsIlk2Ulhac202blg0WlZYa2dJQXR2UTFMR19RWFRIT05kamJIYzB6Y3RFYkUiLCJoM0Vvd2VtNmtFTnNKZ0VudWFOQVZEYjYwXzczSVprX28wTHpQTGd6Q2pRIiwidHdnUXVZMVl1d2U1dDg0Y2wtaHphN2xWV0JHTlFFOWNGYlF4cWZxQlBWMCIsInpuSG5JV1F2a0d5cEtxajNfd3R2SmZCa0FZQmM3N1M1VTNVNGw4TG1nZW8iXSwiYWRkcmVzcyI6eyJfc2QiOlsiT05GYkVTTjU3ZjgzUXNEUWlyLWF2MVdUQ1piSFg0a3BiWmltZFFBRmx3TSIsIlF5UG5DQnlwZjhCa0lmejNzRVk4MEIwblZKeTNCWlVLcmxpSnB6YV83Z0kiLCJ0STdFNS1mNVNOdngzcDUzWVZOWTRPSmRUQkJfLWZzQ1dNZUFOdFR1SUtVIiwid21rajBYc1RQMEFJeWtmcjlMZUV0bVRqTkx6S2JWYllUTzhTWFVCOEY0byJdfSwiaXNzdWluZ19jb3VudHJ5IjoiREUiLCJ2Y3QiOiJ1cm46ZXUuZXVyb3BhLmVjLmV1ZGk6cGlkOjEiLCJpc3N1aW5nX2F1dGhvcml0eSI6IkRFIiwiX3NkX2FsZyI6InNoYS0yNTYiLCJpc3MiOiJodHRwczovL2RlbW8ucGlkLWlzc3Vlci5idW5kZXNkcnVja2VyZWkuZGUvYyIsImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsImtpZCI6IkhOa3V2RDNmMTMzcG9uZGRJcmZYbmZxQ0U4T1VBRzBrcFNKZHlzUFZMUU0iLCJ4IjoiVDVWWHYtUUpmMzhBblhkOTZxcS1qNmZjSVd3NXZjTXpqNUllRWFMQm9qSSIsInkiOiJyandIN0I5RmVXc1VoWURmTWpaeDVCYWFLalVCWWdTbU1vQTM4S3ZIWkRrIiwiYWxnIjoiRVMyNTYifX0sImV4cCI6MTcyNjA3ODAzOSwiaWF0IjoxNzI0ODY4NDM5LCJhZ2VfZXF1YWxfb3Jfb3ZlciI6eyJfc2QiOlsiR000blpmaGJtWEVKVnFrUGh0T0Q2NS1BakNUNXBMQ1czZTZPN2MxMDRObyIsIk1iUWZPM3VmV3dKd19EM01oMG5xeXZZUHQtdGZxRUd1X3B0R3dBUzhYSFkiLCJQeVVaX1hmRV9keEZNRV9YdjBTR0ljRnRFY0ZRbHA1Mld6eVJCeWxldjY0IiwiWDVMMkJCUlhMbUdDdHRVckFqWF9LWGdEdzBpNlBmUFRhOUhBdVJuNy1GNCIsImE4RGxyMnYyZWZQZGxkNnlrMXN5dlJHTjFUajg3clZ5X3FjOUY1MjlPenMiLCJ4SmdyV2ZMaVlwbmFQN0JRMjNmVmJ5S1FXNlVnTTRJTnd0M2I3SFY2RmZZIl19fQ.PxjYlyQJYu5tYIwOu-VPsIBFXB1z-WI7_QSRs8mPWeLlPfJ8POs23vZtrcBD-lXFQm38z4QRG9zw_yKYF0qDLw~WyJFaWozRW9QUTMwZHV1N2ZoQTYxODJ3IiwiZmFtaWx5X25hbWUiLCJNVVNURVJNQU5OIl0~WyJ3NUsybVhOSVBBa1NoNXBjUjlFalZ3IiwiZ2l2ZW5fbmFtZSIsIkVSSUtBIl0~WyJNOXlQZzBvaWQ0eHlHN25zRU9LdV9RIiwiYmlydGhkYXRlIiwiMTk4NC0wMS0yNiJd~WyJYd2dleGd6dmh6bDY5U2tONTQ5R293IiwiYWdlX2JpcnRoX3llYXIiLDE5ODRd~WyJZMXZqekg4QWZZNk1sak1xT1lmS1F3IiwiYWdlX2luX3llYXJzIiw0MF0~WyJySlU1SHhUQ0VvLW0yMFBDNGtPblp3IiwiYmlydGhfZmFtaWx5X25hbWUiLCJHQUJMRVIiXQ~WyJDMm1wSzZpT0RpZ0ZQNkh2OE1NTDJRIiwibmF0aW9uYWxpdGllcyIsWyJERSJdXQ~WyJRdVc4Uko3eWQzZ2FKaGZFby1nUmNBIiwiMTIiLHRydWVd~WyJFQUJGT09LazRBYkZyTFNrN0NVTjlBIiwiMTQiLHRydWVd~WyJJaGR2cUxNLWVzZGdjQkx6a0ZVQ3B3IiwiMTYiLHRydWVd~WyJtc0did3NsY01Sem5jV19DVDFULW9BIiwiMTgiLHRydWVd~WyI1SU1uR1FzRmZRTkNtT0l6ZjhocVJ3IiwiMjEiLHRydWVd~WyJud0F0QzlZQ2VMVHdSakVNMHU2VkRnIiwiNjUiLGZhbHNlXQ~WyJCSmRmOGVselViNVdQMVRzV0FzeU9RIiwibG9jYWxpdHkiLCJCRVJMSU4iXQ~WyJOWFFQS1VVTWdyUzJ4WmFxemJrckZBIiwibG9jYWxpdHkiLCJLw5ZMTiJd~WyJyUnh3M09hcF9lekJrdm9mNGIzVUh3IiwiY291bnRyeSIsIkRFIl0~WyI4c3QyanlNVy1hcGFrQ0V6NTQ4NklRIiwicG9zdGFsX2NvZGUiLCI1MTE0NyJd~WyJIZ2xRQ3d4eWQwb0dyWWdUQXRxTzBRIiwic3RyZWV0X2FkZHJlc3MiLCJIRUlERVNUUkFTU0UgMTciXQ~'; + const vcs: IVerifiableCredential[] = getFileAsJson('test/dif_pe_examples/vp/vp_general.json').verifiableCredential; + const pd: IPresentationDefinition = { + id: 'pid-sdjwt', + input_descriptors: [ + { + constraints: { + fields: [ + { + path: ['$.issuing_country'], + }, + ], + }, + id: '6aa0ac61-6535-46c2-924d-65fccfe65f4f', + name: 'Name and age', + purpose: 'We need your age.', + }, + ], + name: 'Age verification', + purpose: 'We need to determine your age.', + }; + const pex: PEX = new PEX({ hasher }); + + const result = pex.selectFrom(pd, [...vcs, sdJwt]); + expect(result.vcIndexes?.length).toEqual(1); + expect(result.vcIndexes?.[0]).toEqual(3); + }); }); diff --git a/test/evaluation/selectFrom.spec.ts b/test/evaluation/selectFrom.spec.ts index 26bf1fc9..7201a16e 100644 --- a/test/evaluation/selectFrom.spec.ts +++ b/test/evaluation/selectFrom.spec.ts @@ -114,6 +114,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); }); @@ -203,6 +204,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); }); @@ -292,6 +294,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); }); @@ -406,6 +409,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); }); @@ -521,6 +525,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); }); @@ -636,6 +641,7 @@ describe('selectFrom tests', () => { }, ], warnings: [], + vcIndexes: [0, 2], }); });