Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
f2ddb14
Validate sd-jwt credentials vct schema
patatoid May 28, 2025
0112bec
split vct schemas automated tests
patatoid May 29, 2025
1583874
validate unknown sd-jwt vcts
patatoid May 30, 2025
15e72df
sd-jwt schema validation tests
patatoid May 29, 2025
21970cb
test sd-jwt schema validation unknown vct
patatoid May 30, 2025
48d7846
use verifySchema opt
patatoid Jun 6, 2025
4fdc62e
WIP
patatoid Jun 19, 2025
3dd76f9
@sd-jwt/sd-jwt-vc vctm integration in SD JWT parser
patatoid Jun 19, 2025
334aa89
Merge branch 'sd-jwt-vct-schema-validation' into sd-jwt-vct-schema-va…
patatoid Jun 24, 2025
818dff1
Better vct verification testing
patatoid Jun 24, 2025
40ce44d
vctm in sd jwt header tests
patatoid Jun 25, 2025
75d914b
Fetch vctm from sd jwt header
patatoid Jun 25, 2025
e33b74d
Add vct#integrity to fixtures
patatoid Jun 26, 2025
d92a634
Merge branch 'sd-jwt-vct-schema-validation' into sd-jwt-vct-schema-va…
patatoid Jun 26, 2025
d8249b0
Merge branch 'upgrade-sd-jwt-vc' into sd-jwt-vct-schema-validation-tests
patatoid Jun 26, 2025
ef7db84
Test SDJWTParser against SD JWT fixtures
patatoid Jun 26, 2025
d3d9648
Prefer tab over spaces for indentation
patatoid Jun 27, 2025
3ddb270
Merge branch 'sd-jwt-vct-schema-validation' into sd-jwt-vct-schema-va…
patatoid Jun 30, 2025
a3b7ea1
Setup Continuous Integration + no expand tabs
patatoid Jun 30, 2025
caec511
SD JWT fixtures with vct as URL
patatoid Jul 3, 2025
d3d068b
Fetch vct from an URL on SD JWT validation
patatoid Jul 3, 2025
bb7bb50
VCT as URL integration tests
patatoid Jul 3, 2025
3f0e5d2
Fix identation
patatoid Jul 3, 2025
a92e647
Merge branch 'sd-jwt-vct-schema-validation' into sd-jwt-vct-schema-va…
patatoid Jul 8, 2025
4f7d31a
Prefer tabs over spaces
patatoid Jul 8, 2025
a8c15ce
SD JWT VC validation return vct schema not found errors
patatoid Jul 22, 2025
0c7f843
SD JWT without vct schema tests
patatoid Jul 22, 2025
420a3b0
Remove yarn frozen lockfile from continuous integration
patatoid Jul 22, 2025
f8a33ca
Fix yarn.lock
patatoid Jul 22, 2025
47dd3ab
Remove node 18 support
patatoid Jul 22, 2025
8d2d443
Merge branch 'master' into sd-jwt-vct-schema-validation-tests
patatoid Sep 24, 2025
18582f0
verify holder cryptographic binding tests
patatoid Sep 24, 2025
1f84f2a
Merge branch 'verify-holder-cryptographic-binding' into sd-jwt-vct-sc…
patatoid Sep 24, 2025
1660779
Fix yarn.lock
patatoid Sep 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: wallet-common tests

on:
push:
branches-ignore:
- 'tmp**'

jobs:
test:
runs-on: ubuntu-latest

strategy:
matrix:
# node-version: ['18.x', '22.x']
node-version: ['22.x']

steps:
- uses: actions/checkout@v4

- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Install dependencies
run: yarn

- name: Run tests
run: yarn vitest
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
},
"dependencies": {
"@auth0/mdl": "^2.2.0",
"@sd-jwt/core": "^0.10.0",
"@sd-jwt/core": "^0.11.0",
"@sd-jwt/sd-jwt-vc": "^0.13.0",
"ajv": "^8.17.1",
"ajv-formats": "^3.0.1",
Expand All @@ -34,6 +34,7 @@
"@sd-jwt/types": "^0.10.0",
"@types/node": "^22.10.10",
"@types/xmldom": "^0.1.34",
"nock": "^14.0.10",
"typescript": "^5.7.3",
"vitest": "^3.2.4",
"xmldom": "^0.6.0"
Expand Down
2 changes: 0 additions & 2 deletions src/credential-parsers/MsoMdocParser.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


import { assert, expect, describe, it } from "vitest";
import { Context } from "../interfaces";
import { MsoMdocParser } from './MsoMdocParser';
Expand Down
35 changes: 27 additions & 8 deletions src/credential-parsers/SDJWTVCParser.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import crypto from "node:crypto";
import { assert, describe, it } from "vitest";
import { SDJWTVCParser } from "./SDJWTVCParser";
import { Context, HttpClient } from "../interfaces";
Expand All @@ -7,6 +8,7 @@ import { defaultHttpClient } from "../defaultHttpClient";
import path from "path";
import { convertDataUriToImage } from '../functions/convertDataUriToImage';
import { CredentialParsingError } from "../error";
import { sdJwtFixture } from '../../test/fixtures'

const rawCredential = `eyJ0eXAiOiJ2YytzZC1qd3QiLCJ2Y3RtIjpbImV5SjJZM1FpT2lKbGRTNWxkWEp2Y0dFdVpXTXVaWFZrYVM1d2FXUXVNU0lzSW01aGJXVWlPaUpXWlhKcFptbGhZbXhsSUVsRUlpd2laR1Z6WTNKcGNIUnBiMjRpT2lKVWFHbHpJR2x6SUdFZ1ZtVnlhV1pwWVdKc1pTQkpSQ0JrYjJOMWJXVnVkQ0JwYzNOMVpXUWdZbmtnZEdobElIZGxiR3dnYTI1dmQyNGdWa2xFSUVsemMzVmxjaUlzSW1ScGMzQnNZWGtpT2x0N0lteGhibWNpT2lKbGJpMVZVeUlzSW01aGJXVWlPaUpXWlhKcFptbGhZbXhsSUVsRUlpd2ljbVZ1WkdWeWFXNW5JanA3SW5OcGJYQnNaU0k2ZXlKc2IyZHZJanA3SW5WeWFTSTZJbWgwZEhBNkx5OTNZV3hzWlhRdFpXNTBaWEp3Y21selpTMTJhV1F0YVhOemRXVnlPamd3TURNdmFXMWhaMlZ6TDJ4dloyOHVjRzVuSWl3aWRYSnBJMmx1ZEdWbmNtbDBlU0k2SW5Ob1lUSTFOaTFoWTJSaE16UXdOR015WTJZME5tUmhNVGt5WTJZeU5EVmpZMk0yWWpreFpXUmpaVGc0TmpreE1qSm1ZVFZoTmpZek5qSTROR1l4WVRZd1ptWmpaRGcySWl3aVlXeDBYM1JsZUhRaU9pSldTVVFnVEc5bmJ5SjlMQ0ppWVdOclozSnZkVzVrWDJOdmJHOXlJam9pSXpSall6TmtaQ0lzSW5SbGVIUmZZMjlzYjNJaU9pSWpSa1pHUmtaR0luMHNJbk4yWjE5MFpXMXdiR0YwWlhNaU9sdDdJblZ5YVNJNkltaDBkSEE2THk5M1lXeHNaWFF0Wlc1MFpYSndjbWx6WlMxMmFXUXRhWE56ZFdWeU9qZ3dNRE12YVcxaFoyVnpMM1JsYlhCc1lYUmxMbk4yWnlKOVhYMTlYU3dpWTJ4aGFXMXpJanBiZXlKd1lYUm9JanBiSW1kcGRtVnVYMjVoYldVaVhTd2laR2x6Y0d4aGVTSTZXM3NpYkdGdVp5STZJbVZ1TFZWVElpd2liR0ZpWld3aU9pSkhhWFpsYmlCT1lXMWxJaXdpWkdWelkzSnBjSFJwYjI0aU9pSlVhR1VnWjJsMlpXNGdibUZ0WlNCdlppQjBhR1VnVmtsRUlHaHZiR1JsY2lKOVhTd2ljM1puWDJsa0lqb2laMmwyWlc1ZmJtRnRaU0o5TEhzaWNHRjBhQ0k2V3lKbVlXMXBiSGxmYm1GdFpTSmRMQ0prYVhOd2JHRjVJanBiZXlKc1lXNW5Jam9pWlc0dFZWTWlMQ0pzWVdKbGJDSTZJa1poYldsc2VTQk9ZVzFsSWl3aVpHVnpZM0pwY0hScGIyNGlPaUpVYUdVZ1ptRnRhV3g1SUc1aGJXVWdiMllnZEdobElGWkpSQ0JvYjJ4a1pYSWlmVjBzSW5OMloxOXBaQ0k2SW1aaGJXbHNlVjl1WVcxbEluMHNleUp3WVhSb0lqcGJJbUpwY25Sb1gyUmhkR1VpWFN3aVpHbHpjR3hoZVNJNlczc2liR0Z1WnlJNkltVnVMVlZUSWl3aWJHRmlaV3dpT2lKQ2FYSjBhQ0JrWVhSbElpd2laR1Z6WTNKcGNIUnBiMjRpT2lKVWFHVWdZbWx5ZEdnZ1pHRjBaU0J2WmlCMGFHVWdWa2xFSUdodmJHUmxjaUo5WFN3aWMzWm5YMmxrSWpvaVltbHlkR2hmWkdGMFpTSjlMSHNpY0dGMGFDSTZXeUpwYzNOMWFXNW5YMkYxZEdodmNtbDBlU0pkTENKa2FYTndiR0Y1SWpwYmV5SnNZVzVuSWpvaVpXNHRWVk1pTENKc1lXSmxiQ0k2SWtsemMzVnBibWNnWVhWMGFHOXlhWFI1SWl3aVpHVnpZM0pwY0hScGIyNGlPaUpVYUdVZ2FYTnpkV2x1WnlCaGRYUm9iM0pwZEhrZ2IyWWdkR2hsSUZaSlJDQmpjbVZrWlc1MGFXRnNJbjFkTENKemRtZGZhV1FpT2lKcGMzTjFhVzVuWDJGMWRHaHZjbWwwZVNKOUxIc2ljR0YwYUNJNld5SnBjM04xWVc1alpWOWtZWFJsSWwwc0ltUnBjM0JzWVhraU9sdDdJbXhoYm1jaU9pSmxiaTFWVXlJc0lteGhZbVZzSWpvaVNYTnpkV0Z1WTJVZ1pHRjBaU0lzSW1SbGMyTnlhWEIwYVc5dUlqb2lWR2hsSUdSaGRHVWdkR2hoZENCMGFHVWdZM0psWkdWdWRHbGhiQ0IzWVhNZ2FYTnpkV1ZrSW4xZExDSnpkbWRmYVdRaU9pSnBjM04xWVc1alpWOWtZWFJsSW4wc2V5SndZWFJvSWpwYkltVjRjR2x5ZVY5a1lYUmxJbDBzSW1ScGMzQnNZWGtpT2x0N0lteGhibWNpT2lKbGJpMVZVeUlzSW14aFltVnNJam9pU1hOemRXRnVZMlVnWkdGMFpTSXNJbVJsYzJOeWFYQjBhVzl1SWpvaVZHaGxJR1JoZEdVZ2RHaGhkQ0IwYUdVZ1kzSmxaR1Z1ZEdsaGJDQjNhV3hzSUdWNGNHbHlaU0o5WFN3aWMzWm5YMmxrSWpvaVpYaHdhWEo1WDJSaGRHVWlmVjE5Il0sIng1YyI6WyJNSUlCM0RDQ0FZRUNGSEJEV3BrTGk2NGY1WnJGMHh1eXRqNVBJcmJxTUFvR0NDcUdTTTQ5QkFNQ01IQXhDekFKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFJREFaQmRHaGxibk14RURBT0JnTlZCQWNNQjBsc2JHbHphV0V4RVRBUEJnTlZCQW9NQ0hkM1YyRnNiR1YwTVJFd0R3WURWUVFMREFoSlpHVnVkR2wwZVRFWU1CWUdBMVVFQXd3UGQzZDNZV3hzWlhRdGFYTnpkV1Z5TUI0WERUSTBNRGt5TmpBNE1UUXhNbG9YRFRNME1Ea3lOREE0TVRReE1sb3djREVMTUFrR0ExVUVCaE1DUjFJeER6QU5CZ05WQkFnTUJrRjBhR1Z1Y3pFUU1BNEdBMVVFQnd3SFNXeHNhWE5wWVRFUk1BOEdBMVVFQ2d3SWQzZFhZV3hzWlhReEVUQVBCZ05WQkFzTUNFbGtaVzUwYVhSNU1SZ3dGZ1lEVlFRRERBOTNkM2RoYkd4bGRDMXBjM04xWlhJd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFRdFk5a1VRRmZEZjZpb2NGRTRyUnZ5M0dNeVl5cHFtWDNaam13VWVYSnkwa2tnUlQ3M0M4K1dQa1dOZy95ZEpIQ0VERE81WHVSYUlhT0hjOURwTHBOU01Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRRHp3MjduQnI3RThONkdxYzgzdi82KzlpemkvTkVYQktsb2p3TEpBZVNsc0FJaEFPMkpkalBFejNiRDBzdG9XRWc3UkR0ckFtOGRzZ3J5Q3kxVzVCREdDVmROIl0sImFsZyI6IkVTMjU2In0.eyJjbmYiOnsiandrIjp7ImNydiI6IlAtMjU2IiwiZXh0Ijp0cnVlLCJrZXlfb3BzIjpbInZlcmlmeSJdLCJrdHkiOiJFQyIsIngiOiJ0SWdzMG54Z19tZUFlSk5UZnk1dW45QUFIV2hQSHBBR2t2cUh1bzJscTlFIiwieSI6Ik5EVmw1STVENnN0NVBnbmltX2lMak5VNnBLOG02SjFQQVVxbzE4UDR3TGsifX0sInZjdCI6ImV1LmV1cm9wYS5lYy5ldWRpLnBpZC4xIiwianRpIjoidXJuOnZpZDpjN2M4ZWY0Yy0zMzQxLTRlZjEtYjMxZS0wNDM5MjE5ZGY2ODEiLCJpYXQiOjE3MzgxNjEyNDYsImV4cCI6MTc2OTY5NzI0NiwiaXNzIjoiaHR0cDovL3dhbGxldC1lbnRlcnByaXNlLXZpZC1pc3N1ZXI6ODAwMyIsInN1YiI6InpQVC1jbElMZjNIM3ozR012UTk4dUdjMmZzNVo0RkFZN0VfbDZXUVljYlkiLCJfc2RfYWxnIjoic2hhLTI1NiIsIl9zZCI6WyI4SGUtM0NmbmhOREhnaGhvMGktOXYzeDdJLXF6cE1hN29vNFNDaWxVVHBrIiwiRmZCTS02Vm94ZnFSbFNMbFNTOG1xcENFZ3JmeDhTN2ZGblkwV2FIcnVLUSIsIkgyMUhnNzRZM05uMmN2Y0FxY3JSQ0JES08ya09fRVBGWmtlS05KTnN0NzAiLCJIWW9pd1dQRTV4OV90UG9LWlc3VEU1UFRDeGxkR0Y1OHlMaXF1SlNLMkZVIiwiSWpQUGM0WUFIRFhSbjc1RnJxaTVuRVVHR1ZtdVk5dDZTQzBocE1nY3BhNCIsIm9nVV9fVzlGMzFVbF9kOEVGXzNZcVk3NFQxLTVhUGF4NXdUbng4ZmgySGsiLCJxTkM5WDYwNTE4WXh6Qlp3N1lERE9QbGZvd0poYzI2dFR2UXBzTVBualUwIiwicjh5WUhkOTJEb0tUX3hCR1F2V3lrZGUyVHJpWFRST1JtUWxFblBWRFdxUSIsInRUWmMzSExWcXNRM3ZtYXpMU2ppSlFxWUFEdVNsTGVkTjJTMTRSQzZlbzgiXX0.idvaY7ykoRjJ6DFfkjsuxu38ATX_9RZYWuOanyX7oUN0vp16eRqrxPIcVqTVJ0xuzXTHFUeMPYymWWu57wC18g~WyJ0Y282TE5iZC12Y0szRmROenhGZFpRIiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~WyIyZjJDY0ItaVpjUnRkOHpoRktsakp3IiwiZmFtaWx5X25hbWUiLCJEb2UiXQ~WyJhMzFSV1lxOHpseHFXZDhiMGk1UlBnIiwiYmlydGhfZGF0ZSIsIjE5OTAtMTAtMTUiXQ~`;
const expiredCredential = `eyJ0eXAiOiJ2YytzZC1qd3QiLCJ2Y3RtIjpbImV5SjJZM1FpT2lKMWNtNDZZM0psWkdWdWRHbGhiRHAyYVdRaUxDSnVZVzFsSWpvaVZtVnlhV1pwWVdKc1pTQkpSQ0lzSW1SbGMyTnlhWEIwYVc5dUlqb2lWR2hwY3lCcGN5QmhJRlpsY21sbWFXRmliR1VnU1VRZ1pHOWpkVzFsYm5RZ2FYTnpkV1ZrSUdKNUlIUm9aU0IzWld4c0lHdHViM2R1SUZaSlJDQkpjM04xWlhJaUxDSmthWE53YkdGNUlqcGJleUpzWVc1bklqb2laVzR0VlZNaUxDSnVZVzFsSWpvaVZtVnlhV1pwWVdKc1pTQkpSQ0lzSW5KbGJtUmxjbWx1WnlJNmV5SnphVzF3YkdVaU9uc2liRzluYnlJNmV5SjFjbWtpT2lKb2RIUndPaTh2ZDJGc2JHVjBMV1Z1ZEdWeWNISnBjMlV0ZG1sa0xXbHpjM1ZsY2pvNE1EQXpMMmx0WVdkbGN5OXNiMmR2TG5CdVp5SXNJblZ5YVNOcGJuUmxaM0pwZEhraU9pSnphR0V5TlRZdFlXTmtZVE0wTURSak1tTm1ORFprWVRFNU1tTm1NalExWTJOak5tSTVNV1ZrWTJVNE9EWTVNVEl5Wm1FMVlUWTJNell5T0RSbU1XRTJNR1ptWTJRNE5pSXNJbUZzZEY5MFpYaDBJam9pVmtsRUlFeHZaMjhpZlN3aVltRmphMmR5YjNWdVpGOWpiMnh2Y2lJNklpTTBZMk16WkdRaUxDSjBaWGgwWDJOdmJHOXlJam9pSTBaR1JrWkdSaUo5TENKemRtZGZkR1Z0Y0d4aGRHVnpJanBiZXlKMWNta2lPaUpvZEhSd09pOHZkMkZzYkdWMExXVnVkR1Z5Y0hKcGMyVXRkbWxrTFdsemMzVmxjam80TURBekwybHRZV2RsY3k5MFpXMXdiR0YwWlM1emRtY2lmVjE5ZlYwc0ltTnNZV2x0Y3lJNlczc2ljR0YwYUNJNld5Sm5hWFpsYmw5dVlXMWxJbDBzSW1ScGMzQnNZWGtpT2x0N0lteGhibWNpT2lKbGJpMVZVeUlzSW14aFltVnNJam9pUjJsMlpXNGdUbUZ0WlNJc0ltUmxjMk55YVhCMGFXOXVJam9pVkdobElHZHBkbVZ1SUc1aGJXVWdiMllnZEdobElGWkpSQ0JvYjJ4a1pYSWlmVjBzSW5OMloxOXBaQ0k2SW1kcGRtVnVYMjVoYldVaWZTeDdJbkJoZEdnaU9sc2labUZ0YVd4NVgyNWhiV1VpWFN3aVpHbHpjR3hoZVNJNlczc2liR0Z1WnlJNkltVnVMVlZUSWl3aWJHRmlaV3dpT2lKR1lXMXBiSGtnVG1GdFpTSXNJbVJsYzJOeWFYQjBhVzl1SWpvaVZHaGxJR1poYldsc2VTQnVZVzFsSUc5bUlIUm9aU0JXU1VRZ2FHOXNaR1Z5SW4xZExDSnpkbWRmYVdRaU9pSm1ZVzFwYkhsZmJtRnRaU0o5TEhzaWNHRjBhQ0k2V3lKaWFYSjBhRjlrWVhSbElsMHNJbVJwYzNCc1lYa2lPbHQ3SW14aGJtY2lPaUpsYmkxVlV5SXNJbXhoWW1Wc0lqb2lRbWx5ZEdnZ1pHRjBaU0lzSW1SbGMyTnlhWEIwYVc5dUlqb2lWR2hsSUdKcGNuUm9JR1JoZEdVZ2IyWWdkR2hsSUZaSlJDQm9iMnhrWlhJaWZWMHNJbk4yWjE5cFpDSTZJbUpwY25Sb1gyUmhkR1VpZlN4N0luQmhkR2dpT2xzaWFYTnpkV2x1WjE5aGRYUm9iM0pwZEhraVhTd2laR2x6Y0d4aGVTSTZXM3NpYkdGdVp5STZJbVZ1TFZWVElpd2liR0ZpWld3aU9pSkpjM04xYVc1bklHRjFkR2h2Y21sMGVTSXNJbVJsYzJOeWFYQjBhVzl1SWpvaVZHaGxJR2x6YzNWcGJtY2dZWFYwYUc5eWFYUjVJRzltSUhSb1pTQldTVVFnWTNKbFpHVnVkR2xoYkNKOVhTd2ljM1puWDJsa0lqb2lhWE56ZFdsdVoxOWhkWFJvYjNKcGRIa2lmU3g3SW5CaGRHZ2lPbHNpYVhOemRXRnVZMlZmWkdGMFpTSmRMQ0prYVhOd2JHRjVJanBiZXlKc1lXNW5Jam9pWlc0dFZWTWlMQ0pzWVdKbGJDSTZJa2x6YzNWaGJtTmxJR1JoZEdVaUxDSmtaWE5qY21sd2RHbHZiaUk2SWxSb1pTQmtZWFJsSUhSb1lYUWdkR2hsSUdOeVpXUmxiblJwWVd3Z2QyRnpJR2x6YzNWbFpDSjlYU3dpYzNablgybGtJam9pYVhOemRXRnVZMlZmWkdGMFpTSjlMSHNpY0dGMGFDSTZXeUpsZUhCcGNubGZaR0YwWlNKZExDSmthWE53YkdGNUlqcGJleUpzWVc1bklqb2laVzR0VlZNaUxDSnNZV0psYkNJNklrbHpjM1ZoYm1ObElHUmhkR1VpTENKa1pYTmpjbWx3ZEdsdmJpSTZJbFJvWlNCa1lYUmxJSFJvWVhRZ2RHaGxJR055WldSbGJuUnBZV3dnZDJsc2JDQmxlSEJwY21VaWZWMHNJbk4yWjE5cFpDSTZJbVY0Y0dseWVWOWtZWFJsSW4xZGZRIl0sIng1YyI6WyJNSUlCM0RDQ0FZRUNGSEJEV3BrTGk2NGY1WnJGMHh1eXRqNVBJcmJxTUFvR0NDcUdTTTQ5QkFNQ01IQXhDekFKQmdOVkJBWVRBa2RTTVE4d0RRWURWUVFJREFaQmRHaGxibk14RURBT0JnTlZCQWNNQjBsc2JHbHphV0V4RVRBUEJnTlZCQW9NQ0hkM1YyRnNiR1YwTVJFd0R3WURWUVFMREFoSlpHVnVkR2wwZVRFWU1CWUdBMVVFQXd3UGQzZDNZV3hzWlhRdGFYTnpkV1Z5TUI0WERUSTBNRGt5TmpBNE1UUXhNbG9YRFRNME1Ea3lOREE0TVRReE1sb3djREVMTUFrR0ExVUVCaE1DUjFJeER6QU5CZ05WQkFnTUJrRjBhR1Z1Y3pFUU1BNEdBMVVFQnd3SFNXeHNhWE5wWVRFUk1BOEdBMVVFQ2d3SWQzZFhZV3hzWlhReEVUQVBCZ05WQkFzTUNFbGtaVzUwYVhSNU1SZ3dGZ1lEVlFRRERBOTNkM2RoYkd4bGRDMXBjM04xWlhJd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFRdFk5a1VRRmZEZjZpb2NGRTRyUnZ5M0dNeVl5cHFtWDNaam13VWVYSnkwa2tnUlQ3M0M4K1dQa1dOZy95ZEpIQ0VERE81WHVSYUlhT0hjOURwTHBOU01Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRRHp3MjduQnI3RThONkdxYzgzdi82KzlpemkvTkVYQktsb2p3TEpBZVNsc0FJaEFPMkpkalBFejNiRDBzdG9XRWc3UkR0ckFtOGRzZ3J5Q3kxVzVCREdDVmROIl0sImFsZyI6IkVTMjU2In0.eyJjbmYiOnsiandrIjp7ImNydiI6IlAtMjU2IiwiZXh0Ijp0cnVlLCJrZXlfb3BzIjpbInZlcmlmeSJdLCJrdHkiOiJFQyIsIngiOiJsSjlYZDR0N25IcExkSlJkaEQ1UDZ3ZVg5S1ZEeWVmWUtVcmV2V1hqd200IiwieSI6IlFjamRjR19Fd1h5Q0Ewald5UzY2Y1VWc0dTckNaVFJ3VFJwM2F2bWpGS0EifX0sInZjdCI6InVybjpjcmVkZW50aWFsOnZpZCIsImp0aSI6InVybjp2aWQ6YjU0YjNmYTItNDUyNy00MzNmLWIwYmEtYjNlN2Y0YWQyODI2IiwiaWF0IjoxNzM2OTM2NDM3LCJleHAiOjE3MzY5MzYsImlzcyI6Imh0dHA6Ly93YWxsZXQtZW50ZXJwcmlzZS12aWQtaXNzdWVyOjgwMDMiLCJzdWIiOiJ2d0dZWFNmRkhiM205c1ZuSUdiWjZhSXBGUHN5MllZLVlmdGhtOG5Cc1hzIiwiX3NkX2FsZyI6InNoYS0yNTYiLCJfc2QiOlsiMXJ0MTg4Umk5ZTZNZk96WnZRTHJFN0ZDSFE5c2tKNU1aVVRjVlY4WlpaayIsIkRKWVpGUXhMLU5EUEF6UnFtUmd1NnBqVzN1NUxrVm1McnFQeks5MUJlbTQiLCJlOEI3OVR2cUFLc0RPMEVEdkhFXzZoeE9CeUpScFNmRHFtS1BiNXd1dFBVIiwiaERoLXVQOWt4czJDOWk1T3hfTHlBTDIyLTFGdHdrbERhS3RxcWd6bWVYQSIsImtLRGpTc0xVbW1vQTlkUGYwMi1EQ1ZPaXBicnRkelUtWGUtNFVhRXpCWEUiLCJvWHIzT1RfdTM1TW9aNGtLXzZNMGozUHpBN1NBNFlaN19UYUFJQmYySVRNIiwieElab0JVTW53NWh4Q0F1Qi1xSXMydnBZeWxMRWhIQVdhT2NEUlpEUUtqVSIsInpRMURPT0VJd25YMG5KeVF4bklFUUhaUVJLYU9BS3JWTVZMaGxhYnJKWmciXX0.pKTd7FDZfwDNpkjKJY9YBnPlGUxga7yHhTGC-jw8jhdC1sNZgK8lMgaiHEn_PSqNXF3jIOxNPOFCJUfOu3cEfQ~WyIzRlVoRHMyMVl4Um14SjEyVm85ZnBRIiwiZmFtaWx5X25hbWUiLCJEb2UiXQ~WyI4M2xtc051UlV6U1FzM0R2Zkd6TlFnIiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~WyJxUU12TFhWRXkzUDA3QzBJdjE0Q25RIiwiYmlydGhfZGF0ZSIsIjE5OTAtMTAtMTVUMDA6MDA6MDAuMDAwWiJd~WyJ3S2h5WFZUVVdramE2ZTQ2LWtmMl93IiwiaXNzdWluZ19hdXRob3JpdHkiLCJQSUQ6MDAwMDEiXQ~WyJQWnV4S2tCbE85NjZuTkRhQkpqZy1nIiwiaXNzdWluZ19jb3VudHJ5IiwiR1IiXQ~WyJxbWtCLWRVREFXWmMzN1JHVjB6SGF3IiwiZG9jdW1lbnRfbnVtYmVyIiwiMTIzMTMyMTMiXQ~WyJUTkhyeGZJdGluU0s4aE44QU9iaGdnIiwiaXNzdWFuY2VfZGF0ZSIsIjIwMjUtMDEtMTVUMTA6MjA6MzcuNzA3WiJd~WyJ0Zk9NSkthUlBCZG9uRVFVUGQyZEV3IiwiZXhwaXJ5X2RhdGUiLDE3MzY5MzY0Mzdd~`;
Expand Down Expand Up @@ -134,7 +136,6 @@ describe("The SDJWTVCParser", () => {
const result = await parser.parse({ rawCredential });

assert(result.success === true);
assert((result.value.warnings ?? []).some(w => w.code === CredentialParsingError.FailFetchIssuerMetadata));
});

it("should warn if issuer metadata have invalid schema", async () => {
Expand All @@ -158,7 +159,6 @@ describe("The SDJWTVCParser", () => {
const result = await parser.parse({ rawCredential });

assert(result.success === true);
assert((result.value.warnings ?? []).some(w => w.code === CredentialParsingError.FailSchemaIssuerMetadata));
});

it("should default to the first metadata display when an invalid locale is passed", async () => {
Expand All @@ -183,11 +183,30 @@ describe("The SDJWTVCParser", () => {
assert(image);
});

it("should parse credential Bundesdruckerei Pid", async () => {
const contextCopy = { ...context, lang: 'en' };
const parser = SDJWTVCParser({ httpClient: defaultHttpClient, context: contextCopy });
const parsedCredential = await parser.parse({ rawCredential: rawCredentialBundesdruckereiPid });
assert(parsedCredential.success === true);
assert(parsedCredential.value.signedClaims);
[
'urn:eu.europa.ec.eudi:pid:1',
'urn:eudi:pid:1',
'urn:eudi:ehic:1',
'urn:eudi:pda1:1',
'urn:eu.europa.ec.eudi:por:1',
'unknown',
].forEach(vct => {
it(`should be able to parse ${vct} credential`, async () => {
const parser = SDJWTVCParser({ httpClient: defaultHttpClient, context });
const { sdJwt: rawCredential } = await sdJwtFixture(vct);
const parsedCredential = await parser.parse({ rawCredential });
const result = parsedCredential;

assert(result.success);
});

it(`should be able to parse ${vct} credential with vctm in SD JWT header`, async () => {
const parser = SDJWTVCParser({ httpClient: defaultHttpClient, context });
const { sdJwt: rawCredential } = await sdJwtFixture(vct, { vctmInHeader: true });
const parsedCredential = await parser.parse({ rawCredential });
const result = parsedCredential;

assert(result.success);
});
});
})
2 changes: 1 addition & 1 deletion src/credential-parsers/SDJWTVCParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ export function SDJWTVCParser(args: { context: Context, httpClient: HttpClient }
validityInfo: {
...extractValidityInfo(validatedParsedClaims)
},
warnings: getSdJwtMetadataResult.warnings
warnings,
}
}
},
Expand Down
2 changes: 1 addition & 1 deletion src/credential-verifiers/MsoMdocVerifier.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

import crypto from "node:crypto";
import { assert, describe, it } from "vitest";
import { Context } from "../interfaces";
import { PublicKeyResolverEngine } from "../PublicKeyResolverEngine";
Expand Down
Loading