package com.hwlcn.ldap.util.ssl;
import java.io.File;
import java.io.FileInputStream;
import java.io.Serializable;
import java.security.KeyStore;
import java.security.KeyStoreException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import com.hwlcn.core.annotation.NotMutable;
import com.hwlcn.core.annotation.ThreadSafety;
import com.hwlcn.ldap.util.ThreadSafetyLevel;
import static com.hwlcn.ldap.util.Debug.*;
import static com.hwlcn.ldap.util.Validator.*;
import static com.hwlcn.ldap.util.ssl.SSLMessages.*;
@NotMutable()
@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
public final class KeyStoreKeyManager
extends WrapperKeyManager
implements Serializable
{
private static final long serialVersionUID = -5202641256733094253L;
private final String keyStoreFile;
private final String keyStoreFormat;
public KeyStoreKeyManager(final File keyStoreFile, final char[] keyStorePIN)
throws KeyStoreException
{
this(keyStoreFile.getAbsolutePath(), keyStorePIN, null, null);
}
public KeyStoreKeyManager(final String keyStoreFile, final char[] keyStorePIN)
throws KeyStoreException
{
this(keyStoreFile, keyStorePIN, null, null);
}
public KeyStoreKeyManager(final File keyStoreFile, final char[] keyStorePIN,
final String keyStoreFormat,
final String certificateAlias)
throws KeyStoreException
{
this(keyStoreFile.getAbsolutePath(), keyStorePIN, keyStoreFormat,
certificateAlias);
}
public KeyStoreKeyManager(final String keyStoreFile, final char[] keyStorePIN,
final String keyStoreFormat,
final String certificateAlias)
throws KeyStoreException
{
super(getKeyManagers(keyStoreFile, keyStorePIN, keyStoreFormat),
certificateAlias);
this.keyStoreFile = keyStoreFile;
if (keyStoreFormat == null)
{
this.keyStoreFormat = KeyStore.getDefaultType();
}
else
{
this.keyStoreFormat = keyStoreFormat;
}
}
private static KeyManager[] getKeyManagers(final String keyStoreFile,
final char[] keyStorePIN,
final String keyStoreFormat)
throws KeyStoreException
{
ensureNotNull(keyStoreFile);
String type = keyStoreFormat;
if (type == null)
{
type = KeyStore.getDefaultType();
}
final File f = new File(keyStoreFile);
if (! f.exists())
{
throw new KeyStoreException(ERR_KEYSTORE_NO_SUCH_FILE.get(keyStoreFile));
}
final KeyStore ks = KeyStore.getInstance(type);
FileInputStream inputStream = null;
try
{
inputStream = new FileInputStream(f);
ks.load(inputStream, keyStorePIN);
}
catch (Exception e)
{
debugException(e);
throw new KeyStoreException(
ERR_KEYSTORE_CANNOT_LOAD.get(keyStoreFile, type, String.valueOf(e)),
e);
}
finally
{
if (inputStream != null)
{
try
{
inputStream.close();
}
catch (Exception e)
{
debugException(e);
}
}
}
try
{
final KeyManagerFactory factory = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
factory.init(ks, keyStorePIN);
return factory.getKeyManagers();
}
catch (Exception e)
{
debugException(e);
throw new KeyStoreException(ERR_KEYSTORE_CANNOT_GET_KEY_MANAGERS.get(
keyStoreFile, keyStoreFormat, String.valueOf(e)), e);
}
}
public String getKeyStoreFile()
{
return keyStoreFile;
}
public String getKeyStoreFormat()
{
return keyStoreFormat;
}
}