| 31 | } |
| 32 | |
| 33 | static void md5_process(md_context *ctx, const uchar data[CSUM_CHUNK]) |
| 34 | { |
| 35 | uint32 X[16], A, B, C, D; |
| 36 | |
| 37 | A = ctx->A; |
| 38 | B = ctx->B; |
| 39 | C = ctx->C; |
| 40 | D = ctx->D; |
| 41 | |
| 42 | X[0] = IVALu(data, 0); |
| 43 | X[1] = IVALu(data, 4); |
| 44 | X[2] = IVALu(data, 8); |
| 45 | X[3] = IVALu(data, 12); |
| 46 | X[4] = IVALu(data, 16); |
| 47 | X[5] = IVALu(data, 20); |
| 48 | X[6] = IVALu(data, 24); |
| 49 | X[7] = IVALu(data, 28); |
| 50 | X[8] = IVALu(data, 32); |
| 51 | X[9] = IVALu(data, 36); |
| 52 | X[10] = IVALu(data, 40); |
| 53 | X[11] = IVALu(data, 44); |
| 54 | X[12] = IVALu(data, 48); |
| 55 | X[13] = IVALu(data, 52); |
| 56 | X[14] = IVALu(data, 56); |
| 57 | X[15] = IVALu(data, 60); |
| 58 | |
| 59 | #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) |
| 60 | |
| 61 | #define P(a,b,c,d,k,s,t) a += F(b,c,d) + X[k] + t, a = S(a,s) + b |
| 62 | |
| 63 | #define F(x,y,z) (z ^ (x & (y ^ z))) |
| 64 | |
| 65 | P(A, B, C, D, 0, 7, 0xD76AA478); |
| 66 | P(D, A, B, C, 1, 12, 0xE8C7B756); |
| 67 | P(C, D, A, B, 2, 17, 0x242070DB); |
| 68 | P(B, C, D, A, 3, 22, 0xC1BDCEEE); |
| 69 | P(A, B, C, D, 4, 7, 0xF57C0FAF); |
| 70 | P(D, A, B, C, 5, 12, 0x4787C62A); |
| 71 | P(C, D, A, B, 6, 17, 0xA8304613); |
| 72 | P(B, C, D, A, 7, 22, 0xFD469501); |
| 73 | P(A, B, C, D, 8, 7, 0x698098D8); |
| 74 | P(D, A, B, C, 9, 12, 0x8B44F7AF); |
| 75 | P(C, D, A, B, 10, 17, 0xFFFF5BB1); |
| 76 | P(B, C, D, A, 11, 22, 0x895CD7BE); |
| 77 | P(A, B, C, D, 12, 7, 0x6B901122); |
| 78 | P(D, A, B, C, 13, 12, 0xFD987193); |
| 79 | P(C, D, A, B, 14, 17, 0xA679438E); |
| 80 | P(B, C, D, A, 15, 22, 0x49B40821); |
| 81 | |
| 82 | #undef F |
| 83 | #define F(x,y,z) (y ^ (z & (x ^ y))) |
| 84 | |
| 85 | P(A, B, C, D, 1, 5, 0xF61E2562); |
| 86 | P(D, A, B, C, 6, 9, 0xC040B340); |
| 87 | P(C, D, A, B, 11, 14, 0x265E5A51); |
| 88 | P(B, C, D, A, 0, 20, 0xE9B6C7AA); |
| 89 | P(A, B, C, D, 5, 5, 0xD62F105D); |
| 90 | P(D, A, B, C, 10, 9, 0x02441453); |