package org.pac4j.jwt.config.signature; import com.nimbusds.jose.JOSEException; import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.jwk.RSAKey; import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.SignedJWT; import org.junit.Test; import org.pac4j.core.exception.TechnicalException; import org.pac4j.core.util.TestsConstants; import org.pac4j.core.util.TestsHelper; import org.pac4j.jwt.util.JWKHelper; import java.io.UnsupportedEncodingException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import static org.junit.Assert.assertTrue; /** * Tests {@link RSASignatureConfiguration}. * * @author Jerome Leleu * @since 1.9.2 */ public final class RSASignatureConfigurationTests implements TestsConstants { private JWTClaimsSet buildClaims() { return new JWTClaimsSet.Builder().subject(VALUE).build(); } private KeyPair buildKeyPair() { try { final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); return keyGen.generateKeyPair(); } catch (final NoSuchAlgorithmException e) { throw new TechnicalException(e); } } @Test public void testMissingPrivateKey() { final RSASignatureConfiguration config = new RSASignatureConfiguration(); TestsHelper.expectException(() -> config.sign(buildClaims()), TechnicalException.class, "privateKey cannot be null"); } @Test public void testMissingPublicKey() { final RSASignatureConfiguration config = new RSASignatureConfiguration(); config.setPrivateKey((RSAPrivateKey) buildKeyPair().getPrivate()); final SignedJWT signedJWT = config.sign(buildClaims()); TestsHelper.expectException(() -> config.verify(signedJWT), TechnicalException.class, "publicKey cannot be null"); } @Test public void testMissingAlgorithm() { final RSASignatureConfiguration config = new RSASignatureConfiguration(buildKeyPair(), null); TestsHelper.expectException(config::init, TechnicalException.class, "algorithm cannot be null"); } @Test public void testBadAlgorithm() { final RSASignatureConfiguration config = new RSASignatureConfiguration(buildKeyPair(), JWSAlgorithm.HS256); TestsHelper.expectException(config::init, TechnicalException.class, "Only the RS256, RS384, RS512, PS256, PS384 and PS512 algorithms are supported for RSA signature"); } @Test public void buildFromJwk() throws UnsupportedEncodingException { final String json = new RSAKey.Builder((RSAPublicKey) buildKeyPair().getPublic()).build().toJSONObject().toJSONString(); JWKHelper.buildRSAKeyPairFromJwk(json); } @Test public void testSignVerify() throws JOSEException { final RSASignatureConfiguration config = new RSASignatureConfiguration(buildKeyPair()); final JWTClaimsSet claims = new JWTClaimsSet.Builder().subject(VALUE).build(); final SignedJWT signedJwt = config.sign(claims); assertTrue(config.verify(signedJwt)); } }