blob: 81e65a29055f42fafd63f1bfd0c187442f70cd63 [file] [log] [blame]
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();
}
};
}
}