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

package com.google.crypto.tink.keyderivation;

import com.google.crypto.tink.keyderivation.internal.PrfBasedKeyDeriver;
import com.google.crypto.tink.config.internal.TinkFipsUtil;
import com.google.crypto.tink.Configuration;
import com.google.crypto.tink.subtle.prf.StreamingPrf;
import com.google.crypto.tink.prf.HkdfPrfKey;
import com.google.crypto.tink.subtle.prf.HkdfStreamingPrf;
import java.security.GeneralSecurityException;
import com.google.crypto.tink.Key;
import com.google.crypto.tink.internal.PrimitiveConstructor;
import com.google.crypto.tink.keyderivation.internal.KeyDeriver;
import com.google.crypto.tink.keyderivation.internal.KeysetDeriverWrapper;
import com.google.crypto.tink.internal.PrimitiveRegistry;
import com.google.crypto.tink.internal.InternalConfiguration;

class KeysetDeriverConfigurationV0
{
    private static final InternalConfiguration INTERNAL_CONFIGURATION;
    private static final PrimitiveRegistry PRF_REGISTRY;
    
    private KeysetDeriverConfigurationV0() {
    }
    
    private static InternalConfiguration create() {
        try {
            final PrimitiveRegistry.Builder builder = PrimitiveRegistry.builder();
            KeysetDeriverWrapper.registerToInternalPrimitiveRegistry(builder);
            builder.registerPrimitiveConstructor((PrimitiveConstructor<Key, Object>)PrimitiveConstructor.create((PrimitiveConstructor.PrimitiveConstructionFunction<KeyT, PrimitiveT>)KeysetDeriverConfigurationV0::createHkdfPrfBasedKeyDeriver, (Class<KeyT>)PrfBasedKeyDerivationKey.class, (Class<PrimitiveT>)KeyDeriver.class));
            return InternalConfiguration.createFromPrimitiveRegistry(builder.allowReparsingLegacyKeys().build());
        }
        catch (final GeneralSecurityException e) {
            throw new IllegalStateException(e);
        }
    }
    
    private static PrimitiveRegistry createPrfRegistry() {
        try {
            return PrimitiveRegistry.builder().registerPrimitiveConstructor((PrimitiveConstructor<Key, Object>)PrimitiveConstructor.create((PrimitiveConstructor.PrimitiveConstructionFunction<KeyT, PrimitiveT>)HkdfStreamingPrf::create, (Class<KeyT>)HkdfPrfKey.class, (Class<PrimitiveT>)StreamingPrf.class)).build();
        }
        catch (final GeneralSecurityException e) {
            throw new IllegalStateException(e);
        }
    }
    
    public static Configuration get() throws GeneralSecurityException {
        if (TinkFipsUtil.useOnlyFips()) {
            throw new GeneralSecurityException("Cannot use non-FIPS-compliant KeysetDeriverConfigurationV0 in FIPS mode");
        }
        return KeysetDeriverConfigurationV0.INTERNAL_CONFIGURATION;
    }
    
    private static KeyDeriver createHkdfPrfBasedKeyDeriver(final PrfBasedKeyDerivationKey key) throws GeneralSecurityException {
        final KeyDeriver deriver = PrfBasedKeyDeriver.createWithPrfPrimitiveRegistry(KeysetDeriverConfigurationV0.PRF_REGISTRY, key);
        final Object unused = deriver.deriveKey(new byte[] { 1 });
        return deriver;
    }
    
    static {
        INTERNAL_CONFIGURATION = create();
        PRF_REGISTRY = createPrfRegistry();
    }
}
