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

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

import java.io.InputStream;
import com.google.crypto.tink.InsecureSecretKeyAccess;
import com.google.crypto.tink.internal.MutableKeyDerivationRegistry;
import com.google.crypto.tink.Key;
import com.google.crypto.tink.internal.PrimitiveRegistry;
import com.google.crypto.tink.AccessesPartialKey;
import java.security.GeneralSecurityException;
import com.google.crypto.tink.internal.MutablePrimitiveRegistry;
import com.google.crypto.tink.keyderivation.PrfBasedKeyDerivationKey;
import com.google.crypto.tink.subtle.prf.StreamingPrf;
import com.google.errorprone.annotations.Immutable;

@Immutable
public final class PrfBasedKeyDeriver implements KeyDeriver
{
    final StreamingPrf prf;
    final PrfBasedKeyDerivationKey key;
    
    private PrfBasedKeyDeriver(final StreamingPrf prf, final PrfBasedKeyDerivationKey key) {
        this.prf = prf;
        this.key = key;
    }
    
    @AccessesPartialKey
    public static KeyDeriver create(final PrfBasedKeyDerivationKey key) throws GeneralSecurityException {
        final StreamingPrf prf = MutablePrimitiveRegistry.globalInstance().getPrimitive(key.getPrfKey(), StreamingPrf.class);
        final PrfBasedKeyDeriver deriver = new PrfBasedKeyDeriver(prf, key);
        final Object unused = deriver.deriveKey(new byte[] { 1 });
        return deriver;
    }
    
    @AccessesPartialKey
    public static KeyDeriver createWithPrfPrimitiveRegistry(final PrimitiveRegistry primitiveRegistry, final PrfBasedKeyDerivationKey key) throws GeneralSecurityException {
        final StreamingPrf prf = primitiveRegistry.getPrimitive(key.getPrfKey(), StreamingPrf.class);
        final PrfBasedKeyDeriver deriver = new PrfBasedKeyDeriver(prf, key);
        final Object unused = deriver.deriveKey(new byte[] { 1 });
        return deriver;
    }
    
    @AccessesPartialKey
    @Override
    public Key deriveKey(final byte[] salt) throws GeneralSecurityException {
        final InputStream inputStream = this.prf.computePrf(salt);
        return MutableKeyDerivationRegistry.globalInstance().createKeyFromRandomness(this.key.getParameters().getDerivedKeyParameters(), inputStream, this.key.getIdRequirementOrNull(), InsecureSecretKeyAccess.get());
    }
}
