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

JWKTest::testPrivateToPublic()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 22
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\KeyManagement\Tests;
15
16
use Base64Url\Base64Url;
17
use Jose\Component\Core\JWK;
18
use Jose\Component\Core\JWKSet;
19
use Jose\Component\KeyManagement\JWKFactory;
20
use PHPUnit\Framework\TestCase;
21
22
/**
23
 * final class JWKTest.
24
 *
25
 * @group Unit
26
 * @group JWK
27
 */
28
final class JWKTest extends TestCase
29
{
30
    public function testKey()
31
    {
32
        $jwk = JWK::create([
33
            'kty' => 'EC',
34
            'crv' => 'P-256',
35
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
36
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
37
            'use' => 'sign',
38
            'key_ops' => ['sign'],
39
            'alg' => 'ES256',
40
            'bar' => 'plic',
41
        ]);
42
43
        $this->assertEquals('EC', $jwk->get('kty'));
44
        $this->assertEquals('ES256', $jwk->get('alg'));
45
        $this->assertEquals('sign', $jwk->get('use'));
46
        $this->assertFalse($jwk->has('kid'));
47
        $this->assertEquals(['sign'], $jwk->get('key_ops'));
48
        $this->assertEquals('P-256', $jwk->get('crv'));
49
        $this->assertFalse($jwk->has('x5u'));
50
        $this->assertFalse($jwk->has('x5c'));
51
        $this->assertFalse($jwk->has('x5t'));
52
        $this->assertFalse($jwk->has('x5t#256'));
53
        $this->assertEquals('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x'));
54
        $this->assertEquals('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y'));
55
        $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));
56
    }
57
58
    /**
59
     * @expectedException \InvalidArgumentException
60
     * @expectedExceptionMessage The parameter "kty" is mandatory.
61
     */
62
    public function testBadConstruction()
63
    {
64
        JWK::create([]);
65
    }
66
67
    /**
68
     * @expectedException \InvalidArgumentException
69
     * @expectedExceptionMessage The value identified by "ABCD" does not exist.
70
     */
71
    public function testBadCall()
72
    {
73
        $jwk = JWK::create([
74
            'kty' => 'EC',
75
            'crv' => 'P-256',
76
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
77
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
78
            'use' => 'sign',
79
            'key_ops' => ['sign'],
80
            'alg' => 'ES256',
81
            'bar' => 'plic',
82
        ]);
83
84
        $jwk->get('ABCD');
85
    }
86
87
    public function testKeySet()
88
    {
89
        $jwk1 = JWK::create([
90
            'kty' => 'EC',
91
            'crv' => 'P-256',
92
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
93
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
94
            'use' => 'sign',
95
            'key_ops' => ['sign'],
96
            'alg' => 'ES256',
97
            'kid' => '0123456789',
98
        ]);
99
100
        $jwk2 = JWK::create([
101
            'kty' => 'EC',
102
            'crv' => 'P-256',
103
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
104
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
105
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
106
            'use' => 'sign',
107
            'key_ops' => ['verify'],
108
            'alg' => 'ES256',
109
            'kid' => '9876543210',
110
        ]);
111
112
        $jwkset = JWKSet::createFromKeys([$jwk1]);
113
        $jwkset = $jwkset->withKey($jwk2);
114
115
        $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));
116
        $this->assertEquals(2, count($jwkset));
117
        $this->assertEquals(2, $jwkset->count());
118
        $this->assertTrue($jwkset->hasKey('0123456789'));
119
        $this->assertTrue($jwkset->hasKey('9876543210'));
120
        $this->assertFalse($jwkset->hasKey(0));
121
122
        foreach ($jwkset as $key) {
123
            $this->assertEquals('EC', $key->get('kty'));
124
        }
125
        $this->assertEquals(null, $jwkset->key());
126
127
        $this->assertEquals('9876543210', $jwkset->getKey('9876543210')->get('kid'));
128
        $jwkset = $jwkset->withoutKey('9876543210');
129
        $jwkset = $jwkset->withoutKey('9876543210');
130
131
        $this->assertEquals(1, count($jwkset));
132
        $this->assertEquals(1, $jwkset->count());
133
        $this->assertInstanceOf(JWK::class, $jwkset->getKey('0123456789'));
134
135
        $jwkset = $jwkset->withoutKey('0123456789');
136
        $this->assertEquals(0, count($jwkset));
137
        $this->assertEquals(0, $jwkset->count());
138
    }
139
140
    /**
141
     * @expectedException \InvalidArgumentException
142
     * @expectedExceptionMessage Undefined index.
143
     */
144
    public function testKeySet2()
145
    {
146
        $jwk1 = JWK::create([
147
            'kty' => 'EC',
148
            'crv' => 'P-256',
149
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
150
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
151
            'use' => 'sign',
152
            'key_ops' => ['sign'],
153
            'alg' => 'ES256',
154
            'kid' => '0123456789',
155
        ]);
156
157
        $jwk2 = JWK::create([
158
            'kty' => 'EC',
159
            'crv' => 'P-256',
160
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
161
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
162
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
163
            'use' => 'sign',
164
            'key_ops' => ['verify'],
165
            'alg' => 'ES256',
166
            'kid' => '9876543210',
167
        ]);
168
169
        $jwkset = JWKSet::createFromKeys([$jwk1, $jwk2]);
170
171
        $jwkset->getKey(2);
172
    }
173
174
    public function testPrivateToPublic()
175
    {
176
        $private = JWK::create([
177
            'kty' => 'EC',
178
            'crv' => 'P-256',
179
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
180
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
181
            'd' => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
182
            'use' => 'sign',
183
            'key_ops' => ['verify'],
184
            'alg' => 'ES256',
185
            'kid' => '9876543210',
186
        ]);
187
188
        $public = $private->toPublic();
189
190
        $this->assertEquals(json_encode([
191
            'kty' => 'EC',
192
            'crv' => 'P-256',
193
            'x' => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
194
            'y' => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
195
            'use' => 'sign',
196
            'key_ops' => ['verify'],
197
            'alg' => 'ES256',
198
            'kid' => '9876543210',
199
        ]), json_encode($public));
200
    }
201
202
    public function testLoadCertificateChain()
203
    {
204
        $key = JWKFactory::createFromCertificateFile(
205
            __DIR__.'/Chain/google.crt',
206
            [
207
                'kid' => 'From www.google.com',
208
            ]
209
        );
210
211
        $this->assertEquals(
212
            '178f7e93a74ed73d88c29042220b9ae6e4b371cd',
213
            strtolower(bin2hex(Base64Url::decode($key->get('x5t'))))
214
        );
215
        $this->assertEquals([
216
                'kty' => 'RSA',
217
                'n' => 'nCoEd1zYUJE6BqOC4NhQSLyJP_EZcBqIRn7gj8Xxic4h7lr-YQ23MkSJoHQLU09VpM6CYpXu61lfxuEFgBLEXpQ_vFtIOPRT9yTm-5HpFcTP9FMN9Er8n1Tefb6ga2-HwNBQHygwA0DaCHNRbH__OjynNwaOvUsRBOt9JN7m-fwxcfuU1WDzLkqvQtLL6sRqGrLMU90VS4sfyBlhH82dqD5jK4Q1aWWEyBnFRiL4U5W-44BKEMYq7LqXIBHHOZkQBKDwYXqVJYxOUnXitu0IyhT8ziJqs07PRgOXlwN-wLHee69FM8-6PnG33vQlJcINNYmdnfsOEXmJHjfFr45yaQ',
218
                'e' => 'AQAB',
219
                'x5t' => 'F49-k6dO1z2IwpBCIgua5uSzcc0',
220
                'x5t#256' => 'pBJP2vnKx7ruHKsy4yJddGUAwJ888-uyU-8_uwiK_TQ',
221
                'kid' => 'From www.google.com',
222
                'x5c' => ['MIID8DCCAtigAwIBAgIDAjqDMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT'.PHP_EOL.'MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i'.PHP_EOL.'YWwgQ0EwHhcNMTMwNDA1MTUxNTU2WhcNMTYxMjMxMjM1OTU5WjBJMQswCQYDVQQG'.PHP_EOL.'EwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzElMCMGA1UEAxMcR29vZ2xlIEludGVy'.PHP_EOL.'bmV0IEF1dGhvcml0eSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB'.PHP_EOL.'AJwqBHdc2FCROgajguDYUEi8iT/xGXAaiEZ+4I/F8YnOIe5a/mENtzJEiaB0C1NP'.PHP_EOL.'VaTOgmKV7utZX8bhBYASxF6UP7xbSDj0U/ck5vuR6RXEz/RTDfRK/J9U3n2+oGtv'.PHP_EOL.'h8DQUB8oMANA2ghzUWx//zo8pzcGjr1LEQTrfSTe5vn8MXH7lNVg8y5Kr0LSy+rE'.PHP_EOL.'ahqyzFPdFUuLH8gZYR/Nnag+YyuENWllhMgZxUYi+FOVvuOAShDGKuy6lyARxzmZ'.PHP_EOL.'EASg8GF6lSWMTlJ14rbtCMoU/M4iarNOz0YDl5cDfsCx3nuvRTPPuj5xt970JSXC'.PHP_EOL.'DTWJnZ37DhF5iR43xa+OcmkCAwEAAaOB5zCB5DAfBgNVHSMEGDAWgBTAephojYn7'.PHP_EOL.'qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUSt0GFhu89mi1dvWBtrtiGrpagS8wDgYD'.PHP_EOL.'VR0PAQH/BAQDAgEGMC4GCCsGAQUFBwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDov'.PHP_EOL.'L2cuc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwNQYDVR0fBC4wLDAqoCig'.PHP_EOL.'JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMBcGA1UdIAQQ'.PHP_EOL.'MA4wDAYKKwYBBAHWeQIFATANBgkqhkiG9w0BAQsFAAOCAQEAqvqpIM1qZ4PtXtR+'.PHP_EOL.'3h3Ef+AlBgDFJPupyC1tft6dgmUsgWM0Zj7pUsIItMsv91+ZOmqcUHqFBYx90SpI'.PHP_EOL.'hNMJbHzCzTWf84LuUt5oX+QAihcglvcpjZpNy6jehsgNb1aHA30DP9z6eX0hGfnI'.PHP_EOL.'Oi9RdozHQZJxjyXON/hKTAAj78Q1EK7gI4BzfE00LshukNYQHpmEcxpw8u1VDu4X'.PHP_EOL.'Bupn7jLrLN1nBz/2i8Jw3lsA5rsb0zYaImxssDVCbJAJPZPpZAkiDoUGn8JzIdPm'.PHP_EOL.'X4DkjYUiOnMDsWCOrmji9D6X52ASCWg23jrW4kOVWzeBkoEfu43XrVJkFleW2V40'.PHP_EOL.'fsg12A=='],
223
            ],
224
            $key->all()
225
        );
226
    }
227
}
228