package org.bouncycastle.est.jcajce; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Provider; import java.security.SecureRandom; import java.security.Security; import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.X509TrustManager; /** * A basic builder to allow configuration of an SSLContext used to create an SSLSocketFactory. */ class SSLSocketFactoryCreatorBuilder { protected String tlsVersion = "TLS"; protected Provider tlsProvider; protected KeyManager[] keyManagers; protected X509TrustManager[] trustManagers; protected SecureRandom secureRandom = new SecureRandom(); public SSLSocketFactoryCreatorBuilder(X509TrustManager trustManager) { if (trustManager == null) { throw new NullPointerException("Trust managers can not be null"); } this.trustManagers = new X509TrustManager[]{trustManager}; } public SSLSocketFactoryCreatorBuilder(X509TrustManager[] trustManagers) { if (trustManagers == null) { throw new NullPointerException("Trust managers can not be null"); } this.trustManagers = trustManagers; } public SSLSocketFactoryCreatorBuilder withTLSVersion(String tlsVersion) { this.tlsVersion = tlsVersion; return this; } public SSLSocketFactoryCreatorBuilder withSecureRandom(SecureRandom secureRandom) { this.secureRandom = secureRandom; return this; } /** * Configure this builder to use the provider with the passed in name. * * @param tlsProviderName the name JSSE Provider to use. * @return the current builder instance. * @throws NoSuchProviderException if the specified provider does not exist. */ public SSLSocketFactoryCreatorBuilder withProvider(String tlsProviderName) throws NoSuchProviderException { this.tlsProvider = Security.getProvider(tlsProviderName); if (this.tlsProvider == null) { throw new NoSuchProviderException("JSSE provider not found: " + tlsProviderName); } return this; } /** * Configure this builder to use the passed in provider. * * @param tlsProvider the JSSE Provider to use. * @return the current builder instance. */ public SSLSocketFactoryCreatorBuilder withProvider(Provider tlsProvider) { this.tlsProvider = tlsProvider; return this; } public SSLSocketFactoryCreatorBuilder withKeyManager(KeyManager keyManager) { if (keyManager == null) { this.keyManagers = null; } else { this.keyManagers = new KeyManager[]{keyManager}; } return this; } public SSLSocketFactoryCreatorBuilder withKeyManagers(KeyManager[] keyManagers) { this.keyManagers = keyManagers; return this; } public SSLSocketFactoryCreator build() { return new SSLSocketFactoryCreator() { public boolean isTrusted() { for (int i = 0; i != trustManagers.length; i++) { X509TrustManager tm = trustManagers[i]; if (tm.getAcceptedIssuers().length > 0) { return true; } } return false; } public SSLSocketFactory createFactory() throws NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { SSLContext ctx; if (tlsProvider != null) { ctx = SSLContext.getInstance(tlsVersion, tlsProvider); } else { ctx = SSLContext.getInstance(tlsVersion); } ctx.init(keyManagers, trustManagers, secureRandom); return ctx.getSocketFactory(); } }; } }