| 57 | } |
| 58 | |
| 59 | void md5_process( md5_context *ctx, uint8 data[64] ) |
| 60 | { |
| 61 | uint32 X[16], A, B, C, D; |
| 62 | |
| 63 | GET_UINT32( X[0], data, 0 ); |
| 64 | GET_UINT32( X[1], data, 4 ); |
| 65 | GET_UINT32( X[2], data, 8 ); |
| 66 | GET_UINT32( X[3], data, 12 ); |
| 67 | GET_UINT32( X[4], data, 16 ); |
| 68 | GET_UINT32( X[5], data, 20 ); |
| 69 | GET_UINT32( X[6], data, 24 ); |
| 70 | GET_UINT32( X[7], data, 28 ); |
| 71 | GET_UINT32( X[8], data, 32 ); |
| 72 | GET_UINT32( X[9], data, 36 ); |
| 73 | GET_UINT32( X[10], data, 40 ); |
| 74 | GET_UINT32( X[11], data, 44 ); |
| 75 | GET_UINT32( X[12], data, 48 ); |
| 76 | GET_UINT32( X[13], data, 52 ); |
| 77 | GET_UINT32( X[14], data, 56 ); |
| 78 | GET_UINT32( X[15], data, 60 ); |
| 79 | |
| 80 | #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) |
| 81 | |
| 82 | #define P(a,b,c,d,k,s,t) \ |
| 83 | { \ |
| 84 | a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ |
| 85 | } |
| 86 | |
| 87 | A = ctx->state[0]; |
| 88 | B = ctx->state[1]; |
| 89 | C = ctx->state[2]; |
| 90 | D = ctx->state[3]; |
| 91 | |
| 92 | #define F(x,y,z) (z ^ (x & (y ^ z))) |
| 93 | |
| 94 | P( A, B, C, D, 0, 7, 0xD76AA478 ); |
| 95 | P( D, A, B, C, 1, 12, 0xE8C7B756 ); |
| 96 | P( C, D, A, B, 2, 17, 0x242070DB ); |
| 97 | P( B, C, D, A, 3, 22, 0xC1BDCEEE ); |
| 98 | P( A, B, C, D, 4, 7, 0xF57C0FAF ); |
| 99 | P( D, A, B, C, 5, 12, 0x4787C62A ); |
| 100 | P( C, D, A, B, 6, 17, 0xA8304613 ); |
| 101 | P( B, C, D, A, 7, 22, 0xFD469501 ); |
| 102 | P( A, B, C, D, 8, 7, 0x698098D8 ); |
| 103 | P( D, A, B, C, 9, 12, 0x8B44F7AF ); |
| 104 | P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); |
| 105 | P( B, C, D, A, 11, 22, 0x895CD7BE ); |
| 106 | P( A, B, C, D, 12, 7, 0x6B901122 ); |
| 107 | P( D, A, B, C, 13, 12, 0xFD987193 ); |
| 108 | P( C, D, A, B, 14, 17, 0xA679438E ); |
| 109 | P( B, C, D, A, 15, 22, 0x49B40821 ); |
| 110 | |
| 111 | #undef F |
| 112 | |
| 113 | #define F(x,y,z) (y ^ (z & (x ^ y))) |
| 114 | |
| 115 | P( A, B, C, D, 1, 5, 0xF61E2562 ); |
| 116 | P( D, A, B, C, 6, 9, 0xC040B340 ); |