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

package org.bouncycastle.pqc.crypto.sphincsplus;

import org.bouncycastle.util.Arrays;

class HarakaSBase
{
    protected long[][] haraka512_rc;
    protected int[][] haraka256_rc;
    protected final byte[] buffer;
    protected int off;
    
    protected HarakaSBase() {
        this.haraka512_rc = new long[][] { { 2652350495371256459L, -4767360454786055294L, -2778808723033108313L, -6138960262205972599L, 4944264682582508575L, 5312892415214084856L, 390034814247088728L, 2584105839607850161L }, { -2829930801980875922L, 9137660425067592590L, 7974068014816832049L, -4665944065725157058L, 2602240152241800734L, -1525694355931290902L, 8634660511727056099L, 1757945485816280992L }, { 1181946526362588450L, -2765192619992380293L, 3395396416743122529L, -5116273100549372423L, -1285454309797503998L, -3363297609815171261L, -8360835858392998991L, -2371352336613968487L }, { -2500853454776756032L, 8465221333286591414L, 8817016078209461823L, 9067727467981428858L, 4244107674518258433L, -4347326460570889538L, 1711371409274742987L, 6486926172609168623L }, { 1689001080716996467L, -491496126278250673L, 1273395568185090836L, 5805238412293617850L, -3441289770925384855L, 4592753210857527691L, 7062886034259989751L, -7974393977033172556L }, { -797818098819718290L, -41460260651793472L, 476036171179798187L, 7391697506481003962L, -855662275170689475L, -3489340839585811635L, -4891525734487956488L, 9110006695579921767L }, { -886938081943560790L, 4212830408327159617L, -3546674487567282635L, -1955379422127038289L, 3174578079917510314L, 5156046680874954380L, -318545805834821831L, -6176414008149462342L }, { 2529785914229181047L, 2966313764524854080L, 6363694428402697361L, 8292109690175819701L, -8497546332135459587L, -3211108476154815616L, -5526938793786642321L, -4975969843627057770L }, { 3357847021085574721L, -4764837212565187058L, -626391829400648692L, 2124133995575340009L, 7425858999829294301L, -3432032868905637771L, 1119301198758921294L, 1907812968586478892L }, { -8986524826712832802L, 3356175496741300052L, -5764600317639896362L, 4002747967109689317L, -8718925159733497197L, -1938063772587374661L, -8003749789895945835L, 7302960353763723932L } };
        this.haraka256_rc = new int[10][8];
        this.buffer = new byte[64];
        this.off = 0;
    }
    
    protected void reset() {
        this.off = 0;
        Arrays.clear(this.buffer);
    }
    
    private void brRangeDec32Le(final byte[] array, final int[] array2, final int n) {
        for (int i = 0; i < array2.length; ++i) {
            final int n2 = n + (i << 2);
            array2[i] = ((array[n2] & 0xFF) | (array[n2 + 1] << 8 & 0xFF00) | (array[n2 + 2] << 16 & 0xFF0000) | array[n2 + 3] << 24);
        }
    }
    
    protected void interleaveConstant(final long[] array, final byte[] array2, final int n) {
        final int[] array3 = new int[16];
        this.brRangeDec32Le(array2, array3, n);
        for (int i = 0; i < 4; ++i) {
            this.brAesCt64InterleaveIn(array, i, array3, i << 2);
        }
        this.brAesCt64Ortho(array);
    }
    
    protected void interleaveConstant32(final int[] array, final byte[] array2, final int n) {
        for (int i = 0; i < 4; ++i) {
            array[i << 1] = this.brDec32Le(array2, n + (i << 2));
            array[(i << 1) + 1] = this.brDec32Le(array2, n + (i << 2) + 16);
        }
        this.brAesCtOrtho(array);
    }
    
    private int brDec32Le(final byte[] array, final int n) {
        return (array[n] & 0xFF) | (array[n + 1] << 8 & 0xFF00) | (array[n + 2] << 16 & 0xFF0000) | array[n + 3] << 24;
    }
    
    protected void haraka512Perm(final byte[] array) {
        final int[] array2 = new int[16];
        final long[] array3 = new long[8];
        this.brRangeDec32Le(this.buffer, array2, 0);
        for (int i = 0; i < 4; ++i) {
            this.brAesCt64InterleaveIn(array3, i, array2, i << 2);
        }
        this.brAesCt64Ortho(array3);
        for (int j = 0; j < 5; ++j) {
            for (int k = 0; k < 2; ++k) {
                this.brAesCt64BitsliceSbox(array3);
                this.shiftRows(array3);
                this.mixColumns(array3);
                this.addRoundKey(array3, this.haraka512_rc[(j << 1) + k]);
            }
            for (int l = 0; l < 8; ++l) {
                final long n = array3[l];
                array3[l] = ((n & 0x1000100010001L) << 5 | (n & 0x2000200020002L) << 12 | (n & 0x4000400040004L) >>> 1 | (n & 0x8000800080008L) << 6 | (n & 0x20002000200020L) << 9 | (n & 0x40004000400040L) >>> 4 | (n & 0x80008000800080L) << 3 | (n & 0x2100210021002100L) >>> 5 | (n & 0x210021002100210L) << 2 | (n & 0x800080008000800L) << 4 | (n & 0x1000100010001000L) >>> 12 | (n & 0x4000400040004000L) >>> 10 | (n & 0x8400840084008400L) >>> 3);
            }
        }
        this.brAesCt64Ortho(array3);
        for (int n2 = 0; n2 < 4; ++n2) {
            this.brAesCt64InterleaveOut(array2, array3, n2);
        }
        for (int n3 = 0; n3 < 16; ++n3) {
            for (int n4 = 0; n4 < 4; ++n4) {
                array[(n3 << 2) + n4] = (byte)(array2[n3] >>> (n4 << 3) & 0xFF);
            }
        }
    }
    
    protected void haraka256Perm(final byte[] array) {
        final int[] array2 = new int[8];
        this.interleaveConstant32(array2, this.buffer, 0);
        for (int i = 0; i < 5; ++i) {
            for (int j = 0; j < 2; ++j) {
                brAesCtBitsliceSbox(array2);
                this.shiftRows32(array2);
                this.mixColumns32(array2);
                this.addRoundKey32(array2, this.haraka256_rc[(i << 1) + j]);
            }
            for (int k = 0; k < 8; ++k) {
                final int n = array2[k];
                array2[k] = ((n & 0x81818181) | (n & 0x2020202) << 1 | (n & 0x4040404) << 2 | (n & 0x8080808) << 3 | (n & 0x10101010) >>> 3 | (n & 0x20202020) >>> 2 | (n & 0x40404040) >>> 1);
            }
        }
        this.brAesCtOrtho(array2);
        for (int l = 0; l < 4; ++l) {
            this.brEnc32Le(array, array2[l << 1], l << 2);
            this.brEnc32Le(array, array2[(l << 1) + 1], (l << 2) + 16);
        }
    }
    
    private void brEnc32Le(final byte[] array, final int n, final int n2) {
        for (int i = 0; i < 4; ++i) {
            array[n2 + i] = (byte)(n >> (i << 3));
        }
    }
    
    private void brAesCt64InterleaveIn(final long[] array, final int n, final int[] array2, final int n2) {
        final long n3 = (long)array2[n2] & 0xFFFFFFFFL;
        final long n4 = (long)array2[n2 + 1] & 0xFFFFFFFFL;
        final long n5 = (long)array2[n2 + 2] & 0xFFFFFFFFL;
        final long n6 = (long)array2[n2 + 3] & 0xFFFFFFFFL;
        final long n7 = n3 | n3 << 16;
        final long n8 = n4 | n4 << 16;
        final long n9 = n5 | n5 << 16;
        final long n10 = n6 | n6 << 16;
        final long n11 = n7 & 0xFFFF0000FFFFL;
        final long n12 = n8 & 0xFFFF0000FFFFL;
        final long n13 = n9 & 0xFFFF0000FFFFL;
        final long n14 = n10 & 0xFFFF0000FFFFL;
        final long n15 = n11 | n11 << 8;
        final long n16 = n12 | n12 << 8;
        final long n17 = n13 | n13 << 8;
        final long n18 = n14 | n14 << 8;
        final long n19 = n15 & 0xFF00FF00FF00FFL;
        final long n20 = n16 & 0xFF00FF00FF00FFL;
        final long n21 = n17 & 0xFF00FF00FF00FFL;
        final long n22 = n18 & 0xFF00FF00FF00FFL;
        array[n] = (n19 | n21 << 8);
        array[n + 4] = (n20 | n22 << 8);
    }
    
    private static void brAesCtBitsliceSbox(final int[] array) {
        final int n = array[7];
        final int n2 = array[6];
        final int n3 = array[5];
        final int n4 = array[4];
        final int n5 = array[3];
        final int n6 = array[2];
        final int n7 = array[1];
        final int n8 = array[0];
        final int n9 = n4 ^ n6;
        final int n10 = n ^ n7;
        final int n11 = n ^ n4;
        final int n12 = n ^ n6;
        final int n13 = n2 ^ n3;
        final int n14 = n13 ^ n8;
        final int n15 = n14 ^ n4;
        final int n16 = n10 ^ n9;
        final int n17 = n14 ^ n;
        final int n18 = n14 ^ n7;
        final int n19 = n18 ^ n12;
        final int n20 = n5 ^ n16;
        final int n21 = n20 ^ n6;
        final int n22 = n20 ^ n2;
        final int n23 = n21 ^ n8;
        final int n24 = n21 ^ n13;
        final int n25 = n22 ^ n11;
        final int n26 = n8 ^ n25;
        final int n27 = n24 ^ n25;
        final int n28 = n24 ^ n12;
        final int n29 = n13 ^ n25;
        final int n30 = n10 ^ n29;
        final int n31 = n ^ n29;
        final int n32 = n16 & n21;
        final int n33 = (n19 & n23) ^ n32;
        final int n34 = (n15 & n8) ^ n32;
        final int n35 = n10 & n29;
        final int n36 = (n18 & n14) ^ n35;
        final int n37 = (n17 & n26) ^ n35;
        final int n38 = n11 & n25;
        final int n39 = (n9 & n27) ^ n38;
        final int n40 = (n12 & n24) ^ n38;
        final int n41 = n33 ^ n39;
        final int n42 = n34 ^ n40;
        final int n43 = n36 ^ n39;
        final int n44 = n37 ^ n40;
        final int n45 = n41 ^ n22;
        final int n46 = n42 ^ n28;
        final int n47 = n43 ^ n30;
        final int n48 = n44 ^ n31;
        final int n49 = n45 ^ n46;
        final int n50 = n45 & n47;
        final int n51 = n48 ^ n50;
        final int n52 = (n49 & n51) ^ n46;
        final int n53 = ((n46 ^ n50) & (n47 ^ n48)) ^ n48;
        final int n54 = n47 ^ n53;
        final int n55 = n48 & (n51 ^ n53);
        final int n56 = n55 ^ n54;
        final int n57 = n49 ^ (n52 & (n51 ^ n55));
        final int n58 = n57 ^ n56;
        final int n59 = n52 ^ n53;
        final int n60 = n52 ^ n57;
        final int n61 = n53 ^ n56;
        final int n62 = n59 ^ n58;
        final int n63 = n61 & n21;
        final int n64 = n56 & n23;
        final int n65 = n53 & n8;
        final int n66 = n60 & n29;
        final int n67 = n57 & n14;
        final int n68 = n52 & n26;
        final int n69 = n59 & n25;
        final int n70 = n62 & n27;
        final int n71 = n58 & n24;
        final int n72 = n61 & n16;
        final int n73 = n56 & n19;
        final int n74 = n53 & n15;
        final int n75 = n60 & n10;
        final int n76 = n57 & n18;
        final int n77 = n52 & n17;
        final int n78 = n59 & n11;
        final int n79 = n62 & n9;
        final int n80 = n58 & n12;
        final int n81 = n78 ^ n79;
        final int n82 = n73 ^ n74;
        final int n83 = n68 ^ n76;
        final int n84 = n72 ^ n73;
        final int n85 = n65 ^ n75;
        final int n86 = n65 ^ n68;
        final int n87 = n70 ^ n71;
        final int n88 = n63 ^ n66;
        final int n89 = n69 ^ n70;
        final int n90 = n79 ^ n80;
        final int n91 = n75 ^ n83;
        final int n92 = n85 ^ n88;
        final int n93 = n67 ^ n81;
        final int n94 = n66 ^ n89;
        final int n95 = n81 ^ n92;
        final int n96 = n77 ^ n92;
        final int n97 = n87 ^ n93;
        final int n98 = n84 ^ n93;
        final int n99 = n67 ^ n94;
        final int n100 = n96 ^ n97;
        final int n101 = n64 ^ n98;
        final int n102 = n94 ^ n98;
        final int n103 = n91 ^ ~n97;
        final int n104 = n83 ^ ~n95;
        final int n105 = n99 ^ n100;
        final int n106 = n88 ^ n101;
        final int n107 = n86 ^ n101;
        final int n108 = n82 ^ n100;
        final int n109 = n99 ^ ~n106;
        final int n110 = n90 ^ ~n105;
        array[7] = n102;
        array[6] = n109;
        array[5] = n110;
        array[4] = n106;
        array[3] = n107;
        array[2] = n108;
        array[1] = n103;
        array[0] = n104;
    }
    
    private void shiftRows32(final int[] array) {
        for (int i = 0; i < 8; ++i) {
            final int n = array[i];
            array[i] = ((n & 0xFF) | (n & 0xFC00) >>> 2 | (n & 0x300) << 6 | (n & 0xF00000) >>> 4 | (n & 0xF0000) << 4 | (n & 0xC0000000) >>> 6 | (n & 0x3F000000) << 2);
        }
    }
    
    private void mixColumns32(final int[] array) {
        final int n = array[0];
        final int n2 = array[1];
        final int n3 = array[2];
        final int n4 = array[3];
        final int n5 = array[4];
        final int n6 = array[5];
        final int n7 = array[6];
        final int n8 = array[7];
        final int n9 = n >>> 8 | n << 24;
        final int n10 = n2 >>> 8 | n2 << 24;
        final int n11 = n3 >>> 8 | n3 << 24;
        final int n12 = n4 >>> 8 | n4 << 24;
        final int n13 = n5 >>> 8 | n5 << 24;
        final int n14 = n6 >>> 8 | n6 << 24;
        final int n15 = n7 >>> 8 | n7 << 24;
        final int n16 = n8 >>> 8 | n8 << 24;
        array[0] = (n8 ^ n16 ^ n9 ^ this.rotr16(n ^ n9));
        array[1] = (n ^ n9 ^ n8 ^ n16 ^ n10 ^ this.rotr16(n2 ^ n10));
        array[2] = (n2 ^ n10 ^ n11 ^ this.rotr16(n3 ^ n11));
        array[3] = (n3 ^ n11 ^ n8 ^ n16 ^ n12 ^ this.rotr16(n4 ^ n12));
        array[4] = (n4 ^ n12 ^ n8 ^ n16 ^ n13 ^ this.rotr16(n5 ^ n13));
        array[5] = (n5 ^ n13 ^ n14 ^ this.rotr16(n6 ^ n14));
        array[6] = (n6 ^ n14 ^ n15 ^ this.rotr16(n7 ^ n15));
        array[7] = (n7 ^ n15 ^ n16 ^ this.rotr16(n8 ^ n16));
    }
    
    private void addRoundKey32(final int[] array, final int[] array2) {
        final int n = 0;
        array[n] ^= array2[0];
        final int n2 = 1;
        array[n2] ^= array2[1];
        final int n3 = 2;
        array[n3] ^= array2[2];
        final int n4 = 3;
        array[n4] ^= array2[3];
        final int n5 = 4;
        array[n5] ^= array2[4];
        final int n6 = 5;
        array[n6] ^= array2[5];
        final int n7 = 6;
        array[n7] ^= array2[6];
        final int n8 = 7;
        array[n8] ^= array2[7];
    }
    
    private int rotr16(final int n) {
        return n << 16 | n >>> 16;
    }
    
    private void brAesCt64Ortho(final long[] array) {
        this.Swapn(array, 1, 0, 1);
        this.Swapn(array, 1, 2, 3);
        this.Swapn(array, 1, 4, 5);
        this.Swapn(array, 1, 6, 7);
        this.Swapn(array, 2, 0, 2);
        this.Swapn(array, 2, 1, 3);
        this.Swapn(array, 2, 4, 6);
        this.Swapn(array, 2, 5, 7);
        this.Swapn(array, 4, 0, 4);
        this.Swapn(array, 4, 1, 5);
        this.Swapn(array, 4, 2, 6);
        this.Swapn(array, 4, 3, 7);
    }
    
    private void brAesCtOrtho(final int[] array) {
        this.Swapn32(array, 1, 0, 1);
        this.Swapn32(array, 1, 2, 3);
        this.Swapn32(array, 1, 4, 5);
        this.Swapn32(array, 1, 6, 7);
        this.Swapn32(array, 2, 0, 2);
        this.Swapn32(array, 2, 1, 3);
        this.Swapn32(array, 2, 4, 6);
        this.Swapn32(array, 2, 5, 7);
        this.Swapn32(array, 4, 0, 4);
        this.Swapn32(array, 4, 1, 5);
        this.Swapn32(array, 4, 2, 6);
        this.Swapn32(array, 4, 3, 7);
    }
    
    private void Swapn32(final int[] array, final int n, final int n2, final int n3) {
        int n4 = 0;
        int n5 = 0;
        switch (n) {
            case 1: {
                n4 = 1431655765;
                n5 = -1431655766;
                break;
            }
            case 2: {
                n4 = 858993459;
                n5 = -858993460;
                break;
            }
            case 4: {
                n4 = 252645135;
                n5 = -252645136;
                break;
            }
        }
        final int n6 = array[n2];
        final int n7 = array[n3];
        array[n2] = ((n6 & n4) | (n7 & n4) << n);
        array[n3] = ((n6 & n5) >>> n | (n7 & n5));
    }
    
    private void Swapn(final long[] array, final int n, final int n2, final int n3) {
        long n4 = 0L;
        long n5 = 0L;
        switch (n) {
            case 1: {
                n4 = 6148914691236517205L;
                n5 = -6148914691236517206L;
                break;
            }
            case 2: {
                n4 = 3689348814741910323L;
                n5 = -3689348814741910324L;
                break;
            }
            case 4: {
                n4 = 1085102592571150095L;
                n5 = -1085102592571150096L;
                break;
            }
            default: {
                return;
            }
        }
        final long n6 = array[n2];
        final long n7 = array[n3];
        array[n2] = ((n6 & n4) | (n7 & n4) << n);
        array[n3] = ((n6 & n5) >>> n | (n7 & n5));
    }
    
    private void brAesCt64BitsliceSbox(final long[] array) {
        final long n = array[7];
        final long n2 = array[6];
        final long n3 = array[5];
        final long n4 = array[4];
        final long n5 = array[3];
        final long n6 = array[2];
        final long n7 = array[1];
        final long n8 = array[0];
        final long n9 = n4 ^ n6;
        final long n10 = n ^ n7;
        final long n11 = n ^ n4;
        final long n12 = n ^ n6;
        final long n13 = n2 ^ n3;
        final long n14 = n13 ^ n8;
        final long n15 = n14 ^ n4;
        final long n16 = n10 ^ n9;
        final long n17 = n14 ^ n;
        final long n18 = n14 ^ n7;
        final long n19 = n18 ^ n12;
        final long n20 = n5 ^ n16;
        final long n21 = n20 ^ n6;
        final long n22 = n20 ^ n2;
        final long n23 = n21 ^ n8;
        final long n24 = n21 ^ n13;
        final long n25 = n22 ^ n11;
        final long n26 = n8 ^ n25;
        final long n27 = n24 ^ n25;
        final long n28 = n24 ^ n12;
        final long n29 = n13 ^ n25;
        final long n30 = n10 ^ n29;
        final long n31 = n ^ n29;
        final long n32 = n16 & n21;
        final long n33 = (n19 & n23) ^ n32;
        final long n34 = (n15 & n8) ^ n32;
        final long n35 = n10 & n29;
        final long n36 = (n18 & n14) ^ n35;
        final long n37 = (n17 & n26) ^ n35;
        final long n38 = n11 & n25;
        final long n39 = (n9 & n27) ^ n38;
        final long n40 = (n12 & n24) ^ n38;
        final long n41 = n33 ^ n39;
        final long n42 = n34 ^ n40;
        final long n43 = n36 ^ n39;
        final long n44 = n37 ^ n40;
        final long n45 = n41 ^ n22;
        final long n46 = n42 ^ n28;
        final long n47 = n43 ^ n30;
        final long n48 = n44 ^ n31;
        final long n49 = n45 ^ n46;
        final long n50 = n45 & n47;
        final long n51 = n48 ^ n50;
        final long n52 = (n49 & n51) ^ n46;
        final long n53 = ((n46 ^ n50) & (n47 ^ n48)) ^ n48;
        final long n54 = n47 ^ n53;
        final long n55 = n48 & (n51 ^ n53);
        final long n56 = n55 ^ n54;
        final long n57 = n49 ^ (n52 & (n51 ^ n55));
        final long n58 = n57 ^ n56;
        final long n59 = n52 ^ n53;
        final long n60 = n52 ^ n57;
        final long n61 = n53 ^ n56;
        final long n62 = n59 ^ n58;
        final long n63 = n61 & n21;
        final long n64 = n56 & n23;
        final long n65 = n53 & n8;
        final long n66 = n60 & n29;
        final long n67 = n57 & n14;
        final long n68 = n52 & n26;
        final long n69 = n59 & n25;
        final long n70 = n62 & n27;
        final long n71 = n58 & n24;
        final long n72 = n61 & n16;
        final long n73 = n56 & n19;
        final long n74 = n53 & n15;
        final long n75 = n60 & n10;
        final long n76 = n57 & n18;
        final long n77 = n52 & n17;
        final long n78 = n59 & n11;
        final long n79 = n62 & n9;
        final long n80 = n58 & n12;
        final long n81 = n78 ^ n79;
        final long n82 = n73 ^ n74;
        final long n83 = n68 ^ n76;
        final long n84 = n72 ^ n73;
        final long n85 = n65 ^ n75;
        final long n86 = n65 ^ n68;
        final long n87 = n70 ^ n71;
        final long n88 = n63 ^ n66;
        final long n89 = n69 ^ n70;
        final long n90 = n79 ^ n80;
        final long n91 = n75 ^ n83;
        final long n92 = n85 ^ n88;
        final long n93 = n67 ^ n81;
        final long n94 = n66 ^ n89;
        final long n95 = n81 ^ n92;
        final long n96 = n77 ^ n92;
        final long n97 = n87 ^ n93;
        final long n98 = n84 ^ n93;
        final long n99 = n67 ^ n94;
        final long n100 = n96 ^ n97;
        final long n101 = n64 ^ n98;
        final long n102 = n94 ^ n98;
        final long n103 = n91 ^ ~n97;
        final long n104 = n83 ^ ~n95;
        final long n105 = n99 ^ n100;
        final long n106 = n88 ^ n101;
        final long n107 = n86 ^ n101;
        final long n108 = n82 ^ n100;
        final long n109 = n99 ^ ~n106;
        final long n110 = n90 ^ ~n105;
        array[7] = n102;
        array[6] = n109;
        array[5] = n110;
        array[4] = n106;
        array[3] = n107;
        array[2] = n108;
        array[1] = n103;
        array[0] = n104;
    }
    
    private void shiftRows(final long[] array) {
        for (int i = 0; i < array.length; ++i) {
            final long n = array[i];
            array[i] = ((n & 0xFFFFL) | (n & 0xFFF00000L) >>> 4 | (n & 0xF0000L) << 12 | (n & 0xFF0000000000L) >>> 8 | (n & 0xFF00000000L) << 8 | (n & 0xF000000000000000L) >>> 12 | (n & 0xFFF000000000000L) << 4);
        }
    }
    
    private void mixColumns(final long[] array) {
        final long n = array[0];
        final long n2 = array[1];
        final long n3 = array[2];
        final long n4 = array[3];
        final long n5 = array[4];
        final long n6 = array[5];
        final long n7 = array[6];
        final long n8 = array[7];
        final long n9 = n >>> 16 | n << 48;
        final long n10 = n2 >>> 16 | n2 << 48;
        final long n11 = n3 >>> 16 | n3 << 48;
        final long n12 = n4 >>> 16 | n4 << 48;
        final long n13 = n5 >>> 16 | n5 << 48;
        final long n14 = n6 >>> 16 | n6 << 48;
        final long n15 = n7 >>> 16 | n7 << 48;
        final long n16 = n8 >>> 16 | n8 << 48;
        array[0] = (n8 ^ n16 ^ n9 ^ this.rotr32(n ^ n9));
        array[1] = (n ^ n9 ^ n8 ^ n16 ^ n10 ^ this.rotr32(n2 ^ n10));
        array[2] = (n2 ^ n10 ^ n11 ^ this.rotr32(n3 ^ n11));
        array[3] = (n3 ^ n11 ^ n8 ^ n16 ^ n12 ^ this.rotr32(n4 ^ n12));
        array[4] = (n4 ^ n12 ^ n8 ^ n16 ^ n13 ^ this.rotr32(n5 ^ n13));
        array[5] = (n5 ^ n13 ^ n14 ^ this.rotr32(n6 ^ n14));
        array[6] = (n6 ^ n14 ^ n15 ^ this.rotr32(n7 ^ n15));
        array[7] = (n7 ^ n15 ^ n16 ^ this.rotr32(n8 ^ n16));
    }
    
    private long rotr32(final long n) {
        return n << 32 | n >>> 32;
    }
    
    private void addRoundKey(final long[] array, final long[] array2) {
        final int n = 0;
        array[n] ^= array2[0];
        final int n2 = 1;
        array[n2] ^= array2[1];
        final int n3 = 2;
        array[n3] ^= array2[2];
        final int n4 = 3;
        array[n4] ^= array2[3];
        final int n5 = 4;
        array[n5] ^= array2[4];
        final int n6 = 5;
        array[n6] ^= array2[5];
        final int n7 = 6;
        array[n7] ^= array2[6];
        final int n8 = 7;
        array[n8] ^= array2[7];
    }
    
    private void brAesCt64InterleaveOut(final int[] array, final long[] array2, int n) {
        final long n2 = array2[n] & 0xFF00FF00FF00FFL;
        final long n3 = array2[n + 4] & 0xFF00FF00FF00FFL;
        final long n4 = array2[n] >>> 8 & 0xFF00FF00FF00FFL;
        final long n5 = array2[n + 4] >>> 8 & 0xFF00FF00FF00FFL;
        final long n6 = n2 | n2 >>> 8;
        final long n7 = n3 | n3 >>> 8;
        final long n8 = n4 | n4 >>> 8;
        final long n9 = n5 | n5 >>> 8;
        final long n10 = n6 & 0xFFFF0000FFFFL;
        final long n11 = n7 & 0xFFFF0000FFFFL;
        final long n12 = n8 & 0xFFFF0000FFFFL;
        final long n13 = n9 & 0xFFFF0000FFFFL;
        n <<= 2;
        array[n] = (int)(n10 | n10 >>> 16);
        array[n + 1] = (int)(n11 | n11 >>> 16);
        array[n + 2] = (int)(n12 | n12 >>> 16);
        array[n + 3] = (int)(n13 | n13 >>> 16);
    }
    
    protected static void xor(final byte[] array, final int n, final byte[] array2, final int n2, final byte[] array3, final int n3, final int n4) {
        for (int i = 0; i < n4; ++i) {
            array3[n3 + i] = (byte)(array[n + i] ^ array2[n2 + i]);
        }
    }
}
