package org.pac4j.jwt.config.signature;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.jwk.ECKey;
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.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import static org.junit.Assert.assertTrue;
/**
* Tests {@link ECSignatureConfiguration}.
*
* @author Jerome Leleu
* @since 1.9.2
*/
public final class ECSignatureConfigurationTests implements TestsConstants {
private JWTClaimsSet buildClaims() {
return new JWTClaimsSet.Builder().subject(VALUE).build();
}
private KeyPair buildKeyPair() {
try {
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
return keyGen.generateKeyPair();
} catch (final NoSuchAlgorithmException e) {
throw new TechnicalException(e);
}
}
@Test
public void testMissingPrivateKey() {
final ECSignatureConfiguration config = new ECSignatureConfiguration();
TestsHelper.expectException(() -> config.sign(buildClaims()), TechnicalException.class, "privateKey cannot be null");
}
@Test
public void testMissingPublicKey() {
final ECSignatureConfiguration config = new ECSignatureConfiguration();
config.setPrivateKey((ECPrivateKey) buildKeyPair().getPrivate());
final SignedJWT signedJWT = config.sign(buildClaims());
TestsHelper.expectException(() -> config.verify(signedJWT), TechnicalException.class, "publicKey cannot be null");
}
@Test
public void testMissingAlgorithm() {
final ECSignatureConfiguration config = new ECSignatureConfiguration(buildKeyPair(), null);
TestsHelper.expectException(config::init, TechnicalException.class, "algorithm cannot be null");
}
@Test
public void testBadAlgorithm() {
final ECSignatureConfiguration config = new ECSignatureConfiguration(buildKeyPair(), JWSAlgorithm.HS256);
TestsHelper.expectException(config::init, TechnicalException.class, "Only the ES256, ES384 and ES512 algorithms are supported for elliptic curve signature");
}
@Test
public void buildFromJwk() throws UnsupportedEncodingException {
final String json = new ECKey.Builder(ECKey.Curve.P_256, (ECPublicKey) buildKeyPair().getPublic()).build().toJSONObject().toJSONString();
JWKHelper.buildECKeyPairFromJwk(json);
}
@Test
public void testSignVerify() throws JOSEException {
final ECSignatureConfiguration config = new ECSignatureConfiguration(buildKeyPair());
final JWTClaimsSet claims = new JWTClaimsSet.Builder().subject(VALUE).build();
final SignedJWT signedJwt = config.sign(claims);
assertTrue(config.verify(signedJwt));
}
}