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);
}