Failed Conditions
Push — v7 ( 36a297...47c572 )
by Florent
02:05
created

SignerTest::testCompactJSONWithUnencodedPayload()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
dl 0
loc 29
rs 8.8571
c 1
b 1
f 0
cc 1
eloc 20
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\Factory\JWAManagerFactory;
21
use Jose\Component\Signature\Algorithm\HS256;
22
use Jose\Component\Signature\Algorithm\HS512;
23
use Jose\Component\Signature\Algorithm\PS512;
24
use Jose\Component\Signature\Algorithm\RS512;
25
use Jose\Component\Signature\JWS;
26
use Jose\Component\Signature\JWSBuilder;
27
use Jose\Component\Signature\JWSLoader;
28
use Jose\Component\Signature\Verifier;
29
use PHPUnit\Framework\TestCase;
30
31
/**
32
 * @group Signer
33
 * @group Functional
34
 */
35
final class SignerTest extends TestCase
36
{
37
    /**
38
     * @expectedException \InvalidArgumentException
39
     * @expectedExceptionMessage No "alg" parameter set in the header.
40
     */
41
    public function testAlgParameterIsMissing()
42
    {
43
        $signatureAlgorithmManager = JWAManager::create([]);
44
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
45
        $jwsBuilder = $jwsBuilder
46
            ->withPayload($this->getKey3())
47
            ->addSignature($this->getKey1(), []);
48
49
        $jwsBuilder->build();
50
    }
51
52
    /**
53
     * @expectedException \InvalidArgumentException
54
     * @expectedExceptionMessage The algorithm "foo" is not supported.
55
     */
56
    public function testAlgParameterIsNotSupported()
57
    {
58
        $signatureAlgorithmManager = JWAManager::create([]);
59
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
60
61
        $jwsBuilder = $jwsBuilder
62
            ->withPayload($this->getKey3())
63
            ->addSignature($this->getKey1(), ['alg' => 'foo']);
64
65
        $jwsBuilder->build();
66
    }
67
68
    public function testSignAndLoadCompact()
69
    {
70
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
71
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
72
        $jwsBuilder = $jwsBuilder
73
            ->withPayload($this->getKey3())
74
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
75
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
76
77
        $jws = $jwsBuilder->build();
78
79
        $this->assertEquals(2, $jws->countSignatures());
80
81
        $loaded = JWSLoader::load($jws->toJSON());
82
83
        $this->assertInstanceOf(JWS::class, $loaded);
84
        $this->assertTrue(is_array($loaded->getPayload()));
85
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
86
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
87
    }
88
89
    public function testSignMultipleInstructionWithCompactRepresentation()
90
    {
91
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
92
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
93
        $jwsBuilder = $jwsBuilder
94
            ->withPayload('Live long and Prosper.')
95
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
96
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
97
98
        $jws = $jwsBuilder->build();
99
100
        $this->assertEquals(2, $jws->countSignatures());
101
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws->toCompactJSON(0));
102
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws->toCompactJSON(1));
103
    }
104
105
    /**
106
     * @group JWSBuilder
107
     */
108
    public function testSignMultipleInstructionWithCompactRepresentationUsingBuilder()
109
    {
110
        $jwaManager = JWAManager::create([new HS512(), new RS512()]);
111
        $jwsBuilder = new JWSBuilder($jwaManager);
112
        $jwsBuilder = $jwsBuilder
113
            ->withPayload('Live long and Prosper.')
114
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
115
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
116
        $jws = $jwsBuilder->build();
117
118
        $this->assertEquals(2, $jws->countSignatures());
119
        $this->assertEquals('eyJhbGciOiJIUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ', $jws->toCompactJSON(0));
120
        $this->assertEquals('eyJhbGciOiJSUzUxMiJ9.TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg.cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA', $jws->toCompactJSON(1));
121
    }
122
123
    /**
124
     * @group JWSBuilder
125
     */
126
    public function testSignMultipleInstructionWithCompactRepresentationUsingBuilderAndDetachedPayload()
127
    {
128
        $jwaManager = JWAManager::create([new HS512(), new RS512()]);
129
        $jwsBuilder = new JWSBuilder($jwaManager);
130
        $jwsBuilder = $jwsBuilder
131
            ->withPayload('Live long and Prosper.', true)
132
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
133
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
134
        $jws = $jwsBuilder->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 = JWAManagerFactory::createFromAlgorithmName(['HS512', 'RS512']);
144
        $builder = new JWSBuilder($algorithmManager);
145
146
        $jws = $builder
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 = $builder
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
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
184
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
185
        $jwsBuilder = $jwsBuilder
186
            ->withPayload('Live long and Prosper.')
187
            ->addSignature($this->getKey1(), ['alg' => 'HS512'])
188
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
189
        $jws = $jwsBuilder->build();
190
191
        $this->assertEquals(2, $jws->countSignatures());
192
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws->toFlattenedJSON(0));
193
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws->toFlattenedJSON(1));
194
    }
195
196
    public function testCreateFlattenedJWSUsingFactory()
197
    {
198
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS512', 'RS512']);
199
        $builder = new JWSBuilder($algorithmManager);
200
        $jws = $builder
201
            ->withPayload('Live long and Prosper.')
202
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
203
            ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc'])
204
            ->build();
205
        $jws0 = $jws->toFlattenedJSON(0);
206
        $jws1 = $jws->toFlattenedJSON(1);
207
208
        $jws = $builder
209
            ->withPayload('Live long and Prosper.', true)
210
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
211
            ->addSignature($this->getKey2(), ['alg' => 'RS512'], ['plic' => 'ploc'])
212
            ->build();
213
        $jws2 = $jws->toFlattenedJSON(0);
214
        $jws3 = $jws->toFlattenedJSON(1);
215
216
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws0);
217
        $this->assertEquals('{"payload":"TGl2ZSBsb25nIGFuZCBQcm9zcGVyLg","protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws1);
218
        $this->assertEquals('{"protected":"eyJhbGciOiJIUzUxMiJ9","header":{"foo":"bar"},"signature":"TjxvVLKLc1kU5XW1NjZlI6_kQHjeU2orTWBZ7p0KuRzq_9lyPWR04PAUpbYkaLJLsmIJ8Fxi8Gsrc0khPtFxfQ"}', $jws2);
219
        $this->assertEquals('{"protected":"eyJhbGciOiJSUzUxMiJ9","header":{"plic":"ploc"},"signature":"cR-npy2oEi275rpeTAKooLRzOhIOFMewpzE38CLx4_CtdkN4Y7EUlca9ryV6yGMH8SswUqosMnmUU8XYg7xkuNAc6mCODJVF2exfb_Mulmr9YolQrLFrFRsMk1rztXMinCMQeCe5ue3Ck4E4aJlIkjf-d0DJktoIhH6d2gZ-iJeLQ32wcBhPcEbj2gr7K_wYKlEXhKFwG59OE-hIi9IHXEKvK-2V5vzZLVC80G4aWYd3D-2eX3LF1K69NP04jGcu1D4l9UV8zTz1gOWe697iZG0JyKhSccUaHZ0TfEa8cT0tm6xTz6tpUGSDdvPQU8JCU8GTOsi9ifxTsI-GlWE3YA"}', $jws3);
220
221
        $verifier = new Verifier($algorithmManager);
222
        $loaded_0 = JWSLoader::load($jws0);
223
        $verifier->verifyWithKey($loaded_0, $this->getKey1());
224
225
        $loaded_1 = JWSLoader::load($jws1);
226
        $verifier->verifyWithKey($loaded_1, $this->getKey2());
227
228
        $loaded_2 = JWSLoader::load($jws2);
229
        $verifier->verifyWithKey($loaded_2, $this->getKey1(), 'Live long and Prosper.');
230
231
        $loaded_3 = JWSLoader::load($jws3);
232
        $verifier->verifyWithKey($loaded_3, $this->getKey2(), 'Live long and Prosper.');
233
    }
234
235
    /**
236
     * @expectedException \InvalidArgumentException
237
     * @expectedExceptionMessage The algorithm "RS512" is not allowed with this key.
238
     */
239
    public function testAlgorithmNotAllowedForTheKey()
240
    {
241
        $signatureAlgorithmManager = JWAManager::create([]);
242
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
243
        $jwsBuilder = $jwsBuilder
244
            ->withPayload('Live long and Prosper.')
245
            ->addSignature($this->getKey5(), ['alg' => 'RS512']);
246
        $jwsBuilder->build();
247
    }
248
249
    /**
250
     * @expectedException \InvalidArgumentException
251
     * @expectedExceptionMessage Key cannot be used to sign
252
     */
253
    public function testOperationNotAllowedForTheKey()
254
    {
255
        $signatureAlgorithmManager = JWAManager::create([new PS512()]);
256
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
257
        $jwsBuilder = $jwsBuilder
258
            ->withPayload('Live long and Prosper.')
259
            ->addSignature($this->getKey4(), ['alg' => 'PS512']);
260
261
        $jwsBuilder->build();
262
    }
263
264
    public function testSignAndLoadFlattened()
265
    {
266
        $signatureAlgorithmManager = JWAManager::create([new HS512()]);
267
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
268
        $jwsBuilder = $jwsBuilder
269
            ->withPayload(['baz', 'ban'])
270
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar']);
271
272
        $jws = $jwsBuilder->build();
273
274
        $loaded = JWSLoader::load($jws->toFlattenedJSON(0));
275
276
        $this->assertEquals(1, $loaded->countSignatures());
277
        $this->assertInstanceOf(JWS::class, $loaded);
278
        $this->assertTrue(is_array($loaded->getPayload()));
279
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
280
    }
281
282
    public function testSignAndLoad()
283
    {
284
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
285
        $verifier = new Verifier($signatureAlgorithmManager);
286
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
287
        $jwsBuilder = $jwsBuilder
288
            ->withPayload('Live long and Prosper.')
289
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
290
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
291
292
        $jws = $jwsBuilder->build();
293
294
        $loaded = JWSLoader::load($jws->toJSON());
295
296
        $this->assertEquals(2, $loaded->countSignatures());
297
        $this->assertInstanceOf(JWS::class, $loaded);
298
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
299
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
300
        $verifier->verifyWithKeySet($loaded, $this->getPublicKeySet());
301
302
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
303
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
304
    }
305
306
    /**
307
     * @expectedException \InvalidArgumentException
308
     * @expectedExceptionMessage  Unable to verify the JWS.
309
     */
310
    public function testSignAndLoadWithWrongKeys()
311
    {
312
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
313
        $verifier = new Verifier($signatureAlgorithmManager);
314
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
315
        $jwsBuilder = $jwsBuilder
316
            ->withPayload('Live long and Prosper.')
317
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
318
319
        $jws = $jwsBuilder->build();
320
321
        $loaded = JWSLoader::load($jws->toJSON());
322
323
        $this->assertEquals(1, $loaded->countSignatures());
324
        $this->assertInstanceOf(JWS::class, $loaded);
325
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
326
327
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
328
    }
329
330
    /**
331
     * @expectedException \InvalidArgumentException
332
     * @expectedExceptionMessage The algorithm "RS512" is not supported.
333
     */
334
    public function testSignAndLoadWithUnsupportedAlgorithm()
335
    {
336
        $verifier = new Verifier(JWAManager::create([new HS512()]));
337
        $jwsBuilder = new JWSBuilder(JWAManager::create([new RS512()]));
338
        $jwsBuilder = $jwsBuilder
339
            ->withPayload('Live long and Prosper.')
340
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
341
342
        $jws = $jwsBuilder->build();
343
344
        $loaded = JWSLoader::load($jws->toJSON());
345
346
        $this->assertEquals(1, $loaded->countSignatures());
347
        $this->assertInstanceOf(JWS::class, $loaded);
348
        $this->assertEquals('Live long and Prosper.', $loaded->getPayload());
349
350
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
351
    }
352
353
    /**
354
     * @expectedException \InvalidArgumentException
355
     * @expectedExceptionMessage The JWS does not contain any signature.
356
     */
357
    public function testSignAndLoadWithJWSWithoutSignatures()
358
    {
359
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
360
        $verifier = new Verifier($signatureAlgorithmManager);
361
        $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.";
362
        $jws = '{"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[]}';
363
364
        $loaded = JWSLoader::load($jws);
365
366
        $this->assertEquals(0, $loaded->countSignatures());
367
        $this->assertInstanceOf(JWS::class, $loaded);
368
        $this->assertEquals($payload, $loaded->getPayload());
369
370
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
371
    }
372
373
    /**
374
     * @see https://tools.ietf.org/html/rfc7797#section-4
375
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
376
     * @expectedException \InvalidArgumentException
377
     * @expectedExceptionMessage Unable to convert the JWS with non-encoded payload.
378
     */
379
    public function testCompactJSONWithUnencodedPayload()
380
    {
381
        $payload = '$.02';
0 ignored issues
show
Unused Code introduced by
$payload is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
382
        $protectedHeader = [
383
            'alg' => 'HS256',
384
            'b64' => false,
385
            'crit' => ['b64'],
386
        ];
387
388
        $key = JWK::create([
389
            'kty' => 'oct',
390
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
391
        ]);
392
393
        $expected_result = [
0 ignored issues
show
Unused Code introduced by
$expected_result is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
394
            'protected' => 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19',
395
            'payload' => '$.02',
396
            'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY',
397
        ];
398
399
        $signatureAlgorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
400
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
401
        $jws = $jwsBuilder
402
            ->withPayload('Live long and Prosper.')
403
            ->addSignature($key, $protectedHeader)
404
            ->build();
405
406
        $jws->toCompactJSON(0);
407
    }
408
409
    /**
410
     * @see https://tools.ietf.org/html/rfc7797#section-4
411
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
412
     */
413
    public function testCompactJSONWithUnencodedDetachedPayload()
414
    {
415
        $payload = '$.02';
416
        $protectedHeader = [
417
            'alg' => 'HS256',
418
            'b64' => false,
419
            'crit' => ['b64'],
420
        ];
421
422
        $key = JWK::create([
423
            'kty' => 'oct',
424
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
425
        ]);
426
427
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
428
        $builder = new JWSBuilder($algorithmManager);
429
        $jws = $builder
430
            ->withPayload($payload, true)
431
            ->addSignature($key, $protectedHeader)
432
            ->build()
433
            ->toCompactJSON(0);
434
        $this->assertEquals('eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY', $jws);
435
436
        $loaded = JWSLoader::load($jws);
437
        $verifier = new Verifier($algorithmManager);
438
        $verifier->verifyWithKey($loaded, $key, $payload, $index);
439
440
        $this->assertInstanceOf(JWS::class, $loaded);
441
        $this->assertEquals(0, $index);
442
        $this->assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeaders());
443
    }
444
445
    /**
446
     * The library is able to support multiple payload encoding and conversion in JSON if payload is detached.
447
     */
448
    public function testCompactJSONWithUnencodedDetachedPayloadAndMultipleSignatures()
449
    {
450
        $payload = '$.02';
451
        $protectedHeader1 = [
452
            'alg' => 'HS256',
453
            'b64' => false,
454
            'crit' => ['b64'],
455
        ];
456
        $protectedHeader2 = [
457
            'alg' => 'HS256',
458
        ];
459
460
        $key = JWK::create([
461
            'kty' => 'oct',
462
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
463
        ]);
464
465
        $signatureAlgorithmManager = JWAManager::create([new HS256()]);
466
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
467
        $jwsBuilder = $jwsBuilder
468
            ->withPayload($payload, true)
469
            ->addSignature($key, $protectedHeader1)
470
            ->addSignature($key, $protectedHeader2);
471
472
        $jws = $jwsBuilder->build();
473
474
        $expected_result = '{"signatures":[{"signature":"A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY","protected":"eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19"},{"signature":"5mvfOroL-g7HyqJoozehmsaqmvTYGEq5jTI1gVvoEoQ","protected":"eyJhbGciOiJIUzI1NiJ9"}]}';
475
476
        $this->assertEquals($expected_result, $jws->toJSON());
477
478
        $loaded = JWSLoader::load($expected_result);
479
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
480
        $verifier = new Verifier($algorithmManager);
481
        $verifier->verifyWithKey($loaded, $key, $payload, $index1);
482
483
        $this->assertEquals(0, $index1);
484
        $this->assertEquals($protectedHeader1, $loaded->getSignature(0)->getProtectedHeaders());
485
    }
486
487
    /**
488
     * The library is able to support multiple payload encoding and conversion in JSON is not available if payload is not detached.
489
     *
490
     * @expectedException \InvalidArgumentException
491
     * @expectedExceptionMessage  Foreign payload encoding detected. The JWS cannot be converted.
492
     */
493
    public function testCompactJSONWithUnencodedPayloadAndMultipleSignatures()
494
    {
495
        $payload = '$.02';
496
        $protectedHeader1 = [
497
            'alg' => 'HS256',
498
            'b64' => false,
499
            'crit' => ['b64'],
500
        ];
501
        $protectedHeader2 = [
502
            'alg' => 'HS256',
503
        ];
504
505
        $key = JWK::create([
506
            'kty' => 'oct',
507
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
508
        ]);
509
510
        $signatureAlgorithmManager = JWAManager::create([new HS256()]);
511
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
512
        $jwsBuilder = $jwsBuilder
513
            ->withPayload($payload)
514
            ->addSignature($key, $protectedHeader1)
515
            ->addSignature($key, $protectedHeader2);
516
517
        $jws = $jwsBuilder->build();
518
519
        $jws->toJSON();
520
    }
521
522
    /**
523
     * @expectedException \LogicException
524
     * @expectedExceptionMessage The protected header parameter "crit" is mandatory when protected header parameter "b64" is set.
525
     */
526
    public function testJWSWithUnencodedPayloadButNoCritHeader()
527
    {
528
        $payload = '$.02';
529
        $protectedHeader = [
530
            'alg' => 'HS256',
531
            'b64' => false,
532
        ];
533
534
        $key = JWK::create([
535
            'kty' => 'oct',
536
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
537
        ]);
538
539
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
540
        $builder = new JWSBuilder($algorithmManager);
541
        $builder
542
            ->withPayload($payload, true)
543
            ->addSignature($key, $protectedHeader)
544
            ->build()
545
            ->toCompactJSON(0);
546
    }
547
548
    /**
549
     * @expectedException \LogicException
550
     * @expectedExceptionMessage The protected header parameter "crit" must be an array.
551
     */
552
    public function testJWSWithUnencodedPayloadButCritHeaderIsNotAnArray()
553
    {
554
        $payload = '$.02';
555
        $protectedHeader = [
556
            'alg' => 'HS256',
557
            'b64' => false,
558
            'crit' => 'foo',
559
        ];
560
561
        $key = JWK::create([
562
            'kty' => 'oct',
563
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
564
        ]);
565
566
567
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
568
        $builder = new JWSBuilder($algorithmManager);
569
        $builder
570
            ->withPayload($payload, true)
571
            ->addSignature($key, $protectedHeader)
572
            ->build()
573
            ->toCompactJSON(0);
574
    }
575
576
    /**
577
     * @expectedException \LogicException
578
     * @expectedExceptionMessage The protected header parameter "crit" must contain "b64" when protected header parameter "b64" is set.
579
     */
580
    public function testJWSWithUnencodedPayloadButCritHeaderDoesNotContainB64()
581
    {
582
        $payload = '$.02';
583
        $protectedHeader = [
584
            'alg' => 'HS256',
585
            'b64' => false,
586
            'crit' => ['foo'],
587
        ];
588
589
        $key = JWK::create([
590
            'kty' => 'oct',
591
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
592
        ]);
593
594
595
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
596
        $builder = new JWSBuilder($algorithmManager);
597
        $builder
598
            ->withPayload($payload, true)
599
            ->addSignature($key, $protectedHeader)
600
            ->build()
601
            ->toCompactJSON(0);
602
    }
603
604
    /**
605
     * @see https://tools.ietf.org/html/rfc7797#section-4
606
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
607
     */
608
    public function testFlattenedJSONWithUnencodedPayload()
609
    {
610
        $payload = '$.02';
611
        $protectedHeader = [
612
            'alg' => 'HS256',
613
            'b64' => false,
614
            'crit' => ['b64'],
615
        ];
616
617
        $key = JWK::create([
618
            'kty' => 'oct',
619
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
620
        ]);
621
622
        $expected_result = [
623
            'protected' => 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19',
624
            'payload' => '$.02',
625
            'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY',
626
        ];
627
628
        $algorithmManager = JWAManagerFactory::createFromAlgorithmName(['HS256']);
629
        $builder = new JWSBuilder($algorithmManager);
630
        $jws = $builder
631
            ->withPayload($payload)
632
            ->addSignature($key, $protectedHeader)
633
            ->build()
634
            ->toFlattenedJSON(0);
635
636
        $this->assertEquals($expected_result, json_decode($jws, true));
637
638
        $loaded = JWSLoader::load($jws);
639
        $verifier = new Verifier($algorithmManager);
640
        $verifier->verifyWithKey($loaded, $key, null, $index);
641
642
        $this->assertInstanceOf(JWS::class, $loaded);
643
        $this->assertEquals($payload, $loaded->getPayload());
644
        $this->assertEquals(0, $index);
645
        $this->assertEquals($protectedHeader, $loaded->getSignature(0)->getProtectedHeaders());
646
    }
647
648
    /**
649
     * @see https://tools.ietf.org/html/rfc7797#section-4
650
     * @see https://tools.ietf.org/html/rfc7797#section-4.2
651
     */
652
    public function testFlattenedJSONWithUnencodedDetachedPayload()
653
    {
654
        $payload = '$.02';
655
        $protectedHeader = [
656
            'alg' => 'HS256',
657
            'b64' => false,
658
            'crit' => ['b64'],
659
        ];
660
661
        $key = JWK::create([
662
            'kty' => 'oct',
663
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
664
        ]);
665
666
        $expected_result = [
667
            'protected' => 'eyJhbGciOiJIUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19',
668
            'signature' => 'A5dxf2s96_n5FLueVuW1Z_vh161FwXZC4YLPff6dmDY',
669
        ];
670
671
        $signatureAlgorithmManager = JWAManager::create([new HS256()]);
672
        $builder = new JWSBuilder($signatureAlgorithmManager);
673
        $jws = $builder
674
            ->withPayload($payload, true)
675
            ->addSignature($key, $protectedHeader)
676
            ->build()
677
            ->toFlattenedJSON(0);
678
679
        $this->assertEquals($expected_result, json_decode($jws, true));
680
    }
681
682
    /**
683
     * @expectedException \InvalidArgumentException
684
     * @expectedExceptionMessage No "alg" parameter set in the header.
685
     */
686
    public function testSignAndLoadWithoutAlgParameterInTheHeader()
687
    {
688
        $signatureAlgorithmManager = JWAManager::create([new RS512()]);
689
        $verifier = new Verifier($signatureAlgorithmManager);
690
        $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.";
691
        $jws = 'eyJraWQiOiJiaWxiby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUifQ.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg';
692
693
        $loaded = JWSLoader::load($jws);
694
695
        $this->assertEquals(1, $loaded->countSignatures());
696
        $this->assertInstanceOf(JWS::class, $loaded);
697
        $this->assertEquals($payload, $loaded->getPayload());
698
699
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
700
    }
701
702
    public function testSignAndLoadJWKSet()
703
    {
704
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
705
        $verifier = new Verifier($signatureAlgorithmManager);
706
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
707
        $jwsBuilder = $jwsBuilder
708
            ->withPayload($this->getKeyset())
709
            ->addSignature($this->getKey1(), ['alg' => 'HS512'], ['foo' => 'bar'])
710
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
711
712
        $jws = $jwsBuilder->build();
713
714
        $loaded = JWSLoader::load($jws->toJSON());
715
        $this->assertEquals(2, $loaded->countSignatures());
716
        $this->assertInstanceOf(JWS::class, $loaded);
717
        $this->assertEquals($this->getKeyset(), JWKSet::createFromKeyData($loaded->getPayload()));
718
        $verifier->verifyWithKeySet($loaded, $this->getSymmetricKeySet());
719
        $verifier->verifyWithKeySet($loaded, $this->getPublicKeySet());
720
721
        $this->assertEquals('HS512', $loaded->getSignature(0)->getProtectedHeader('alg'));
722
        $this->assertEquals('RS512', $loaded->getSignature(1)->getProtectedHeader('alg'));
723
    }
724
725
    /**
726
     * @expectedException \InvalidArgumentException
727
     * @expectedExceptionMessage There is no key in the key set.
728
     */
729
    public function testKeySetIsEmpty()
730
    {
731
        $signatureAlgorithmManager = JWAManager::create([new HS512(), new RS512()]);
732
        $verifier = new Verifier($signatureAlgorithmManager);
733
        $jwsBuilder = new JWSBuilder($signatureAlgorithmManager);
734
        $jwsBuilder = $jwsBuilder
735
            ->withPayload($this->getKeyset())
736
            ->addSignature($this->getKey1(), ['alg' => 'HS512', ['foo' => 'bar']])
737
            ->addSignature($this->getKey2(), ['alg' => 'RS512']);
738
739
        $jws = $jwsBuilder->build();
740
741
        $loaded = JWSLoader::load($jws->toJSON());
742
        $this->assertEquals(2, $loaded->countSignatures());
743
        $this->assertInstanceOf(JWS::class, $loaded);
744
        $this->assertEquals($this->getKeyset(), JWKSet::createFromKeyData($loaded->getPayload()));
745
        $verifier->verifyWithKeySet($loaded, JWKSet::createFromKeys([]));
746
        $verifier->verifyWithKey($loaded, JWK::create(['kty' => 'EC']));
747
    }
748
749
    /**
750
     * @return JWK
751
     */
752
    private function getKey1(): JWK
753
    {
754
        $key = JWK::create([
755
            'kty' => 'oct',
756
            'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
757
        ]);
758
759
        return $key;
760
    }
761
762
    /**
763
     * @return JWK
764
     */
765
    private function getKey2(): JWK
766
    {
767
        $key = JWK::create([
768
            'kty' => 'RSA',
769
            'use' => 'sig',
770
            'key_ops' => ['sign'],
771
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
772
            'e' => 'AQAB',
773
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
774
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
775
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
776
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
777
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
778
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
779
        ]);
780
781
        return $key;
782
    }
783
784
    /**
785
     * @return JWK
786
     */
787
    private function getKey3(): JWK
788
    {
789
        $key = JWK::create([
790
            'kty' => 'EC',
791
            'crv' => 'P-256',
792
            'use' => 'sig',
793
            'key_ops' => ['sign'],
794
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
795
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
796
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
797
        ]);
798
799
        return $key;
800
    }
801
802
    /**
803
     * @return JWK
804
     */
805
    private function getKey4(): JWK
806
    {
807
        $key = JWK::create([
808
            'kty' => 'RSA',
809
            'alg' => 'PS512',
810
            'key_ops' => ['encrypt', 'decrypt'],
811
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
812
            'e' => 'AQAB',
813
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
814
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
815
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
816
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
817
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
818
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
819
        ]);
820
821
        return $key;
822
    }
823
824
    /**
825
     * @return JWK
826
     */
827
    private function getKey5(): JWK
828
    {
829
        $key = JWK::create([
830
            'kty' => 'RSA',
831
            'alg' => 'PS512',
832
            'use' => 'sig',
833
            'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
834
            'e' => 'AQAB',
835
            'd' => 'Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ',
836
            'p' => '4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc',
837
            'q' => 'uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc',
838
            'dp' => 'BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0',
839
            'dq' => 'h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU',
840
            'qi' => 'IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U',
841
        ]);
842
843
        return $key;
844
    }
845
846
    /**
847
     * @return JWKSet
848
     */
849
    private function getKeyset(): JWKSet
850
    {
851
        $keyset = JWKSet::createFromKeys([$this->getKey1(), $this->getKey2()]);
852
853
        return $keyset;
854
    }
855
856
    /**
857
     * @return JWKSet
858
     */
859
    private function getPublicKeySet(): JWKSet
860
    {
861
        $keys = ['keys' => [
862
            [
863
                'kid' => '71ee230371d19630bc17fb90ccf20ae632ad8cf8',
864
                'kty' => 'RSA',
865
                'alg' => 'RS256',
866
                'use' => 'sig',
867
                'n' => 'vnMTRCMvsS04M1yaKR112aB8RxOkWHFixZO68wCRlVLxK4ugckXVD_Ebcq-kms1T2XpoWntVfBuX40r2GvcD9UsTFt_MZlgd1xyGwGV6U_tfQUll5mKxCPjr60h83LXKJ_zmLXIqkV8tAoIg78a5VRWoms_0Bn09DKT3-RBWFjk=',
868
                'e' => 'AQAB',
869
            ],
870
            [
871
                'kid' => '02491f945c951adf156f370788e8ccdabf8877a8',
872
                'kty' => 'RSA',
873
                'alg' => 'RS256',
874
                'use' => 'sig',
875
                'n' => 'rI67uHIDWDgCy_Ut-FhhjTCkEcqzoO80IRgdpk_fJHlDmXhMTJKPizxbIEMs0wRHRZpwH-4D20thpnQB5Mgx6-XM9kOvcYpHSdcYME77BwX6uQG-hw2w77NOhYiCSZCLzx-5ld5Wjy0dympL-ExqQw-wrWipMX7NQhIbJqVbZ18=',
876
                'e' => 'AQAB',
877
            ],
878
            [
879
                'kty' => 'RSA',
880
                'n' => 'oahUIoWw0K0usKNuOR6H4wkf4oBUXHTxRvgb48E-BVvxkeDNjbC4he8rUWcJoZmds2h7M70imEVhRU5djINXtqllXI4DFqcI1DgjT9LewND8MW2Krf3Spsk_ZkoFnilakGygTwpZ3uesH-PFABNIUYpOiN15dsQRkgr0vEhxN92i2asbOenSZeyaxziK72UwxrrKoExv6kc5twXTq4h-QChLOln0_mtUZwfsRaMStPs6mS6XrgxnxbWhojf663tuEQueGC-FCMfra36C9knDFGzKsNa7LZK2djYgyD3JR_MB_4NUJW_TqOQtwHYbxevoJArm-L5StowjzGy-_bq6Gw',
881
                'e' => 'AQAB',
882
            ],
883
            [
884
                'kty' => 'RSA',
885
                'n' => 'sXchDaQebHnPiGvyDOAT4saGEUetSyo9MKLOoWFsueri23bOdgWp4Dy1WlUzewbgBHod5pcM9H95GQRV3JDXboIRROSBigeC5yjU1hGzHHyXss8UDprecbAYxknTcQkhslANGRUZmdTOQ5qTRsLAt6BTYuyvVRdhS8exSZEy_c4gs_7svlJJQ4H9_NxsiIoLwAEk7-Q3UXERGYw_75IDrGA84-lA_-Ct4eTlXHBIY2EaV7t7LjJaynVJCpkv4LKjTTAumiGUIuQhrNhZLuF_RJLqHpM2kgWFLU7-VTdL1VbC2tejvcI2BlMkEpk1BzBZI0KQB0GaDWFLN-aEAw3vRw',
886
                'e' => 'AQAB',
887
            ],
888
            [
889
                'kty' => 'RSA',
890
                'n' => 'ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ',
891
                'e' => 'AQAB',
892
            ],
893
            [
894
                'kty' => 'EC',
895
                'crv' => 'P-256',
896
                'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
897
                'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
898
            ],
899
            [
900
                'kty' => 'EC',
901
                'crv' => 'P-521',
902
                'x' => 'AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk',
903
                'y' => 'ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2',
904
            ],
905
        ]];
906
907
        return JWKSet::createFromKeyData($keys);
908
    }
909
910
    /**
911
     * @return JWKSet
912
     */
913
    private function getSymmetricKeySet(): JWKSet
914
    {
915
        $keys = ['keys' => [
916
            [
917
                'kid' => 'DIR_1',
918
                'kty' => 'oct',
919
                'k' => Base64Url::encode(hex2bin('00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F')),
920
            ],
921
            [
922
                'kty' => 'oct',
923
                'k' => 'f5aN5V6iihwQVqP-tPNNtkIJNCwUb9-JukCIKkF0rNfxqxA771RJynYAT2xtzAP0MYaR7U5fMP_wvbRQq5l38Q',
924
            ],
925
            [
926
                'kty' => 'oct',
927
                'k' => 'GawgguFyGrWKav7AX4VKUg',
928
            ],
929
            [
930
                'kty' => 'oct',
931
                'k' => 'AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow',
932
            ],
933
        ]];
934
935
        return JWKSet::createFromKeyData($keys);
936
    }
937
}
938