package eu.geekplace.javapinning.java7;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import eu.geekplace.javapinning.JavaPinning;
import eu.geekplace.javapinning.PinningTrustManager;
import eu.geekplace.javapinning.pin.Pin;
/**
* A specialized version of {@link JavaPinning} for runtime environments
* providing {@code X509ExtendedTrustManager}. Use this instead of JavaPinning
* when possible, e.g. if you target a recent Java SE version and <b>not</b>
* Android.
*/
public class Java7Pinning extends JavaPinning {
static {
try {
Class.forName("javax.net.ssl.X509ExtendedTrustManager");
} catch(ClassNotFoundException e) {
throw new IllegalStateException(
Java7Pinning.class.getSimpleName()
+ " requires X509ExtendedTrustManager, but it was not found in classpath (Are you on Android?)",
e);
}
}
private static final Java7Pinning INSTANCE = new Java7Pinning();
public static X509TrustManager trustManagerForPin(String pinString) {
return INSTANCE.tmForPin(pinString);
}
public static X509TrustManager trustManagerforPins(Collection<Pin> pins) {
return INSTANCE.tmForPins(pins);
}
public static SSLContext forPin(String pinString) throws KeyManagementException,
NoSuchAlgorithmException {
return INSTANCE.ctxForPin(pinString);
}
public static SSLContext forPins(Collection<Pin> pins) throws KeyManagementException,
NoSuchAlgorithmException {
return INSTANCE.ctxForPins(pins);
}
private Java7Pinning() {
}
/**
* This method specializes the PinningTrustManager from a
* {@code X509TrustManager} to a {@code X509ExtendedTrustManager}. Newer
* JREs, since a certain u-release of JRE/JDK 8 to be precisce, will perform
* further verification steps if the TrustManager <b>is not</b> of type
* X509ExtendedTrustManager. This verification steps include ensuring
* algorithmic constraints, which doesn't make much sense when Java Pinning
* is used.
*/
@Override
protected X509TrustManager eventuallySpecialize(PinningTrustManager pinningTrustManager) {
return new X509ExtendedTrustManagerWrapper(pinningTrustManager);
}
}