Failed Conditions
Push — v7 ( 28b6a4...6a06f2 )
by Florent
07:13 queued 03:54
created

JWKTest::testKey()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 23
nc 1
nop 0
dl 0
loc 27
rs 8.8571
c 0
b 0
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\Core\Tests;
15
16
use Jose\Component\Core\JWK;
17
use Jose\Component\Core\JWKSet;
18
use PHPUnit\Framework\TestCase;
19
20
/**
21
 * final class JWKTest.
22
 *
23
 * @group Unit
24
 * @group JWK
25
 */
26
final class JWKTest extends TestCase
27
{
28
    public function testKey()
29
    {
30
        $jwk = JWK::create([
31
            'kty' => 'EC',
32
            'crv' => 'P-256',
33
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
34
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
35
            'use' => 'sign',
36
            'key_ops' => ['sign'],
37
            'alg' => 'ES256',
38
            'bar' => 'plic',
39
        ]);
40
41
        $this->assertEquals('EC', $jwk->get('kty'));
42
        $this->assertEquals('ES256', $jwk->get('alg'));
43
        $this->assertEquals('sign', $jwk->get('use'));
44
        $this->assertFalse($jwk->has('kid'));
45
        $this->assertEquals(['sign'], $jwk->get('key_ops'));
46
        $this->assertEquals('P-256', $jwk->get('crv'));
47
        $this->assertFalse($jwk->has('x5u'));
48
        $this->assertFalse($jwk->has('x5c'));
49
        $this->assertFalse($jwk->has('x5t'));
50
        $this->assertFalse($jwk->has('x5t#256'));
51
        $this->assertEquals('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x'));
52
        $this->assertEquals('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y'));
53
        $this->assertEquals('{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","bar":"plic"}', json_encode($jwk));
54
    }
55
56
    /**
57
     * @expectedException \InvalidArgumentException
58
     * @expectedExceptionMessage The parameter "kty" is mandatory.
59
     */
60
    public function testBadConstruction()
61
    {
62
        JWK::create([]);
63
    }
64
65
    /**
66
     * @expectedException \InvalidArgumentException
67
     * @expectedExceptionMessage The value identified by "ABCD" does not exist.
68
     */
69
    public function testBadCall()
70
    {
71
        $jwk = JWK::create([
72
            'kty' => 'EC',
73
            'crv' => 'P-256',
74
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
75
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
76
            'use' => 'sign',
77
            'key_ops' => ['sign'],
78
            'alg' => 'ES256',
79
            'bar' => 'plic',
80
        ]);
81
82
        $jwk->get('ABCD');
83
    }
84
85
    public function testKeySet()
86
    {
87
        $jwk1 = JWK::create([
88
            'kty' => 'EC',
89
            'crv' => 'P-256',
90
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
91
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
92
            'use' => 'sign',
93
            'key_ops' => ['sign'],
94
            'alg' => 'ES256',
95
            'kid' => '0123456789',
96
        ]);
97
98
        $jwk2 = JWK::create([
99
            'kty' => 'EC',
100
            'crv' => 'P-256',
101
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
102
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
103
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
104
            'use' => 'sign',
105
            'key_ops' => ['verify'],
106
            'alg' => 'ES256',
107
            'kid' => '9876543210',
108
        ]);
109
110
        $jwkset = JWKSet::createFromKeys([$jwk1]);
111
        $jwkset = $jwkset->with($jwk2);
112
113
        $this->assertEquals('{"keys":{"0123456789":{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},"9876543210":{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI","use":"sign","key_ops":["verify"],"alg":"ES256","kid":"9876543210"}}}', json_encode($jwkset));
114
        $this->assertEquals(2, count($jwkset));
115
        $this->assertEquals(2, $jwkset->count());
116
        $this->assertTrue($jwkset->has('0123456789'));
117
        $this->assertTrue($jwkset->has('9876543210'));
118
        $this->assertFalse($jwkset->has(0));
119
120
        foreach ($jwkset as $key) {
121
            $this->assertEquals('EC', $key->get('kty'));
122
        }
123
        $this->assertEquals(null, $jwkset->key());
124
125
        $this->assertEquals('9876543210', $jwkset->get('9876543210')->get('kid'));
126
        $jwkset = $jwkset->without('9876543210');
127
        $jwkset = $jwkset->without('9876543210');
128
129
        $this->assertEquals(1, count($jwkset));
130
        $this->assertEquals(1, $jwkset->count());
131
        $this->assertInstanceOf(JWK::class, $jwkset->get('0123456789'));
132
133
        $jwkset = $jwkset->without('0123456789');
134
        $this->assertEquals(0, count($jwkset));
135
        $this->assertEquals(0, $jwkset->count());
136
    }
137
138
    /**
139
     * @expectedException \InvalidArgumentException
140
     * @expectedExceptionMessage Undefined index.
141
     */
142
    public function testKeySet2()
143
    {
144
        $jwk1 = JWK::create([
145
            'kty' => 'EC',
146
            'crv' => 'P-256',
147
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
148
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
149
            'use' => 'sign',
150
            'key_ops' => ['sign'],
151
            'alg' => 'ES256',
152
            'kid' => '0123456789',
153
        ]);
154
155
        $jwk2 = JWK::create([
156
            'kty' => 'EC',
157
            'crv' => 'P-256',
158
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
159
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
160
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
161
            'use' => 'sign',
162
            'key_ops' => ['verify'],
163
            'alg' => 'ES256',
164
            'kid' => '9876543210',
165
        ]);
166
167
        $jwkset = JWKSet::createFromKeys([$jwk1, $jwk2]);
168
169
        $jwkset->get(2);
170
    }
171
172
    public function testPrivateToPublic()
173
    {
174
        $private = JWK::create([
175
            'kty' => 'EC',
176
            'crv' => 'P-256',
177
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
178
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
179
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
180
            'use' => 'sign',
181
            'key_ops' => ['verify'],
182
            'alg' => 'ES256',
183
            'kid' => '9876543210',
184
        ]);
185
186
        $public = $private->toPublic();
187
188
        $this->assertEquals(json_encode([
189
            'kty' => 'EC',
190
            'crv' => 'P-256',
191
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
192
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
193
            'use' => 'sign',
194
            'key_ops' => ['verify'],
195
            'alg' => 'ES256',
196
            'kid' => '9876543210',
197
        ]), json_encode($public));
198
    }
199
}
200