@@ -128,4 +128,240 @@ function testDecode()
128128 "enc " => "A128CBC-HS256 "
129129 ), $ jwe ->header );
130130 }
131+
132+ function testConstructFromJWT ()
133+ {
134+ $ jwt = new JOSE_JWT (array ('foo ' => 'bar ' ));
135+ $ jwe = new JOSE_JWE ($ jwt );
136+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
137+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
138+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
139+ $ this ->assertEquals ($ jwt ->toString (), $ decrypted ->plain_text );
140+ }
141+
142+ function testConstructFromNull ()
143+ {
144+ $ jwe = new JOSE_JWE ();
145+ $ this ->assertArrayNotHasKey ('typ ' , $ jwe ->header );
146+ }
147+
148+ function testEncryptDir_A256CBCHS512 ()
149+ {
150+ $ secret = Random::string (512 / 8 );
151+ $ jwe = new JOSE_JWE ($ this ->plain_text );
152+ $ jwe = $ jwe ->encrypt ($ secret , 'dir ' , 'A256CBC-HS512 ' );
153+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
154+ $ this ->assertEquals ($ this ->plain_text , $ jwe_decoded ->decrypt ($ secret )->plain_text );
155+ }
156+
157+ function testEncryptWithJWKSetsKid ()
158+ {
159+ $ rsa = new \phpseclib \Crypt \RSA ();
160+ $ rsa ->loadKey ($ this ->rsa_keys ['public ' ]);
161+ $ jwk = \JOSE_JWK ::encode ($ rsa , array ('kid ' => 'test-key-id ' ));
162+ $ jwe = new JOSE_JWE ($ this ->plain_text );
163+ $ jwe ->encrypt ($ jwk );
164+ $ this ->assertEquals ('test-key-id ' , $ jwe ->header ['kid ' ]);
165+ }
166+
167+ function testEncryptWithCryptRSA ()
168+ {
169+ $ rsa = new \phpseclib \Crypt \RSA ();
170+ $ rsa ->loadKey ($ this ->rsa_keys ['public ' ]);
171+ $ jwe = new JOSE_JWE ($ this ->plain_text );
172+ $ jwe ->encrypt ($ rsa );
173+ $ segments = explode ('. ' , $ jwe ->toString ());
174+ $ this ->assertEquals (5 , count ($ segments ));
175+ }
176+
177+ function testEncryptA256KW ()
178+ {
179+ $ jwe = new JOSE_JWE ($ this ->plain_text );
180+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
181+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'A256KW ' );
182+ }
183+
184+ function testEncryptECDHES ()
185+ {
186+ $ jwe = new JOSE_JWE ($ this ->plain_text );
187+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
188+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'ECDH-ES ' );
189+ }
190+
191+ function testEncryptECDHES_A128KW ()
192+ {
193+ $ jwe = new JOSE_JWE ($ this ->plain_text );
194+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
195+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'ECDH-ES+A128KW ' );
196+ }
197+
198+ function testEncryptECDHES_A256KW ()
199+ {
200+ $ jwe = new JOSE_JWE ($ this ->plain_text );
201+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
202+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'ECDH-ES+A256KW ' );
203+ }
204+
205+ function testDecryptRSAOAEP_A128CBCHS256 ()
206+ {
207+ $ jwe = new JOSE_JWE ($ this ->plain_text );
208+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'RSA-OAEP ' );
209+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
210+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
211+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
212+ }
213+
214+ function testDecryptRSAOAEP_A256CBCHS512 ()
215+ {
216+ $ jwe = new JOSE_JWE ($ this ->plain_text );
217+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'RSA-OAEP ' , 'A256CBC-HS512 ' );
218+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
219+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
220+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
221+ }
222+
223+ function testDecryptRSA15_A256CBCHS512 ()
224+ {
225+ $ jwe = new JOSE_JWE ($ this ->plain_text );
226+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'RSA1_5 ' , 'A256CBC-HS512 ' );
227+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
228+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
229+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
230+ }
231+
232+ function testDecryptWithCryptRSA ()
233+ {
234+ $ jwe = new JOSE_JWE ($ this ->plain_text );
235+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
236+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
237+ $ rsa = new \phpseclib \Crypt \RSA ();
238+ $ rsa ->loadKey ($ this ->rsa_keys ['private ' ]);
239+ $ decrypted = $ jwe_decoded ->decrypt ($ rsa );
240+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
241+ }
242+
243+ function testDecryptDir_A128CBCHS256 ()
244+ {
245+ $ secret = Random::string (256 / 8 );
246+ $ jwe = new JOSE_JWE ($ this ->plain_text );
247+ $ jwe = $ jwe ->encrypt ($ secret , 'dir ' );
248+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
249+ $ decrypted = $ jwe_decoded ->decrypt ($ secret );
250+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
251+ }
252+
253+ function testDecryptDir_A256CBCHS512 ()
254+ {
255+ $ secret = Random::string (512 / 8 );
256+ $ jwe = new JOSE_JWE ($ this ->plain_text );
257+ $ jwe = $ jwe ->encrypt ($ secret , 'dir ' , 'A256CBC-HS512 ' );
258+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
259+ $ decrypted = $ jwe_decoded ->decrypt ($ secret );
260+ $ this ->assertEquals ($ this ->plain_text , $ decrypted ->plain_text );
261+ }
262+
263+ function testDecryptA128KW ()
264+ {
265+ $ jwe = new JOSE_JWE ($ this ->plain_text );
266+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
267+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
268+ // Manually override the header to simulate an A128KW token
269+ $ jwe_decoded ->header ['alg ' ] = 'A128KW ' ;
270+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
271+ $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
272+ }
273+
274+ function testDecryptUnknownAlgorithm ()
275+ {
276+ $ jwe = new JOSE_JWE ($ this ->plain_text );
277+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
278+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
279+ $ jwe_decoded ->header ['alg ' ] = 'Unknown ' ;
280+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
281+ $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
282+ }
283+
284+ function testDecryptInvalidAuthenticationTag ()
285+ {
286+ $ jwe = new JOSE_JWE ($ this ->plain_text );
287+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
288+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
289+ // Corrupt the authentication tag
290+ $ jwe_decoded ->authentication_tag = 'invalid ' ;
291+ $ this ->expectException ('JOSE_Exception_UnexpectedAlgorithm ' );
292+ $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
293+ }
294+
295+ function testEncryptReturnsJWE ()
296+ {
297+ $ jwe = new JOSE_JWE ($ this ->plain_text );
298+ $ result = $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
299+ $ this ->assertInstanceOf ('JOSE_JWE ' , $ result );
300+ }
301+
302+ function testDecryptReturnsJWE ()
303+ {
304+ $ jwe = new JOSE_JWE ($ this ->plain_text );
305+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
306+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
307+ $ result = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
308+ $ this ->assertInstanceOf ('JOSE_JWE ' , $ result );
309+ }
310+
311+ function testEncryptFromJWTEncryptMethod ()
312+ {
313+ $ jwt = new JOSE_JWT (array ('foo ' => 'bar ' ));
314+ $ jwe = $ jwt ->encrypt ($ this ->rsa_keys ['public ' ], 'RSA-OAEP ' , 'A256CBC-HS512 ' );
315+ $ this ->assertInstanceOf ('JOSE_JWE ' , $ jwe );
316+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
317+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
318+ $ this ->assertEquals ($ jwt ->toString (), $ decrypted ->plain_text );
319+ }
320+
321+ function testHeaderDoesNotContainTyp ()
322+ {
323+ $ jwe = new JOSE_JWE ($ this ->plain_text );
324+ $ this ->assertArrayNotHasKey ('typ ' , $ jwe ->header );
325+ }
326+
327+ function testDirEncryptedKeyIsEmpty ()
328+ {
329+ $ secret = Random::string (256 / 8 );
330+ $ jwe = new JOSE_JWE ($ this ->plain_text );
331+ $ jwe = $ jwe ->encrypt ($ secret , 'dir ' );
332+ $ this ->assertEmpty ($ jwe ->jwe_encrypted_key );
333+ }
334+
335+ function testToStringHasFiveSegments ()
336+ {
337+ $ jwe = new JOSE_JWE ($ this ->plain_text );
338+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
339+ $ segments = explode ('. ' , $ jwe ->toString ());
340+ $ this ->assertEquals (5 , count ($ segments ));
341+ // Verify each segment is non-empty except possibly encrypted key
342+ $ this ->assertNotEmpty ($ segments [0 ]); // header
343+ $ this ->assertNotEmpty ($ segments [1 ]); // encrypted key
344+ $ this ->assertNotEmpty ($ segments [2 ]); // IV
345+ $ this ->assertNotEmpty ($ segments [3 ]); // cipher text
346+ $ this ->assertNotEmpty ($ segments [4 ]); // auth tag
347+ }
348+
349+ function testDecodeHeaderValues ()
350+ {
351+ $ jwe = new JOSE_JWE ($ this ->plain_text );
352+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ], 'RSA-OAEP ' , 'A256CBC-HS512 ' );
353+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
354+ $ this ->assertEquals ('RSA-OAEP ' , $ jwe_decoded ->header ['alg ' ]);
355+ $ this ->assertEquals ('A256CBC-HS512 ' , $ jwe_decoded ->header ['enc ' ]);
356+ }
357+
358+ function testRoundTripLongPlainText ()
359+ {
360+ $ long_text = str_repeat ('The quick brown fox jumps over the lazy dog. ' , 100 );
361+ $ jwe = new JOSE_JWE ($ long_text );
362+ $ jwe ->encrypt ($ this ->rsa_keys ['public ' ]);
363+ $ jwe_decoded = JOSE_JWT ::decode ($ jwe ->toString ());
364+ $ decrypted = $ jwe_decoded ->decrypt ($ this ->rsa_keys ['private ' ]);
365+ $ this ->assertEquals ($ long_text , $ decrypted ->plain_text );
366+ }
131367}
0 commit comments