Failed Conditions
Push — v7 ( e44e34...2109ab )
by Florent
04:36
created

testSignMultipleInstructionWithCompactRepresentationUsingBuilder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 13
rs 9.4285
c 1
b 0
f 0
cc 1
eloc 10
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2017 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace Jose\Component\Signature\Tests;
15
16
use Base64Url\Base64Url;
17
use Jose\Component\Core\JWAManager;
18
use Jose\Component\Core\JWK;
19
use Jose\Component\Core\JWKSet;
20
use Jose\Component\Signature\Algorithm\HS256;
21
use Jose\Component\Signature\Algorithm\HS512;
22
use Jose\Component\Signature\Algorithm\PS512;
23
use Jose\Component\Signature\Algorithm\RS512;
24
use Jose\Component\Signature\JWS;
25
use Jose\Component\Signature\JWSBuilder;
26
use Jose\Component\Signature\JWSLoader;
27
use Jose\Component\Signature\Verifier;
28
29
/**
30
 * @group Signer
31
 * @group Functional
32
 */
33
final class SignerTest extends AbstractSignatureTest
34
{
35
    /**
36
     * @expectedException \InvalidArgumentException
37
     * @expectedExceptionMessage No "alg" parameter set in the header.
38
     */
39
    public function testAlgParameterIsMissing()
40
    {
41
        $jwsBuilder = $this->getJWSBuilderFactory()->create([]);
42
        $jwsBuilder
43
            ->withPayload(json_encode($this->getKey3()))
44
            ->addSignature($this->getKey1(), [])
45
            ->build();
46
    }
47
48
    /**
49
     * @expectedException \InvalidArgumentException
50
     * @expectedExceptionMessage The algorithm "foo" is not supported.
51
     */
52
    public function testAlgParameterIsNotSupported()
53
    {
54
        $jwsBuilder = $this->getJWSBuilderFactory()->create([]);
55
56
        $jwsBuilder
57
            ->withPayload(json_encode($this->getKey3()))
58
            ->addSignature($this->getKey1(), ['alg' => 'foo'])
59
            ->build();
60
    }
61
62
    /**
63
     * @expectedException \InvalidArgumentException
64
     * @expectedExceptionMessage The header contains duplicated entries: ["foo"].
65
     */
66
    public function testDuplicatedHeader()
67
    {
68
        $jwsBuilder = $this->getJWSBuilderFactory()->create([]);
69
70
        $jwsBuilder
71
            ->withPayload(json_encode($this->getKey3()))
72
            ->addSignature($this->getKey1(), ['alg' => 'ES256', 'foo' => 'bar'], ['foo' => 'bar']);
73
    }
74
75
    public function testSignAndLoadCompact()
76
    {
77
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
78
        $jws = $jwsBuilder
79
            ->withPayload(json_encode($this->getKey3()))
80
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
81
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
82
            ->build();
83
84
        $this->assertEquals(2, $jws->countSignatures());
85
86
        $loaded = JWSLoader::load($jws->toJSON());
87
88
        $this->assertInstanceOf(JWS::class, $loaded);
89
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
90
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
91
    }
92
93
    public function testSignMultipleInstructionWithCompactRepresentation()
94
    {
95
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
96
        $jws = $jwsBuilder
97
            ->withPayload('Live long and Prosper.')
98
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
99
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
100
            ->build();
101
102
        $this->assertEquals(2, $jws->countSignatures());
103
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws->toCompactJSON(0));
104
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws->toCompactJSON(1));
105
    }
106
107
    /**
108
     * @group JWSBuilder
109
     */
110
    public function testSignMultipleInstructionWithCompactRepresentationUsingBuilder()
111
    {
112
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
113
        $jws = $jwsBuilder
114
            ->withPayload('Live long and Prosper.')
115
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
116
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
117
            ->build();
118
119
        $this->assertEquals(2, $jws->countSignatures());
120
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws->toCompactJSON(0));
121
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws->toCompactJSON(1));
122
    }
123
124
    /**
125
     * @group JWSBuilder
126
     */
127
    public function testSignMultipleInstructionWithCompactRepresentationUsingBuilderAndDetachedPayload()
128
    {
129
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
130
        $jws = $jwsBuilder
131
            ->withPayload('Live long and Prosper.', true)
132
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
133
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
134
            ->build();
135
136
        $this->assertEquals(2, $jws->countSignatures());
137
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws->toCompactJSON(0));
138
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws->toCompactJSON(1));
139
    }
140
141
    public function testCreateCompactJWSUsingFactory()
142
    {
143
        $algorithmManager = JWAManager::create([new HS512(), new RS512()]);
144
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
145
146
        $jws = $jwsBuilder
147
            ->withPayload('Live long and Prosper.')
148
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
149
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
150
            ->build();
151
        $jws0 = $jws->toCompactJSON(0);
152
        $jws1 = $jws->toCompactJSON(1);
153
154
        $jws = $jwsBuilder
155
            ->withPayload('Live long and Prosper.', true)
156
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
157
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
158
            ->build();
159
        $jws2 = $jws->toCompactJSON(0);
160
        $jws3 = $jws->toCompactJSON(1);
161
162
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws0);
163
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws1);
164
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9..TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws2);
165
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9..cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws3);
166
167
        $verifier = new Verifier($algorithmManager);
168
        $loaded_0 = JWSLoader::load($jws0);
169
        $verifier->verifyWithKey($loaded_0, $this->getKey1());
170
171
        $loaded_1 = JWSLoader::load($jws1);
172
        $verifier->verifyWithKey($loaded_1, $this->getKey2());
173
174
        $loaded_2 = JWSLoader::load($jws2);
175
        $verifier->verifyWithKey($loaded_2, $this->getKey1(), 'Live long and Prosper.');
176
177
        $loaded_3 = JWSLoader::load($jws3);
178
        $verifier->verifyWithKey($loaded_3, $this->getKey2(), 'Live long and Prosper.');
179
    }
180
181
    public function testSignMultipleInstructionWithFlattenedRepresentation()
182
    {
183
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
184
        $jws = $jwsBuilder
185
            ->withPayload('Live long and Prosper.')
186
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
187
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
188
            ->build();
189
190
        $this->assertEquals(2, $jws->countSignatures());
191
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws->toFlattenedJSON(0));
192
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws->toFlattenedJSON(1));
193
    }
194
195
    public function testCreateFlattenedJWSUsingFactory()
196
    {
197
        $algorithmManager = JWAManager::create([new HS512(), new RS512()]);
198
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
199
        $jws = $jwsBuilder
200
            ->withPayload('Live long and Prosper.')
201
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
202
            ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc'])
203
            ->build();
204
        $jws0 = $jws->toFlattenedJSON(0);
205
        $jws1 = $jws->toFlattenedJSON(1);
206
207
        $jws = $jwsBuilder
208
            ->withPayload('Live long and Prosper.', true)
209
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
210
            ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc'])
211
            ->build();
212
        $jws2 = $jws->toFlattenedJSON(0);
213
        $jws3 = $jws->toFlattenedJSON(1);
214
215
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws0);
216
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws1);
217
        $this->assertEquals('{"protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws2);
218
        $this->assertEquals('{"protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws3);
219
220
        $verifier = new Verifier($algorithmManager);
221
        $loaded_0 = JWSLoader::load($jws0);
222
        $verifier->verifyWithKey($loaded_0, $this->getKey1());
223
224
        $loaded_1 = JWSLoader::load($jws1);
225
        $verifier->verifyWithKey($loaded_1, $this->getKey2());
226
227
        $loaded_2 = JWSLoader::load($jws2);
228
        $verifier->verifyWithKey($loaded_2, $this->getKey1(), 'Live long and Prosper.');
229
230
        $loaded_3 = JWSLoader::load($jws3);
231
        $verifier->verifyWithKey($loaded_3, $this->getKey2(), 'Live long and Prosper.');
232
    }
233
234
    /**
235
     * @expectedException \InvalidArgumentException
236
     * @expectedExceptionMessage The algorithm "RS512" is not allowed with this key.
237
     */
238
    public function testAlgorithmNotAllowedForTheKey()
239
    {
240
        $jwsBuilder = $this->getJWSBuilderFactory()->create([]);
241
        $jwsBuilder
242
            ->withPayload('Live long and Prosper.')
243
            ->addSignature($this->getKey5(), ['alg' => 'RS512'])
244
            ->build();
245
    }
246
247
    /**
248
     * @expectedException \InvalidArgumentException
249
     * @expectedExceptionMessage Key cannot be used to sign
250
     */
251
    public function testOperationNotAllowedForTheKey()
252
    {
253
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['PS512']);
254
        $jwsBuilder
255
            ->withPayload('Live long and Prosper.')
256
            ->addSignature($this->getKey4(), ['alg' => 'PS512'])
257
            ->build();
258
    }
259
260
    public function testSignAndLoadFlattened()
261
    {
262
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512']);
263
        $jws = $jwsBuilder
264
            ->withPayload(json_encode(['baz', 'ban']))
265
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
266
            ->build();
267
268
        $loaded = JWSLoader::load($jws->toFlattenedJSON(0));
269
270
        $this->assertEquals(1, $loaded->countSignatures());
271
        $this->assertInstanceOf(JWS::class, $loaded);
272
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
273
    }
274
275
    public function testSignAndLoad()
276
    {
277
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
278
        $verifier = new Verifier($signatureAlgorithmManager);
279
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
280
        $jws = $jwsBuilder
281
            ->withPayload('Live long and Prosper.')
282
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
283
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
284
            ->build();
285
286
        $loaded = JWSLoader::load($jws->toJSON());
287
288
        $this->assertEquals(2, $loaded->countSignatures());
289
        $this->assertInstanceOf(JWS::class, $loaded);
290
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
291
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
292
        $verifier->verifyWithKeySet($loaded, $this->getPublicKeySet());
293
294
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
295
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
296
    }
297
298
    /**
299
     * @expectedException \InvalidArgumentException
300
     * @expectedExceptionMessage  Unable to verify the JWS.
301
     */
302
    public function testSignAndLoadWithWrongKeys()
303
    {
304
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
305
        $verifier = new Verifier($signatureAlgorithmManager);
306
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['RS512']);
307
        $jws = $jwsBuilder
308
            ->withPayload('Live long and Prosper.')
309
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
310
            ->build();
311
312
        $loaded = JWSLoader::load($jws->toJSON());
313
314
        $this->assertEquals(1, $loaded->countSignatures());
315
        $this->assertInstanceOf(JWS::class, $loaded);
316
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
317
318
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
319
    }
320
321
    /**
322
     * @expectedException \InvalidArgumentException
323
     * @expectedExceptionMessage The algorithm "RS512" is not supported.
324
     */
325
    public function testSignAndLoadWithUnsupportedAlgorithm()
326
    {
327
        $verifier = new Verifier(JWAManager::create([new HS512()]));
328
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['RS512']);
329
        $jws = $jwsBuilder
330
            ->withPayload('Live long and Prosper.')
331
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
332
            ->build();
333
334
        $loaded = JWSLoader::load($jws->toJSON());
335
336
        $this->assertEquals(1, $loaded->countSignatures());
337
        $this->assertInstanceOf(JWS::class, $loaded);
338
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
339
340
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
341
    }
342
343
    /**
344
     * @expectedException \InvalidArgumentException
345
     * @expectedExceptionMessage The JWS does not contain any signature.
346
     */
347
    public function testSignAndLoadWithJWSWithoutSignatures()
348
    {
349
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
350
        $verifier = new Verifier($signatureAlgorithmManager);
351
        $payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
352
        $jws = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[]}';
353
354
        $loaded = JWSLoader::load($jws);
355
356
        $this->assertEquals(0, $loaded->countSignatures());
357
        $this->assertInstanceOf(JWS::class, $loaded);
358
        $this->assertEquals($payload, $loaded->getPayload());
359
360
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
361
    }
362
363
    /**
364
     * @see https://tools.ietf.org/html/rfc7797#section-4
365
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
366
     * @expectedException \LogicException
367
     * @expectedExceptionMessage Unable to convert the JWS with non-encoded payload.
368
     */
369
    public function testCompactJSONWithUnencodedPayload()
370
    {
371
        $protectedHeader = [
372
            'alg' => 'HS256',
373
            'b64' => false,
374
            'crit' => ['b64'],
375
        ];
376
377
        $key = JWK::create([
378
            'kty' => 'oct',
379
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
380
        ]);
381
382
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
383
        $jws = $jwsBuilder
384
            ->withPayload('Live long and Prosper.')
385
            ->addSignature($key, $protectedHeader)
386
            ->build();
387
388
        $jws->toCompactJSON(0);
389
    }
390
391
    /**
392
     * @see https://tools.ietf.org/html/rfc7797#section-4
393
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
394
     */
395
    public function testCompactJSONWithUnencodedDetachedPayload()
396
    {
397
        $payload = '$.02';
398
        $protectedHeader = [
399
            'alg' => 'HS256',
400
            'b64' => false,
401
            'crit' => ['b64'],
402
        ];
403
404
        $key = JWK::create([
405
            'kty' => 'oct',
406
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
407
        ]);
408
409
        $algorithmManager = JWAManager::create([new HS256()]);
410
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
411
        $jws = $jwsBuilder
412
            ->withPayload($payload, true)
413
            ->addSignature($key, $protectedHeader)
414
            ->build()
415
            ->toCompactJSON(0);
416
        $this->assertEquals('eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', $jws);
417
418
        $loaded = JWSLoader::load($jws);
419
        $verifier = new Verifier($algorithmManager);
420
        $verifier->verifyWithKey($loaded, $key, $payload, $index);
421
422
        $this->assertInstanceOf(JWS::class, $loaded);
423
        $this->assertEquals(0, $index);
424
        $this->assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeaders());
425
    }
426
427
    /**
428
     * The library is able to support multiple payload encoding and conversion in JSON if payload is detached.
429
     */
430
    public function testCompactJSONWithUnencodedDetachedPayloadAndMultipleSignatures()
431
    {
432
        $payload = '$.02';
433
        $protectedHeader1 = [
434
            'alg' => 'HS256',
435
            'b64' => false,
436
            'crit' => ['b64'],
437
        ];
438
        $protectedHeader2 = [
439
            'alg' => 'HS256',
440
        ];
441
442
        $key = JWK::create([
443
            'kty' => 'oct',
444
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
445
        ]);
446
447
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
448
        $jws = $jwsBuilder
449
            ->withPayload($payload, true)
450
            ->addSignature($key, $protectedHeader1)
451
            ->addSignature($key, $protectedHeader2)
452
            ->build();
453
454
        $expected_result = '{"signatures":[{"signature":"A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY","protected":"eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19"},{"signature":"5mvfOroL-g7HyqJoozehmsaqmvTYGEq5jTI1gVvoEoQ","protected":"eyJhbGciOiJIUzI1NiJ9"}]}';
455
456
        $this->assertEquals($expected_result, $jws->toJSON());
457
458
        $loaded = JWSLoader::load($expected_result);
459
        $algorithmManager = JWAManager::create([new HS256()]);
460
        $verifier = new Verifier($algorithmManager);
461
        $verifier->verifyWithKey($loaded, $key, $payload, $index1);
462
463
        $this->assertEquals(0, $index1);
464
        $this->assertEquals($protectedHeader1, $loaded->getSignature(0)->getProtectedHeaders());
465
    }
466
467
    /**
468
     * The library is able to support multiple payload encoding and conversion in JSON is not available if payload is not detached.
469
     *
470
     * @expectedException \LogicException
471
     * @expectedExceptionMessage  Foreign payload encoding detected. The JWS cannot be converted.
472
     */
473
    public function testCompactJSONWithUnencodedPayloadAndMultipleSignatures()
474
    {
475
        $payload = '$.02';
476
        $protectedHeader1 = [
477
            'alg' => 'HS256',
478
            'b64' => false,
479
            'crit' => ['b64'],
480
        ];
481
        $protectedHeader2 = [
482
            'alg' => 'HS256',
483
        ];
484
485
        $key = JWK::create([
486
            'kty' => 'oct',
487
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
488
        ]);
489
490
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
491
        $jws = $jwsBuilder
492
            ->withPayload($payload)
493
            ->addSignature($key, $protectedHeader1)
494
            ->addSignature($key, $protectedHeader2)
495
            ->build();
496
497
        $jws->toJSON();
498
    }
499
500
    /**
501
     * @expectedException \LogicException
502
     * @expectedExceptionMessage The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.
503
     */
504
    public function testJWSWithUnencodedPayloadButNoCritHeader()
505
    {
506
        $payload = '$.02';
507
        $protectedHeader = [
508
            'alg' => 'HS256',
509
            'b64' => false,
510
        ];
511
512
        $key = JWK::create([
513
            'kty' => 'oct',
514
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
515
        ]);
516
517
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
518
        $jwsBuilder
519
            ->withPayload($payload, true)
520
            ->addSignature($key, $protectedHeader)
521
            ->build()
522
            ->toCompactJSON(0);
523
    }
524
525
    /**
526
     * @expectedException \LogicException
527
     * @expectedExceptionMessage The protected header parameter "crit" must be an array.
528
     */
529
    public function testJWSWithUnencodedPayloadButCritHeaderIsNotAnArray()
530
    {
531
        $payload = '$.02';
532
        $protectedHeader = [
533
            'alg' => 'HS256',
534
            'b64' => false,
535
            'crit' => 'foo',
536
        ];
537
538
        $key = JWK::create([
539
            'kty' => 'oct',
540
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
541
        ]);
542
543
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
544
        $jwsBuilder
545
            ->withPayload($payload, true)
546
            ->addSignature($key, $protectedHeader)
547
            ->build()
548
            ->toCompactJSON(0);
549
    }
550
551
    /**
552
     * @expectedException \LogicException
553
     * @expectedExceptionMessage The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.
554
     */
555
    public function testJWSWithUnencodedPayloadButCritHeaderDoesNotContainB64()
556
    {
557
        $payload = '$.02';
558
        $protectedHeader = [
559
            'alg' => 'HS256',
560
            'b64' => false,
561
            'crit' => ['foo'],
562
        ];
563
564
        $key = JWK::create([
565
            'kty' => 'oct',
566
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
567
        ]);
568
569
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
570
        $jwsBuilder
571
            ->withPayload($payload, true)
572
            ->addSignature($key, $protectedHeader)
573
            ->build()
574
            ->toCompactJSON(0);
575
    }
576
577
    /**
578
     * @see https://tools.ietf.org/html/rfc7797#section-4
579
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
580
     */
581
    public function testFlattenedJSONWithUnencodedPayload()
582
    {
583
        $payload = '$.02';
584
        $protectedHeader = [
585
            'alg' => 'HS256',
586
            'b64' => false,
587
            'crit' => ['b64'],
588
        ];
589
590
        $key = JWK::create([
591
            'kty' => 'oct',
592
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
593
        ]);
594
595
        $expected_result = [
596
            'protected' => 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19',
597
            'payload' => '$.02',
598
            'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY',
599
        ];
600
601
        $algorithmManager = JWAManager::create([new HS256()]);
602
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
603
        $jws = $jwsBuilder
604
            ->withPayload($payload)
605
            ->addSignature($key, $protectedHeader)
606
            ->build()
607
            ->toFlattenedJSON(0);
608
609
        $this->assertEquals($expected_result, json_decode($jws, true));
610
611
        $loaded = JWSLoader::load($jws);
612
        $verifier = new Verifier($algorithmManager);
613
        $verifier->verifyWithKey($loaded, $key, null, $index);
614
615
        $this->assertInstanceOf(JWS::class, $loaded);
616
        $this->assertEquals($payload, $loaded->getPayload());
617
        $this->assertEquals(0, $index);
618
        $this->assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeaders());
619
    }
620
621
    /**
622
     * @see https://tools.ietf.org/html/rfc7797#section-4
623
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
624
     */
625
    public function testFlattenedJSONWithUnencodedDetachedPayload()
626
    {
627
        $payload = '$.02';
628
        $protectedHeader = [
629
            'alg' => 'HS256',
630
            'b64' => false,
631
            'crit' => ['b64'],
632
        ];
633
634
        $key = JWK::create([
635
            'kty' => 'oct',
636
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
637
        ]);
638
639
        $expected_result = [
640
            'protected' => 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19',
641
            'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY',
642
        ];
643
644
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS256']);
645
        $jws = $jwsBuilder
646
            ->withPayload($payload, true)
647
            ->addSignature($key, $protectedHeader)
648
            ->build()
649
            ->toFlattenedJSON(0);
650
651
        $this->assertEquals($expected_result, json_decode($jws, true));
652
    }
653
654
    /**
655
     * @expectedException \InvalidArgumentException
656
     * @expectedExceptionMessage No "alg" parameter set in the header.
657
     */
658
    public function testSignAndLoadWithoutAlgParameterInTheHeader()
659
    {
660
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
661
        $verifier = new Verifier($signatureAlgorithmManager);
662
        $payload = "It\xe2\x80\x99s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there\xe2\x80\x99s no knowing where you might be swept off to.";
663
        $jws = 'eyJraWQiOiJiaWxiby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUifQ.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg';
664
665
        $loaded = JWSLoader::load($jws);
666
667
        $this->assertEquals(1, $loaded->countSignatures());
668
        $this->assertInstanceOf(JWS::class, $loaded);
669
        $this->assertEquals($payload, $loaded->getPayload());
670
671
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
672
    }
673
674
    public function testSignAndLoadJWKSet()
675
    {
676
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
677
        $verifier = new Verifier($signatureAlgorithmManager);
678
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
679
        $jws = $jwsBuilder
680
            ->withPayload(json_encode($this->getKeyset()))
681
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
682
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
683
            ->build();
684
685
        $loaded = JWSLoader::load($jws->toJSON());
686
        $this->assertEquals(2, $loaded->countSignatures());
687
        $this->assertInstanceOf(JWS::class, $loaded);
688
        $this->assertEquals($this->getKeyset(), JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true)));
689
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
690
        $verifier->verifyWithKeySet($loaded, $this->getPublicKeySet());
691
692
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
693
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
694
    }
695
696
    /**
697
     * @expectedException \InvalidArgumentException
698
     * @expectedExceptionMessage There is no key in the key set.
699
     */
700
    public function testKeySetIsEmpty()
701
    {
702
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
703
        $verifier = new Verifier($signatureAlgorithmManager);
704
        $jwsBuilder = $this->getJWSBuilderFactory()->create(['HS512', 'RS512']);
705
        $jws = $jwsBuilder
706
            ->withPayload(json_encode($this->getKeyset()))
707
            ->addSignature($this->getKey1(), ['alg' => 'HS512', ['foo' => 'bar']])
708
            ->addSignature($this->getKey2(), ['alg' => 'RS512'])
709
            ->build();
710
711
        $loaded = JWSLoader::load($jws->toJSON());
712
        $this->assertEquals(2, $loaded->countSignatures());
713
        $this->assertInstanceOf(JWS::class, $loaded);
714
        $this->assertEquals($this->getKeyset(), JWKSet::createFromKeyData(json_decode($loaded->getPayload(), true)));
715
        $verifier->verifyWithKeySet($loaded, JWKSet::createFromKeys([]));
716
        $verifier->verifyWithKey($loaded, JWK::create(['kty' => 'EC']));
717
    }
718
719
    /**
720
     * @return JWK
721
     */
722
    private function getKey1(): JWK
723
    {
724
        $key = JWK::create([
725
            'kty' => 'oct',
726
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
727
        ]);
728
729
        return $key;
730
    }
731
732
    /**
733
     * @return JWK
734
     */
735
    private function getKey2(): JWK
736
    {
737
        $key = JWK::create([
738
            'kty' => 'RSA',
739
            'use' => 'sig',
740
            'key_ops' => ['sign'],
741
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
742
            'e' => 'AQAB',
743
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
744
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
745
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
746
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
747
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
748
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
749
        ]);
750
751
        return $key;
752
    }
753
754
    /**
755
     * @return JWK
756
     */
757
    private function getKey3(): JWK
758
    {
759
        $key = JWK::create([
760
            'kty' => 'EC',
761
            'crv' => 'P-256',
762
            'use' => 'sig',
763
            'key_ops' => ['sign'],
764
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
765
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
766
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
767
        ]);
768
769
        return $key;
770
    }
771
772
    /**
773
     * @return JWK
774
     */
775
    private function getKey4(): JWK
776
    {
777
        $key = JWK::create([
778
            'kty' => 'RSA',
779
            'alg' => 'PS512',
780
            'key_ops' => ['encrypt', 'decrypt'],
781
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
782
            'e' => 'AQAB',
783
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
784
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
785
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
786
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
787
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
788
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
789
        ]);
790
791
        return $key;
792
    }
793
794
    /**
795
     * @return JWK
796
     */
797
    private function getKey5(): JWK
798
    {
799
        $key = JWK::create([
800
            'kty' => 'RSA',
801
            'alg' => 'PS512',
802
            'use' => 'sig',
803
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
804
            'e' => 'AQAB',
805
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
806
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
807
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
808
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
809
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
810
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
811
        ]);
812
813
        return $key;
814
    }
815
816
    /**
817
     * @return JWKSet
818
     */
819
    private function getKeyset(): JWKSet
820
    {
821
        $keyset = JWKSet::createFromKeys([$this->getKey1(), $this->getKey2()]);
822
823
        return $keyset;
824
    }
825
826
    /**
827
     * @return JWKSet
828
     */
829
    private function getPublicKeySet(): JWKSet
830
    {
831
        $keys = ['keys' => [
832
            [
833
                'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8',
834
                'kty' => 'RSA',
835
                'alg' => 'RS256',
836
                'use' => 'sig',
837
                'n' => 'vnMTRCMvsS04M1yaKR112aB8RxOkWHFixZO68wCRlVLxK4ugckXVD_Ebcq-kms1T2XpoWntVfBuX40r2GvcD9UsTFt_MZlgd1xyGwGV6U_tfQUll5mKxCPjr60h83LXKJ_zmLXIqkV8tAoIg78a5VRWoms_0Bn09DKT3-RBWFjk=',
838
                'e' => 'AQAB',
839
            ],
840
            [
841
                'kid' => '02491f945c951adf156f370788e8ccdabf8877a8',
842
                'kty' => 'RSA',
843
                'alg' => 'RS256',
844
                'use' => 'sig',
845
                'n' => 'rI67uHIDWDgCy_Ut-FhhjTCkEcqzoO80IRgdpk_fJHlDmXhMTJKPizxbIEMs0wRHRZpwH-4D20thpnQB5Mgx6-XM9kOvcYpHSdcYME77BwX6uQG-hw2w77NOhYiCSZCLzx-5ld5Wjy0dympL-ExqQw-wrWipMX7NQhIbJqVbZ18=',
846
                'e' => 'AQAB',
847
            ],
848
            [
849
                'kty' => 'RSA',
850
                'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw',
851
                'e' => 'AQAB',
852
            ],
853
            [
854
                'kty' => 'RSA',
855
                'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw',
856
                'e' => 'AQAB',
857
            ],
858
            [
859
                'kty' => 'RSA',
860
                'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
861
                'e' => 'AQAB',
862
            ],
863
            [
864
                'kty' => 'EC',
865
                'crv' => 'P-256',
866
                'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
867
                'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
868
            ],
869
            [
870
                'kty' => 'EC',
871
                'crv' => 'P-521',
872
                'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
873
                'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
874
            ],
875
        ]];
876
877
        return JWKSet::createFromKeyData($keys);
878
    }
879
880
    /**
881
     * @return JWKSet
882
     */
883
    private function getSymmetricKeySet(): JWKSet
884
    {
885
        $keys = ['keys' => [
886
            [
887
                'kid' => 'DIR_1',
888
                'kty' => 'oct',
889
                'k' => Base64Url::encode(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')),
890
            ],
891
            [
892
                'kty' => 'oct',
893
                'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q',
894
            ],
895
            [
896
                'kty' => 'oct',
897
                'k' => 'GawgguFyGrWKav7AX4VKUg',
898
            ],
899
            [
900
                'kty' => 'oct',
901
                'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
902
            ],
903
        ]];
904
905
        return JWKSet::createFromKeyData($keys);
906
    }
907
}
908