GraniteSecurityProvider.java 3.37 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  org.slf4j.Logger
 *  org.slf4j.LoggerFactory
 */
package com.adobe.granite.keystore.internal;

import com.adobe.granite.crypto.internal.InternalClassLoaderWrapper;
import java.lang.reflect.Constructor;
import java.security.Provider;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class GraniteSecurityProvider
extends Provider {
    public static final String BASE_PROVIDER_NAME = "AdobeGraniteSecurityProvider";
    public static final String PROVIDER_INFO = "Adobe Granite Security Provider";
    public static final String PKCS12 = "PKCS12";
    public static final String X509 = "X.509";
    public static final String RSA = "RSA";
    private static final Logger LOG = LoggerFactory.getLogger(GraniteSecurityProvider.class);
    private static final String JSAFE_PROVIDER = "com.rsa.jsafe.provider.JsafeJCE";
    private static Provider jsafeJCEProvider;
    private static Map<String, Provider.Service> services;
    private static final Set<String> wrappedServices;
    private static volatile GraniteSecurityProvider instance;

    private GraniteSecurityProvider() {
        super("AdobeGraniteSecurityProvider", 1.0, "Adobe Granite Security Provider");
    }

    /*
     * WARNING - Removed try catching itself - possible behaviour change.
     * Enabled force condition propagation
     * Lifted jumps to return sites
     */
    public static GraniteSecurityProvider getInstance() {
        if (instance != null) return instance;
        Class<GraniteSecurityProvider> class_ = GraniteSecurityProvider.class;
        synchronized (GraniteSecurityProvider.class) {
            if (instance != null) return instance;
            {
                instance = new GraniteSecurityProvider();
            }
            // ** MonitorExit[var0] (shouldn't be in output)
            return instance;
        }
    }

    @Override
    public synchronized Provider.Service getService(String type, String algorithm) {
        Provider.Service service = null;
        String key = type + "|" + algorithm;
        if (type != null && algorithm != null && wrappedServices.contains(type + "|" + algorithm) && (service = services.get(key)) == null) {
            this.initJsafeJCEProvider();
            service = jsafeJCEProvider.getService(type, algorithm);
            services.put(key, service);
        }
        return service;
    }

    private synchronized void initJsafeJCEProvider() {
        if (jsafeJCEProvider == null) {
            try {
                ClassLoader classLoader = InternalClassLoaderWrapper.getInstance().getClassLoader();
                Class jsafeJCEProviderClass = classLoader.loadClass("com.rsa.jsafe.provider.JsafeJCE");
                Constructor jsafeJCEProviderConstructor = jsafeJCEProviderClass.getDeclaredConstructor(null);
                jsafeJCEProvider = (Provider)jsafeJCEProviderConstructor.newInstance(null);
            }
            catch (Exception E) {
                LOG.error("Cannot access com.rsa.jsafe.provider.JsafeJCE");
            }
        }
    }

    static {
        services = new HashMap<String, Provider.Service>();
        wrappedServices = new HashSet<String>();
        wrappedServices.add("CertPathValidator|PKIX");
        wrappedServices.add("KeyStore|PKCS12");
    }
}