protected void setKeyStream()

in sshd-common/src/main/java/org/apache/sshd/common/cipher/ChaCha20Cipher.java [219:330]


        protected void setKeyStream(int[] engine) {
            int x0 = engine[0];
            int x1 = engine[1];
            int x2 = engine[2];
            int x3 = engine[3];
            int x4 = engine[4];
            int x5 = engine[5];
            int x6 = engine[6];
            int x7 = engine[7];
            int x8 = engine[8];
            int x9 = engine[9];
            int x10 = engine[10];
            int x11 = engine[11];
            int x12 = engine[12]; // counter
            int x13 = engine[13]; // 0
            int x14 = engine[14]; // 0
            int x15 = engine[15]; // nonce

            for (int i = 0; i < 10; i++) {
                // Columns
                // Quarter round 0, 4, 8, 12
                x0 += x4;
                x12 = Integer.rotateLeft(x12 ^ x0, 16);
                x8 += x12;
                x4 = Integer.rotateLeft(x4 ^ x8, 12);
                x0 += x4;
                x12 = Integer.rotateLeft(x12 ^ x0, 8);
                x8 += x12;
                x4 = Integer.rotateLeft(x4 ^ x8, 7);
                // Quarter round 1, 5, 9, 13
                x1 += x5;
                x13 = Integer.rotateLeft(x13 ^ x1, 16);
                x9 += x13;
                x5 = Integer.rotateLeft(x5 ^ x9, 12);
                x1 += x5;
                x13 = Integer.rotateLeft(x13 ^ x1, 8);
                x9 += x13;
                x5 = Integer.rotateLeft(x5 ^ x9, 7);
                // Quarter round 2, 6, 10, 14
                x2 += x6;
                x14 = Integer.rotateLeft(x14 ^ x2, 16);
                x10 += x14;
                x6 = Integer.rotateLeft(x6 ^ x10, 12);
                x2 += x6;
                x14 = Integer.rotateLeft(x14 ^ x2, 8);
                x10 += x14;
                x6 = Integer.rotateLeft(x6 ^ x10, 7);
                // Quarter round 3, 7, 11, 15
                x3 += x7;
                x15 = Integer.rotateLeft(x15 ^ x3, 16);
                x11 += x15;
                x7 = Integer.rotateLeft(x7 ^ x11, 12);
                x3 += x7;
                x15 = Integer.rotateLeft(x15 ^ x3, 8);
                x11 += x15;
                x7 = Integer.rotateLeft(x7 ^ x11, 7);
                // Diagonals
                // Quarter round 0, 5, 10, 15
                x0 += x5;
                x15 = Integer.rotateLeft(x15 ^ x0, 16);
                x10 += x15;
                x5 = Integer.rotateLeft(x5 ^ x10, 12);
                x0 += x5;
                x15 = Integer.rotateLeft(x15 ^ x0, 8);
                x10 += x15;
                x5 = Integer.rotateLeft(x5 ^ x10, 7);
                // Quarter round 1, 6, 11, 12
                x1 += x6;
                x12 = Integer.rotateLeft(x12 ^ x1, 16);
                x11 += x12;
                x6 = Integer.rotateLeft(x6 ^ x11, 12);
                x1 += x6;
                x12 = Integer.rotateLeft(x12 ^ x1, 8);
                x11 += x12;
                x6 = Integer.rotateLeft(x6 ^ x11, 7);
                // Quarter round 2, 7, 8, 13
                x2 += x7;
                x13 = Integer.rotateLeft(x13 ^ x2, 16);
                x8 += x13;
                x7 = Integer.rotateLeft(x7 ^ x8, 12);
                x2 += x7;
                x13 = Integer.rotateLeft(x13 ^ x2, 8);
                x8 += x13;
                x7 = Integer.rotateLeft(x7 ^ x8, 7);
                // Quarter round 3, 4, 9, 14
                x3 += x4;
                x14 = Integer.rotateLeft(x14 ^ x3, 16);
                x9 += x14;
                x4 = Integer.rotateLeft(x4 ^ x9, 12);
                x3 += x4;
                x14 = Integer.rotateLeft(x14 ^ x3, 8);
                x9 += x14;
                x4 = Integer.rotateLeft(x4 ^ x9, 7);
            }

            Poly1305Mac.packIntLE(engine[0] + x0, keyStream, 0);
            Poly1305Mac.packIntLE(engine[1] + x1, keyStream, 4);
            Poly1305Mac.packIntLE(engine[2] + x2, keyStream, 8);
            Poly1305Mac.packIntLE(engine[3] + x3, keyStream, 12);
            Poly1305Mac.packIntLE(engine[4] + x4, keyStream, 16);
            Poly1305Mac.packIntLE(engine[5] + x5, keyStream, 20);
            Poly1305Mac.packIntLE(engine[6] + x6, keyStream, 24);
            Poly1305Mac.packIntLE(engine[7] + x7, keyStream, 28);
            Poly1305Mac.packIntLE(engine[8] + x8, keyStream, 32);
            Poly1305Mac.packIntLE(engine[9] + x9, keyStream, 36);
            Poly1305Mac.packIntLE(engine[10] + x10, keyStream, 40);
            Poly1305Mac.packIntLE(engine[11] + x11, keyStream, 44);
            Poly1305Mac.packIntLE(engine[12] + x12, keyStream, 48);
            Poly1305Mac.packIntLE(engine[13] + x13, keyStream, 52);
            Poly1305Mac.packIntLE(engine[14] + x14, keyStream, 56);
            Poly1305Mac.packIntLE(engine[15] + x15, keyStream, 60);
        }