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

package com.google.crypto.tink.prf;

import com.google.crypto.tink.subtle.PrfAesCmac;
import com.google.crypto.tink.subtle.prf.PrfImpl;
import com.google.crypto.tink.subtle.prf.HkdfStreamingPrf;
import com.google.crypto.tink.config.internal.TinkFipsUtil;
import com.google.crypto.tink.Configuration;
import java.security.GeneralSecurityException;
import com.google.crypto.tink.Key;
import com.google.crypto.tink.internal.PrimitiveConstructor;
import com.google.crypto.tink.subtle.PrfHmacJce;
import com.google.crypto.tink.internal.PrimitiveRegistry;
import com.google.crypto.tink.internal.InternalConfiguration;

class PrfConfigurationV1
{
    private static final InternalConfiguration INTERNAL_CONFIGURATION;
    private static final int MIN_HKDF_PRF_KEY_SIZE = 32;
    
    private PrfConfigurationV1() {
    }
    
    private static InternalConfiguration create() {
        try {
            final PrimitiveRegistry.Builder builder = PrimitiveRegistry.builder();
            PrfSetWrapper.registerToInternalPrimitiveRegistry(builder);
            builder.registerPrimitiveConstructor((PrimitiveConstructor<Key, Object>)PrimitiveConstructor.create((PrimitiveConstructor.PrimitiveConstructionFunction<KeyT, PrimitiveT>)PrfHmacJce::create, (Class<KeyT>)HmacPrfKey.class, (Class<PrimitiveT>)Prf.class));
            builder.registerPrimitiveConstructor((PrimitiveConstructor<Key, Object>)PrimitiveConstructor.create((PrimitiveConstructor.PrimitiveConstructionFunction<KeyT, PrimitiveT>)PrfConfigurationV1::createHkdfPrf, (Class<KeyT>)HkdfPrfKey.class, (Class<PrimitiveT>)Prf.class));
            builder.registerPrimitiveConstructor((PrimitiveConstructor<Key, Object>)PrimitiveConstructor.create((PrimitiveConstructor.PrimitiveConstructionFunction<KeyT, PrimitiveT>)PrfConfigurationV1::createAesCmacPrf, (Class<KeyT>)AesCmacPrfKey.class, (Class<PrimitiveT>)Prf.class));
            return InternalConfiguration.createFromPrimitiveRegistry(builder.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 PrfConfigurationV1 in FIPS mode");
        }
        return PrfConfigurationV1.INTERNAL_CONFIGURATION;
    }
    
    private static Prf createHkdfPrf(final HkdfPrfKey key) throws GeneralSecurityException {
        if (key.getParameters().getKeySizeBytes() < 32) {
            throw new GeneralSecurityException("HkdfPrf key size must be at least 32");
        }
        if (key.getParameters().getHashType() != HkdfPrfParameters.HashType.SHA256 && key.getParameters().getHashType() != HkdfPrfParameters.HashType.SHA512) {
            throw new GeneralSecurityException("HkdfPrf hash type must be SHA256 or SHA512");
        }
        return PrfImpl.wrap(HkdfStreamingPrf.create(key));
    }
    
    private static Prf createAesCmacPrf(final AesCmacPrfKey key) throws GeneralSecurityException {
        if (key.getParameters().getKeySizeBytes() != 32) {
            throw new GeneralSecurityException("AesCmacPrf key size must be 32 bytes");
        }
        return PrfAesCmac.create(key);
    }
    
    static {
        INTERNAL_CONFIGURATION = create();
    }
}
