Failed Conditions
Push — v7 ( 334279...19cd68 )
by Florent
01:45
created

SignerTest   B

Complexity

Total Complexity 36

Size/Duplication

Total Lines 901
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 14

Importance

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