/*
* Copyright 2016
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.acra.security;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.acra.ACRAConstants;
import org.acra.config.ACRAConfiguration;
import org.acra.util.InstanceCreator;
import java.security.KeyStore;
/**
* Helper to get a KeyStore from a configuration
*
* @author F43nd1r
* @since 4.9.0
*/
public final class KeyStoreHelper {
private static final String ASSET_PREFIX = "asset://";
private KeyStoreHelper() {
}
/**
* try to get the keystore
* @param context a context
* @param config the configuration
* @return the keystore, or null if none provided / failure
*/
@Nullable
public static KeyStore getKeyStore(@NonNull Context context, @NonNull ACRAConfiguration config) {
final InstanceCreator instanceCreator = new InstanceCreator();
KeyStore keyStore = instanceCreator.create(config.keyStoreFactoryClass(), new NoKeyStoreFactory()).create(context);
if(keyStore == null) {
//either users factory did not create a keystore, or the configuration is default {@link NoKeyStoreFactory}
final int certificateRes = config.resCertificate();
final String certificatePath = config.certificatePath();
final String certificateType = config.certificateType();
if(certificateRes != ACRAConstants.DEFAULT_RES_VALUE){
keyStore = new ResourceKeyStoreFactory(certificateType, certificateRes).create(context);
}else if(!certificatePath.equals(ACRAConstants.DEFAULT_STRING_VALUE)){
if(certificatePath.startsWith(ASSET_PREFIX)) {
keyStore = new AssetKeyStoreFactory(certificateType, certificatePath.substring(ASSET_PREFIX.length())).create(context);
} else {
keyStore = new FileKeyStoreFactory(certificateType, certificatePath).create(context);
}
}
}
return keyStore;
}
}