@sphereon/ssi-sdk-ext.jwt-service 0.24.1-unstable.93 → 0.25.0
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/README.md +73 -374
- package/dist/agent/JwtService.d.ts +3 -0
- package/dist/agent/JwtService.d.ts.map +1 -1
- package/dist/agent/JwtService.js +78 -1
- package/dist/agent/JwtService.js.map +1 -1
- package/dist/functions/JWE.d.ts +75 -0
- package/dist/functions/JWE.d.ts.map +1 -0
- package/dist/functions/JWE.js +280 -0
- package/dist/functions/JWE.js.map +1 -0
- package/dist/functions/index.d.ts +19 -5
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js +155 -19
- package/dist/functions/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/dist/types/IJwtService.d.ts +149 -20
- package/dist/types/IJwtService.d.ts.map +1 -1
- package/dist/types/IJwtService.js +54 -1
- package/dist/types/IJwtService.js.map +1 -1
- package/package.json +15 -13
- package/plugin.schema.json +4212 -282
- package/src/agent/JwtService.ts +103 -39
- package/src/functions/JWE.ts +360 -0
- package/src/functions/index.ts +184 -26
- package/src/index.ts +4 -0
- package/src/types/IJwtService.ts +272 -55
package/README.md
CHANGED
|
@@ -6,410 +6,109 @@
|
|
|
6
6
|
<br>
|
|
7
7
|
</h1>
|
|
8
8
|
|
|
9
|
-
A plugin that
|
|
10
|
-
|
|
11
|
-
as JWKs.
|
|
9
|
+
A plugin that can generate and verify JWTs. It can create/sign JWS in Compact, JSON General and JSON Flattened form as
|
|
10
|
+
specified in [RFC 7515](https://datatracker.ietf.org/doc/html/rfc7515)
|
|
12
11
|
|
|
13
|
-
Currently, it supports the following
|
|
12
|
+
Currently, it supports the following JWS forms:
|
|
14
13
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
- X.509 certificate chains
|
|
14
|
+
- JWS Compact Form
|
|
15
|
+
- JWS Json General
|
|
16
|
+
- JWS Json Flattened (1 signature)
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
The plugin is using
|
|
19
|
+
the [Universal Identifier Resolution](https://github.com/Sphereon-Opensource/SSI-SDK-crypto-extensions/tree/develop/packages/identifier-resolution)
|
|
20
|
+
module. Both for generating JWS JWTs as well as for verifying JWTs.
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- OID4VCI Issuers
|
|
22
|
+
When signing a JWS it takes into account any x5c, kid or JWK value already present in the header, as well as the `iss`
|
|
23
|
+
value. When not present but a Managed Identifier is being provided, the signing service will take care of putting the
|
|
24
|
+
correct headers into the JWS.
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
be used for any and all identifier resolution.
|
|
26
|
+
# Creating/signing a JWS
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
The `jwtCreateJswCompactSignature` accepts a protected JWT header. You can put any JWT header properties in there.
|
|
29
|
+
The `payload` can either be a base64url payload, a `JwtPayload` object or a Buffer/Uint8arry. The method will take care
|
|
30
|
+
of any relevant conversions
|
|
33
31
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
Managed or internal identifiers, are identifiers that are being controlled by the agent. This means the agent either has
|
|
37
|
-
access to the private key, or is using a hardware protected mechanism with access to the private key. All of the managed
|
|
38
|
-
methods return both a JWK managed by the agent, an IKey instance, which is the internal key representations, as well as
|
|
39
|
-
a kmsKeyRef allowing you to retrieve the key easily later.
|
|
40
|
-
|
|
41
|
-
Read an identifier by IIdentifier object or DID (or did URL)
|
|
42
|
-
|
|
43
|
-
### DIDs and IIdentifiers
|
|
32
|
+
The `issuer` object allows you to provide a managed identifier
|
|
44
33
|
|
|
45
34
|
```typescript
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
resolution = await agent.identifierManagedGet({
|
|
56
|
-
identifier:
|
|
57
|
-
'did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0',
|
|
58
|
-
})
|
|
59
|
-
// This is the same as above, but with the benefit of having fully typed response, instead of a union
|
|
60
|
-
resolution = await agent.identifierManagedGetByDid({
|
|
61
|
-
identifier:
|
|
62
|
-
'did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0',
|
|
35
|
+
const publicKeyHex = '037fcdce2770f6c45d4183cbee6fdb4b7b580733357be9ef13bacf6e3c7bd15445'
|
|
36
|
+
const kid = publicKeyHex
|
|
37
|
+
|
|
38
|
+
const example = await agent.jwtCreateJwsCompactSignature({
|
|
39
|
+
// Example payloads from IETF spec
|
|
40
|
+
issuer: { identifier: kid, noIdentifierInHeader: true }, // do not update any header values with the provided identifier. Just use the identifier for signing
|
|
41
|
+
protectedHeader: { alg: 'ES256' },
|
|
42
|
+
payload: 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ',
|
|
63
43
|
})
|
|
64
44
|
```
|
|
65
45
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
```json
|
|
69
|
-
{
|
|
70
|
-
"method": "did",
|
|
71
|
-
"jwk": {
|
|
72
|
-
"alg": "ES256",
|
|
73
|
-
"kty": "EC",
|
|
74
|
-
"crv": "P-256",
|
|
75
|
-
"x": "GjhS83y2FihjbF38P_sMUKf935hVvMDsck0DgxxmC34",
|
|
76
|
-
"y": "SpVOGx5levQc5M_Y3eAM2ouhfFqtUsPzU__DAITX-hI",
|
|
77
|
-
"kid": "77_7PdYbkikec5AR6zSKVIxgNExChvuOLLULBwS6jwc"
|
|
78
|
-
},
|
|
79
|
-
"jwkThumbprint": "77_7PdYbkikec5AR6zSKVIxgNExChvuOLLULBwS6jwc",
|
|
80
|
-
"identifier": {
|
|
81
|
-
"did": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0",
|
|
82
|
-
"controllerKeyId": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0#0",
|
|
83
|
-
"keys": [
|
|
84
|
-
{
|
|
85
|
-
<snip>
|
|
86
|
-
"kms": "local"
|
|
87
|
-
}
|
|
88
|
-
],
|
|
89
|
-
"services": [],
|
|
90
|
-
"provider": "did:jwk"
|
|
91
|
-
},
|
|
92
|
-
"did": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0",
|
|
93
|
-
"controllerKeyId": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0#0",
|
|
94
|
-
"keys": [
|
|
95
|
-
{
|
|
96
|
-
<snip,
|
|
97
|
-
see
|
|
98
|
-
key
|
|
99
|
-
below>
|
|
100
|
-
}
|
|
101
|
-
],
|
|
102
|
-
"key": {
|
|
103
|
-
"type": "Secp256r1",
|
|
104
|
-
"kid": "021a3852f37cb61628636c5dfc3ffb0c50a7fddf9855bcc0ec724d03831c660b7e",
|
|
105
|
-
"publicKeyHex": "021a3852f37cb61628636c5dfc3ffb0c50a7fddf9855bcc0ec724d03831c660b7e",
|
|
106
|
-
"kms": "local",
|
|
107
|
-
"meta": <snip>
|
|
108
|
-
},
|
|
109
|
-
"kmsKeyRef": "021a3852f37cb61628636c5dfc3ffb0c50a7fddf9855bcc0ec724d03831c660b7e"
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### KMS Key reference, JWK Thumbprint
|
|
46
|
+
Verify the signature:
|
|
114
47
|
|
|
115
|
-
|
|
116
|
-
|
|
48
|
+
You can optionally provide a JWK if you want to use the JWK as a key for verification. Otherwise it will automacally
|
|
49
|
+
resolve the header params like x5c, kid (DID), JWK to perform the resolution with
|
|
50
|
+
the [Universal Identifier Resolution](https://github.com/Sphereon-Opensource/SSI-SDK-crypto-extensions/tree/develop/packages/identifier-resolution)
|
|
51
|
+
module
|
|
117
52
|
|
|
118
53
|
```typescript
|
|
119
|
-
|
|
120
|
-
resolution = await agent.identifierManagedGet({ identifier: '77_7PdYbkikec5AR6zSKVIxgNExChvuOLLULBwS6jwc' })
|
|
121
|
-
// This is the same as above, but with the benefit of having fully typed response, instead of a union
|
|
122
|
-
resolution = await agent.identifierManagedGetByKid({ identifier: '77_7PdYbkikec5AR6zSKVIxgNExChvuOLLULBwS6jwc' })
|
|
123
|
-
|
|
124
|
-
// KMS Key ref
|
|
125
|
-
resolution = await agent.identifierManagedGet({ identifier: '021a3852f37cb61628636c5dfc3ffb0c50a7fddf9855bcc0ec724d03831c660b7e' })
|
|
126
|
-
// This is the same as above, but with the benefit of having fully typed response, instead of a union
|
|
127
|
-
resolution = await agent.identifierManagedGetByKid({ identifier: '021a3852f37cb61628636c5dfc3ffb0c50a7fddf9855bcc0ec724d03831c660b7e' })
|
|
128
|
-
|
|
129
|
-
const jwk = {
|
|
130
|
-
alg: 'ES256',
|
|
54
|
+
const ietfJwk = {
|
|
131
55
|
kty: 'EC',
|
|
132
56
|
crv: 'P-256',
|
|
133
|
-
x: '
|
|
134
|
-
y: '
|
|
135
|
-
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
resolution = await agent.identifierManagedGetByJwk({ identifier: jwk })
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## External Identifiers
|
|
145
|
-
|
|
146
|
-
We will use the example JWK above again, as that is an in memory construct, we can also resolve it like an external
|
|
147
|
-
identifier
|
|
148
|
-
|
|
149
|
-
### DIDs
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
const did =
|
|
153
|
-
'did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoiR2poUzgzeTJGaWhqYkYzOFBfc01VS2Y5MzVoVnZNRHNjazBEZ3h4bUMzNCIsInkiOiJTcFZPR3g1bGV2UWM1TV9ZM2VBTTJvdWhmRnF0VXNQelVfX0RBSVRYLWhJIn0'
|
|
154
|
-
|
|
155
|
-
resolution = await agent.identifierExternalResolve({ identifier: did })
|
|
156
|
-
// This is the same as above, but with the benefit of having fully typed response, instead of a union
|
|
157
|
-
resolution = await agent.identifierExternalResolveByDid({ identifier: did })
|
|
158
|
-
console.log(JSON.stringify(resolution, null, 2))
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
Results in the following JSON, with some properties removed for brevity
|
|
162
|
-
|
|
163
|
-
```json
|
|
164
|
-
{
|
|
165
|
-
"method": "did",
|
|
166
|
-
"did": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
167
|
-
"jwks": [
|
|
168
|
-
{
|
|
169
|
-
"jwk": {
|
|
170
|
-
"alg": "ES256",
|
|
171
|
-
"use": "sig",
|
|
172
|
-
"kty": "EC",
|
|
173
|
-
"crv": "P-256",
|
|
174
|
-
"x": "wdIEmfjmaZiGsub9Hffnhbr0xVVVmVLiUYLscgRt-3Y",
|
|
175
|
-
"y": "ept3ke4SslZb7ZbweWKmSaM3166ZuvecZ9ciKs6PDcw",
|
|
176
|
-
"kid": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
177
|
-
},
|
|
178
|
-
"jwkThumbprint": "gBT5We3eKcs3NNBAeJ40iPHbWvqAmY8C8L36rGwOAJk",
|
|
179
|
-
"kid": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
180
|
-
}
|
|
181
|
-
],
|
|
182
|
-
"didJwks": {
|
|
183
|
-
// These are the JWKs per verification method relationship. For a JWK this includes the above JWK, so we will not repeat it here
|
|
184
|
-
"verificationMethod": [
|
|
185
|
-
{
|
|
186
|
-
<snip>
|
|
187
|
-
}
|
|
188
|
-
],
|
|
189
|
-
"assertionMethod": [
|
|
190
|
-
{
|
|
191
|
-
<snip>
|
|
192
|
-
}
|
|
193
|
-
],
|
|
194
|
-
"authentication": [
|
|
195
|
-
{
|
|
196
|
-
<snip>
|
|
197
|
-
}
|
|
198
|
-
],
|
|
199
|
-
"keyAgreement": [],
|
|
200
|
-
"capabilityInvocation": [
|
|
201
|
-
{
|
|
202
|
-
<snip>
|
|
203
|
-
}
|
|
204
|
-
],
|
|
205
|
-
"capabilityDelegation": [
|
|
206
|
-
{
|
|
207
|
-
<snip>
|
|
208
|
-
}
|
|
209
|
-
]
|
|
210
|
-
},
|
|
211
|
-
"didDocument": {
|
|
212
|
-
"@context": [
|
|
213
|
-
"https://www.w3.org/ns/did/v1",
|
|
214
|
-
{
|
|
215
|
-
"@vocab": "https://www.iana.org/assignments/jose#"
|
|
216
|
-
}
|
|
217
|
-
],
|
|
218
|
-
"id": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
219
|
-
"verificationMethod": [
|
|
220
|
-
{
|
|
221
|
-
"id": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0",
|
|
222
|
-
"type": "JsonWebKey2020",
|
|
223
|
-
"controller": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
224
|
-
"publicKeyJwk": {
|
|
225
|
-
"alg": "ES256",
|
|
226
|
-
"use": "sig",
|
|
227
|
-
"kty": "EC",
|
|
228
|
-
"crv": "P-256",
|
|
229
|
-
"x": "wdIEmfjmaZiGsub9Hffnhbr0xVVVmVLiUYLscgRt-3Y",
|
|
230
|
-
"y": "ept3ke4SslZb7ZbweWKmSaM3166ZuvecZ9ciKs6PDcw",
|
|
231
|
-
"kid": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
],
|
|
235
|
-
"assertionMethod": [
|
|
236
|
-
"did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
237
|
-
],
|
|
238
|
-
"authentication": [
|
|
239
|
-
"did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
240
|
-
],
|
|
241
|
-
"capabilityInvocation": [
|
|
242
|
-
"did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
243
|
-
],
|
|
244
|
-
"capabilityDelegation": [
|
|
245
|
-
"did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0#0"
|
|
246
|
-
]
|
|
247
|
-
},
|
|
248
|
-
"didResolutionResult": {
|
|
249
|
-
"didDocumentMetadata": {},
|
|
250
|
-
"didResolutionMetadata": {
|
|
251
|
-
"contentType": "application/did+ld+json",
|
|
252
|
-
"pattern": "^(did:jwk:.+)$",
|
|
253
|
-
"did": {
|
|
254
|
-
"didString": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
255
|
-
"methodSpecificId": "eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
256
|
-
"method": "jwk"
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
},
|
|
260
|
-
"didParsed": {
|
|
261
|
-
"did": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
262
|
-
"method": "jwk",
|
|
263
|
-
"id": "eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0",
|
|
264
|
-
"didUrl": "did:jwk:eyJhbGciOiJFUzI1NiIsInVzZSI6InNpZyIsImt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4Ijoid2RJRW1mam1hWmlHc3ViOUhmZm5oYnIweFZWVm1WTGlVWUxzY2dSdC0zWSIsInkiOiJlcHQza2U0U3NsWmI3WmJ3ZVdLbVNhTTMxNjZadXZlY1o5Y2lLczZQRGN3In0"
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### X.509 Certificate Chains
|
|
270
|
-
|
|
271
|
-
You can provide an optional verification time as well using a Date as value. By default the X5C will be fully verified,
|
|
272
|
-
unless the verification param is set to false.
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
const sphereonCA = 'PEM or DER CERT'
|
|
276
|
-
const sphereonTest = 'PEM or DER CERT'
|
|
277
|
-
|
|
278
|
-
let resolution = await agent.identifierExternalResolve({
|
|
279
|
-
identifier: [sphereonTest, sphereonCA],
|
|
280
|
-
trustAnchors: [sphereonCA],
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
// This is the same as above, but with the benefit of having fully typed response, instead of a union
|
|
284
|
-
resolution = await agent.identifierExternalResolveByX5c({
|
|
285
|
-
identifier: [sphereonTest, sphereonCA],
|
|
286
|
-
trustAnchors: [sphereonCA],
|
|
57
|
+
x: 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
|
|
58
|
+
y: 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
|
|
59
|
+
// d: 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
|
|
60
|
+
} satisfies JWK
|
|
61
|
+
|
|
62
|
+
const result = await agent.jwtVerifyJwsSignature({
|
|
63
|
+
jws: example.jwt,
|
|
64
|
+
jwk: ietfJwk,
|
|
287
65
|
})
|
|
288
|
-
|
|
289
|
-
console.log(JSON.stringify(resolution, null, 2))
|
|
290
66
|
```
|
|
291
67
|
|
|
292
|
-
```
|
|
293
|
-
{
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
"verificationTime": "2024-08-13T13:28:16.457Z",
|
|
300
|
-
"certificateChain": [
|
|
68
|
+
```typescript
|
|
69
|
+
const result = {
|
|
70
|
+
critical: false,
|
|
71
|
+
error: false,
|
|
72
|
+
jws: {
|
|
73
|
+
payload: 'eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ',
|
|
74
|
+
signatures: [
|
|
301
75
|
{
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
"key_ops": ["verify"],
|
|
323
|
-
"ext": true,
|
|
324
|
-
"kty": "EC",
|
|
325
|
-
"x": "pyVHVR7IdgWmG_TLb3-K_4dg3XC6GQQWDB61Lna15ns",
|
|
326
|
-
"y": "OcVNCBD0kMmqEaKjbczwd2GvbV1AOxgE7AKsa3L0zxM",
|
|
327
|
-
"crv": "P-256"
|
|
76
|
+
identifier: {
|
|
77
|
+
jwk: {
|
|
78
|
+
crv: 'P-256',
|
|
79
|
+
kty: 'EC',
|
|
80
|
+
x: 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
|
|
81
|
+
y: 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
|
|
82
|
+
},
|
|
83
|
+
jwks: [
|
|
84
|
+
{
|
|
85
|
+
jwk: {
|
|
86
|
+
crv: 'P-256',
|
|
87
|
+
kty: 'EC',
|
|
88
|
+
x: 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
|
|
89
|
+
y: 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
|
|
90
|
+
},
|
|
91
|
+
jwkThumbprint: 'oKIywvGUpTVTyxMQ3bwIIeQUudfr_CkLMjCE19ECD-U',
|
|
92
|
+
publicKeyHex: '037fcdce2770f6c45d4183cbee6fdb4b7b580733357be9ef13bacf6e3c7bd15445',
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
method: 'jwk',
|
|
328
96
|
},
|
|
329
|
-
|
|
330
|
-
|
|
97
|
+
protected: 'eyJhbGciOiJFUzI1NiJ9',
|
|
98
|
+
signature: 'e4ZrhZdbFQ7630Tq51E6RQiJaae9bFNGJszIhtusEwzvO21rzH76Wer6yRn2Zb34VjIm3cVRl0iQctbf4uBY3w',
|
|
331
99
|
},
|
|
332
|
-
|
|
333
|
-
"issuer": {
|
|
334
|
-
"dn": {
|
|
335
|
-
"DN": "C=NL,O=Sphereon International B.V.,OU=IT,CN=ca.sphereon.com",
|
|
336
|
-
"attributes": {
|
|
337
|
-
"C": "NL",
|
|
338
|
-
"O": "Sphereon International B.V.",
|
|
339
|
-
"OU": "IT",
|
|
340
|
-
"CN": "ca.sphereon.com"
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
},
|
|
344
|
-
"subject": {
|
|
345
|
-
"dn": {
|
|
346
|
-
"DN": "C=NL,O=Sphereon International B.V.,OU=IT,CN=ca.sphereon.com",
|
|
347
|
-
"attributes": {
|
|
348
|
-
"C": "NL",
|
|
349
|
-
"O": "Sphereon International B.V.",
|
|
350
|
-
"OU": "IT",
|
|
351
|
-
"CN": "ca.sphereon.com"
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
},
|
|
355
|
-
"publicKeyJWK": {
|
|
356
|
-
"key_ops": ["verify"],
|
|
357
|
-
"ext": true,
|
|
358
|
-
"kty": "EC",
|
|
359
|
-
"x": "SIDQp4RJI2s5yYIOBrxiwGRROCjBkbCq8vaf3UlSkAw",
|
|
360
|
-
"y": "dRSwvlVFdqdiLXnk2pQqT1vZnDG0I-x-iz2EbdsG0aY",
|
|
361
|
-
"crv": "P-256"
|
|
362
|
-
},
|
|
363
|
-
"notBefore": "2024-07-28T21:26:49.000Z",
|
|
364
|
-
"notAfter": "2034-07-28T21:26:49.000Z"
|
|
365
|
-
}
|
|
366
|
-
]
|
|
367
|
-
},
|
|
368
|
-
"issuerJWK": {
|
|
369
|
-
"key_ops": ["verify"],
|
|
370
|
-
"ext": true,
|
|
371
|
-
"kty": "EC",
|
|
372
|
-
"x": "pyVHVR7IdgWmG_TLb3-K_4dg3XC6GQQWDB61Lna15ns",
|
|
373
|
-
"y": "OcVNCBD0kMmqEaKjbczwd2GvbV1AOxgE7AKsa3L0zxM",
|
|
374
|
-
"crv": "P-256"
|
|
100
|
+
],
|
|
375
101
|
},
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
"key_ops": ["verify"],
|
|
380
|
-
"ext": true,
|
|
381
|
-
"kty": "EC",
|
|
382
|
-
"x": "pyVHVR7IdgWmG_TLb3-K_4dg3XC6GQQWDB61Lna15ns",
|
|
383
|
-
"y": "OcVNCBD0kMmqEaKjbczwd2GvbV1AOxgE7AKsa3L0zxM",
|
|
384
|
-
"crv": "P-256"
|
|
385
|
-
},
|
|
386
|
-
"kid": "CN=test123.test.sphereon.com",
|
|
387
|
-
"jwkThumbprint": "LlITYB6tlvSVtVrMtIEzrkkSQkMSoPslhQ3Rnk1x484"
|
|
388
|
-
},
|
|
389
|
-
{
|
|
390
|
-
"jwk": {
|
|
391
|
-
"key_ops": ["verify"],
|
|
392
|
-
"ext": true,
|
|
393
|
-
"kty": "EC",
|
|
394
|
-
"x": "SIDQp4RJI2s5yYIOBrxiwGRROCjBkbCq8vaf3UlSkAw",
|
|
395
|
-
"y": "dRSwvlVFdqdiLXnk2pQqT1vZnDG0I-x-iz2EbdsG0aY",
|
|
396
|
-
"crv": "P-256"
|
|
397
|
-
},
|
|
398
|
-
"kid": "C=NL,O=Sphereon International B.V.,OU=IT,CN=ca.sphereon.com",
|
|
399
|
-
"jwkThumbprint": "1wAefk4zZ8Q8cM-9djHoJhPUtKjVFLqG7u9VftVqulA"
|
|
400
|
-
}
|
|
401
|
-
],
|
|
402
|
-
"x5c": [
|
|
403
|
-
"MIIC1jCCAnygAwIBAgITALtvb+InWBtzJO3mAeQZIUBXbzAKBggqhkjOPQQDAjBaMQswCQYDVQQGEwJOTDEkMCIGA1UECgwbU3BoZXJlb24gSW50ZXJuYXRpb25hbCBCLlYuMQswCQYDVQQLDAJJVDEYMBYGA1UEAwwPY2Euc3BoZXJlb24uY29tMB4XDTI0MDgwNjIwMTYxMloXDTI0MTEwNDIyMTYxMlowJDEiMCAGA1UEAwwZdGVzdDEyMy50ZXN0LnNwaGVyZW9uLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKclR1UeyHYFphv0y29/iv+HYN1wuhkEFgwetS52teZ7OcVNCBD0kMmqEaKjbczwd2GvbV1AOxgE7AKsa3L0zxOjggFVMIIBUTAdBgNVHQ4EFgQUoWVOwL15ttB1YPUd0HgvYry0Z+UwHwYDVR0jBBgwFoAU5wfKXZVc+cig/s7jZEUegLMsMsEwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vZXUuY2VydC5lemNhLmlvL2NlcnRzL2RhYTFiNGI0LTg1ZmQtNGJhNC1iOTZiLTMzMmFkZDg5OWNlOS5jZXIwEwYDVR0lBAwwCgYIKwYBBQUHAwIwJAYDVR0RBB0wG4IZdGVzdDEyMy50ZXN0LnNwaGVyZW9uLmNvbTAOBgNVHQ8BAf8EBAMCB4AwYQYDVR0fBFowWDBWoFSgUoZQaHR0cDovL2V1LmNybC5lemNhLmlvL2NybC8yY2RmN2M1ZS1iOWNkLTQzMTctYmI1Ni0zODZkMjQ0MzgwZTIvY2FzcGhlcmVvbmNvbS5jcmwwCgYIKoZIzj0EAwIDSAAwRQIgThuggyhKePvRt5YEvfg6MD42N2/63L0ypw0vLZkM+zYCIQD+uInjqsfR6K/D+ebjuOAdhOyeD2nZAW29zN20WIQJsw==",
|
|
404
|
-
"MIICCDCCAa6gAwIBAgITAPMgqwtYzWPBXaobHhxG9iSydTAKBggqhkjOPQQDAjBaMQswCQYDVQQGEwJOTDEkMCIGA1UECgwbU3BoZXJlb24gSW50ZXJuYXRpb25hbCBCLlYuMQswCQYDVQQLDAJJVDEYMBYGA1UEAwwPY2Euc3BoZXJlb24uY29tMB4XDTI0MDcyODIxMjY0OVoXDTM0MDcyODIxMjY0OVowWjELMAkGA1UEBhMCTkwxJDAiBgNVBAoMG1NwaGVyZW9uIEludGVybmF0aW9uYWwgQi5WLjELMAkGA1UECwwCSVQxGDAWBgNVBAMMD2NhLnNwaGVyZW9uLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEiA0KeESSNrOcmCDga8YsBkUTgowZGwqvL2n91JUpAMdRSwvlVFdqdiLXnk2pQqT1vZnDG0I+x+iz2EbdsG0aajUzBRMB0GA1UdDgQWBBTnB8pdlVz5yKD+zuNkRR6AsywywTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIHH7ie1OAAbff5262rzZVQa8J9zENG8AQlHHFydMdgaXAiEA1Ib82mhHIYDziE0DDbHEAXOs98al+7dpo8fPGVGTeKI="
|
|
405
|
-
]
|
|
102
|
+
message: 'Signature validated',
|
|
103
|
+
name: 'jws',
|
|
104
|
+
verificationTime: '2024-08-10T23:04:23',
|
|
406
105
|
}
|
|
407
106
|
```
|
|
408
107
|
|
|
409
108
|
### Installation
|
|
410
109
|
|
|
411
110
|
```shell
|
|
412
|
-
pnpm add @sphereon/ssi-sdk-ext.
|
|
111
|
+
pnpm add @sphereon/ssi-sdk-ext.jwt-service
|
|
413
112
|
```
|
|
414
113
|
|
|
415
114
|
### Build
|
|
@@ -10,5 +10,8 @@ export declare class JwtService implements IAgentPlugin {
|
|
|
10
10
|
private jwtCreateJwsJsonGeneralSignature;
|
|
11
11
|
private jwtCreateJwsJsonFlattenedSignature;
|
|
12
12
|
private jwtCreateJwsCompactSignature;
|
|
13
|
+
private jwtVerifyJwsSignature;
|
|
14
|
+
private jwtEncryptJweCompactJwt;
|
|
15
|
+
private jwtDecryptJweCompactJwt;
|
|
13
16
|
}
|
|
14
17
|
//# sourceMappingURL=JwtService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JwtService.d.ts","sourceRoot":"","sources":["../../src/agent/JwtService.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"JwtService.d.ts","sourceRoot":"","sources":["../../src/agent/JwtService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAA;AACzC,OAAO,EAUH,WAAW,EAad,MAAM,IAAI,CAAA;AAKX;;GAEG;AACH,qBAAa,UAAW,YAAW,YAAY;IAC3C,QAAQ,CAAC,MAAM,MAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAQ5B;YAEa,aAAa;YAIb,gCAAgC;YAIhC,kCAAkC;YAIlC,4BAA4B;YAK5B,qBAAqB;YAIrB,uBAAuB;YAyCvB,uBAAuB;CAIxC"}
|
package/dist/agent/JwtService.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -11,17 +34,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
35
|
exports.JwtService = void 0;
|
|
13
36
|
const __1 = require("..");
|
|
37
|
+
const JWE_1 = require("../functions/JWE");
|
|
38
|
+
const u8a = __importStar(require("uint8arrays"));
|
|
14
39
|
/**
|
|
15
40
|
* @public
|
|
16
41
|
*/
|
|
17
42
|
class JwtService {
|
|
18
43
|
constructor() {
|
|
19
|
-
this.schema = __1.schema.
|
|
44
|
+
this.schema = __1.schema.IJwtService;
|
|
20
45
|
this.methods = {
|
|
21
46
|
jwtPrepareJws: this.jwtPrepareJws.bind(this),
|
|
22
47
|
jwtCreateJwsJsonGeneralSignature: this.jwtCreateJwsJsonGeneralSignature.bind(this),
|
|
23
48
|
jwtCreateJwsJsonFlattenedSignature: this.jwtCreateJwsJsonFlattenedSignature.bind(this),
|
|
24
49
|
jwtCreateJwsCompactSignature: this.jwtCreateJwsCompactSignature.bind(this),
|
|
50
|
+
jwtVerifyJwsSignature: this.jwtVerifyJwsSignature.bind(this),
|
|
51
|
+
jwtEncryptJweCompactJwt: this.jwtEncryptJweCompactJwt.bind(this),
|
|
52
|
+
jwtDecryptJweCompactJwt: this.jwtDecryptJweCompactJwt.bind(this)
|
|
25
53
|
};
|
|
26
54
|
}
|
|
27
55
|
jwtPrepareJws(args, context) {
|
|
@@ -45,6 +73,55 @@ class JwtService {
|
|
|
45
73
|
return { jwt: yield (0, __1.createJwsCompact)(args, context) };
|
|
46
74
|
});
|
|
47
75
|
}
|
|
76
|
+
jwtVerifyJwsSignature(args, context) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
return yield (0, __1.verifyJws)(args, context);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
jwtEncryptJweCompactJwt(args, context) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
84
|
+
const { payload, protectedHeader = { alg: args.alg, enc: args.enc }, recipientKey, issuer, expirationTime, audience } = args;
|
|
85
|
+
console.log(JSON.stringify(args, null, 2));
|
|
86
|
+
const alg = (_b = (_a = (0, __1.jweAlg)(args.alg)) !== null && _a !== void 0 ? _a : (0, __1.jweAlg)(protectedHeader.alg)) !== null && _b !== void 0 ? _b : 'ECDH-ES';
|
|
87
|
+
const enc = (_d = (_c = (0, __1.jweEnc)(args.enc)) !== null && _c !== void 0 ? _c : (0, __1.jweEnc)(protectedHeader.enc)) !== null && _d !== void 0 ? _d : 'A256GCM';
|
|
88
|
+
const encJwks = recipientKey.jwks.length === 1 ? [recipientKey.jwks[0]] : recipientKey.jwks.filter(jwk => (jwk.kid && (jwk.kid === jwk.jwk.kid || jwk.kid === jwk.jwkThumbprint)) || jwk.jwk.use === 'enc');
|
|
89
|
+
if (encJwks.length === 0) {
|
|
90
|
+
return Promise.reject(Error(`No public JWK found that can be used to encrypt against`));
|
|
91
|
+
}
|
|
92
|
+
const jwkInfo = encJwks[0];
|
|
93
|
+
if (encJwks.length > 0) {
|
|
94
|
+
__1.JwtLogger.warning(`More than one JWK with 'enc' usage found. Selected the first one as no 'kid' was provided`, encJwks);
|
|
95
|
+
}
|
|
96
|
+
if (((_e = jwkInfo.jwk.kty) === null || _e === void 0 ? void 0 : _e.startsWith('EC')) !== true || !alg.startsWith('ECDH')) {
|
|
97
|
+
return Promise.reject(Error(`Currently only ECDH-ES is supported for encryption. JWK alg ${jwkInfo.jwk.kty}, header alg ${alg}`)); // TODO: Probably we support way more already
|
|
98
|
+
}
|
|
99
|
+
const apuVal = (_f = protectedHeader.apu) !== null && _f !== void 0 ? _f : args.apu;
|
|
100
|
+
const apu = apuVal ? u8a.fromString(apuVal, 'base64url') : undefined;
|
|
101
|
+
const apvVal = (_g = protectedHeader.apv) !== null && _g !== void 0 ? _g : args.apv;
|
|
102
|
+
const apv = apvVal ? u8a.fromString(apvVal, 'base64url') : undefined;
|
|
103
|
+
const pubKey = yield crypto.subtle.importKey('jwk', jwkInfo.jwk, {
|
|
104
|
+
name: 'ECDH',
|
|
105
|
+
namedCurve: 'P-256',
|
|
106
|
+
}, true, []);
|
|
107
|
+
const encrypter = new JWE_1.CompactJwtEncrypter({
|
|
108
|
+
enc,
|
|
109
|
+
alg,
|
|
110
|
+
keyManagementParams: { apu, apv },
|
|
111
|
+
key: pubKey,
|
|
112
|
+
issuer,
|
|
113
|
+
expirationTime,
|
|
114
|
+
audience
|
|
115
|
+
});
|
|
116
|
+
const jwe = yield encrypter.encryptCompactJWT(payload, {});
|
|
117
|
+
return { jwt: jwe };
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
jwtDecryptJweCompactJwt(args, context) {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
return { jwt: "FIXME" };
|
|
123
|
+
});
|
|
124
|
+
}
|
|
48
125
|
}
|
|
49
126
|
exports.JwtService = JwtService;
|
|
50
127
|
//# sourceMappingURL=JwtService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JwtService.js","sourceRoot":"","sources":["../../src/agent/JwtService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JwtService.js","sourceRoot":"","sources":["../../src/agent/JwtService.ts"],"names":[],"mappings":"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"}
|