Skip to content

Commit e23285f

Browse files
authored
Merge pull request #189 from Sphereon-Opensource/feature/SPHEREON-1182
feature/SPHEREON-1182
2 parents 4a69b80 + 21ff6c4 commit e23285f

File tree

2 files changed

+215
-0
lines changed

2 files changed

+215
-0
lines changed

test/SdJwt.spec.ts

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ const decodedSdJwtVc = {
8282
],
8383
} satisfies SdJwtDecodedVerifiableCredential;
8484

85+
const decodedSdJwtVcNewPid = {
86+
compactSdJwtVc:
87+
'eyJ0eXAiOiJ2YytzZC1qd3QiLCJraWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lVemR3V0d0S1RVaGpWR0l5ZG5CU2RIZzVhVzFFZURCNFUzSm5WSGRMWDFGWU1qUldOMGRUV1U5Tk1DSXNJbmtpT2lKM1VYWjJiM054YW1Ga1ltOTVhbWhzWDFCb1JtTnlkRGQzWlVsSU5EaDZaVTl2VFcxcWJpMHljbEJqSW4wIzAiLCJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2ljVU50Y0dsNWFtOVlVblkxUm1WalgwRnhPR0Z5VUU5bVRrdEZSSFl5U0ZkSFUyRm1UVGR5TkVGSGJ5SXNJbmtpT2lKc1ZscERZVGhTZHpscFkyRnVhVTlYU2tVeWVHTmFVM1J1WVhKdVZYSklhek5qVmxwUFpubFFiVlE0SW4wIzAiLCJpc3MiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lVemR3V0d0S1RVaGpWR0l5ZG5CU2RIZzVhVzFFZURCNFUzSm5WSGRMWDFGWU1qUldOMGRUV1U5Tk1DSXNJbmtpT2lKM1VYWjJiM054YW1Ga1ltOTVhbWhzWDFCb1JtTnlkRGQzWlVsSU5EaDZaVTl2VFcxcWJpMHljbEJqSW4wIzAiLCJpYXQiOjE3MzMxNTU0OTMsInZjdCI6Imh0dHBzOi8vZXhhbXBsZS5ibWkuYnVuZC5kZS9jcmVkZW50aWFsL3BpZC8xLjAiLCJfc2QiOlsiOEZDelV2VkhOVDA1WmdDRXptdnNRc0ZLekVVTVZWLW9QMUJDWVkwakxsMCIsIkVuYlRUbFJseUNRdXZ6NkhHZm0yZmtmT3Z2NDMzSE9CcE9ub3ViZzBVeVUiLCJRTEhJZnNvdXR6Xy1hdW96dmpnRUQ2ZUpQV1hVaWZiMkJENDJUQXpFaGlFIiwiZV9yTDlqQXBfRVJrb21OZl9PRGNjdFNBSVREZWNCUWFMRVJyRzVFcFRXQSIsIm00eTR5RVd1cjhRdkdMQ0ROQ3hVY0RwdDc4NDMxZDU0czVzeEUxUkpGRlEiLCJ1cG9Bc3B5Zm11RHhzX3RNXzdmZGFxZVJYMWhGc3FqcVlHSnFfZ3VjYW80Il0sIl9zZF9hbGciOiJTSEEtMjU2In0.PFI-nq8CildqIDp-oKYWaHAnpRK5bRGS4tM6aqnyvNtVZqEkjB3TpxJqtlcPDmynMXsf-ZKxdFkWBhkqMakLHw~WyI4NmYxYWYyOC05MWVkLTRkZDktYWE0Yy0xNTdmODYzNDU4Y2QiLCJnaXZlbl9uYW1lIiwiSm9obiJd~WyIxNDRiYjY5NS1hZGFhLTQyNDMtODY3NS1mOWY3YTA4YzczMjAiLCJmYW1pbHlfbmFtZSIsIkRvZSJd~WyJjNjg2NmU4Mi1kZGJlLTQ0YzMtYjliZS0zOThlOTNkMTA4Y2MiLCJlbWFpbCIsImpvaG5kZW9AZXhhbXBsZS5jb20iXQ~WyI4MTczMjkzNC03ZDMwLTQ4MzAtOWRjMi1hYjgxNjNkMjg4YzciLCJwaG9uZSIsIisxLTIwMi01NTUtMDEwMSJd~WyI5ODQ3OWU1Yi1iOGE0LTRiOTItOTA5Mi1kZjdhNTQ5NGZiMTMiLCJhZGRyZXNzIix7InN0cmVldF9hZGRyZXNzIjoiMTIzIE1haW4gU3QiLCJsb2NhbGl0eSI6IkFueXRvd24iLCJyZWdpb24iOiJBbnlzdGF0ZSIsImNvdW50cnkiOiJVUyJ9XQ~WyI0NDQ1ZGYzNi1iN2E2LTQ3Y2QtODZiYS0wMjBmMzQzZDc2NDciLCJiaXJ0aGRhdGUiLCIxOTQwLTAxLTAxIl0~',
88+
};
89+
90+
const decodedSdJwtVcOldPid = {
91+
compactSdJwtVc:
92+
'eyJ0eXAiOiJ2YytzZC1qd3QiLCJraWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lRbE5YUWtFdE5UZHVkeko1TldOMVZsZFdPRjgzUm5aSVozbEpTamQ0TVhCMWRsbzVkMmMyUWpKUlZTSXNJbmtpT2lKNFpUaGZkRXRLY1VKemJ6aHJNRmxDUkhaUFgwOXpkeTFKTVdGcWRVcFFiRU40U2twNGJIWmZRVVJCSW4wIzAiLCJhbGciOiJFUzI1NiJ9.eyJzdWIiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lOMHBVYVRkWlREUXhhRTlXUm5oNWRtcEJjWE0wUVZnMmNsRnRPVzlFZDNoSmNsUkJhSFp2ZEV0WldTSXNJbmtpT2lJMWRrbDFPVzVmTm1JMk1FSjROMlJJU1VveldpMXNlRzh0VFhjelluVlpSV0ZhVjNWRE5XSjNiemRySW4wIzAiLCJpc3MiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lRbE5YUWtFdE5UZHVkeko1TldOMVZsZFdPRjgzUm5aSVozbEpTamQ0TVhCMWRsbzVkMmMyUWpKUlZTSXNJbmtpT2lKNFpUaGZkRXRLY1VKemJ6aHJNRmxDUkhaUFgwOXpkeTFKTVdGcWRVcFFiRU40U2twNGJIWmZRVVJCSW4wIzAiLCJpYXQiOjE3MzMxNTgwODksInZjdCI6InVybjpldS5ldXJvcGEuZWMuZXVkaTpwaWQ6MSIsIl9zZCI6WyIwa0lWQzJOVHZ2eTFnek9QSEpOUk9oSjhmaHB3dEIwWEhBOUVXblFKblVZIiwiRU1UeURmR0xLSjkzV3o1dFp1X1JfckFtM0hnZG81VDBqM01HYmhoZDBjbyIsIkhQNVk4d0RsS0Q5VjhqWVFGZHI0MVh3dWlMLXhxaVZKUmY1ODZzV0tJMDQiLCJYWVFFYzlPZk0weFVyWWJodVl3c1VDWHhBLWtuMnozclc1eko1aVdwekMwIiwiZ2Jfem9TeE1aT2VqdElpZ3FCeTNtemhxUXhYT0FmaUMybFd2ZkdPSi1LbyIsInd2cFctMWRyNV91RVZjTG9Ec3RpRUZPYTRrYi11dVcyaFlmZzdETTNzSWciXSwiX3NkX2FsZyI6IlNIQS0yNTYifQ.pVRW95_MZ7hdgTeXMoL5FqvWRgezKI1cJ-QPfDiUNdeQxl6bS_Vh5jvm4vBgHPgG1srxtNuOKiQshGTM8CAwyg~WyJhM2Q2OWEwMi02N2Y3LTQ4MzUtOWRmZC0yMjUxN2IxZjRiMTIiLCJnaXZlbl9uYW1lIiwiSm9obiJd~WyIxYTFhNTg5Ni01M2EyLTQzY2QtODNhYy1jMGNmODhkZjZmNTEiLCJmYW1pbHlfbmFtZSIsIkRvZSJd~WyJmZDViMTFmNC04ZDllLTQzYmYtYTVkMC04ODE5YTJjYjg2MzEiLCJlbWFpbCIsImpvaG5kZW9AZXhhbXBsZS5jb20iXQ~WyJkY2IwNTJjYS02ZDFiLTQ3NDktODNmYi1lNjkxYzIyZTY2ZjAiLCJwaG9uZSIsIisxLTIwMi01NTUtMDEwMSJd~WyI1MDdjM2MyNi0yZjQxLTQwNWEtOTZkMS1lNTI1ZWM2Y2VjNTQiLCJhZGRyZXNzIix7InN0cmVldF9hZGRyZXNzIjoiMTIzIE1haW4gU3QiLCJsb2NhbGl0eSI6IkFueXRvd24iLCJyZWdpb24iOiJBbnlzdGF0ZSIsImNvdW50cnkiOiJVUyJ9XQ~WyIwNzBlZjYyNy05NTAyLTRkMTYtYTNjYi1lNTAwZTViOTk0YWIiLCJiaXJ0aGRhdGUiLCIxOTQwLTAxLTAxIl0~',
93+
};
94+
8595
// This is the expected output SD-JWT based on the presentation definition defined below
8696
const decodedSdJwtVcWithDisclosuresRemoved = {
8797
// 3 disclosures not included
@@ -159,6 +169,96 @@ function getPresentationDefinitionV2(): PresentationDefinitionV2 {
159169
};
160170
}
161171

172+
function getPresentationDefinitionV2_with_enum(): PresentationDefinitionV2 {
173+
return {
174+
id: '32f54163-7166-48f1-93d8-ff217bdb0653',
175+
name: 'Conference Entry Requirements',
176+
purpose: 'We can only allow people associated with Washington State business representatives into conference areas',
177+
format: {
178+
'vc+sd-jwt': {},
179+
},
180+
input_descriptors: [
181+
{
182+
id: 'wa_driver_license',
183+
name: 'Washington State Business License',
184+
purpose: 'We can only allow licensed Washington State business representatives into the WA Business Conference',
185+
constraints: {
186+
limit_disclosure: 'required',
187+
fields: [
188+
{
189+
path: ['$.vct'],
190+
filter: {
191+
type: 'string',
192+
enum: ['https://example.bmi.bund.de/credential/pid/1.0', 'urn:eu.europa.ec.eudi:pid:1'],
193+
},
194+
},
195+
],
196+
},
197+
},
198+
],
199+
};
200+
}
201+
202+
function getPresentationDefinitionV2_const_new_pid(): PresentationDefinitionV2 {
203+
return {
204+
id: '32f54163-7166-48f1-93d8-ff217bdb0653',
205+
name: 'Conference Entry Requirements',
206+
purpose: 'We can only allow people associated with Washington State business representatives into conference areas',
207+
format: {
208+
'vc+sd-jwt': {},
209+
},
210+
input_descriptors: [
211+
{
212+
id: 'wa_driver_license',
213+
name: 'Washington State Business License',
214+
purpose: 'We can only allow licensed Washington State business representatives into the WA Business Conference',
215+
constraints: {
216+
limit_disclosure: 'required',
217+
fields: [
218+
{
219+
path: ['$.vct'],
220+
filter: {
221+
type: 'string',
222+
const: 'https://example.bmi.bund.de/credential/pid/1.0',
223+
},
224+
},
225+
],
226+
},
227+
},
228+
],
229+
};
230+
}
231+
232+
function getPresentationDefinitionV2_const_old_pid(): PresentationDefinitionV2 {
233+
return {
234+
id: '32f54163-7166-48f1-93d8-ff217bdb0653',
235+
name: 'Conference Entry Requirements',
236+
purpose: 'We can only allow people associated with Washington State business representatives into conference areas',
237+
format: {
238+
'vc+sd-jwt': {},
239+
},
240+
input_descriptors: [
241+
{
242+
id: 'wa_driver_license',
243+
name: 'Washington State Business License',
244+
purpose: 'We can only allow licensed Washington State business representatives into the WA Business Conference',
245+
constraints: {
246+
limit_disclosure: 'required',
247+
fields: [
248+
{
249+
path: ['$.vct'],
250+
filter: {
251+
type: 'string',
252+
const: 'urn:eu.europa.ec.eudi:pid:1',
253+
},
254+
},
255+
],
256+
},
257+
},
258+
],
259+
};
260+
}
261+
162262
// TODO:
163263
// - evaluateSubmission / submissionFrom
164264
// - correctly set up KB-JWT payload and sign this in the presentation callback
@@ -309,4 +409,64 @@ describe('evaluate', () => {
309409
value: presentationResult.presentationSubmission,
310410
});
311411
});
412+
413+
it('selectFrom with vc+sd-jwt format compact - enum new PID format', async () => {
414+
const result = pex.selectFrom(getPresentationDefinitionV2_with_enum(), [decodedSdJwtVcNewPid.compactSdJwtVc]);
415+
expect(result.errors?.length).toEqual(0);
416+
expect(result.matches).toEqual([
417+
{
418+
name: 'Washington State Business License',
419+
rule: 'all',
420+
vc_path: ['$.verifiableCredential[0]'],
421+
type: SubmissionRequirementMatchType.InputDescriptor,
422+
id: 'wa_driver_license',
423+
},
424+
]);
425+
expect(result.areRequiredCredentialsPresent).toBe('info');
426+
});
427+
428+
it('selectFrom with vc+sd-jwt format compact - enum old PID format', async () => {
429+
const result = pex.selectFrom(getPresentationDefinitionV2_with_enum(), [decodedSdJwtVcOldPid.compactSdJwtVc]);
430+
expect(result.errors?.length).toEqual(0);
431+
expect(result.matches).toEqual([
432+
{
433+
name: 'Washington State Business License',
434+
rule: 'all',
435+
vc_path: ['$.verifiableCredential[0]'],
436+
type: SubmissionRequirementMatchType.InputDescriptor,
437+
id: 'wa_driver_license',
438+
},
439+
]);
440+
expect(result.areRequiredCredentialsPresent).toBe('info');
441+
});
442+
443+
it('selectFrom with vc+sd-jwt format compact - const new PID format', async () => {
444+
const result = pex.selectFrom(getPresentationDefinitionV2_const_new_pid(), [decodedSdJwtVcNewPid.compactSdJwtVc]);
445+
expect(result.errors?.length).toEqual(0);
446+
expect(result.matches).toEqual([
447+
{
448+
name: 'Washington State Business License',
449+
rule: 'all',
450+
vc_path: ['$.verifiableCredential[0]'],
451+
type: SubmissionRequirementMatchType.InputDescriptor,
452+
id: 'wa_driver_license',
453+
},
454+
]);
455+
expect(result.areRequiredCredentialsPresent).toBe('info');
456+
});
457+
458+
it('selectFrom with vc+sd-jwt format compact - const old PID format', async () => {
459+
const result = pex.selectFrom(getPresentationDefinitionV2_const_old_pid(), [decodedSdJwtVcOldPid.compactSdJwtVc]);
460+
expect(result.errors?.length).toEqual(0);
461+
expect(result.matches).toEqual([
462+
{
463+
name: 'Washington State Business License',
464+
rule: 'all',
465+
vc_path: ['$.verifiableCredential[0]'],
466+
type: SubmissionRequirementMatchType.InputDescriptor,
467+
id: 'wa_driver_license',
468+
},
469+
]);
470+
expect(result.areRequiredCredentialsPresent).toBe('info');
471+
});
312472
});

test/resources/pd_enum_values.json

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"presentation_definition": {
3+
"id": "56e001a9-c41f-49c5-9b12-440ad4861f58",
4+
"name": "DIIP v3 compliance",
5+
"purpose": "Prove you're compliant with DIIP v3",
6+
"input_descriptors": [
7+
{
8+
"id": "b2a1f1d3-37ee-4494-98e2-ef9853b28197",
9+
"name": "DIIP v3 compliance",
10+
"purpose": "Prove you're compliant with DIIP v3",
11+
"format": {
12+
"vc+sd-jwt": {}
13+
},
14+
"constraints": {
15+
"limit_disclosure": "preferred",
16+
"fields": [
17+
{
18+
"path": ["$.compliant"],
19+
"name": "compliant",
20+
"filter": {
21+
"type": "boolean",
22+
"enum": [
23+
true,
24+
false
25+
]
26+
}
27+
},
28+
{
29+
"path": ["$.name"],
30+
"name": "name",
31+
"filter": {
32+
"type": "string",
33+
"enum": [
34+
"https://example.bmi.bund.de/credential/pid/1.0",
35+
"urn:eu.europa.ec.eudi:pid:1"
36+
]
37+
}
38+
},
39+
{
40+
"path": ["$.age"],
41+
"name": "age",
42+
"filter": {
43+
"type": "number",
44+
"enum": [
45+
12,
46+
135
47+
]
48+
}
49+
}
50+
]
51+
}
52+
}
53+
]
54+
}
55+
}

0 commit comments

Comments
 (0)