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

package org.bouncycastle.pqc.crypto.sphincsplus;

class HarakaSXof extends HarakaSBase
{
    public String getAlgorithmName() {
        return "Haraka-S";
    }
    
    public HarakaSXof(final byte[] array) {
        final byte[] array2 = new byte[640];
        this.update(array, 0, array.length);
        this.doFinal(array2, 0, array2.length);
        this.haraka512_rc = new long[10][8];
        this.haraka256_rc = new int[10][8];
        for (int i = 0; i < 10; ++i) {
            this.interleaveConstant32(this.haraka256_rc[i], array2, i << 5);
            this.interleaveConstant(this.haraka512_rc[i], array2, i << 6);
        }
    }
    
    public void update(final byte[] array, final int n, final int n2) {
        int i = n;
        for (int n3 = n2 + this.off >> 5, j = 0; j < n3; ++j) {
            while (this.off < 32) {
                final byte[] buffer = this.buffer;
                final int n4 = this.off++;
                buffer[n4] ^= array[i++];
            }
            this.haraka512Perm(this.buffer);
            this.off = 0;
        }
        while (i < n + n2) {
            final byte[] buffer2 = this.buffer;
            final int n5 = this.off++;
            buffer2[n5] ^= array[i++];
        }
    }
    
    public void update(final byte b) {
        final byte[] buffer = this.buffer;
        final int n = this.off++;
        buffer[n] ^= b;
        if (this.off == 32) {
            this.haraka512Perm(this.buffer);
            this.off = 0;
        }
    }
    
    public int doFinal(final byte[] array, int n, int i) {
        final int n2 = i;
        final byte[] buffer = this.buffer;
        final int off = this.off;
        buffer[off] ^= 0x1F;
        final byte[] buffer2 = this.buffer;
        final int n3 = 31;
        buffer2[n3] ^= (byte)128;
        while (i >= 32) {
            this.haraka512Perm(this.buffer);
            System.arraycopy(this.buffer, 0, array, n, 32);
            n += 32;
            i -= 32;
        }
        if (i > 0) {
            this.haraka512Perm(this.buffer);
            System.arraycopy(this.buffer, 0, array, n, i);
        }
        this.reset();
        return n2;
    }
}
