Completed
Push — develop ( b5844e...e46df6 )
by Florent
02:33
created

JWKTest   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 198
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 2
Bugs 1 Features 1
Metric Value
wmc 8
c 2
b 1
f 1
lcom 1
cbo 6
dl 0
loc 198
rs 10
1
<?php
2
3
/*
4
 * The MIT License (MIT)
5
 *
6
 * Copyright (c) 2014-2016 Spomky-Labs
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license.  See the LICENSE file for details.
10
 */
11
12
use Jose\Object\JWK;
13
use Jose\Object\JWKInterface;
14
use Jose\Object\JWKSet;
15
16
/**
17
 * Class JWKTest.
18
 *
19
 * @group Unit
20
 * @group JWK
21
 */
22
class JWKTest extends \PHPUnit_Framework_TestCase
23
{
24
    public function testKey()
25
    {
26
        $jwk = new JWK([
27
            'kty'     => 'EC',
28
            'crv'     => 'P-256',
29
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
30
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
31
            'use'     => 'sign',
32
            'key_ops' => ['sign'],
33
            'alg'     => 'ES256',
34
            'bar'     => 'plic',
35
        ]);
36
37
        $this->assertEquals('EC', $jwk->get('kty'));
38
        $this->assertEquals('ES256', $jwk->get('alg'));
39
        $this->assertEquals('sign', $jwk->get('use'));
40
        $this->assertFalse($jwk->has('kid'));
41
        $this->assertEquals(['sign'], $jwk->get('key_ops'));
42
        $this->assertEquals('P-256', $jwk->get('crv'));
43
        $this->assertFalse($jwk->has('x5u'));
44
        $this->assertFalse($jwk->has('x5c'));
45
        $this->assertFalse($jwk->has('x5t'));
46
        $this->assertFalse($jwk->has('x5t#256'));
47
        $this->assertEquals('f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU', $jwk->get('x'));
48
        $this->assertEquals('x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0', $jwk->get('y'));
49
        $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));
50
    }
51
52
    /**
53
     * @expectedException \InvalidArgumentException
54
     * @expectedExceptionMessage The parameter "kty" is mandatory.
55
     */
56
    public function testBadConstruction()
57
    {
58
        new JWK([]);
59
    }
60
61
    /**
62
     * @expectedException \InvalidArgumentException
63
     * @expectedExceptionMessage The value identified by "ABCD" does not exist.
64
     */
65
    public function testBadCall()
66
    {
67
        $jwk = new JWK([
68
            'kty'     => 'EC',
69
            'crv'     => 'P-256',
70
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
71
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
72
            'use'     => 'sign',
73
            'key_ops' => ['sign'],
74
            'alg'     => 'ES256',
75
            'bar'     => 'plic',
76
        ]);
77
78
        $jwk->get('ABCD');
79
    }
80
81
    public function testKeySet()
82
    {
83
        $jwk1 = new JWK([
84
            'kty'     => 'EC',
85
            'crv'     => 'P-256',
86
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
87
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
88
            'use'     => 'sign',
89
            'key_ops' => ['sign'],
90
            'alg'     => 'ES256',
91
            'kid'     => '0123456789',
92
        ]);
93
94
        $jwk2 = new JWK([
95
            'kty'     => 'EC',
96
            'crv'     => 'P-256',
97
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
98
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
99
            'd'       => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
100
            'use'     => 'sign',
101
            'key_ops' => ['verify'],
102
            'alg'     => 'ES256',
103
            'kid'     => '9876543210',
104
        ]);
105
106
        $jwkset = new JWKSet();
107
        $jwkset = $jwkset->addKey($jwk1);
108
        $jwkset = $jwkset->addKey($jwk2);
109
110
        $this->assertEquals('{"keys":[{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","use":"sign","key_ops":["sign"],"alg":"ES256","kid":"0123456789"},{"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));
111
        $this->assertEquals(2, count($jwkset));
112
        $this->assertEquals(2, $jwkset->count());
113
114
        foreach ($jwkset as $key) {
115
            $this->assertEquals('EC', $key->get('kty'));
116
        }
117
        $this->assertEquals(2, $jwkset->key());
118
119
        $this->assertEquals('9876543210', $jwkset->getKey(1)->get('kid'));
120
        $jwkset = $jwkset->removeKey(1);
121
        $jwkset = $jwkset->removeKey(1);
122
123
        $this->assertEquals(1, count($jwkset));
124
        $this->assertEquals(1, $jwkset->count());
125
126
        $this->assertInstanceOf(JWKInterface::class, $jwkset->getKey(0));
127
    }
128
129
    /**
130
     * @expectedException \InvalidArgumentException
131
     * @expectedExceptionMessage Undefined index.
132
     */
133
    public function testKeySet2()
134
    {
135
        $jwk1 = new JWK([
136
            'kty'     => 'EC',
137
            'crv'     => 'P-256',
138
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
139
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
140
            'use'     => 'sign',
141
            'key_ops' => ['sign'],
142
            'alg'     => 'ES256',
143
            'kid'     => '0123456789',
144
        ]);
145
146
        $jwk2 = new JWK([
147
            'kty'     => 'EC',
148
            'crv'     => 'P-256',
149
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
150
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
151
            'd'       => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
152
            'use'     => 'sign',
153
            'key_ops' => ['verify'],
154
            'alg'     => 'ES256',
155
            'kid'     => '9876543210',
156
        ]);
157
158
        $jwkset = new JWKSet();
159
        $jwkset = $jwkset->addKey($jwk1);
160
        $jwkset = $jwkset->addKey($jwk2);
161
162
        $jwkset->getKey(2);
163
    }
164
165
    public function testPrivateToPublic()
166
    {
167
        $private = new JWK([
168
            'kty'     => 'EC',
169
            'crv'     => 'P-256',
170
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
171
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
172
            'd'       => 'jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI',
173
            'use'     => 'sign',
174
            'key_ops' => ['verify'],
175
            'alg'     => 'ES256',
176
            'kid'     => '9876543210',
177
        ]);
178
179
        $public = $private->toPublic();
180
181
        $this->assertEquals(json_encode([
182
            'kty'     => 'EC',
183
            'crv'     => 'P-256',
184
            'x'       => 'f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU',
185
            'y'       => 'x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0',
186
            'use'     => 'sign',
187
            'key_ops' => ['verify'],
188
            'alg'     => 'ES256',
189
            'kid'     => '9876543210',
190
        ]), json_encode($public));
191
    }
192
193
    public function testLoadCertificateChain()
194
    {
195
        $key = \Jose\Factory\JWKFactory::createFromCertificateFile(
196
            __DIR__.'/../Certificates/Chain/google.crt',
197
            [
198
                'kid' => 'From www.google.com',
199
            ]
200
        );
201
202
        $this->assertEquals(
203
            '178f7e93a74ed73d88c29042220b9ae6e4b371cd',
204
            strtolower(bin2hex(\Base64Url\Base64Url::decode($key->get('x5t'))))
205
        );
206
        $this->assertEquals([
207
                'kty'     => 'RSA',
208
                'n'       => 'nCoEd1zYUJE6BqOC4NhQSLyJP_EZcBqIRn7gj8Xxic4h7lr-YQ23MkSJoHQLU09VpM6CYpXu61lfxuEFgBLEXpQ_vFtIOPRT9yTm-5HpFcTP9FMN9Er8n1Tefb6ga2-HwNBQHygwA0DaCHNRbH__OjynNwaOvUsRBOt9JN7m-fwxcfuU1WDzLkqvQtLL6sRqGrLMU90VS4sfyBlhH82dqD5jK4Q1aWWEyBnFRiL4U5W-44BKEMYq7LqXIBHHOZkQBKDwYXqVJYxOUnXitu0IyhT8ziJqs07PRgOXlwN-wLHee69FM8-6PnG33vQlJcINNYmdnfsOEXmJHjfFr45yaQ',
209
                'e'       => 'AQAB',
210
                'x5t'     => 'F49-k6dO1z2IwpBCIgua5uSzcc0',
211
                'x5t#256' => 'pBJP2vnKx7ruHKsy4yJddGUAwJ888-uyU-8_uwiK_TQ',
212
                'kid'     => 'From www.google.com',
213
                '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=='],
214
            ],
215
            $key->getAll()
216
217
        );
218
    }
219
}
220