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

package org.bouncycastle.crypto.digests;

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

public class ISAPDigest extends BufferBaseDigest
{
    private final AsconPermutationFriend.AsconPermutation p;
    
    public ISAPDigest() {
        super(ProcessingBufferType.Immediate, 8);
        this.p = AsconPermutationFriend.getAsconPermutation(Friend.INSTANCE);
        this.DigestSize = 32;
        this.algorithmName = "ISAP Hash";
        this.reset();
    }
    
    @Override
    protected void processBytes(final byte[] array, final int n) {
        final AsconPermutationFriend.AsconPermutation p2 = this.p;
        p2.x0 ^= Pack.bigEndianToLong(array, n);
        this.p.p(12);
    }
    
    @Override
    protected void finish(final byte[] array, int n) {
        final AsconPermutationFriend.AsconPermutation p2 = this.p;
        p2.x0 ^= 128L << (7 - this.m_bufPos << 3);
        while (this.m_bufPos > 0) {
            final AsconPermutationFriend.AsconPermutation p3 = this.p;
            final long x0 = p3.x0;
            final byte[] buf = this.m_buf;
            final int bufPos = this.m_bufPos - 1;
            this.m_bufPos = bufPos;
            p3.x0 = (x0 ^ ((long)buf[bufPos] & 0xFFL) << (7 - this.m_bufPos << 3));
        }
        for (int i = 0; i < 4; ++i) {
            this.p.p(12);
            Pack.longToBigEndian(this.p.x0, array, n);
            n += 8;
        }
    }
    
    @Override
    public void reset() {
        super.reset();
        this.p.set(-1255492011513352131L, -8380609354527731710L, -5437372128236807582L, 4834782570098516968L, 3787428097924915520L);
    }
    
    public static class Friend
    {
        private static final Friend INSTANCE;
        
        private Friend() {
        }
        
        static Friend getFriend(final AsconBaseDigest.Friend friend) {
            if (null == friend) {
                throw new NullPointerException("This method is only for use by AsconBaseDigest");
            }
            return Friend.INSTANCE;
        }
        
        static {
            INSTANCE = new Friend();
        }
    }
}
