@sphereon/ssi-sdk.sd-jwt 0.32.1-feature.MWALL.715.120 → 0.32.1-feature.MWALL.715.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/__tests__/resources/BoardingPassCredential-vct.json +86 -18
- package/src/__tests__/resources/LoyaltyProgramAccountCredential-vct.json +37 -11
- package/src/__tests__/resources/ePassport VC Schema V1.0.sd-jwt.json +296 -190
- package/src/__tests__/resources/travel-agency-EmployeeAgencyCredential-vct.json +48 -13
- package/src/__tests__/sd-jwt-integrity.test.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.sd-jwt",
|
|
3
|
-
"version": "0.32.1-feature.MWALL.715.
|
|
3
|
+
"version": "0.32.1-feature.MWALL.715.121+57a299ff",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"@sphereon/ssi-sdk-ext.jwt-service": "0.27.1-next.14",
|
|
22
22
|
"@sphereon/ssi-sdk-ext.key-utils": "0.27.1-next.14",
|
|
23
23
|
"@sphereon/ssi-sdk-ext.x509-utils": "0.27.1-next.14",
|
|
24
|
-
"@sphereon/ssi-sdk.agent-config": "0.32.1-feature.MWALL.715.
|
|
25
|
-
"@sphereon/ssi-sdk.mdl-mdoc": "0.32.1-feature.MWALL.715.
|
|
26
|
-
"@sphereon/ssi-types": "0.32.1-feature.MWALL.715.
|
|
24
|
+
"@sphereon/ssi-sdk.agent-config": "0.32.1-feature.MWALL.715.121+57a299ff",
|
|
25
|
+
"@sphereon/ssi-sdk.mdl-mdoc": "0.32.1-feature.MWALL.715.121+57a299ff",
|
|
26
|
+
"@sphereon/ssi-types": "0.32.1-feature.MWALL.715.121+57a299ff",
|
|
27
27
|
"@veramo/utils": "4.2.0",
|
|
28
28
|
"debug": "^4.3.5",
|
|
29
29
|
"uint8arrays": "3.1.1",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"Verifiable Credential"
|
|
73
73
|
],
|
|
74
74
|
"nx": {},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "57a299ff462f52b69fdcc5400cca68323cf10e64"
|
|
76
76
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "Boarding Pass Verifiable Credential",
|
|
3
3
|
"schema_uri": "https://iata.trustregistry.nborbit.ca/.well-known/schema/boardingpass.json",
|
|
4
4
|
"schema_uri#integrity": "sha256-LCPRPfq0BCFVgW469g8F58ng0Nti1RL0+pir1hcQRa8",
|
|
5
|
-
"vct": "https://iata.trustregistry.nborbit.ca
|
|
5
|
+
"vct": "https://iata.trustregistry.nborbit.ca/boardingpass",
|
|
6
6
|
"description": "A Verifiable Credential for a boarding pass.",
|
|
7
7
|
"display": [
|
|
8
8
|
{
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"lang": "en-US"
|
|
41
41
|
}
|
|
42
42
|
],
|
|
43
|
-
"path": [
|
|
43
|
+
"path": [
|
|
44
|
+
"boardingPass"
|
|
45
|
+
]
|
|
44
46
|
},
|
|
45
47
|
{
|
|
46
48
|
"display": [
|
|
@@ -50,7 +52,10 @@
|
|
|
50
52
|
"lang": "en-US"
|
|
51
53
|
}
|
|
52
54
|
],
|
|
53
|
-
"path": [
|
|
55
|
+
"path": [
|
|
56
|
+
"boardingPass",
|
|
57
|
+
"barcodeString"
|
|
58
|
+
]
|
|
54
59
|
},
|
|
55
60
|
{
|
|
56
61
|
"display": [
|
|
@@ -60,7 +65,10 @@
|
|
|
60
65
|
"lang": "en-US"
|
|
61
66
|
}
|
|
62
67
|
],
|
|
63
|
-
"path": [
|
|
68
|
+
"path": [
|
|
69
|
+
"boardingPass",
|
|
70
|
+
"paxName"
|
|
71
|
+
]
|
|
64
72
|
},
|
|
65
73
|
{
|
|
66
74
|
"display": [
|
|
@@ -70,7 +78,10 @@
|
|
|
70
78
|
"lang": "en-US"
|
|
71
79
|
}
|
|
72
80
|
],
|
|
73
|
-
"path": [
|
|
81
|
+
"path": [
|
|
82
|
+
"boardingPass",
|
|
83
|
+
"segmentCount"
|
|
84
|
+
]
|
|
74
85
|
},
|
|
75
86
|
{
|
|
76
87
|
"display": [
|
|
@@ -80,7 +91,10 @@
|
|
|
80
91
|
"lang": "en-US"
|
|
81
92
|
}
|
|
82
93
|
],
|
|
83
|
-
"path": [
|
|
94
|
+
"path": [
|
|
95
|
+
"boardingPass",
|
|
96
|
+
"ticketLessOrElectronicTicketInd"
|
|
97
|
+
]
|
|
84
98
|
},
|
|
85
99
|
{
|
|
86
100
|
"display": [
|
|
@@ -90,7 +104,11 @@
|
|
|
90
104
|
"lang": "en-US"
|
|
91
105
|
}
|
|
92
106
|
],
|
|
93
|
-
"path": [
|
|
107
|
+
"path": [
|
|
108
|
+
"boardingPass",
|
|
109
|
+
"paxSegments",
|
|
110
|
+
null
|
|
111
|
+
]
|
|
94
112
|
},
|
|
95
113
|
{
|
|
96
114
|
"display": [
|
|
@@ -100,7 +118,12 @@
|
|
|
100
118
|
"lang": "en-US"
|
|
101
119
|
}
|
|
102
120
|
],
|
|
103
|
-
"path": [
|
|
121
|
+
"path": [
|
|
122
|
+
"boardingPass",
|
|
123
|
+
"paxSegments",
|
|
124
|
+
null,
|
|
125
|
+
"bookingRefID"
|
|
126
|
+
]
|
|
104
127
|
},
|
|
105
128
|
{
|
|
106
129
|
"display": [
|
|
@@ -110,7 +133,12 @@
|
|
|
110
133
|
"lang": "en-US"
|
|
111
134
|
}
|
|
112
135
|
],
|
|
113
|
-
"path": [
|
|
136
|
+
"path": [
|
|
137
|
+
"boardingPass",
|
|
138
|
+
"paxSegments",
|
|
139
|
+
null,
|
|
140
|
+
"checkInOrdinal"
|
|
141
|
+
]
|
|
114
142
|
},
|
|
115
143
|
{
|
|
116
144
|
"display": [
|
|
@@ -120,7 +148,12 @@
|
|
|
120
148
|
"lang": "en-US"
|
|
121
149
|
}
|
|
122
150
|
],
|
|
123
|
-
"path": [
|
|
151
|
+
"path": [
|
|
152
|
+
"boardingPass",
|
|
153
|
+
"paxSegments",
|
|
154
|
+
null,
|
|
155
|
+
"compartmentTypeCode"
|
|
156
|
+
]
|
|
124
157
|
},
|
|
125
158
|
{
|
|
126
159
|
"display": [
|
|
@@ -130,7 +163,12 @@
|
|
|
130
163
|
"lang": "en-US"
|
|
131
164
|
}
|
|
132
165
|
],
|
|
133
|
-
"path": [
|
|
166
|
+
"path": [
|
|
167
|
+
"boardingPass",
|
|
168
|
+
"paxSegments",
|
|
169
|
+
null,
|
|
170
|
+
"originStationIATALocationCode"
|
|
171
|
+
]
|
|
134
172
|
},
|
|
135
173
|
{
|
|
136
174
|
"display": [
|
|
@@ -140,7 +178,12 @@
|
|
|
140
178
|
"lang": "en-US"
|
|
141
179
|
}
|
|
142
180
|
],
|
|
143
|
-
"path": [
|
|
181
|
+
"path": [
|
|
182
|
+
"boardingPass",
|
|
183
|
+
"paxSegments",
|
|
184
|
+
null,
|
|
185
|
+
"destStationIATALocationCode"
|
|
186
|
+
]
|
|
144
187
|
},
|
|
145
188
|
{
|
|
146
189
|
"display": [
|
|
@@ -150,7 +193,12 @@
|
|
|
150
193
|
"lang": "en-US"
|
|
151
194
|
}
|
|
152
195
|
],
|
|
153
|
-
"path": [
|
|
196
|
+
"path": [
|
|
197
|
+
"boardingPass",
|
|
198
|
+
"paxSegments",
|
|
199
|
+
null,
|
|
200
|
+
"flightIdentifierDate"
|
|
201
|
+
]
|
|
154
202
|
},
|
|
155
203
|
{
|
|
156
204
|
"display": [
|
|
@@ -160,7 +208,12 @@
|
|
|
160
208
|
"lang": "en-US"
|
|
161
209
|
}
|
|
162
210
|
],
|
|
163
|
-
"path": [
|
|
211
|
+
"path": [
|
|
212
|
+
"boardingPass",
|
|
213
|
+
"paxSegments",
|
|
214
|
+
null,
|
|
215
|
+
"operatingCarrierAirlineDesigCode"
|
|
216
|
+
]
|
|
164
217
|
},
|
|
165
218
|
{
|
|
166
219
|
"display": [
|
|
@@ -170,7 +223,12 @@
|
|
|
170
223
|
"lang": "en-US"
|
|
171
224
|
}
|
|
172
225
|
],
|
|
173
|
-
"path": [
|
|
226
|
+
"path": [
|
|
227
|
+
"boardingPass",
|
|
228
|
+
"paxSegments",
|
|
229
|
+
null,
|
|
230
|
+
"operatingCarrierFlightNumber"
|
|
231
|
+
]
|
|
174
232
|
},
|
|
175
233
|
{
|
|
176
234
|
"display": [
|
|
@@ -180,7 +238,12 @@
|
|
|
180
238
|
"lang": "en-US"
|
|
181
239
|
}
|
|
182
240
|
],
|
|
183
|
-
"path": [
|
|
241
|
+
"path": [
|
|
242
|
+
"boardingPass",
|
|
243
|
+
"paxSegments",
|
|
244
|
+
null,
|
|
245
|
+
"paxRelatedStatusCode"
|
|
246
|
+
]
|
|
184
247
|
},
|
|
185
248
|
{
|
|
186
249
|
"display": [
|
|
@@ -190,7 +253,12 @@
|
|
|
190
253
|
"lang": "en-US"
|
|
191
254
|
}
|
|
192
255
|
],
|
|
193
|
-
"path": [
|
|
256
|
+
"path": [
|
|
257
|
+
"boardingPass",
|
|
258
|
+
"paxSegments",
|
|
259
|
+
null,
|
|
260
|
+
"seatAssignmentStatusOrSeatNumberCode"
|
|
261
|
+
]
|
|
194
262
|
}
|
|
195
263
|
]
|
|
196
|
-
}
|
|
264
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "Loyalty Program Account Verifiable Credential",
|
|
3
3
|
"schema_uri": "https://iata.trustregistry.nborbit.ca/.well-known/schema/loyalty.json",
|
|
4
4
|
"schema_uri#integrity": "sha256-E08U75Zcmn1iIxBlZx3V/QW0cshVZJmSQx97WfRSGI4",
|
|
5
|
-
"vct": "https://iata.trustregistry.nborbit.ca
|
|
5
|
+
"vct": "https://iata.trustregistry.nborbit.ca/loyalty",
|
|
6
6
|
"description": "A Verifiable Credential for loyalty program accounts.",
|
|
7
7
|
"display": [
|
|
8
8
|
{
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"lang": "en-US"
|
|
41
41
|
}
|
|
42
42
|
],
|
|
43
|
-
"path": [
|
|
43
|
+
"path": [
|
|
44
|
+
"loyaltyProgramAccount"
|
|
45
|
+
]
|
|
44
46
|
},
|
|
45
47
|
{
|
|
46
48
|
"display": [
|
|
@@ -50,7 +52,10 @@
|
|
|
50
52
|
"lang": "en-US"
|
|
51
53
|
}
|
|
52
54
|
],
|
|
53
|
-
"path": [
|
|
55
|
+
"path": [
|
|
56
|
+
"loyaltyProgramAccount",
|
|
57
|
+
"givenName"
|
|
58
|
+
]
|
|
54
59
|
},
|
|
55
60
|
{
|
|
56
61
|
"display": [
|
|
@@ -60,7 +65,10 @@
|
|
|
60
65
|
"lang": "en-US"
|
|
61
66
|
}
|
|
62
67
|
],
|
|
63
|
-
"path": [
|
|
68
|
+
"path": [
|
|
69
|
+
"loyaltyProgramAccount",
|
|
70
|
+
"surname"
|
|
71
|
+
]
|
|
64
72
|
},
|
|
65
73
|
{
|
|
66
74
|
"display": [
|
|
@@ -70,7 +78,10 @@
|
|
|
70
78
|
"lang": "en-US"
|
|
71
79
|
}
|
|
72
80
|
],
|
|
73
|
-
"path": [
|
|
81
|
+
"path": [
|
|
82
|
+
"loyaltyProgramAccount",
|
|
83
|
+
"titleName"
|
|
84
|
+
]
|
|
74
85
|
},
|
|
75
86
|
{
|
|
76
87
|
"display": [
|
|
@@ -80,7 +91,10 @@
|
|
|
80
91
|
"lang": "en-US"
|
|
81
92
|
}
|
|
82
93
|
],
|
|
83
|
-
"path": [
|
|
94
|
+
"path": [
|
|
95
|
+
"loyaltyProgramAccount",
|
|
96
|
+
"loyaltyProgramAccountIdentifier"
|
|
97
|
+
]
|
|
84
98
|
},
|
|
85
99
|
{
|
|
86
100
|
"display": [
|
|
@@ -90,7 +104,10 @@
|
|
|
90
104
|
"lang": "en-US"
|
|
91
105
|
}
|
|
92
106
|
],
|
|
93
|
-
"path": [
|
|
107
|
+
"path": [
|
|
108
|
+
"loyaltyProgramAccount",
|
|
109
|
+
"loyaltyProgramAccountTierLevelCode"
|
|
110
|
+
]
|
|
94
111
|
},
|
|
95
112
|
{
|
|
96
113
|
"display": [
|
|
@@ -100,7 +117,10 @@
|
|
|
100
117
|
"lang": "en-US"
|
|
101
118
|
}
|
|
102
119
|
],
|
|
103
|
-
"path": [
|
|
120
|
+
"path": [
|
|
121
|
+
"loyaltyProgramAccount",
|
|
122
|
+
"loyaltyProgramCode"
|
|
123
|
+
]
|
|
104
124
|
},
|
|
105
125
|
{
|
|
106
126
|
"display": [
|
|
@@ -110,7 +130,10 @@
|
|
|
110
130
|
"lang": "en-US"
|
|
111
131
|
}
|
|
112
132
|
],
|
|
113
|
-
"path": [
|
|
133
|
+
"path": [
|
|
134
|
+
"loyaltyProgramAccount",
|
|
135
|
+
"loyaltyProgramName"
|
|
136
|
+
]
|
|
114
137
|
},
|
|
115
138
|
{
|
|
116
139
|
"display": [
|
|
@@ -120,7 +143,10 @@
|
|
|
120
143
|
"lang": "en-US"
|
|
121
144
|
}
|
|
122
145
|
],
|
|
123
|
-
"path": [
|
|
146
|
+
"path": [
|
|
147
|
+
"loyaltyProgramAccount",
|
|
148
|
+
"providerName"
|
|
149
|
+
]
|
|
124
150
|
}
|
|
125
151
|
]
|
|
126
|
-
}
|
|
152
|
+
}
|
|
@@ -1,197 +1,303 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
"birthdate": {
|
|
22
|
-
"title": "Data Group 1 Birthdate",
|
|
23
|
-
"description": "Date of birth of the passport holder as recorded by the issuing State or organization.",
|
|
24
|
-
"type": "string",
|
|
25
|
-
"pattern": "^[0-9<]{2}([0<][1-9<]|[1<][0-2<])([0<][1-9<]|[12<][0-9<]|[3<][01<])$"
|
|
26
|
-
},
|
|
27
|
-
"docTypeCode": {
|
|
28
|
-
"title": "Data Group 1 Document Type Code",
|
|
29
|
-
"description": "Capital letter P to designate an ePassport. One additional capital letter may be used, in the character position after the letter P and at the discretion of the issuing State or organization, to designate other types of passports such as MRP issued to diplomatic staff.",
|
|
30
|
-
"type": "string",
|
|
31
|
-
"pattern": "^P.$"
|
|
32
|
-
},
|
|
33
|
-
"expiryDate": {
|
|
34
|
-
"title": "Data Group 1 Expiry Date",
|
|
35
|
-
"description": "Date of expiry of the ePassport.",
|
|
36
|
-
"type": "string",
|
|
37
|
-
"pattern": "^[0-9]{2}([0][1-9]|[1][0-2])([0][1-9]|[12][0-9]|[3][01])$"
|
|
38
|
-
},
|
|
39
|
-
"sexCode": {
|
|
40
|
-
"title": "Sex Code",
|
|
41
|
-
"description": "Sex of the passport holder; typically, F for Female, M for Male or < for non-specified.",
|
|
42
|
-
"type": "string",
|
|
43
|
-
"enum": ["F", "M", "<"]
|
|
44
|
-
},
|
|
45
|
-
"holdersName": {
|
|
46
|
-
"title": "Data Group 1 Holders Name",
|
|
47
|
-
"description": "Full name of the holder, as identified by the issuing State or organization.",
|
|
48
|
-
"type": "string",
|
|
49
|
-
"minLength": 1,
|
|
50
|
-
"maxLength": 39
|
|
51
|
-
},
|
|
52
|
-
"issuerCode": {
|
|
53
|
-
"title": "Data Group 1 Issuer Code",
|
|
54
|
-
"description": "Code of the State or Organization responsible for the issuance of the ePassport.",
|
|
55
|
-
"type": "string",
|
|
56
|
-
"maxLength": 13
|
|
57
|
-
},
|
|
58
|
-
"natlCode": {
|
|
59
|
-
"title": "Data Group 1 Nationality Text",
|
|
60
|
-
"description": "The code for the nationality of the holder of the ePassport.",
|
|
61
|
-
"type": "string",
|
|
62
|
-
"minLength": 3,
|
|
63
|
-
"maxLength": 3
|
|
64
|
-
},
|
|
65
|
-
"passportNumberIdentifier": {
|
|
66
|
-
"title": "Data Group 1 Passport Number Identifier",
|
|
67
|
-
"description": "As given by the issuing State or organization to uniquely identify the document from all other MRTDs issued by the State or organization.",
|
|
68
|
-
"type": "string",
|
|
69
|
-
"maxLength": 9
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
},
|
|
73
|
-
"dataGroup15": {
|
|
74
|
-
"title": "Data Group 15",
|
|
75
|
-
"description": "Data group 15 defined by ICAO for ePassport. Reference: Section 4.7.15.1 of Doc 9303 Machine Readable Travel Documents, Eighth Edition 2021, Part 10: Logical Data Structure (LDS) for Storage of Biometrics and Other Data in the Contactless Integrated Circuit (IC).",
|
|
76
|
-
"type": "object",
|
|
77
|
-
"required": ["activeAuthentication"],
|
|
78
|
-
"properties": {
|
|
79
|
-
"activeAuthentication": {
|
|
80
|
-
"title": "Active Authentication",
|
|
81
|
-
"description": "Active Authentication authenticates the contactless IC by signing a challenge sent by the IFD (inspection system) with a private key known only to the IC. For this purpose the contactless IC contains its own Active Authentication Key pair (KPrAA and KPuAA). A hash representation of Data Group 15 (Public Key (KPuAA) info) is stored in the Document Security Object (SOD) and therefore authenticated by the issuer's digital signature. The corresponding Private Key (KPrAA) is stored in the contactless IC's secure memory. By authenticating the visual MRZ (through the hashed MRZ in the Document Security Object (SOD)) in combination with the challenge response, using the eMRTD's Active Authentication Key Pair (KPrAA and KPuAA), the inspection system verifies that the Document Security Object (SOD) has been read from the genuine contactless IC stored in the genuine eMRTD.",
|
|
82
|
-
"type": "object",
|
|
83
|
-
"required": ["publicKeyBinaryObject"],
|
|
84
|
-
"properties": {
|
|
85
|
-
"publicKeyBinaryObject": {
|
|
86
|
-
"title": "Active Authentication Public Key Binary Object",
|
|
87
|
-
"description": "Public key for use in active authentication. Example uri format data:application/octet-stream;base64,...",
|
|
88
|
-
"type": "string",
|
|
89
|
-
"format": "uri"
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
2
|
+
"name": "ePassport Verifiable Credential",
|
|
3
|
+
"schema_uri": "https://iata.trustregistry.nborbit.ca/.well-known/schema/epassport.json",
|
|
4
|
+
"schema_uri#integrity": "sha256-ro3/ER87HPcrdV1JliUeH5JRDKNO+PThBd1gMf84EKc",
|
|
5
|
+
"vct": "https://iata.trustregistry.nborbit.ca/epassport",
|
|
6
|
+
"description": "A Verifiable Credential for an ePassport.",
|
|
7
|
+
"display": [
|
|
8
|
+
{
|
|
9
|
+
"description": "A Verifiable Credential for an ePassport.",
|
|
10
|
+
"lang": "en-US",
|
|
11
|
+
"name": "ePassport Verifiable Credential",
|
|
12
|
+
"rendering": {
|
|
13
|
+
"simple": {
|
|
14
|
+
"background_color": "#CB2210",
|
|
15
|
+
"logo": {
|
|
16
|
+
"alt_text": "ePassport Verifiable Credential Logo",
|
|
17
|
+
"uri": "https://iata.trustregistry.nborbit.ca/logo/epassport-logo.png",
|
|
18
|
+
"uri#integrity": "sha256-SSp0p9SBIotc7FIi/pkqbMthx4Gmx+g+IXnMdOOQXl4"
|
|
19
|
+
},
|
|
20
|
+
"text_color": "#F9F9F9"
|
|
94
21
|
},
|
|
95
|
-
"
|
|
96
|
-
"title": "Data Group 2 Encoded Face Biometrics",
|
|
97
|
-
"description": "First, most recent, face biometric image from data group 2. Reference: Section 4.7.2 of Doc 9303 Machine Readable Travel Documents, Eighth Edition 2021, Part 10: Logical Data Structure (LDS) for Storage of Biometrics and Other Data in the Contactless Integrated Circuit (IC).",
|
|
98
|
-
"type": "object",
|
|
99
|
-
"required": ["faceBiometricDataEncodedPicture"],
|
|
22
|
+
"svg_template": {
|
|
100
23
|
"properties": {
|
|
101
|
-
"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
"digitalTravelCredential": {
|
|
110
|
-
"title": "Digital Travel Credential",
|
|
111
|
-
"description": "Travel credentials in a digital format that are meant to temporarily or permanently substitute a conventional passport by a digital representation of the traveler's identity. Reference: Section 2.1.3 of Machine Readable Travel Documents, Digital Travel Credentials (DTC), Virtual Component Data Structure and PKI Mechanisms, Technical Report, Version 1.2 October 2020.",
|
|
112
|
-
"type": "object",
|
|
113
|
-
"required": ["dTCContentInfo"],
|
|
114
|
-
"properties": {
|
|
115
|
-
"dTCContentInfo": {
|
|
116
|
-
"title": "DTC-VC as DTCContentInfo encoded Structure",
|
|
117
|
-
"description": "DER encoded DTC-VC. Example uri format data:application/octet-stream;base64,...",
|
|
118
|
-
"type": "string",
|
|
119
|
-
"format": "uri"
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
"docSecurityObject": {
|
|
124
|
-
"title": "Document Security Object",
|
|
125
|
-
"description": "Document Security Object which contains the hashing information including hashed ePassport data. Reference: Section 4.6.2 of Doc 9303 Machine Readable Travel Documents, Eighth Edition 2021, Part 10: Logical Data Structure (LDS) for Storage of Biometrics and Other Data in the Contactless Integrated Circuit (IC).",
|
|
126
|
-
"type": "object",
|
|
127
|
-
"required": ["dataGroupHash", "digestHashAlgorithmIdentifier", "versionNumber"],
|
|
128
|
-
"properties": {
|
|
129
|
-
"digestHashAlgorithmIdentifier": {
|
|
130
|
-
"title": "Document Security Object Digest Hash Algorithm Identifier",
|
|
131
|
-
"description": "Digest Algorithm Identifier used to perform hashing on the data groups.",
|
|
132
|
-
"type": "string",
|
|
133
|
-
"maxLength": 35
|
|
134
|
-
},
|
|
135
|
-
"versionNumber": {
|
|
136
|
-
"title": "Document Security Object Version Number",
|
|
137
|
-
"description": "Security object version.",
|
|
138
|
-
"type": "number"
|
|
139
|
-
},
|
|
140
|
-
"dataGroupHash": {
|
|
141
|
-
"title": "Data Group Hash",
|
|
142
|
-
"description": "Data group with corresponding hash value.",
|
|
143
|
-
"type": "array",
|
|
144
|
-
"items": {
|
|
145
|
-
"type": "object",
|
|
146
|
-
"title": "Data Group Hash",
|
|
147
|
-
"description": "Data group with corresponding hash value.",
|
|
148
|
-
"required": ["dataGroupNumber", "valueBinaryObject"],
|
|
149
|
-
"properties": {
|
|
150
|
-
"dataGroupNumber": {
|
|
151
|
-
"title": "Data Group Hash Data Group Number",
|
|
152
|
-
"description": "Data group number.",
|
|
153
|
-
"type": "integer",
|
|
154
|
-
"minimum": 1,
|
|
155
|
-
"maximum": 16
|
|
156
|
-
},
|
|
157
|
-
"valueBinaryObject": {
|
|
158
|
-
"title": "Data Group Hash Value Binary Object",
|
|
159
|
-
"description": "Hash value for the corresponding data group. Example uri format data:application/octet-stream;base64,...",
|
|
160
|
-
"type": "string",
|
|
161
|
-
"format": "uri"
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
24
|
+
"color_scheme": "light",
|
|
25
|
+
"contrast": "high",
|
|
26
|
+
"orientation": "landscape"
|
|
27
|
+
},
|
|
28
|
+
"uri": "https://iata.trustregistry.nborbit.ca/svg/epassport.svg",
|
|
29
|
+
"uri#integrity": "sha256-+2b8yT2jzbRuoHh5KnI6RzorWNTN/eL67ZvEV+abEfA"
|
|
167
30
|
}
|
|
168
31
|
}
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"claims": [
|
|
35
|
+
{
|
|
36
|
+
"display": [
|
|
37
|
+
{
|
|
38
|
+
"description": "Information about the electronic passport.",
|
|
39
|
+
"label": "Electronic Passport",
|
|
40
|
+
"lang": "en-US"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"path": [
|
|
44
|
+
"electronicPassport"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"display": [
|
|
49
|
+
{
|
|
50
|
+
"description": "Data Group 1 of the electronic passport.",
|
|
51
|
+
"label": "Data Group 1",
|
|
52
|
+
"lang": "en-US"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"path": [
|
|
56
|
+
"electronicPassport",
|
|
57
|
+
"dataGroup1"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"display": [
|
|
62
|
+
{
|
|
63
|
+
"description": "Date of birth of the passport holder.",
|
|
64
|
+
"label": "Birthdate",
|
|
65
|
+
"lang": "en-US"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"path": [
|
|
69
|
+
"electronicPassport",
|
|
70
|
+
"dataGroup1",
|
|
71
|
+
"birthdate"
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"display": [
|
|
76
|
+
{
|
|
77
|
+
"description": "Document type code, such as 'P' for an ePassport.",
|
|
78
|
+
"label": "Document Type Code",
|
|
79
|
+
"lang": "en-US"
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"path": [
|
|
83
|
+
"electronicPassport",
|
|
84
|
+
"dataGroup1",
|
|
85
|
+
"docTypeCode"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"display": [
|
|
90
|
+
{
|
|
91
|
+
"description": "Expiry date of the ePassport.",
|
|
92
|
+
"label": "Expiry Date",
|
|
93
|
+
"lang": "en-US"
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"path": [
|
|
97
|
+
"electronicPassport",
|
|
98
|
+
"dataGroup1",
|
|
99
|
+
"expiryDate"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"display": [
|
|
104
|
+
{
|
|
105
|
+
"description": "Sex of the passport holder.",
|
|
106
|
+
"label": "Sex Code",
|
|
107
|
+
"lang": "en-US"
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
"path": [
|
|
111
|
+
"electronicPassport",
|
|
112
|
+
"dataGroup1",
|
|
113
|
+
"sexCode"
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"display": [
|
|
118
|
+
{
|
|
119
|
+
"description": "Full name of the passport holder.",
|
|
120
|
+
"label": "Holder's Name",
|
|
121
|
+
"lang": "en-US"
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"path": [
|
|
125
|
+
"electronicPassport",
|
|
126
|
+
"dataGroup1",
|
|
127
|
+
"holdersName"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"display": [
|
|
132
|
+
{
|
|
133
|
+
"description": "Issuer code of the ePassport.",
|
|
134
|
+
"label": "Issuer Code",
|
|
135
|
+
"lang": "en-US"
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"path": [
|
|
139
|
+
"electronicPassport",
|
|
140
|
+
"dataGroup1",
|
|
141
|
+
"issuerCode"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"display": [
|
|
146
|
+
{
|
|
147
|
+
"description": "Nationality code of the passport holder.",
|
|
148
|
+
"label": "Nationality Code",
|
|
149
|
+
"lang": "en-US"
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
"path": [
|
|
153
|
+
"electronicPassport",
|
|
154
|
+
"dataGroup1",
|
|
155
|
+
"natlCode"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"display": [
|
|
160
|
+
{
|
|
161
|
+
"description": "Unique identifier for the passport.",
|
|
162
|
+
"label": "Passport Number",
|
|
163
|
+
"lang": "en-US"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"path": [
|
|
167
|
+
"electronicPassport",
|
|
168
|
+
"dataGroup1",
|
|
169
|
+
"passportNumberIdentifier"
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"display": [
|
|
174
|
+
{
|
|
175
|
+
"description": "Encoded face biometric data from Data Group 2.",
|
|
176
|
+
"label": "Encoded Face Biometrics",
|
|
177
|
+
"lang": "en-US"
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
"path": [
|
|
181
|
+
"electronicPassport",
|
|
182
|
+
"dataGroup2EncodedFaceBiometrics",
|
|
183
|
+
"faceBiometricDataEncodedPicture"
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"display": [
|
|
188
|
+
{
|
|
189
|
+
"description": "Data group 15 containing the public key for active authentication.",
|
|
190
|
+
"label": "Data Group 15",
|
|
191
|
+
"lang": "en-US"
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
"path": [
|
|
195
|
+
"electronicPassport",
|
|
196
|
+
"dataGroup15"
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"display": [
|
|
201
|
+
{
|
|
202
|
+
"description": "Public key for active authentication.",
|
|
203
|
+
"label": "Active Authentication Public Key",
|
|
204
|
+
"lang": "en-US"
|
|
205
|
+
}
|
|
206
|
+
],
|
|
207
|
+
"path": [
|
|
208
|
+
"electronicPassport",
|
|
209
|
+
"dataGroup15",
|
|
210
|
+
"activeAuthentication",
|
|
211
|
+
"publicKeyBinaryObject"
|
|
212
|
+
]
|
|
169
213
|
},
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
"
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
"
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
214
|
+
{
|
|
215
|
+
"display": [
|
|
216
|
+
{
|
|
217
|
+
"description": "Document security object containing hashing information.",
|
|
218
|
+
"label": "Document Security Object",
|
|
219
|
+
"lang": "en-US"
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"path": [
|
|
223
|
+
"electronicPassport",
|
|
224
|
+
"docSecurityObject"
|
|
225
|
+
]
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"display": [
|
|
229
|
+
{
|
|
230
|
+
"description": "Digest hash algorithm used for the document security object.",
|
|
231
|
+
"label": "Digest Hash Algorithm",
|
|
232
|
+
"lang": "en-US"
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
"path": [
|
|
236
|
+
"electronicPassport",
|
|
237
|
+
"docSecurityObject",
|
|
238
|
+
"digestHashAlgorithmIdentifier"
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"display": [
|
|
243
|
+
{
|
|
244
|
+
"description": "Version number of the document security object.",
|
|
245
|
+
"label": "Version Number",
|
|
246
|
+
"lang": "en-US"
|
|
247
|
+
}
|
|
248
|
+
],
|
|
249
|
+
"path": [
|
|
250
|
+
"electronicPassport",
|
|
251
|
+
"docSecurityObject",
|
|
252
|
+
"versionNumber"
|
|
253
|
+
]
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"display": [
|
|
257
|
+
{
|
|
258
|
+
"description": "Data group hash values within the document security object.",
|
|
259
|
+
"label": "Data Group Hash",
|
|
260
|
+
"lang": "en-US"
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"path": [
|
|
264
|
+
"electronicPassport",
|
|
265
|
+
"docSecurityObject",
|
|
266
|
+
"dataGroupHash",
|
|
267
|
+
null
|
|
268
|
+
]
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"display": [
|
|
272
|
+
{
|
|
273
|
+
"description": "Data group number for the hash.",
|
|
274
|
+
"label": "Data Group Number",
|
|
275
|
+
"lang": "en-US"
|
|
276
|
+
}
|
|
277
|
+
],
|
|
278
|
+
"path": [
|
|
279
|
+
"electronicPassport",
|
|
280
|
+
"docSecurityObject",
|
|
281
|
+
"dataGroupHash",
|
|
282
|
+
null,
|
|
283
|
+
"dataGroupNumber"
|
|
284
|
+
]
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"display": [
|
|
288
|
+
{
|
|
289
|
+
"description": "Hash value for the data group.",
|
|
290
|
+
"label": "Hash Value",
|
|
291
|
+
"lang": "en-US"
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"path": [
|
|
295
|
+
"electronicPassport",
|
|
296
|
+
"docSecurityObject",
|
|
297
|
+
"dataGroupHash",
|
|
298
|
+
null,
|
|
299
|
+
"valueBinaryObject"
|
|
300
|
+
]
|
|
195
301
|
}
|
|
196
|
-
|
|
197
|
-
}
|
|
302
|
+
]
|
|
303
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "Employee Agency Verifiable Credential",
|
|
3
3
|
"schema_uri": "https://iata.trustregistry.nborbit.ca/.well-known/schema/employee.json",
|
|
4
4
|
"schema_uri#integrity": "sha256-WFMhTljMTe7UrWbol6llL3T0K4VkxPgd0QoXzQHMKNQ",
|
|
5
|
-
"vct": "https://iata.trustregistry.nborbit.ca
|
|
5
|
+
"vct": "https://iata.trustregistry.nborbit.ca/employee",
|
|
6
6
|
"description": "A Verifiable Credential for employees working at a travel agency",
|
|
7
7
|
"display": [
|
|
8
8
|
{
|
|
@@ -40,7 +40,9 @@
|
|
|
40
40
|
"lang": "en-US"
|
|
41
41
|
}
|
|
42
42
|
],
|
|
43
|
-
"path": [
|
|
43
|
+
"path": [
|
|
44
|
+
"employee"
|
|
45
|
+
]
|
|
44
46
|
},
|
|
45
47
|
{
|
|
46
48
|
"display": [
|
|
@@ -50,7 +52,10 @@
|
|
|
50
52
|
"lang": "en-US"
|
|
51
53
|
}
|
|
52
54
|
],
|
|
53
|
-
"path": [
|
|
55
|
+
"path": [
|
|
56
|
+
"employee",
|
|
57
|
+
"salutation"
|
|
58
|
+
]
|
|
54
59
|
},
|
|
55
60
|
{
|
|
56
61
|
"display": [
|
|
@@ -60,7 +65,10 @@
|
|
|
60
65
|
"lang": "en-US"
|
|
61
66
|
}
|
|
62
67
|
],
|
|
63
|
-
"path": [
|
|
68
|
+
"path": [
|
|
69
|
+
"employee",
|
|
70
|
+
"givenName"
|
|
71
|
+
]
|
|
64
72
|
},
|
|
65
73
|
{
|
|
66
74
|
"display": [
|
|
@@ -70,7 +78,10 @@
|
|
|
70
78
|
"lang": "en-US"
|
|
71
79
|
}
|
|
72
80
|
],
|
|
73
|
-
"path": [
|
|
81
|
+
"path": [
|
|
82
|
+
"employee",
|
|
83
|
+
"surname"
|
|
84
|
+
]
|
|
74
85
|
},
|
|
75
86
|
{
|
|
76
87
|
"display": [
|
|
@@ -80,7 +91,10 @@
|
|
|
80
91
|
"lang": "en-US"
|
|
81
92
|
}
|
|
82
93
|
],
|
|
83
|
-
"path": [
|
|
94
|
+
"path": [
|
|
95
|
+
"employee",
|
|
96
|
+
"phoneNumber"
|
|
97
|
+
]
|
|
84
98
|
},
|
|
85
99
|
{
|
|
86
100
|
"display": [
|
|
@@ -90,7 +104,11 @@
|
|
|
90
104
|
"lang": "en-US"
|
|
91
105
|
}
|
|
92
106
|
],
|
|
93
|
-
"path": [
|
|
107
|
+
"path": [
|
|
108
|
+
"employee",
|
|
109
|
+
"phoneNumber",
|
|
110
|
+
"countryCode"
|
|
111
|
+
]
|
|
94
112
|
},
|
|
95
113
|
{
|
|
96
114
|
"display": [
|
|
@@ -100,7 +118,11 @@
|
|
|
100
118
|
"lang": "en-US"
|
|
101
119
|
}
|
|
102
120
|
],
|
|
103
|
-
"path": [
|
|
121
|
+
"path": [
|
|
122
|
+
"employee",
|
|
123
|
+
"phoneNumber",
|
|
124
|
+
"localNumber"
|
|
125
|
+
]
|
|
104
126
|
},
|
|
105
127
|
{
|
|
106
128
|
"display": [
|
|
@@ -110,7 +132,10 @@
|
|
|
110
132
|
"lang": "en-US"
|
|
111
133
|
}
|
|
112
134
|
],
|
|
113
|
-
"path": [
|
|
135
|
+
"path": [
|
|
136
|
+
"employee",
|
|
137
|
+
"employeeID"
|
|
138
|
+
]
|
|
114
139
|
},
|
|
115
140
|
{
|
|
116
141
|
"display": [
|
|
@@ -120,7 +145,10 @@
|
|
|
120
145
|
"lang": "en-US"
|
|
121
146
|
}
|
|
122
147
|
],
|
|
123
|
-
"path": [
|
|
148
|
+
"path": [
|
|
149
|
+
"employee",
|
|
150
|
+
"email"
|
|
151
|
+
]
|
|
124
152
|
},
|
|
125
153
|
{
|
|
126
154
|
"display": [
|
|
@@ -130,7 +158,10 @@
|
|
|
130
158
|
"lang": "en-US"
|
|
131
159
|
}
|
|
132
160
|
],
|
|
133
|
-
"path": [
|
|
161
|
+
"path": [
|
|
162
|
+
"employee",
|
|
163
|
+
"jobTitle"
|
|
164
|
+
]
|
|
134
165
|
},
|
|
135
166
|
{
|
|
136
167
|
"display": [
|
|
@@ -140,7 +171,11 @@
|
|
|
140
171
|
"lang": "en-US"
|
|
141
172
|
}
|
|
142
173
|
],
|
|
143
|
-
"path": [
|
|
174
|
+
"path": [
|
|
175
|
+
"employee",
|
|
176
|
+
"pcc",
|
|
177
|
+
null
|
|
178
|
+
]
|
|
144
179
|
}
|
|
145
180
|
]
|
|
146
|
-
}
|
|
181
|
+
}
|
|
@@ -54,7 +54,7 @@ describe('VCT Integrity', () => {
|
|
|
54
54
|
)
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
it('create vct integrity values for loyalty
|
|
57
|
+
it('create vct integrity values for loyalty prograam account', async () => {
|
|
58
58
|
const vct: string = fs.readFileSync(__dirname + '/resources/LoyaltyProgramAccountCredential-vct.json', 'utf8')
|
|
59
59
|
const vctIntegrity = await createIntegrity({ input: vct, hasher, alg: 'sha256' })
|
|
60
60
|
await validateIntegrity({ input: vct, integrityValue: vctIntegrity, hasher })
|