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

package org.bouncycastle.crypto.engines;

abstract class AsconBaseEngine extends AEADBaseEngine
{
    protected int nr;
    protected long K0;
    protected long K1;
    protected long N0;
    protected long N1;
    protected long ASCON_IV;
    AsconPermutationFriend.AsconPermutation p;
    protected long dsep;
    
    AsconBaseEngine() {
        this.p = new AsconPermutationFriend.AsconPermutation();
    }
    
    protected abstract long pad(final int p0);
    
    protected abstract long loadBytes(final byte[] p0, final int p1);
    
    protected abstract void setBytes(final long p0, final byte[] p1, final int p2);
    
    protected abstract void ascon_aeadinit();
    
    @Override
    protected void finishAAD(final State state, final boolean b) {
        switch (this.m_state.ord) {
            case 2:
            case 6: {
                this.processFinalAAD();
                this.p.p(this.nr);
                break;
            }
        }
        final AsconPermutationFriend.AsconPermutation p2 = this.p;
        p2.x4 ^= this.dsep;
        this.m_aadPos = 0;
        this.m_state = state;
    }
    
    protected abstract void processFinalDecrypt(final byte[] p0, final int p1, final byte[] p2, final int p3);
    
    protected abstract void processFinalEncrypt(final byte[] p0, final int p1, final byte[] p2, final int p3);
    
    @Override
    protected void processBufferAAD(final byte[] array, final int n) {
        final AsconPermutationFriend.AsconPermutation p2 = this.p;
        p2.x0 ^= this.loadBytes(array, n);
        if (this.BlockSize == 16) {
            final AsconPermutationFriend.AsconPermutation p3 = this.p;
            p3.x1 ^= this.loadBytes(array, 8 + n);
        }
        this.p.p(this.nr);
    }
    
    @Override
    protected void processFinalBlock(final byte[] array, final int n) {
        if (this.forEncryption) {
            this.processFinalEncrypt(this.m_buf, this.m_bufPos, array, n);
        }
        else {
            this.processFinalDecrypt(this.m_buf, this.m_bufPos, array, n);
        }
        this.setBytes(this.p.x3, this.mac, 0);
        this.setBytes(this.p.x4, this.mac, 8);
    }
    
    @Override
    protected void processBufferDecrypt(final byte[] array, final int n, final byte[] array2, final int n2) {
        final long loadBytes = this.loadBytes(array, n);
        this.setBytes(this.p.x0 ^ loadBytes, array2, n2);
        this.p.x0 = loadBytes;
        if (this.BlockSize == 16) {
            final long loadBytes2 = this.loadBytes(array, n + 8);
            this.setBytes(this.p.x1 ^ loadBytes2, array2, n2 + 8);
            this.p.x1 = loadBytes2;
        }
        this.p.p(this.nr);
    }
    
    @Override
    protected void processBufferEncrypt(final byte[] array, final int n, final byte[] array2, final int n2) {
        final AsconPermutationFriend.AsconPermutation p4 = this.p;
        p4.x0 ^= this.loadBytes(array, n);
        this.setBytes(this.p.x0, array2, n2);
        if (this.BlockSize == 16) {
            final AsconPermutationFriend.AsconPermutation p5 = this.p;
            p5.x1 ^= this.loadBytes(array, n + 8);
            this.setBytes(this.p.x1, array2, n2 + 8);
        }
        this.p.p(this.nr);
    }
    
    @Override
    protected void reset(final boolean b) {
        super.reset(b);
        this.ascon_aeadinit();
    }
    
    public abstract String getAlgorithmVersion();
}
