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

package org.bouncycastle.crypto.agreement.kdf;

import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.Pack;
import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.DerivationParameters;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.DigestDerivationFunction;

public class GSKKFDGenerator implements DigestDerivationFunction
{
    private final Digest digest;
    private byte[] z;
    private int counter;
    private byte[] r;
    private byte[] buf;
    
    public GSKKFDGenerator(final Digest digest) {
        this.digest = digest;
        this.buf = new byte[digest.getDigestSize()];
    }
    
    @Override
    public Digest getDigest() {
        return this.digest;
    }
    
    @Override
    public void init(final DerivationParameters derivationParameters) {
        if (derivationParameters instanceof GSKKDFParameters) {
            this.z = ((GSKKDFParameters)derivationParameters).getZ();
            this.counter = ((GSKKDFParameters)derivationParameters).getStartCounter();
            this.r = ((GSKKDFParameters)derivationParameters).getNonce();
            return;
        }
        throw new IllegalArgumentException("unkown parameters type");
    }
    
    @Override
    public int generateBytes(final byte[] array, final int n, final int n2) throws DataLengthException, IllegalArgumentException {
        if (n + n2 > array.length) {
            throw new DataLengthException("output buffer too small");
        }
        this.digest.update(this.z, 0, this.z.length);
        final byte[] intToBigEndian = Pack.intToBigEndian(this.counter++);
        this.digest.update(intToBigEndian, 0, intToBigEndian.length);
        if (this.r != null) {
            this.digest.update(this.r, 0, this.r.length);
        }
        this.digest.doFinal(this.buf, 0);
        System.arraycopy(this.buf, 0, array, n, n2);
        Arrays.clear(this.buf);
        return n2;
    }
}
