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

package org.bouncycastle.crypto.engines;

import org.bouncycastle.crypto.OutputLengthException;
import org.bouncycastle.crypto.DataLengthException;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoServiceProperties;
import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.constraints.DefaultServiceProperties;
import org.bouncycastle.util.Pack;
import org.bouncycastle.crypto.BlockCipher;

public class AESLightEngine implements BlockCipher
{
    private static final byte[] S;
    private static final byte[] Si;
    private static final int[] rcon;
    private static final int m1 = -2139062144;
    private static final int m2 = 2139062143;
    private static final int m3 = 27;
    private static final int m4 = -1061109568;
    private static final int m5 = 1061109567;
    private int ROUNDS;
    private int[][] WorkingKey;
    private boolean forEncryption;
    private static final int BLOCK_SIZE = 16;
    
    private static int shift(final int n, final int n2) {
        return n >>> n2 | n << -n2;
    }
    
    private static int FFmulX(final int n) {
        return (n & 0x7F7F7F7F) << 1 ^ ((n & 0x80808080) >>> 7) * 27;
    }
    
    private static int FFmulX2(final int n) {
        final int n2 = (n & 0x3F3F3F3F) << 2;
        final int n3 = n & 0xC0C0C0C0;
        final int n4 = n3 ^ n3 >>> 1;
        return n2 ^ n4 >>> 2 ^ n4 >>> 5;
    }
    
    private static int mcol(final int n) {
        final int shift = shift(n, 8);
        final int n2 = n ^ shift;
        return shift(n2, 16) ^ shift ^ FFmulX(n2);
    }
    
    private static int inv_mcol(final int n) {
        final int n2 = n ^ shift(n, 8);
        final int n3 = n ^ FFmulX(n2);
        final int n4 = n2 ^ FFmulX2(n3);
        return n3 ^ (n4 ^ shift(n4, 16));
    }
    
    private static int subWord(final int n) {
        return (AESLightEngine.S[n & 0xFF] & 0xFF) | (AESLightEngine.S[n >> 8 & 0xFF] & 0xFF) << 8 | (AESLightEngine.S[n >> 16 & 0xFF] & 0xFF) << 16 | AESLightEngine.S[n >> 24 & 0xFF] << 24;
    }
    
    private int[][] generateWorkingKey(final byte[] array, final boolean b) {
        final int length = array.length;
        if (length < 16 || length > 32 || (length & 0x7) != 0x0) {
            throw new IllegalArgumentException("Key length not 128/192/256 bits.");
        }
        final int n = length >>> 2;
        this.ROUNDS = n + 6;
        final int[][] array2 = new int[this.ROUNDS + 1][4];
        switch (n) {
            case 4: {
                int littleEndianToInt = Pack.littleEndianToInt(array, 0);
                array2[0][0] = littleEndianToInt;
                int littleEndianToInt2 = Pack.littleEndianToInt(array, 4);
                array2[0][1] = littleEndianToInt2;
                int littleEndianToInt3 = Pack.littleEndianToInt(array, 8);
                array2[0][2] = littleEndianToInt3;
                int littleEndianToInt4 = Pack.littleEndianToInt(array, 12);
                array2[0][3] = littleEndianToInt4;
                for (int i = 1; i <= 10; ++i) {
                    littleEndianToInt ^= (subWord(shift(littleEndianToInt4, 8)) ^ AESLightEngine.rcon[i - 1]);
                    array2[i][0] = littleEndianToInt;
                    littleEndianToInt2 ^= littleEndianToInt;
                    array2[i][1] = littleEndianToInt2;
                    littleEndianToInt3 ^= littleEndianToInt2;
                    array2[i][2] = littleEndianToInt3;
                    littleEndianToInt4 ^= littleEndianToInt3;
                    array2[i][3] = littleEndianToInt4;
                }
                break;
            }
            case 6: {
                int littleEndianToInt5 = Pack.littleEndianToInt(array, 0);
                array2[0][0] = littleEndianToInt5;
                int littleEndianToInt6 = Pack.littleEndianToInt(array, 4);
                array2[0][1] = littleEndianToInt6;
                int littleEndianToInt7 = Pack.littleEndianToInt(array, 8);
                array2[0][2] = littleEndianToInt7;
                int littleEndianToInt8 = Pack.littleEndianToInt(array, 12);
                array2[0][3] = littleEndianToInt8;
                int littleEndianToInt9 = Pack.littleEndianToInt(array, 16);
                int littleEndianToInt10 = Pack.littleEndianToInt(array, 20);
                int n2 = 1;
                int n3 = 1;
                while (true) {
                    array2[n2][0] = littleEndianToInt9;
                    array2[n2][1] = littleEndianToInt10;
                    final int n4 = subWord(shift(littleEndianToInt10, 8)) ^ n3;
                    final int n5 = n3 << 1;
                    final int n6 = littleEndianToInt5 ^ n4;
                    array2[n2][2] = n6;
                    final int n7 = littleEndianToInt6 ^ n6;
                    array2[n2][3] = n7;
                    final int n8 = littleEndianToInt7 ^ n7;
                    array2[n2 + 1][0] = n8;
                    final int n9 = littleEndianToInt8 ^ n8;
                    array2[n2 + 1][1] = n9;
                    final int n10 = littleEndianToInt9 ^ n9;
                    array2[n2 + 1][2] = n10;
                    final int n11 = littleEndianToInt10 ^ n10;
                    array2[n2 + 1][3] = n11;
                    final int n12 = subWord(shift(n11, 8)) ^ n5;
                    n3 = n5 << 1;
                    littleEndianToInt5 = (n6 ^ n12);
                    array2[n2 + 2][0] = littleEndianToInt5;
                    littleEndianToInt6 = (n7 ^ littleEndianToInt5);
                    array2[n2 + 2][1] = littleEndianToInt6;
                    littleEndianToInt7 = (n8 ^ littleEndianToInt6);
                    array2[n2 + 2][2] = littleEndianToInt7;
                    littleEndianToInt8 = (n9 ^ littleEndianToInt7);
                    array2[n2 + 2][3] = littleEndianToInt8;
                    n2 += 3;
                    if (n2 >= 13) {
                        break;
                    }
                    littleEndianToInt9 = (n10 ^ littleEndianToInt8);
                    littleEndianToInt10 = (n11 ^ littleEndianToInt9);
                }
                break;
            }
            case 8: {
                int littleEndianToInt11 = Pack.littleEndianToInt(array, 0);
                array2[0][0] = littleEndianToInt11;
                int littleEndianToInt12 = Pack.littleEndianToInt(array, 4);
                array2[0][1] = littleEndianToInt12;
                int littleEndianToInt13 = Pack.littleEndianToInt(array, 8);
                array2[0][2] = littleEndianToInt13;
                int littleEndianToInt14 = Pack.littleEndianToInt(array, 12);
                array2[0][3] = littleEndianToInt14;
                int littleEndianToInt15 = Pack.littleEndianToInt(array, 16);
                array2[1][0] = littleEndianToInt15;
                int littleEndianToInt16 = Pack.littleEndianToInt(array, 20);
                array2[1][1] = littleEndianToInt16;
                int littleEndianToInt17 = Pack.littleEndianToInt(array, 24);
                array2[1][2] = littleEndianToInt17;
                int littleEndianToInt18 = Pack.littleEndianToInt(array, 28);
                array2[1][3] = littleEndianToInt18;
                int n13 = 2;
                int n14 = 1;
                while (true) {
                    final int n15 = subWord(shift(littleEndianToInt18, 8)) ^ n14;
                    n14 <<= 1;
                    littleEndianToInt11 ^= n15;
                    array2[n13][0] = littleEndianToInt11;
                    littleEndianToInt12 ^= littleEndianToInt11;
                    array2[n13][1] = littleEndianToInt12;
                    littleEndianToInt13 ^= littleEndianToInt12;
                    array2[n13][2] = littleEndianToInt13;
                    littleEndianToInt14 ^= littleEndianToInt13;
                    array2[n13][3] = littleEndianToInt14;
                    if (++n13 >= 15) {
                        break;
                    }
                    littleEndianToInt15 ^= subWord(littleEndianToInt14);
                    array2[n13][0] = littleEndianToInt15;
                    littleEndianToInt16 ^= littleEndianToInt15;
                    array2[n13][1] = littleEndianToInt16;
                    littleEndianToInt17 ^= littleEndianToInt16;
                    array2[n13][2] = littleEndianToInt17;
                    littleEndianToInt18 ^= littleEndianToInt17;
                    array2[n13][3] = littleEndianToInt18;
                    ++n13;
                }
                break;
            }
            default: {
                throw new IllegalStateException("Should never get here");
            }
        }
        if (!b) {
            for (int j = 1; j < this.ROUNDS; ++j) {
                for (int k = 0; k < 4; ++k) {
                    array2[j][k] = inv_mcol(array2[j][k]);
                }
            }
        }
        return array2;
    }
    
    public AESLightEngine() {
        this.WorkingKey = null;
        CryptoServicesRegistrar.checkConstraints(new DefaultServiceProperties(this.getAlgorithmName(), this.bitsOfSecurity()));
    }
    
    @Override
    public void init(final boolean forEncryption, final CipherParameters cipherParameters) {
        if (cipherParameters instanceof KeyParameter) {
            this.WorkingKey = this.generateWorkingKey(((KeyParameter)cipherParameters).getKey(), forEncryption);
            this.forEncryption = forEncryption;
            CryptoServicesRegistrar.checkConstraints(new DefaultServiceProperties(this.getAlgorithmName(), this.bitsOfSecurity(), cipherParameters, Utils.getPurpose(forEncryption)));
            return;
        }
        throw new IllegalArgumentException("invalid parameter passed to AES init - " + cipherParameters.getClass().getName());
    }
    
    @Override
    public String getAlgorithmName() {
        return "AES";
    }
    
    @Override
    public int getBlockSize() {
        return 16;
    }
    
    @Override
    public int processBlock(final byte[] array, final int n, final byte[] array2, final int n2) {
        if (this.WorkingKey == null) {
            throw new IllegalStateException("AES engine not initialised");
        }
        if (n > array.length - 16) {
            throw new DataLengthException("input buffer too short");
        }
        if (n2 > array2.length - 16) {
            throw new OutputLengthException("output buffer too short");
        }
        if (this.forEncryption) {
            this.encryptBlock(array, n, array2, n2, this.WorkingKey);
        }
        else {
            this.decryptBlock(array, n, array2, n2, this.WorkingKey);
        }
        return 16;
    }
    
    @Override
    public void reset() {
    }
    
    private void encryptBlock(final byte[] array, final int n, final byte[] array2, final int n2, final int[][] array3) {
        final int littleEndianToInt = Pack.littleEndianToInt(array, n + 0);
        final int littleEndianToInt2 = Pack.littleEndianToInt(array, n + 4);
        final int littleEndianToInt3 = Pack.littleEndianToInt(array, n + 8);
        final int littleEndianToInt4 = Pack.littleEndianToInt(array, n + 12);
        int n3;
        int n4;
        int n5;
        int i;
        int n6;
        int n7;
        int n8;
        int n9;
        int n10;
        for (n3 = (littleEndianToInt ^ array3[0][0]), n4 = (littleEndianToInt2 ^ array3[0][1]), n5 = (littleEndianToInt3 ^ array3[0][2]), i = 1, n6 = (littleEndianToInt4 ^ array3[0][3]); i < this.ROUNDS - 1; n10 = (mcol((AESLightEngine.S[n6 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n3 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n4 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n5 >> 24 & 0xFF] << 24) ^ array3[i++][3]), n3 = (mcol((AESLightEngine.S[n7 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n8 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n9 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n10 >> 24 & 0xFF] << 24) ^ array3[i][0]), n4 = (mcol((AESLightEngine.S[n8 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n9 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n10 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n7 >> 24 & 0xFF] << 24) ^ array3[i][1]), n5 = (mcol((AESLightEngine.S[n9 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n10 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n7 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n8 >> 24 & 0xFF] << 24) ^ array3[i][2]), n6 = (mcol((AESLightEngine.S[n10 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n7 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n8 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n9 >> 24 & 0xFF] << 24) ^ array3[i++][3])) {
            n7 = (mcol((AESLightEngine.S[n3 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n4 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n5 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n6 >> 24 & 0xFF] << 24) ^ array3[i][0]);
            n8 = (mcol((AESLightEngine.S[n4 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n5 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n6 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n3 >> 24 & 0xFF] << 24) ^ array3[i][1]);
            n9 = (mcol((AESLightEngine.S[n5 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n6 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n3 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n4 >> 24 & 0xFF] << 24) ^ array3[i][2]);
        }
        final int n11 = mcol((AESLightEngine.S[n3 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n4 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n5 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n6 >> 24 & 0xFF] << 24) ^ array3[i][0];
        final int n12 = mcol((AESLightEngine.S[n4 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n5 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n6 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n3 >> 24 & 0xFF] << 24) ^ array3[i][1];
        final int n13 = mcol((AESLightEngine.S[n5 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n6 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n3 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n4 >> 24 & 0xFF] << 24) ^ array3[i][2];
        final int n14 = mcol((AESLightEngine.S[n6 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n3 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n4 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n5 >> 24 & 0xFF] << 24) ^ array3[i++][3];
        final int n15 = (AESLightEngine.S[n11 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n12 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n13 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n14 >> 24 & 0xFF] << 24 ^ array3[i][0];
        final int n16 = (AESLightEngine.S[n12 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n13 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n14 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n11 >> 24 & 0xFF] << 24 ^ array3[i][1];
        final int n17 = (AESLightEngine.S[n13 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n14 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n11 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n12 >> 24 & 0xFF] << 24 ^ array3[i][2];
        final int n18 = (AESLightEngine.S[n14 & 0xFF] & 0xFF) ^ (AESLightEngine.S[n11 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.S[n12 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.S[n13 >> 24 & 0xFF] << 24 ^ array3[i][3];
        Pack.intToLittleEndian(n15, array2, n2 + 0);
        Pack.intToLittleEndian(n16, array2, n2 + 4);
        Pack.intToLittleEndian(n17, array2, n2 + 8);
        Pack.intToLittleEndian(n18, array2, n2 + 12);
    }
    
    private void decryptBlock(final byte[] array, final int n, final byte[] array2, final int n2, final int[][] array3) {
        final int littleEndianToInt = Pack.littleEndianToInt(array, n + 0);
        final int littleEndianToInt2 = Pack.littleEndianToInt(array, n + 4);
        final int littleEndianToInt3 = Pack.littleEndianToInt(array, n + 8);
        final int littleEndianToInt4 = Pack.littleEndianToInt(array, n + 12);
        int n3;
        int n4;
        int n5;
        int i;
        int n6;
        int n7;
        int n8;
        int n9;
        int n10;
        for (n3 = (littleEndianToInt ^ array3[this.ROUNDS][0]), n4 = (littleEndianToInt2 ^ array3[this.ROUNDS][1]), n5 = (littleEndianToInt3 ^ array3[this.ROUNDS][2]), i = this.ROUNDS - 1, n6 = (littleEndianToInt4 ^ array3[this.ROUNDS][3]); i > 1; n10 = (inv_mcol((AESLightEngine.Si[n6 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n5 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n4 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n3 >> 24 & 0xFF] << 24) ^ array3[i--][3]), n3 = (inv_mcol((AESLightEngine.Si[n7 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n10 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n9 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n8 >> 24 & 0xFF] << 24) ^ array3[i][0]), n4 = (inv_mcol((AESLightEngine.Si[n8 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n7 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n10 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n9 >> 24 & 0xFF] << 24) ^ array3[i][1]), n5 = (inv_mcol((AESLightEngine.Si[n9 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n8 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n7 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n10 >> 24 & 0xFF] << 24) ^ array3[i][2]), n6 = (inv_mcol((AESLightEngine.Si[n10 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n9 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n8 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n7 >> 24 & 0xFF] << 24) ^ array3[i--][3])) {
            n7 = (inv_mcol((AESLightEngine.Si[n3 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n6 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n5 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n4 >> 24 & 0xFF] << 24) ^ array3[i][0]);
            n8 = (inv_mcol((AESLightEngine.Si[n4 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n3 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n6 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n5 >> 24 & 0xFF] << 24) ^ array3[i][1]);
            n9 = (inv_mcol((AESLightEngine.Si[n5 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n4 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n3 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n6 >> 24 & 0xFF] << 24) ^ array3[i][2]);
        }
        final int n11 = inv_mcol((AESLightEngine.Si[n3 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n6 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n5 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n4 >> 24 & 0xFF] << 24) ^ array3[i][0];
        final int n12 = inv_mcol((AESLightEngine.Si[n4 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n3 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n6 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n5 >> 24 & 0xFF] << 24) ^ array3[i][1];
        final int n13 = inv_mcol((AESLightEngine.Si[n5 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n4 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n3 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n6 >> 24 & 0xFF] << 24) ^ array3[i][2];
        final int n14 = inv_mcol((AESLightEngine.Si[n6 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n5 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n4 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n3 >> 24 & 0xFF] << 24) ^ array3[i][3];
        final int n15 = (AESLightEngine.Si[n11 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n14 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n13 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n12 >> 24 & 0xFF] << 24 ^ array3[0][0];
        final int n16 = (AESLightEngine.Si[n12 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n11 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n14 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n13 >> 24 & 0xFF] << 24 ^ array3[0][1];
        final int n17 = (AESLightEngine.Si[n13 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n12 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n11 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n14 >> 24 & 0xFF] << 24 ^ array3[0][2];
        final int n18 = (AESLightEngine.Si[n14 & 0xFF] & 0xFF) ^ (AESLightEngine.Si[n13 >> 8 & 0xFF] & 0xFF) << 8 ^ (AESLightEngine.Si[n12 >> 16 & 0xFF] & 0xFF) << 16 ^ AESLightEngine.Si[n11 >> 24 & 0xFF] << 24 ^ array3[0][3];
        Pack.intToLittleEndian(n15, array2, n2 + 0);
        Pack.intToLittleEndian(n16, array2, n2 + 4);
        Pack.intToLittleEndian(n17, array2, n2 + 8);
        Pack.intToLittleEndian(n18, array2, n2 + 12);
    }
    
    private int bitsOfSecurity() {
        if (this.WorkingKey == null) {
            return 256;
        }
        return this.WorkingKey.length - 7 << 5;
    }
    
    static {
        S = new byte[] { 99, 124, 119, 123, -14, 107, 111, -59, 48, 1, 103, 43, -2, -41, -85, 118, -54, -126, -55, 125, -6, 89, 71, -16, -83, -44, -94, -81, -100, -92, 114, -64, -73, -3, -109, 38, 54, 63, -9, -52, 52, -91, -27, -15, 113, -40, 49, 21, 4, -57, 35, -61, 24, -106, 5, -102, 7, 18, -128, -30, -21, 39, -78, 117, 9, -125, 44, 26, 27, 110, 90, -96, 82, 59, -42, -77, 41, -29, 47, -124, 83, -47, 0, -19, 32, -4, -79, 91, 106, -53, -66, 57, 74, 76, 88, -49, -48, -17, -86, -5, 67, 77, 51, -123, 69, -7, 2, 127, 80, 60, -97, -88, 81, -93, 64, -113, -110, -99, 56, -11, -68, -74, -38, 33, 16, -1, -13, -46, -51, 12, 19, -20, 95, -105, 68, 23, -60, -89, 126, 61, 100, 93, 25, 115, 96, -127, 79, -36, 34, 42, -112, -120, 70, -18, -72, 20, -34, 94, 11, -37, -32, 50, 58, 10, 73, 6, 36, 92, -62, -45, -84, 98, -111, -107, -28, 121, -25, -56, 55, 109, -115, -43, 78, -87, 108, 86, -12, -22, 101, 122, -82, 8, -70, 120, 37, 46, 28, -90, -76, -58, -24, -35, 116, 31, 75, -67, -117, -118, 112, 62, -75, 102, 72, 3, -10, 14, 97, 53, 87, -71, -122, -63, 29, -98, -31, -8, -104, 17, 105, -39, -114, -108, -101, 30, -121, -23, -50, 85, 40, -33, -116, -95, -119, 13, -65, -26, 66, 104, 65, -103, 45, 15, -80, 84, -69, 22 };
        Si = new byte[] { 82, 9, 106, -43, 48, 54, -91, 56, -65, 64, -93, -98, -127, -13, -41, -5, 124, -29, 57, -126, -101, 47, -1, -121, 52, -114, 67, 68, -60, -34, -23, -53, 84, 123, -108, 50, -90, -62, 35, 61, -18, 76, -107, 11, 66, -6, -61, 78, 8, 46, -95, 102, 40, -39, 36, -78, 118, 91, -94, 73, 109, -117, -47, 37, 114, -8, -10, 100, -122, 104, -104, 22, -44, -92, 92, -52, 93, 101, -74, -110, 108, 112, 72, 80, -3, -19, -71, -38, 94, 21, 70, 87, -89, -115, -99, -124, -112, -40, -85, 0, -116, -68, -45, 10, -9, -28, 88, 5, -72, -77, 69, 6, -48, 44, 30, -113, -54, 63, 15, 2, -63, -81, -67, 3, 1, 19, -118, 107, 58, -111, 17, 65, 79, 103, -36, -22, -105, -14, -49, -50, -16, -76, -26, 115, -106, -84, 116, 34, -25, -83, 53, -123, -30, -7, 55, -24, 28, 117, -33, 110, 71, -15, 26, 113, 29, 41, -59, -119, 111, -73, 98, 14, -86, 24, -66, 27, -4, 86, 62, 75, -58, -46, 121, 32, -102, -37, -64, -2, 120, -51, 90, -12, 31, -35, -88, 51, -120, 7, -57, 49, -79, 18, 16, 89, 39, -128, -20, 95, 96, 81, 127, -87, 25, -75, 74, 13, 45, -27, 122, -97, -109, -55, -100, -17, -96, -32, 59, 77, -82, 42, -11, -80, -56, -21, -69, 60, -125, 83, -103, 97, 23, 43, 4, 126, -70, 119, -42, 38, -31, 105, 20, 99, 85, 33, 12, 125 };
        rcon = new int[] { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, 145 };
    }
}
