private void Compress() {
uint aa = _HashValue[0], bb = _HashValue[1], cc = _HashValue[2], dd = _HashValue[3], ee = _HashValue[4];
uint aaa = _HashValue[0], bbb = _HashValue[1], ccc = _HashValue[2], ddd = _HashValue[3], eee = _HashValue[4];
/* round 1 */
FF(ref aa, bb, ref cc, dd, ee, _X[ 0], 11);
FF(ref ee, aa, ref bb, cc, dd, _X[ 1], 14);
FF(ref dd, ee, ref aa, bb, cc, _X[ 2], 15);
FF(ref cc, dd, ref ee, aa, bb, _X[ 3], 12);
FF(ref bb, cc, ref dd, ee, aa, _X[ 4], 5);
FF(ref aa, bb, ref cc, dd, ee, _X[ 5], 8);
FF(ref ee, aa, ref bb, cc, dd, _X[ 6], 7);
FF(ref dd, ee, ref aa, bb, cc, _X[ 7], 9);
FF(ref cc, dd, ref ee, aa, bb, _X[ 8], 11);
FF(ref bb, cc, ref dd, ee, aa, _X[ 9], 13);
FF(ref aa, bb, ref cc, dd, ee, _X[10], 14);
FF(ref ee, aa, ref bb, cc, dd, _X[11], 15);
FF(ref dd, ee, ref aa, bb, cc, _X[12], 6);
FF(ref cc, dd, ref ee, aa, bb, _X[13], 7);
FF(ref bb, cc, ref dd, ee, aa, _X[14], 9);
FF(ref aa, bb, ref cc, dd, ee, _X[15], 8);
/* round 2 */
GG(ref ee, aa, ref bb, cc, dd, _X[ 7], 7);
GG(ref dd, ee, ref aa, bb, cc, _X[ 4], 6);
GG(ref cc, dd, ref ee, aa, bb, _X[13], 8);
GG(ref bb, cc, ref dd, ee, aa, _X[ 1], 13);
GG(ref aa, bb, ref cc, dd, ee, _X[10], 11);
GG(ref ee, aa, ref bb, cc, dd, _X[ 6], 9);
GG(ref dd, ee, ref aa, bb, cc, _X[15], 7);
GG(ref cc, dd, ref ee, aa, bb, _X[ 3], 15);
GG(ref bb, cc, ref dd, ee, aa, _X[12], 7);
GG(ref aa, bb, ref cc, dd, ee, _X[ 0], 12);
GG(ref ee, aa, ref bb, cc, dd, _X[ 9], 15);
GG(ref dd, ee, ref aa, bb, cc, _X[ 5], 9);
GG(ref cc, dd, ref ee, aa, bb, _X[ 2], 11);
GG(ref bb, cc, ref dd, ee, aa, _X[14], 7);
GG(ref aa, bb, ref cc, dd, ee, _X[11], 13);
GG(ref ee, aa, ref bb, cc, dd, _X[ 8], 12);
/* round 3 */
HH(ref dd, ee, ref aa, bb, cc, _X[ 3], 11);
HH(ref cc, dd, ref ee, aa, bb, _X[10], 13);
HH(ref bb, cc, ref dd, ee, aa, _X[14], 6);
HH(ref aa, bb, ref cc, dd, ee, _X[ 4], 7);
HH(ref ee, aa, ref bb, cc, dd, _X[ 9], 14);
HH(ref dd, ee, ref aa, bb, cc, _X[15], 9);
HH(ref cc, dd, ref ee, aa, bb, _X[ 8], 13);
HH(ref bb, cc, ref dd, ee, aa, _X[ 1], 15);
HH(ref aa, bb, ref cc, dd, ee, _X[ 2], 14);
HH(ref ee, aa, ref bb, cc, dd, _X[ 7], 8);
HH(ref dd, ee, ref aa, bb, cc, _X[ 0], 13);
HH(ref cc, dd, ref ee, aa, bb, _X[ 6], 6);
HH(ref bb, cc, ref dd, ee, aa, _X[13], 5);
HH(ref aa, bb, ref cc, dd, ee, _X[11], 12);
HH(ref ee, aa, ref bb, cc, dd, _X[ 5], 7);
HH(ref dd, ee, ref aa, bb, cc, _X[12], 5);
/* round 4 */
II(ref cc, dd, ref ee, aa, bb, _X[ 1], 11);
II(ref bb, cc, ref dd, ee, aa, _X[ 9], 12);
II(ref aa, bb, ref cc, dd, ee, _X[11], 14);
II(ref ee, aa, ref bb, cc, dd, _X[10], 15);
II(ref dd, ee, ref aa, bb, cc, _X[ 0], 14);
II(ref cc, dd, ref ee, aa, bb, _X[ 8], 15);
II(ref bb, cc, ref dd, ee, aa, _X[12], 9);
II(ref aa, bb, ref cc, dd, ee, _X[ 4], 8);
II(ref ee, aa, ref bb, cc, dd, _X[13], 9);
II(ref dd, ee, ref aa, bb, cc, _X[ 3], 14);
II(ref cc, dd, ref ee, aa, bb, _X[ 7], 5);
II(ref bb, cc, ref dd, ee, aa, _X[15], 6);
II(ref aa, bb, ref cc, dd, ee, _X[14], 8);
II(ref ee, aa, ref bb, cc, dd, _X[ 5], 6);
II(ref dd, ee, ref aa, bb, cc, _X[ 6], 5);
II(ref cc, dd, ref ee, aa, bb, _X[ 2], 12);
/* round 5 */
JJ(ref bb, cc, ref dd, ee, aa, _X[ 4], 9);
JJ(ref aa, bb, ref cc, dd, ee, _X[ 0], 15);
JJ(ref ee, aa, ref bb, cc, dd, _X[ 5], 5);
JJ(ref dd, ee, ref aa, bb, cc, _X[ 9], 11);
JJ(ref cc, dd, ref ee, aa, bb, _X[ 7], 6);
JJ(ref bb, cc, ref dd, ee, aa, _X[12], 8);
JJ(ref aa, bb, ref cc, dd, ee, _X[ 2], 13);
JJ(ref ee, aa, ref bb, cc, dd, _X[10], 12);
JJ(ref dd, ee, ref aa, bb, cc, _X[14], 5);
JJ(ref cc, dd, ref ee, aa, bb, _X[ 1], 12);
JJ(ref bb, cc, ref dd, ee, aa, _X[ 3], 13);
JJ(ref aa, bb, ref cc, dd, ee, _X[ 8], 14);
JJ(ref ee, aa, ref bb, cc, dd, _X[11], 11);
JJ(ref dd, ee, ref aa, bb, cc, _X[ 6], 8);
JJ(ref cc, dd, ref ee, aa, bb, _X[15], 5);
JJ(ref bb, cc, ref dd, ee, aa, _X[13], 6);
/* parallel round 1 */
JJJ(ref aaa, bbb, ref ccc, ddd, eee, _X[ 5], 8);
JJJ(ref eee, aaa, ref bbb, ccc, ddd, _X[14], 9);
JJJ(ref ddd, eee, ref aaa, bbb, ccc, _X[ 7], 9);
JJJ(ref ccc, ddd, ref eee, aaa, bbb, _X[ 0], 11);
JJJ(ref bbb, ccc, ref ddd, eee, aaa, _X[ 9], 13);
JJJ(ref aaa, bbb, ref ccc, ddd, eee, _X[ 2], 15);
JJJ(ref eee, aaa, ref bbb, ccc, ddd, _X[11], 15);
JJJ(ref ddd, eee, ref aaa, bbb, ccc, _X[ 4], 5);
JJJ(ref ccc, ddd, ref eee, aaa, bbb, _X[13], 7);
JJJ(ref bbb, ccc, ref ddd, eee, aaa, _X[ 6], 7);
JJJ(ref aaa, bbb, ref ccc, ddd, eee, _X[15], 8);
JJJ(ref eee, aaa, ref bbb, ccc, ddd, _X[ 8], 11);
JJJ(ref ddd, eee, ref aaa, bbb, ccc, _X[ 1], 14);
JJJ(ref ccc, ddd, ref eee, aaa, bbb, _X[10], 14);
JJJ(ref bbb, ccc, ref ddd, eee, aaa, _X[ 3], 12);
JJJ(ref aaa, bbb, ref ccc, ddd, eee, _X[12], 6);
/* parallel round 2 */
III(ref eee, aaa, ref bbb, ccc, ddd, _X[ 6], 9);
III(ref ddd, eee, ref aaa, bbb, ccc, _X[11], 13);
III(ref ccc, ddd, ref eee, aaa, bbb, _X[ 3], 15);
III(ref bbb, ccc, ref ddd, eee, aaa, _X[ 7], 7);
III(ref aaa, bbb, ref ccc, ddd, eee, _X[ 0], 12);
III(ref eee, aaa, ref bbb, ccc, ddd, _X[13], 8);
III(ref ddd, eee, ref aaa, bbb, ccc, _X[ 5], 9);
III(ref ccc, ddd, ref eee, aaa, bbb, _X[10], 11);
III(ref bbb, ccc, ref ddd, eee, aaa, _X[14], 7);
III(ref aaa, bbb, ref ccc, ddd, eee, _X[15], 7);
III(ref eee, aaa, ref bbb, ccc, ddd, _X[ 8], 12);
III(ref ddd, eee, ref aaa, bbb, ccc, _X[12], 7);
III(ref ccc, ddd, ref eee, aaa, bbb, _X[ 4], 6);
III(ref bbb, ccc, ref ddd, eee, aaa, _X[ 9], 15);
III(ref aaa, bbb, ref ccc, ddd, eee, _X[ 1], 13);
III(ref eee, aaa, ref bbb, ccc, ddd, _X[ 2], 11);
/* parallel round 3 */
HHH(ref ddd, eee, ref aaa, bbb, ccc, _X[15], 9);
HHH(ref ccc, ddd, ref eee, aaa, bbb, _X[ 5], 7);
HHH(ref bbb, ccc, ref ddd, eee, aaa, _X[ 1], 15);
HHH(ref aaa, bbb, ref ccc, ddd, eee, _X[ 3], 11);
HHH(ref eee, aaa, ref bbb, ccc, ddd, _X[ 7], 8);
HHH(ref ddd, eee, ref aaa, bbb, ccc, _X[14], 6);
HHH(ref ccc, ddd, ref eee, aaa, bbb, _X[ 6], 6);
HHH(ref bbb, ccc, ref ddd, eee, aaa, _X[ 9], 14);
HHH(ref aaa, bbb, ref ccc, ddd, eee, _X[11], 12);
HHH(ref eee, aaa, ref bbb, ccc, ddd, _X[ 8], 13);
HHH(ref ddd, eee, ref aaa, bbb, ccc, _X[12], 5);
HHH(ref ccc, ddd, ref eee, aaa, bbb, _X[ 2], 14);
HHH(ref bbb, ccc, ref ddd, eee, aaa, _X[10], 13);
HHH(ref aaa, bbb, ref ccc, ddd, eee, _X[ 0], 13);
HHH(ref eee, aaa, ref bbb, ccc, ddd, _X[ 4], 7);
HHH(ref ddd, eee, ref aaa, bbb, ccc, _X[13], 5);
/* parallel round 4 */
GGG(ref ccc, ddd, ref eee, aaa, bbb, _X[ 8], 15);
GGG(ref bbb, ccc, ref ddd, eee, aaa, _X[ 6], 5);
GGG(ref aaa, bbb, ref ccc, ddd, eee, _X[ 4], 8);
GGG(ref eee, aaa, ref bbb, ccc, ddd, _X[ 1], 11);
GGG(ref ddd, eee, ref aaa, bbb, ccc, _X[ 3], 14);
GGG(ref ccc, ddd, ref eee, aaa, bbb, _X[11], 14);
GGG(ref bbb, ccc, ref ddd, eee, aaa, _X[15], 6);
GGG(ref aaa, bbb, ref ccc, ddd, eee, _X[ 0], 14);
GGG(ref eee, aaa, ref bbb, ccc, ddd, _X[ 5], 6);
GGG(ref ddd, eee, ref aaa, bbb, ccc, _X[12], 9);
GGG(ref ccc, ddd, ref eee, aaa, bbb, _X[ 2], 12);
GGG(ref bbb, ccc, ref ddd, eee, aaa, _X[13], 9);
GGG(ref aaa, bbb, ref ccc, ddd, eee, _X[ 9], 12);
GGG(ref eee, aaa, ref bbb, ccc, ddd, _X[ 7], 5);
GGG(ref ddd, eee, ref aaa, bbb, ccc, _X[10], 15);
GGG(ref ccc, ddd, ref eee, aaa, bbb, _X[14], 8);
/* parallel round 5 */
FFF(ref bbb, ccc, ref ddd, eee, aaa, _X[12], 8);
FFF(ref aaa, bbb, ref ccc, ddd, eee, _X[15], 5);
FFF(ref eee, aaa, ref bbb, ccc, ddd, _X[10], 12);
FFF(ref ddd, eee, ref aaa, bbb, ccc, _X[ 4], 9);
FFF(ref ccc, ddd, ref eee, aaa, bbb, _X[ 1], 12);
FFF(ref bbb, ccc, ref ddd, eee, aaa, _X[ 5], 5);
FFF(ref aaa, bbb, ref ccc, ddd, eee, _X[ 8], 14);
FFF(ref eee, aaa, ref bbb, ccc, ddd, _X[ 7], 6);
FFF(ref ddd, eee, ref aaa, bbb, ccc, _X[ 6], 8);
FFF(ref ccc, ddd, ref eee, aaa, bbb, _X[ 2], 13);
FFF(ref bbb, ccc, ref ddd, eee, aaa, _X[13], 6);
FFF(ref aaa, bbb, ref ccc, ddd, eee, _X[14], 5);
FFF(ref eee, aaa, ref bbb, ccc, ddd, _X[ 0], 15);
FFF(ref ddd, eee, ref aaa, bbb, ccc, _X[ 3], 13);
FFF(ref ccc, ddd, ref eee, aaa, bbb, _X[ 9], 11);
FFF(ref bbb, ccc, ref ddd, eee, aaa, _X[11], 11);
/* combine results */
ddd += cc + _HashValue[1]; /* final result for _HashValue[0] */
_HashValue[1] = _HashValue[2] + dd + eee;
_HashValue[2] = _HashValue[3] + ee + aaa;
_HashValue[3] = _HashValue[4] + aa + bbb;
_HashValue[4] = _HashValue[0] + bb + ccc;
_HashValue[0] = ddd;
}
private void CompressFinal(ulong length) {