// 
// Decompiled by Procyon v0.6.0
// 

package com.google.crypto.tink.config.internal;

import java.lang.reflect.Method;
import com.google.crypto.tink.internal.Random;
import java.security.GeneralSecurityException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;

public final class TinkFipsUtil
{
    private static final Logger logger;
    private static final AtomicBoolean isRestrictedToFips;
    
    public static void setFipsRestricted() throws GeneralSecurityException {
        if (!checkConscryptIsAvailableAndUsesFipsBoringSsl()) {
            throw new GeneralSecurityException("Conscrypt is not available or does not support checking for FIPS build.");
        }
        Random.validateUsesConscrypt();
        TinkFipsUtil.isRestrictedToFips.set(true);
    }
    
    public static void unsetFipsRestricted() {
        TinkFipsUtil.isRestrictedToFips.set(false);
    }
    
    public static boolean useOnlyFips() {
        return TinkFipsStatus.useOnlyFips() || TinkFipsUtil.isRestrictedToFips.get();
    }
    
    public static boolean fipsModuleAvailable() {
        return checkConscryptIsAvailableAndUsesFipsBoringSsl();
    }
    
    static Boolean checkConscryptIsAvailableAndUsesFipsBoringSsl() {
        try {
            final Class<?> cls = Class.forName("org.conscrypt.Conscrypt");
            final Method isBoringSslFipsBuild = cls.getMethod("isBoringSslFIPSBuild", (Class<?>[])new Class[0]);
            return (Boolean)isBoringSslFipsBuild.invoke(null, new Object[0]);
        }
        catch (final Exception e) {
            TinkFipsUtil.logger.info("Conscrypt is not available or does not support checking for FIPS build.");
            return false;
        }
    }
    
    private TinkFipsUtil() {
    }
    
    static {
        logger = Logger.getLogger(TinkFipsUtil.class.getName());
        isRestrictedToFips = new AtomicBoolean(false);
    }
    
    public enum AlgorithmFipsCompatibility
    {
        ALGORITHM_NOT_FIPS {
            @Override
            public boolean isCompatible() {
                return !TinkFipsUtil.useOnlyFips();
            }
        }, 
        ALGORITHM_REQUIRES_BORINGCRYPTO {
            @Override
            public boolean isCompatible() {
                return !TinkFipsUtil.useOnlyFips() || TinkFipsUtil.fipsModuleAvailable();
            }
        };
        
        public abstract boolean isCompatible();
    }
}
