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

package org.bouncycastle.crypto.digests;

import org.bouncycastle.crypto.engines.AsconPermutationFriend;
import org.bouncycastle.util.Pack;
import org.bouncycastle.crypto.DataLengthException;

public class AsconCXof128 extends AsconXofBase
{
    private final long z0;
    private final long z1;
    private final long z2;
    private final long z3;
    private final long z4;
    
    public AsconCXof128() {
        this(new byte[0], 0, 0);
    }
    
    public AsconCXof128(final byte[] array) {
        this(array, 0, array.length);
    }
    
    public AsconCXof128(final byte[] array, final int n, final int n2) {
        this.algorithmName = "Ascon-CXOF128";
        this.ensureSufficientInputBuffer(array, n, n2);
        if (n2 > 256) {
            throw new DataLengthException("customized string is too long");
        }
        this.initState(array, n, n2);
        this.z0 = this.p.x0;
        this.z1 = this.p.x1;
        this.z2 = this.p.x2;
        this.z3 = this.p.x3;
        this.z4 = this.p.x4;
    }
    
    @Override
    protected long pad(final int n) {
        return 1L << (n << 3);
    }
    
    @Override
    protected long loadBytes(final byte[] array, final int n) {
        return Pack.littleEndianToLong(array, n);
    }
    
    @Override
    protected long loadBytes(final byte[] array, final int n, final int n2) {
        return Pack.littleEndianToLong(array, n, n2);
    }
    
    @Override
    protected void setBytes(final long n, final byte[] array, final int n2) {
        Pack.longToLittleEndian(n, array, n2);
    }
    
    @Override
    protected void setBytes(final long n, final byte[] array, final int n2, final int n3) {
        Pack.longToLittleEndian(n, array, n2, n3);
    }
    
    @Override
    public void reset() {
        super.reset();
        this.p.set(this.z0, this.z1, this.z2, this.z3, this.z4);
    }
    
    private void initState(final byte[] array, final int n, final int n2) {
        if (n2 == 0) {
            this.p.set(5768210384618244584L, 6623958265790276749L, 4252419465292010770L, 1238191464582506891L, 56353695744608240L);
        }
        else {
            this.p.set(7445901275803737603L, 4886737088792722364L, -1616759365661982283L, 3076320316797452470L, -8124743304765850554L);
            final AsconPermutationFriend.AsconPermutation p3 = this.p;
            p3.x0 ^= (long)n2 << 3;
            this.p.p(12);
            this.update();
            this.padAndAbsorb();
        }
        super.reset();
    }
}
