1 | <?php |
||
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 |