in kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/util/Md4.java [217:338]
private void process(byte[] in, int offset) {
// Save previous state.
int aa = a;
int bb = b;
int cc = c;
int dd = d;
// Copy the block to process into X array
int[] x = new int[16];
for (int i = 0; i < 16; i++) {
x[i] = (in[offset++] & 0xff) | (in[offset++] & 0xff) << 8 | (in[offset++] & 0xff) << 16
| (in[offset++] & 0xff) << 24;
}
// Round 1
a += ((b & c) | (~b & d)) + x[0];
a = a << 3 | a >>> (32 - 3);
d += ((a & b) | (~a & c)) + x[1];
d = d << 7 | d >>> (32 - 7);
c += ((d & a) | (~d & b)) + x[2];
c = c << 11 | c >>> (32 - 11);
b += ((c & d) | (~c & a)) + x[3];
b = b << 19 | b >>> (32 - 19);
a += ((b & c) | (~b & d)) + x[4];
a = a << 3 | a >>> (32 - 3);
d += ((a & b) | (~a & c)) + x[5];
d = d << 7 | d >>> (32 - 7);
c += ((d & a) | (~d & b)) + x[6];
c = c << 11 | c >>> (32 - 11);
b += ((c & d) | (~c & a)) + x[7];
b = b << 19 | b >>> (32 - 19);
a += ((b & c) | (~b & d)) + x[8];
a = a << 3 | a >>> (32 - 3);
d += ((a & b) | (~a & c)) + x[9];
d = d << 7 | d >>> (32 - 7);
c += ((d & a) | (~d & b)) + x[10];
c = c << 11 | c >>> (32 - 11);
b += ((c & d) | (~c & a)) + x[11];
b = b << 19 | b >>> (32 - 19);
a += ((b & c) | (~b & d)) + x[12];
a = a << 3 | a >>> (32 - 3);
d += ((a & b) | (~a & c)) + x[13];
d = d << 7 | d >>> (32 - 7);
c += ((d & a) | (~d & b)) + x[14];
c = c << 11 | c >>> (32 - 11);
b += ((c & d) | (~c & a)) + x[15];
b = b << 19 | b >>> (32 - 19);
// Round 2
a += ((b & (c | d)) | (c & d)) + x[0] + 0x5a827999;
a = a << 3 | a >>> (32 - 3);
d += ((a & (b | c)) | (b & c)) + x[4] + 0x5a827999;
d = d << 5 | d >>> (32 - 5);
c += ((d & (a | b)) | (a & b)) + x[8] + 0x5a827999;
c = c << 9 | c >>> (32 - 9);
b += ((c & (d | a)) | (d & a)) + x[12] + 0x5a827999;
b = b << 13 | b >>> (32 - 13);
a += ((b & (c | d)) | (c & d)) + x[1] + 0x5a827999;
a = a << 3 | a >>> (32 - 3);
d += ((a & (b | c)) | (b & c)) + x[5] + 0x5a827999;
d = d << 5 | d >>> (32 - 5);
c += ((d & (a | b)) | (a & b)) + x[9] + 0x5a827999;
c = c << 9 | c >>> (32 - 9);
b += ((c & (d | a)) | (d & a)) + x[13] + 0x5a827999;
b = b << 13 | b >>> (32 - 13);
a += ((b & (c | d)) | (c & d)) + x[2] + 0x5a827999;
a = a << 3 | a >>> (32 - 3);
d += ((a & (b | c)) | (b & c)) + x[6] + 0x5a827999;
d = d << 5 | d >>> (32 - 5);
c += ((d & (a | b)) | (a & b)) + x[10] + 0x5a827999;
c = c << 9 | c >>> (32 - 9);
b += ((c & (d | a)) | (d & a)) + x[14] + 0x5a827999;
b = b << 13 | b >>> (32 - 13);
a += ((b & (c | d)) | (c & d)) + x[3] + 0x5a827999;
a = a << 3 | a >>> (32 - 3);
d += ((a & (b | c)) | (b & c)) + x[7] + 0x5a827999;
d = d << 5 | d >>> (32 - 5);
c += ((d & (a | b)) | (a & b)) + x[11] + 0x5a827999;
c = c << 9 | c >>> (32 - 9);
b += ((c & (d | a)) | (d & a)) + x[15] + 0x5a827999;
b = b << 13 | b >>> (32 - 13);
// Round 3
a += (b ^ c ^ d) + x[0] + 0x6ed9eba1;
a = a << 3 | a >>> (32 - 3);
d += (a ^ b ^ c) + x[8] + 0x6ed9eba1;
d = d << 9 | d >>> (32 - 9);
c += (d ^ a ^ b) + x[4] + 0x6ed9eba1;
c = c << 11 | c >>> (32 - 11);
b += (c ^ d ^ a) + x[12] + 0x6ed9eba1;
b = b << 15 | b >>> (32 - 15);
a += (b ^ c ^ d) + x[2] + 0x6ed9eba1;
a = a << 3 | a >>> (32 - 3);
d += (a ^ b ^ c) + x[10] + 0x6ed9eba1;
d = d << 9 | d >>> (32 - 9);
c += (d ^ a ^ b) + x[6] + 0x6ed9eba1;
c = c << 11 | c >>> (32 - 11);
b += (c ^ d ^ a) + x[14] + 0x6ed9eba1;
b = b << 15 | b >>> (32 - 15);
a += (b ^ c ^ d) + x[1] + 0x6ed9eba1;
a = a << 3 | a >>> (32 - 3);
d += (a ^ b ^ c) + x[9] + 0x6ed9eba1;
d = d << 9 | d >>> (32 - 9);
c += (d ^ a ^ b) + x[5] + 0x6ed9eba1;
c = c << 11 | c >>> (32 - 11);
b += (c ^ d ^ a) + x[13] + 0x6ed9eba1;
b = b << 15 | b >>> (32 - 15);
a += (b ^ c ^ d) + x[3] + 0x6ed9eba1;
a = a << 3 | a >>> (32 - 3);
d += (a ^ b ^ c) + x[11] + 0x6ed9eba1;
d = d << 9 | d >>> (32 - 9);
c += (d ^ a ^ b) + x[7] + 0x6ed9eba1;
c = c << 11 | c >>> (32 - 11);
b += (c ^ d ^ a) + x[15] + 0x6ed9eba1;
b = b << 15 | b >>> (32 - 15);
//Update state.
a += aa;
b += bb;
c += cc;
d += dd;
}