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

package org.bouncycastle.crypto.hpke;

import org.bouncycastle.util.Strings;
import org.bouncycastle.crypto.DerivationParameters;
import org.bouncycastle.crypto.params.HKDFParameters;
import org.bouncycastle.util.Pack;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.digests.SHA384Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.generators.HKDFBytesGenerator;

class HKDF
{
    private static final byte[] VERSION_LABEL;
    private final HKDFBytesGenerator kdf;
    private final int hashLength;
    
    HKDF(final short n) {
        ExtendedDigest extendedDigest = null;
        switch (n) {
            case 1: {
                extendedDigest = new SHA256Digest();
                break;
            }
            case 2: {
                extendedDigest = new SHA384Digest();
                break;
            }
            case 3: {
                extendedDigest = new SHA512Digest();
                break;
            }
            default: {
                throw new IllegalArgumentException("invalid kdf id");
            }
        }
        this.kdf = new HKDFBytesGenerator(extendedDigest);
        this.hashLength = extendedDigest.getDigestSize();
    }
    
    int getHashSize() {
        return this.hashLength;
    }
    
    protected byte[] LabeledExtract(byte[] array, final byte[] array2, final String s, final byte[] array3) {
        if (array == null) {
            array = new byte[this.hashLength];
        }
        return this.kdf.extractPRK(array, Arrays.concatenate(HKDF.VERSION_LABEL, array2, getBytes(s), array3));
    }
    
    protected byte[] LabeledExpand(final byte[] array, final byte[] array2, final String s, final byte[] array3, final int n) {
        if (n > 65536) {
            throw new IllegalArgumentException("Expand length cannot be larger than 2^16");
        }
        this.kdf.init(HKDFParameters.skipExtractParameters(array, Arrays.concatenate(Arrays.concatenate(Pack.shortToBigEndian((short)n), HKDF.VERSION_LABEL, array2, getBytes(s)), array3)));
        final byte[] array4 = new byte[n];
        this.kdf.generateBytes(array4, 0, array4.length);
        return array4;
    }
    
    protected byte[] Extract(byte[] array, final byte[] array2) {
        if (array == null) {
            array = new byte[this.hashLength];
        }
        return this.kdf.extractPRK(array, array2);
    }
    
    protected byte[] Expand(final byte[] array, final byte[] array2, final int n) {
        if (n > 65536) {
            throw new IllegalArgumentException("Expand length cannot be larger than 2^16");
        }
        this.kdf.init(HKDFParameters.skipExtractParameters(array, array2));
        final byte[] array3 = new byte[n];
        this.kdf.generateBytes(array3, 0, array3.length);
        return array3;
    }
    
    private static byte[] getBytes(final String s) {
        return Strings.toByteArray(s);
    }
    
    static {
        VERSION_LABEL = getBytes("HPKE-v1");
    }
}
