32#define ROTLEFT(A, B) ((A << B) | (A >> (32 - B)))
34#define F(X, Y, Z) ((X & Y) | (~X & Z))
35#define G(X, Y, Z) ((X & Z) | (Y & ~Z))
36#define H(X, Y, Z) (X ^ Y ^ Z)
37#define I(X, Y, Z) (Y ^ (X | ~Z))
39#define FF(A, B, C, D, M, S, T) do { A += F(B,C,D) + M + T;\
40 A = B + ROTLEFT(A,S); } while (0)
41#define GG(A, B, C, D, M, S, T) do { A += G(B,C,D) + M + T;\
42 A = B + ROTLEFT(A,S); } while (0)
43#define HH(A, B, C, D, M, S, T) do { A += H(B,C,D) + M + T;\
44 A = B + ROTLEFT(A,S); } while (0)
45#define II(A, B, C, D, M, S, T) do { A += I(B,C,D) + M + T;\
46 A = B + ROTLEFT(A,S); } while (0)
48#ifdef OC_CRYPTO_SUPPORTS_MD5
56 UINT32 A, B, C, D, M[16], Index1, Index2;
63 for (Index1 = 0, Index2 = 0; Index1 < 16; ++Index1, Index2 += 4) {
64 M[Index1] = (Data[Index2]) + (Data[Index2 + 1] << 8)
65 + (Data[Index2 + 2] << 16) + (Data[Index2 + 3] << 24);
73 FF (A, B, C, D, M[0], 7, 0xD76AA478);
74 FF (D, A, B, C, M[1], 12, 0xE8C7B756);
75 FF (C, D, A, B, M[2], 17, 0x242070DB);
76 FF (B, C, D, A, M[3], 22, 0xC1BDCEEE);
77 FF (A, B, C, D, M[4], 7, 0xF57C0FAF);
78 FF (D, A, B, C, M[5], 12, 0x4787C62A);
79 FF (C, D, A, B, M[6], 17, 0xA8304613);
80 FF (B, C, D, A, M[7], 22, 0xFD469501);
81 FF (A, B, C, D, M[8], 7, 0x698098D8);
82 FF (D, A, B, C, M[9], 12, 0x8B44F7AF);
83 FF (C, D, A, B, M[10], 17, 0xFFFF5BB1);
84 FF (B, C, D, A, M[11], 22, 0x895CD7BE);
85 FF (A, B, C, D, M[12], 7, 0x6B901122);
86 FF (D, A, B, C, M[13], 12, 0xFD987193);
87 FF (C, D, A, B, M[14], 17, 0xA679438E);
88 FF (B, C, D, A, M[15], 22, 0x49B40821);
90 GG (A, B, C, D, M[1], 5, 0xF61E2562);
91 GG (D, A, B, C, M[6], 9, 0xC040B340);
92 GG (C, D, A, B, M[11], 14, 0x265E5A51);
93 GG (B, C, D, A, M[0], 20, 0xE9B6C7AA);
94 GG (A, B, C, D, M[5], 5, 0xD62F105D);
95 GG (D, A, B, C, M[10], 9, 0x02441453);
96 GG (C, D, A, B, M[15], 14, 0xD8A1E681);
97 GG (B, C, D, A, M[4], 20, 0xE7D3FBC8);
98 GG (A, B, C, D, M[9], 5, 0x21E1CDE6);
99 GG (D, A, B, C, M[14], 9, 0xC33707D6);
100 GG (C, D, A, B, M[3], 14, 0xF4D50D87);
101 GG (B, C, D, A, M[8], 20, 0x455A14ED);
102 GG (A, B, C, D, M[13], 5, 0xA9E3E905);
103 GG (D, A, B, C, M[2], 9, 0xFCEFA3F8);
104 GG (C, D, A, B, M[7], 14, 0x676F02D9);
105 GG (B, C, D, A, M[12], 20, 0x8D2A4C8A);
107 HH (A, B, C, D, M[5], 4, 0xFFFA3942);
108 HH (D, A, B, C, M[8], 11, 0x8771F681);
109 HH (C, D, A, B, M[11], 16, 0x6D9D6122);
110 HH (B, C, D, A, M[14], 23, 0xFDE5380C);
111 HH (A, B, C, D, M[1], 4, 0xA4BEEA44);
112 HH (D, A, B, C, M[4], 11, 0x4BDECFA9);
113 HH (C, D, A, B, M[7], 16, 0xF6BB4B60);
114 HH (B, C, D, A, M[10], 23, 0xBEBFBC70);
115 HH (A, B, C, D, M[13], 4, 0x289B7EC6);
116 HH (D, A, B, C, M[0], 11, 0xEAA127FA);
117 HH (C, D, A, B, M[3], 16, 0xD4EF3085);
118 HH (B, C, D, A, M[6], 23, 0x04881D05);
119 HH (A, B, C, D, M[9], 4, 0xD9D4D039);
120 HH (D, A, B, C, M[12], 11, 0xE6DB99E5);
121 HH (C, D, A, B, M[15], 16, 0x1FA27CF8);
122 HH (B, C, D, A, M[2], 23, 0xC4AC5665);
124 II (A, B, C, D, M[0], 6, 0xF4292244);
125 II (D, A, B, C, M[7], 10, 0x432AFF97);
126 II (C, D, A, B, M[14], 15, 0xAB9423A7);
127 II (B, C, D, A, M[5], 21, 0xFC93A039);
128 II (A, B, C, D, M[12], 6, 0x655B59C3);
129 II (D, A, B, C, M[3], 10, 0x8F0CCC92);
130 II (C, D, A, B, M[10], 15, 0xFFEFF47D);
131 II (B, C, D, A, M[1], 21, 0x85845DD1);
132 II (A, B, C, D, M[8], 6, 0x6FA87E4F);
133 II (D, A, B, C, M[15], 10, 0xFE2CE6E0);
134 II (C, D, A, B, M[6], 15, 0xA3014314);
135 II (B, C, D, A, M[13], 21, 0x4E0811A1);
136 II (A, B, C, D, M[4], 6, 0xF7537E82);
137 II (D, A, B, C, M[11], 10, 0xBD3AF235);
138 II (C, D, A, B, M[2], 15, 0x2AD7D2BB);
139 II (B, C, D, A, M[9], 21, 0xEB86D391);
154 Ctx->
State[0] = 0x67452301;
155 Ctx->
State[1] = 0xEFCDAB89;
156 Ctx->
State[2] = 0x98BADCFE;
157 Ctx->
State[3] = 0x10325476;
169 for (Index = 0; Index <
Len; ++Index) {
173 Md5Transform (Ctx, Ctx->
Data);
192 Ctx->
Data[Index++] = 0x80;
194 }
else if (Ctx->
DataLen >= 56) {
195 Ctx->
Data[Index++] = 0x80;
197 Md5Transform (Ctx, Ctx->
Data);
213 Md5Transform (Ctx, Ctx->
Data);
219 for (Index = 0; Index < 4; ++Index) {
220 Hash[Index] = (UINT8)((Ctx->
State[0] >> (Index * 8)) & 0x000000FF);
221 Hash[Index + 4] = (UINT8)((Ctx->
State[1] >> (Index * 8)) & 0x000000FF);
222 Hash[Index + 8] = (UINT8)((Ctx->
State[2] >> (Index * 8)) & 0x000000FF);
223 Hash[Index + 12] = (UINT8)((Ctx->
State[3] >> (Index * 8)) & 0x000000FF);
#define HH(A, B, C, D, M, S, T)
#define GG(A, B, C, D, M, S, T)
#define II(A, B, C, D, M, S, T)
#define FF(A, B, C, D, M, S, T)
VOID Md5Init(MD5_CONTEXT *Context)
VOID Md5Final(MD5_CONTEXT *Context, UINT8 *Hash)
VOID Md5(UINT8 *Hash, UINT8 *Data, UINTN Len)
VOID * SecureZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID Md5Update(MD5_CONTEXT *Context, CONST UINT8 *Data, UINTN Len)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)