use super::md5;
use crate::encoding::binary::{self, ByteOrder};
use crate::math::bits;
pub(super) fn block_generic(state: &mut md5::State, p: &[u8]) {
let mut a = state[0];
let mut b = state[1];
let mut c = state[2];
let mut d = state[3];
let mut i = 0;
while i <= p.len() - md5::BLOCK_SIZE {
let q = &p[i..i + md5::BLOCK_SIZE];
let (aa, bb, cc, dd) = (a, b, c, d);
let x0 = binary::LITTLE_ENDIAN.uint32(&q[0..]);
let x1 = binary::LITTLE_ENDIAN.uint32(&q[4..]);
let x2 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x2..]);
let x3 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x3..]);
let x4 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x4..]);
let x5 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x5..]);
let x6 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x6..]);
let x7 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x7..]);
let x8 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x8..]);
let x9 = binary::LITTLE_ENDIAN.uint32(&q[4 * 0x9..]);
let xa = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xa..]);
let xb = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xb..]);
let xc = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xc..]);
let xd = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xd..]);
let xe = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xe..]);
let xf = binary::LITTLE_ENDIAN.uint32(&q[4 * 0xf..]);
a = b.wrapping_add(bits::rotate_left32(
(((c ^ d) & b) ^ d)
.wrapping_add(a)
.wrapping_add(x0)
.wrapping_add(0xd76aa478),
7,
));
d = a.wrapping_add(bits::rotate_left32(
(((b ^ c) & a) ^ c)
.wrapping_add(d)
.wrapping_add(x1)
.wrapping_add(0xe8c7b756),
12,
));
c = d.wrapping_add(bits::rotate_left32(
(((a ^ b) & d) ^ b)
.wrapping_add(c)
.wrapping_add(x2)
.wrapping_add(0x242070db),
17,
));
b = c.wrapping_add(bits::rotate_left32(
(((d ^ a) & c) ^ a)
.wrapping_add(b)
.wrapping_add(x3)
.wrapping_add(0xc1bdceee),
22,
));
a = b.wrapping_add(bits::rotate_left32(
(((c ^ d) & b) ^ d)
.wrapping_add(a)
.wrapping_add(x4)
.wrapping_add(0xf57c0faf),
7,
));
d = a.wrapping_add(bits::rotate_left32(
(((b ^ c) & a) ^ c)
.wrapping_add(d)
.wrapping_add(x5)
.wrapping_add(0x4787c62a),
12,
));
c = d.wrapping_add(bits::rotate_left32(
(((a ^ b) & d) ^ b)
.wrapping_add(c)
.wrapping_add(x6)
.wrapping_add(0xa8304613),
17,
));
b = c.wrapping_add(bits::rotate_left32(
(((d ^ a) & c) ^ a)
.wrapping_add(b)
.wrapping_add(x7)
.wrapping_add(0xfd469501),
22,
));
a = b.wrapping_add(bits::rotate_left32(
(((c ^ d) & b) ^ d)
.wrapping_add(a)
.wrapping_add(x8)
.wrapping_add(0x698098d8),
7,
));
d = a.wrapping_add(bits::rotate_left32(
(((b ^ c) & a) ^ c)
.wrapping_add(d)
.wrapping_add(x9)
.wrapping_add(0x8b44f7af),
12,
));
c = d.wrapping_add(bits::rotate_left32(
(((a ^ b) & d) ^ b)
.wrapping_add(c)
.wrapping_add(xa)
.wrapping_add(0xffff5bb1),
17,
));
b = c.wrapping_add(bits::rotate_left32(
(((d ^ a) & c) ^ a)
.wrapping_add(b)
.wrapping_add(xb)
.wrapping_add(0x895cd7be),
22,
));
a = b.wrapping_add(bits::rotate_left32(
(((c ^ d) & b) ^ d)
.wrapping_add(a)
.wrapping_add(xc)
.wrapping_add(0x6b901122),
7,
));
d = a.wrapping_add(bits::rotate_left32(
(((b ^ c) & a) ^ c)
.wrapping_add(d)
.wrapping_add(xd)
.wrapping_add(0xfd987193),
12,
));
c = d.wrapping_add(bits::rotate_left32(
(((a ^ b) & d) ^ b)
.wrapping_add(c)
.wrapping_add(xe)
.wrapping_add(0xa679438e),
17,
));
b = c.wrapping_add(bits::rotate_left32(
(((d ^ a) & c) ^ a)
.wrapping_add(b)
.wrapping_add(xf)
.wrapping_add(0x49b40821),
22,
));
a = b.wrapping_add(bits::rotate_left32(
(((b ^ c) & d) ^ c)
.wrapping_add(a)
.wrapping_add(x1)
.wrapping_add(0xf61e2562),
5,
));
d = a.wrapping_add(bits::rotate_left32(
(((a ^ b) & c) ^ b)
.wrapping_add(d)
.wrapping_add(x6)
.wrapping_add(0xc040b340),
9,
));
c = d.wrapping_add(bits::rotate_left32(
(((d ^ a) & b) ^ a)
.wrapping_add(c)
.wrapping_add(xb)
.wrapping_add(0x265e5a51),
14,
));
b = c.wrapping_add(bits::rotate_left32(
(((c ^ d) & a) ^ d)
.wrapping_add(b)
.wrapping_add(x0)
.wrapping_add(0xe9b6c7aa),
20,
));
a = b.wrapping_add(bits::rotate_left32(
(((b ^ c) & d) ^ c)
.wrapping_add(a)
.wrapping_add(x5)
.wrapping_add(0xd62f105d),
5,
));
d = a.wrapping_add(bits::rotate_left32(
(((a ^ b) & c) ^ b)
.wrapping_add(d)
.wrapping_add(xa)
.wrapping_add(0x02441453),
9,
));
c = d.wrapping_add(bits::rotate_left32(
(((d ^ a) & b) ^ a)
.wrapping_add(c)
.wrapping_add(xf)
.wrapping_add(0xd8a1e681),
14,
));
b = c.wrapping_add(bits::rotate_left32(
(((c ^ d) & a) ^ d)
.wrapping_add(b)
.wrapping_add(x4)
.wrapping_add(0xe7d3fbc8),
20,
));
a = b.wrapping_add(bits::rotate_left32(
(((b ^ c) & d) ^ c)
.wrapping_add(a)
.wrapping_add(x9)
.wrapping_add(0x21e1cde6),
5,
));
d = a.wrapping_add(bits::rotate_left32(
(((a ^ b) & c) ^ b)
.wrapping_add(d)
.wrapping_add(xe)
.wrapping_add(0xc33707d6),
9,
));
c = d.wrapping_add(bits::rotate_left32(
(((d ^ a) & b) ^ a)
.wrapping_add(c)
.wrapping_add(x3)
.wrapping_add(0xf4d50d87),
14,
));
b = c.wrapping_add(bits::rotate_left32(
(((c ^ d) & a) ^ d)
.wrapping_add(b)
.wrapping_add(x8)
.wrapping_add(0x455a14ed),
20,
));
a = b.wrapping_add(bits::rotate_left32(
(((b ^ c) & d) ^ c)
.wrapping_add(a)
.wrapping_add(xd)
.wrapping_add(0xa9e3e905),
5,
));
d = a.wrapping_add(bits::rotate_left32(
(((a ^ b) & c) ^ b)
.wrapping_add(d)
.wrapping_add(x2)
.wrapping_add(0xfcefa3f8),
9,
));
c = d.wrapping_add(bits::rotate_left32(
(((d ^ a) & b) ^ a)
.wrapping_add(c)
.wrapping_add(x7)
.wrapping_add(0x676f02d9),
14,
));
b = c.wrapping_add(bits::rotate_left32(
(((c ^ d) & a) ^ d)
.wrapping_add(b)
.wrapping_add(xc)
.wrapping_add(0x8d2a4c8a),
20,
));
a = b.wrapping_add(bits::rotate_left32(
(b ^ c ^ d)
.wrapping_add(a)
.wrapping_add(x5)
.wrapping_add(0xfffa3942),
4,
));
d = a.wrapping_add(bits::rotate_left32(
(a ^ b ^ c)
.wrapping_add(d)
.wrapping_add(x8)
.wrapping_add(0x8771f681),
11,
));
c = d.wrapping_add(bits::rotate_left32(
(d ^ a ^ b)
.wrapping_add(c)
.wrapping_add(xb)
.wrapping_add(0x6d9d6122),
16,
));
b = c.wrapping_add(bits::rotate_left32(
(c ^ d ^ a)
.wrapping_add(b)
.wrapping_add(xe)
.wrapping_add(0xfde5380c),
23,
));
a = b.wrapping_add(bits::rotate_left32(
(b ^ c ^ d)
.wrapping_add(a)
.wrapping_add(x1)
.wrapping_add(0xa4beea44),
4,
));
d = a.wrapping_add(bits::rotate_left32(
(a ^ b ^ c)
.wrapping_add(d)
.wrapping_add(x4)
.wrapping_add(0x4bdecfa9),
11,
));
c = d.wrapping_add(bits::rotate_left32(
(d ^ a ^ b)
.wrapping_add(c)
.wrapping_add(x7)
.wrapping_add(0xf6bb4b60),
16,
));
b = c.wrapping_add(bits::rotate_left32(
(c ^ d ^ a)
.wrapping_add(b)
.wrapping_add(xa)
.wrapping_add(0xbebfbc70),
23,
));
a = b.wrapping_add(bits::rotate_left32(
(b ^ c ^ d)
.wrapping_add(a)
.wrapping_add(xd)
.wrapping_add(0x289b7ec6),
4,
));
d = a.wrapping_add(bits::rotate_left32(
(a ^ b ^ c)
.wrapping_add(d)
.wrapping_add(x0)
.wrapping_add(0xeaa127fa),
11,
));
c = d.wrapping_add(bits::rotate_left32(
(d ^ a ^ b)
.wrapping_add(c)
.wrapping_add(x3)
.wrapping_add(0xd4ef3085),
16,
));
b = c.wrapping_add(bits::rotate_left32(
(c ^ d ^ a)
.wrapping_add(b)
.wrapping_add(x6)
.wrapping_add(0x04881d05),
23,
));
a = b.wrapping_add(bits::rotate_left32(
(b ^ c ^ d)
.wrapping_add(a)
.wrapping_add(x9)
.wrapping_add(0xd9d4d039),
4,
));
d = a.wrapping_add(bits::rotate_left32(
(a ^ b ^ c)
.wrapping_add(d)
.wrapping_add(xc)
.wrapping_add(0xe6db99e5),
11,
));
c = d.wrapping_add(bits::rotate_left32(
(d ^ a ^ b)
.wrapping_add(c)
.wrapping_add(xf)
.wrapping_add(0x1fa27cf8),
16,
));
b = c.wrapping_add(bits::rotate_left32(
(c ^ d ^ a)
.wrapping_add(b)
.wrapping_add(x2)
.wrapping_add(0xc4ac5665),
23,
));
a = b.wrapping_add(bits::rotate_left32(
(c ^ (b | !d))
.wrapping_add(a)
.wrapping_add(x0)
.wrapping_add(0xf4292244),
6,
));
d = a.wrapping_add(bits::rotate_left32(
(b ^ (a | !c))
.wrapping_add(d)
.wrapping_add(x7)
.wrapping_add(0x432aff97),
10,
));
c = d.wrapping_add(bits::rotate_left32(
(a ^ (d | !b))
.wrapping_add(c)
.wrapping_add(xe)
.wrapping_add(0xab9423a7),
15,
));
b = c.wrapping_add(bits::rotate_left32(
(d ^ (c | !a))
.wrapping_add(b)
.wrapping_add(x5)
.wrapping_add(0xfc93a039),
21,
));
a = b.wrapping_add(bits::rotate_left32(
(c ^ (b | !d))
.wrapping_add(a)
.wrapping_add(xc)
.wrapping_add(0x655b59c3),
6,
));
d = a.wrapping_add(bits::rotate_left32(
(b ^ (a | !c))
.wrapping_add(d)
.wrapping_add(x3)
.wrapping_add(0x8f0ccc92),
10,
));
c = d.wrapping_add(bits::rotate_left32(
(a ^ (d | !b))
.wrapping_add(c)
.wrapping_add(xa)
.wrapping_add(0xffeff47d),
15,
));
b = c.wrapping_add(bits::rotate_left32(
(d ^ (c | !a))
.wrapping_add(b)
.wrapping_add(x1)
.wrapping_add(0x85845dd1),
21,
));
a = b.wrapping_add(bits::rotate_left32(
(c ^ (b | !d))
.wrapping_add(a)
.wrapping_add(x8)
.wrapping_add(0x6fa87e4f),
6,
));
d = a.wrapping_add(bits::rotate_left32(
(b ^ (a | !c))
.wrapping_add(d)
.wrapping_add(xf)
.wrapping_add(0xfe2ce6e0),
10,
));
c = d.wrapping_add(bits::rotate_left32(
(a ^ (d | !b))
.wrapping_add(c)
.wrapping_add(x6)
.wrapping_add(0xa3014314),
15,
));
b = c.wrapping_add(bits::rotate_left32(
(d ^ (c | !a))
.wrapping_add(b)
.wrapping_add(xd)
.wrapping_add(0x4e0811a1),
21,
));
a = b.wrapping_add(bits::rotate_left32(
(c ^ (b | !d))
.wrapping_add(a)
.wrapping_add(x4)
.wrapping_add(0xf7537e82),
6,
));
d = a.wrapping_add(bits::rotate_left32(
(b ^ (a | !c))
.wrapping_add(d)
.wrapping_add(xb)
.wrapping_add(0xbd3af235),
10,
));
c = d.wrapping_add(bits::rotate_left32(
(a ^ (d | !b))
.wrapping_add(c)
.wrapping_add(x2)
.wrapping_add(0x2ad7d2bb),
15,
));
b = c.wrapping_add(bits::rotate_left32(
(d ^ (c | !a))
.wrapping_add(b)
.wrapping_add(x9)
.wrapping_add(0xeb86d391),
21,
));
a = a.wrapping_add(aa);
b = b.wrapping_add(bb);
c = c.wrapping_add(cc);
d = d.wrapping_add(dd);
i += md5::BLOCK_SIZE;
}
(state[0], state[1], state[2], state[3]) = (a, b, c, d);
}