2020import com .auth0 .jwt .JWTVerifier ;
2121import com .auth0 .jwt .algorithms .Algorithm ;
2222import com .auth0 .jwt .exceptions .JWTDecodeException ;
23+ import com .auth0 .jwt .exceptions .oicmsg_exceptions .HeaderError ;
2324import com .auth0 .jwt .exceptions .oicmsg_exceptions .ImportException ;
2425import com .auth0 .jwt .exceptions .oicmsg_exceptions .JWKException ;
26+ import com .auth0 .jwt .exceptions .oicmsg_exceptions .SerializationNotPossible ;
2527import com .auth0 .jwt .exceptions .oicmsg_exceptions .UnknownKeyType ;
2628import com .auth0 .jwt .exceptions .oicmsg_exceptions .ValueError ;
2729import com .auth0 .jwt .interfaces .DecodedJWT ;
30+ import com .auth0 .msg .ECKey ;
2831import com .auth0 .msg .Key ;
32+ import com .auth0 .msg .KeyBundle ;
2933import com .auth0 .msg .KeyJar ;
30- //import com.auth0.msg.KeyType;
3134import com .auth0 .msg .SYMKey ;
3235import com .fasterxml .jackson .core .JsonProcessingException ;
3336import java .io .IOException ;
3437import java .lang .reflect .Array ;
3538import java .net .MalformedURLException ;
39+ import java .security .KeyPair ;
3640import java .security .interfaces .RSAPublicKey ;
3741import java .util .ArrayList ;
3842import java .util .Arrays ;
3943import java .util .Date ;
4044import java .util .HashMap ;
4145import java .util .List ;
4246import java .util .Map ;
43-
4447import org .hamcrest .CoreMatchers ;
4548import org .junit .Assert ;
4649import org .junit .Before ;
@@ -128,7 +131,7 @@ public void testSuccessToAndFromJWTNoneAlgBasicTypes() throws IOException, Inval
128131 claims .put ("foo4" , 5L );
129132 MockMessage mockMessage = new MockMessage (claims , parVerDef );
130133 mockMessage .verify ();
131- String jwt = mockMessage .toJwt (null , "none" );
134+ String jwt = mockMessage .toJwt (null , "none" , null , null , null , null , null , null );
132135 // Test jwt can be verified by auth0
133136 Algorithm algorithm = Algorithm .none ();
134137 JWTVerifier verifier = JWT .require (algorithm ).build ();
@@ -153,25 +156,60 @@ public void testSuccessToAndFromJWTNoneAlgBasicTypes() throws IOException, Inval
153156
154157 private void testSuccessJWTEncryptDecrypt (String alg , String encAlg , String encEnc )
155158 throws IOException , InvalidClaimException , SerializationException , DeserializationException ,
156- IllegalArgumentException , ImportException , UnknownKeyType , ValueError , JWKException {
159+ IllegalArgumentException , ImportException , UnknownKeyType , ValueError , JWKException , HeaderError , SerializationNotPossible {
157160 //Initial test for jwt encryption. Not at all complete case.
158161 HashMap <String , Object > claims = new HashMap <String , Object >();
159162 claims .put ("foo" , "bar" );
160163 MockMessage mockMessage = new MockMessage (claims );
161164 List <Key > keysDec = getKeyJar ().getDecryptKey (null , keyOwner , null , null );
162165 List <Key > keysEnc = getKeyJarPub ().getEncryptKey (null , keyOwner , null , null );
163- int index =0 ;
164- if (encAlg .equals ("A128KW" )){
165- index =1 ;
166- }
167- if (encAlg .equals ("A192KW" )){
168- index =2 ;
169- }
170- if (encAlg .equals ("A256KW" )){
171- index =3 ;
166+ String signedAndEncryptedJwt = null ;
167+ if (encAlg .equals ("A128KW" )) {
168+ signedAndEncryptedJwt = mockMessage .toJwt (keysDec .get (0 ), alg , keysEnc .get (1 ), encAlg ,
169+ encEnc , null , null , null );
170+ } else if (encAlg .equals ("A192KW" )) {
171+ signedAndEncryptedJwt = mockMessage .toJwt (keysDec .get (0 ), alg , keysEnc .get (2 ), encAlg ,
172+ encEnc , null , null , null );
173+ } else if (encAlg .equals ("A256KW" )) {
174+ signedAndEncryptedJwt = mockMessage .toJwt (keysDec .get (0 ), alg , keysEnc .get (3 ), encAlg ,
175+ encEnc , null , null , null );
176+ } else if (encAlg .startsWith ("ECDH" )) {
177+
178+ //For ECDH we need to do bit more complicated test
179+ KeyPair senderKeyPair = ECKey .generateECKeyPair ("P-256" );
180+ ECKey senderKey = ECKey .keyBuilder (senderKeyPair .getPrivate ()).build ();
181+ KeyPair receiverKeyPair = ECKey .generateECKeyPair ("P-256" );
182+ ECKey receiverPubKey = ECKey .keyBuilder (receiverKeyPair .getPublic ()).build ();
183+ ECKey receiverPrvKey = ECKey .keyBuilder (receiverKeyPair .getPrivate ()).build ();
184+ senderKey .setUse ("enc" );
185+ //Key jar of sender
186+ KeyJar keyjarSender =new KeyJar ();
187+ KeyBundle keyBundlePub = new KeyBundle ();
188+ keyBundlePub .append (receiverPubKey );
189+ //Receiver public key is expected to be in the key jar of sender
190+ keyjarSender .addKeyBundle ("receiver" , keyBundlePub );
191+ signedAndEncryptedJwt = mockMessage .toJwt (keysDec .get (0 ), alg , senderKey , encAlg ,
192+ encEnc , keyjarSender , "sender" ,"receiver" );
193+ //Key jar of receiver is expected to have private key of the receiver
194+ KeyBundle keyBundlePrv = new KeyBundle ();
195+ keyBundlePrv .append (receiverPrvKey );
196+ KeyJar keyjarReceiver =new KeyJar ();
197+ keyjarReceiver .addKeyBundle ("sender" , keyBundlePrv );
198+ receiverPubKey .setUse ("enc" );
199+
200+ for (KeyBundle bundle :getKeyJar ().getBundles ().get (keyOwner )) {
201+ keyjarReceiver .addKeyBundle ("sender" , bundle );
202+ }
203+ MockMessage mockMessage2 = new MockMessage ();
204+ mockMessage2 .fromJwt (signedAndEncryptedJwt , keyjarReceiver , "sender" );
205+ Assert .assertEquals ("bar" , mockMessage2 .getClaims ().get ("foo" ));
206+ return ;
207+
208+ } else {
209+ //Default
210+ signedAndEncryptedJwt = mockMessage .toJwt (keysDec .get (0 ), alg , keysEnc .get (0 ), encAlg ,
211+ encEnc , null , null , null );
172212 }
173- String signedAndEncryptedJwt =mockMessage .toJwt (keysDec .get (0 ), alg , keysEnc .get (index ), encAlg ,
174- encEnc );
175213 MockMessage mockMessage2 = new MockMessage ();
176214 mockMessage2 .fromJwt (signedAndEncryptedJwt , getKeyJar (), keyOwner );
177215 Assert .assertEquals ("bar" , mockMessage2 .getClaims ().get ("foo" ));
@@ -181,7 +219,7 @@ private void testSuccessJWTEncryptDecrypt(String alg, String encAlg, String encE
181219 @ Test
182220 public void testSuccessJWTEncryptDecrypt1 ()
183221 throws IOException , InvalidClaimException , SerializationException , DeserializationException ,
184- IllegalArgumentException , ImportException , UnknownKeyType , ValueError , JWKException {
222+ IllegalArgumentException , ImportException , UnknownKeyType , ValueError , JWKException , HeaderError , SerializationNotPossible {
185223
186224 testSuccessJWTEncryptDecrypt ("RS256" ,"RSA1_5" ,"A128CBC-HS256" );
187225 testSuccessJWTEncryptDecrypt ("RS384" ,"RSA-OAEP" ,"A192CBC-HS384" );
@@ -190,8 +228,14 @@ public void testSuccessJWTEncryptDecrypt1()
190228 testSuccessJWTEncryptDecrypt ("RS384" ,"RSA-OAEP" ,"A192GCM" );
191229 testSuccessJWTEncryptDecrypt ("RS512" ,"RSA-OAEP-256" ,"A256GCM" );
192230 testSuccessJWTEncryptDecrypt ("RS256" ,"A128KW" ,"A128CBC-HS256" );
193- testSuccessJWTEncryptDecrypt ("RS256" ,"A192KW" ,"A128CBC-HS256" );
194- testSuccessJWTEncryptDecrypt ("RS256" ,"A256KW" ,"A128CBC-HS256" );
231+ testSuccessJWTEncryptDecrypt ("RS384" ,"A192KW" ,"A128CBC-HS256" );
232+ testSuccessJWTEncryptDecrypt ("RS512" ,"A256KW" ,"A128CBC-HS256" );
233+ //TODO: not passing
234+ //testSuccessJWTEncryptDecrypt("RS256","ECDH-ES","A128CBC-HS256");
235+ testSuccessJWTEncryptDecrypt ("RS256" ,"ECDH-ES+A128KW" ,"A128GCM" );
236+ testSuccessJWTEncryptDecrypt ("RS384" ,"ECDH-ES+A192KW" ,"A192GCM" );
237+ testSuccessJWTEncryptDecrypt ("RS512" ,"ECDH-ES+A256KW" ,"A256GCM" );
238+
195239 }
196240
197241 @ Test
@@ -205,15 +249,15 @@ public void testSuccessToJWTSignRS()
205249 MockMessage mockMessage = new MockMessage (claims );
206250 DecodedJWT jwt = JWT
207251 .require (Algorithm .RSA256 ((RSAPublicKey ) keysVerify .get (0 ).getKey (false ), null )).build ()
208- .verify (mockMessage .toJwt (keysSign .get (0 ), "RS256" ));
252+ .verify (mockMessage .toJwt (keysSign .get (0 ), "RS256" , null , null , null , null , null , null ));
209253 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
210254 Assert .assertEquals ("RS256" , jwt .getHeaderClaim ("alg" ).asString ());
211255 jwt = JWT .require (Algorithm .RSA384 ((RSAPublicKey ) keysVerify .get (0 ).getKey (false ), null ))
212- .build ().verify (mockMessage .toJwt (keysSign .get (0 ), "RS384" ));
256+ .build ().verify (mockMessage .toJwt (keysSign .get (0 ), "RS384" , null , null , null , null , null , null ));
213257 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
214258 Assert .assertEquals ("RS384" , jwt .getHeaderClaim ("alg" ).asString ());
215259 jwt = JWT .require (Algorithm .RSA512 ((RSAPublicKey ) keysVerify .get (0 ).getKey (false ), null ))
216- .build ().verify (mockMessage .toJwt (keysSign .get (0 ), "RS512" ));
260+ .build ().verify (mockMessage .toJwt (keysSign .get (0 ), "RS512" , null , null , null , null , null , null ));
217261 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
218262 Assert .assertEquals ("RS512" , jwt .getHeaderClaim ("alg" ).asString ());
219263 }
@@ -229,15 +273,15 @@ public void testSuccessToJWTSignHS()
229273 MockMessage mockMessage = new MockMessage (claims );
230274 DecodedJWT jwt = JWT
231275 .require (Algorithm .HMAC256 (secret )).build ()
232- .verify (mockMessage .toJwt (key , "HS256" ));
276+ .verify (mockMessage .toJwt (key , "HS256" , null , null , null , null , null , null ));
233277 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
234278 Assert .assertEquals ("HS256" , jwt .getHeaderClaim ("alg" ).asString ());
235279 jwt = JWT .require (Algorithm .HMAC384 (secret ))
236- .build ().verify (mockMessage .toJwt (key , "HS384" ));
280+ .build ().verify (mockMessage .toJwt (key , "HS384" , null , null , null , null , null , null ));
237281 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
238282 Assert .assertEquals ("HS384" , jwt .getHeaderClaim ("alg" ).asString ());
239283 jwt = JWT .require (Algorithm .HMAC512 (secret ))
240- .build ().verify (mockMessage .toJwt (key , "HS512" ));
284+ .build ().verify (mockMessage .toJwt (key , "HS512" , null , null , null , null , null , null ));
241285 Assert .assertEquals ("bar" , jwt .getClaim ("foo" ).asString ());
242286 Assert .assertEquals ("HS512" , jwt .getHeaderClaim ("alg" ).asString ());
243287 }
0 commit comments