/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.crypto;
import org.seedstack.seed.SeedException;
import org.seedstack.seed.crypto.CryptoConfig;
import org.seedstack.shed.ClassLoaders;
import java.net.URL;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
class KeyPairConfigFactory {
private final CryptoConfig cryptoConfig;
KeyPairConfigFactory(CryptoConfig cryptoConfig) {
this.cryptoConfig = cryptoConfig;
}
List<KeyPairConfig> create(String keyStoreName, KeyStore keyStore) {
List<KeyPairConfig> keyPairConfigs = new ArrayList<>();
try {
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
KeyPairConfig keyPairConfig = createKeyPairFromAlias(aliases.nextElement(), keyStoreName);
keyPairConfigs.add(keyPairConfig);
}
} catch (KeyStoreException e) {
throw SeedException.wrap(e, CryptoErrorCode.UNEXPECTED_EXCEPTION);
}
return keyPairConfigs;
}
private KeyPairConfig createKeyPairFromAlias(String alias, String keyStoreName) {
String aliasPassword = getPassword(alias, keyStoreName);
String location = getLocation(alias);
String qualifier = getQualifier(alias, keyStoreName);
return new KeyPairConfig(keyStoreName, alias, aliasPassword, location, qualifier);
}
private String getLocation(String certificateName) {
CryptoConfig.CertificateConfig certificateConfig = cryptoConfig.certificates().get(certificateName);
if (certificateConfig != null) {
// Find the certificate location from the classpath
String certResource = certificateConfig.getResource();
if (certResource != null) {
URL urlResource = ClassLoaders.findMostCompleteClassLoader().getResource(certResource);
if (urlResource == null) {
throw SeedException.createNew(CryptoErrorCode.CERTIFICATE_NOT_FOUND)
.put("certificateName", certificateName).put("certResource", certResource);
}
return urlResource.getFile();
} else {
// Otherwise get the file path from the configuration
return certificateConfig.getFile();
}
} else {
return null;
}
}
private String getPassword(String alias, String keyStoreName) {
CryptoConfig.KeyStoreConfig.AliasConfig aliasConfig = getAliasConfig(alias, keyStoreName);
if (aliasConfig != null) {
return aliasConfig.getPassword();
} else {
return null;
}
}
private String getQualifier(String alias, String keyStoreName) {
CryptoConfig.KeyStoreConfig.AliasConfig aliasConfig = getAliasConfig(alias, keyStoreName);
if (aliasConfig != null) {
return aliasConfig.getQualifier();
} else {
return null;
}
}
private CryptoConfig.KeyStoreConfig.AliasConfig getAliasConfig(String alias, String keyStoreName) {
CryptoConfig.KeyStoreConfig keyStoreConfig = cryptoConfig.keyStores().get(keyStoreName);
if (keyStoreConfig != null) {
return keyStoreConfig.getAliases().get(alias);
} else {
return null;
}
}
}