]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / Md5.c
CommitLineData
6a690e23 1/*++\r
2\r
7a444476 3Copyright (c) 2004 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
6a690e23 11\r
12Module Name:\r
13\r
14 Md5.c\r
15\r
16Abstract:\r
17\r
18 Implementation of MD5 algorithm\r
19\r
20--*/\r
21\r
22#include "Md5.h"\r
23\r
24STATIC CONST UINT32 MD5_K[][2] = {\r
25 { 0, 1 },\r
26 { 1, 5 },\r
27 { 5, 3 },\r
28 { 0, 7 }\r
29};\r
30\r
31STATIC CONST UINT32 MD5_S[][4] = {\r
32 { 7, 22, 17, 12 },\r
33 { 5, 20, 14, 9 },\r
34 { 4, 23, 16 ,11 },\r
35 { 6, 21, 15, 10 },\r
36};\r
37\r
38STATIC CONST UINT32 MD5_T[] = {\r
39 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,\r
40 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,\r
41 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,\r
42 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,\r
43 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,\r
44 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,\r
45 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,\r
46 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,\r
47 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,\r
48 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,\r
49 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,\r
50 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,\r
51 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,\r
52 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,\r
53 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,\r
54 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391\r
55};\r
56\r
57STATIC CONST UINT8 Md5HashPadding[] =\r
58{\r
59 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
61 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
62 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
74 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \r
75};\r
76\r
77//\r
78// ROTATE_LEFT rotates x left n bits.\r
79//\r
80#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))\r
81\r
82#define SA S[j & 3]\r
83#define SB S[(j + 1) & 3]\r
84#define SC S[(j + 2) & 3]\r
85#define SD S[(j + 3) & 3]\r
86\r
87//\r
88// TF1, TF2, TF3, TF4 are basic MD5 transform functions\r
89//\r
90UINT32 TF1 (UINT32 A, UINT32 B, UINT32 C)\r
91{\r
92 return (A & B) | (~A & C);\r
93}\r
94\r
95UINT32 TF2 (UINT32 A, UINT32 B, UINT32 C)\r
96{\r
97 return (A & C) | (B & ~C);\r
98}\r
99\r
100UINT32 TF3 (UINT32 A, UINT32 B, UINT32 C)\r
101{\r
102 return A ^ B ^ C;\r
103}\r
104\r
105UINT32 TF4 (UINT32 A, UINT32 B, UINT32 C)\r
106{\r
107 return B ^ (A | ~C);\r
108}\r
109\r
110typedef\r
111UINT32\r
112(*MD5_TRANSFORM_FUNC) (\r
113 IN UINT32 A,\r
114 IN UINT32 B,\r
115 IN UINT32 C\r
116 );\r
117\r
118STATIC CONST MD5_TRANSFORM_FUNC MD5_F[] = {\r
119 TF1,\r
120 TF2,\r
121 TF3,\r
122 TF4\r
123};\r
124\r
125STATIC\r
126VOID\r
127MD5Transform (\r
128 IN MD5_CTX *Md5Ctx\r
129 )\r
130/*++\r
131\r
132Routine Description:\r
133\r
134 GC_TODO: Add function description\r
135\r
136Arguments:\r
137\r
138 Md5Ctx - GC_TODO: add argument description\r
139\r
140Returns:\r
141\r
142 GC_TODO: add return values\r
143\r
144--*/\r
145{\r
146 UINT32 i;\r
147 UINT32 j;\r
148 UINT32 S[MD5_HASHSIZE >> 2];\r
149 UINT32 *X;\r
150 UINT32 k;\r
151 UINT32 t;\r
152\r
153 X = (UINT32 *) Md5Ctx->M;\r
154\r
155 //\r
156 // Copy MD5 states to S\r
157 //\r
e48e37fc 158 CopyMem (S, Md5Ctx->States, MD5_HASHSIZE);\r
6a690e23 159\r
160 t = 0;\r
161 for (i = 0; i < 4; i++) {\r
162 k = MD5_K[i][0];\r
163 for (j = 16; j > 0; j--) {\r
164 SA += (*MD5_F[i]) (SB, SC, SD) + X[k] + MD5_T[t];\r
165 SA = ROTATE_LEFT (SA, MD5_S[i][j & 3]);\r
166 SA += SB;\r
167\r
168 k += MD5_K[i][1];\r
169 k &= 15;\r
170\r
171 t++;\r
172 }\r
173 }\r
174\r
175 for (i = 0; i < 4; i++) {\r
176 Md5Ctx->States[i] += S[i];\r
177 }\r
178}\r
179\r
180STATIC\r
181VOID\r
182MD5UpdateBlock (\r
183 IN MD5_CTX *Md5Ctx,\r
184 IN CONST UINT8 *Data,\r
185 IN UINTN DataLen\r
186 )\r
187/*++\r
188\r
189Routine Description:\r
190\r
191 GC_TODO: Add function description\r
192\r
193Arguments:\r
194\r
195 Md5Ctx - GC_TODO: add argument description\r
196 Data - GC_TODO: add argument description\r
197 DataLen - GC_TODO: add argument description\r
198\r
199Returns:\r
200\r
201 GC_TODO: add return values\r
202\r
203--*/\r
204{\r
205 UINTN Limit;\r
206\r
207 for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) {\r
e48e37fc 208 CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);\r
6a690e23 209 MD5Transform (Md5Ctx);\r
210 \r
211 Md5Ctx->Count = 0;\r
212 Data += Limit;\r
213 DataLen -= Limit;\r
214 }\r
215\r
e48e37fc 216 CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);\r
6a690e23 217 Md5Ctx->Count += DataLen;\r
218}\r
219\r
220EFI_STATUS\r
221MD5Init (\r
222 IN MD5_CTX *Md5Ctx\r
223 )\r
224/*++\r
225\r
226Routine Description:\r
227\r
228 GC_TODO: Add function description\r
229\r
230Arguments:\r
231\r
232 Md5Ctx - GC_TODO: add argument description\r
233\r
234Returns:\r
235\r
236 EFI_SUCCESS - GC_TODO: Add description for return value\r
237\r
238--*/\r
239{\r
e48e37fc 240 ZeroMem (Md5Ctx, sizeof (*Md5Ctx));\r
6a690e23 241\r
242 //\r
243 // Set magic initialization constants.\r
244 //\r
245 Md5Ctx->States[0] = 0x67452301;\r
246 Md5Ctx->States[1] = 0xefcdab89;\r
247 Md5Ctx->States[2] = 0x98badcfe;\r
248 Md5Ctx->States[3] = 0x10325476; \r
249\r
250 return EFI_SUCCESS;\r
251}\r
252\r
253EFI_STATUS\r
254MD5Update (\r
255 IN MD5_CTX *Md5Ctx,\r
256 IN VOID *Data,\r
257 IN UINTN DataLen\r
258 )\r
259/*++\r
260\r
261Routine Description:\r
262\r
263 GC_TODO: Add function description\r
264\r
265Arguments:\r
266\r
267 Md5Ctx - GC_TODO: add argument description\r
268 Data - GC_TODO: add argument description\r
269 DataLen - GC_TODO: add argument description\r
270\r
271Returns:\r
272\r
273 EFI_SUCCESS - GC_TODO: Add description for return value\r
274\r
275--*/\r
276{\r
277 if (EFI_ERROR (Md5Ctx->Status)) {\r
278 return Md5Ctx->Status;\r
279 }\r
280\r
281 MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);\r
282 Md5Ctx->Length += DataLen;\r
283 return EFI_SUCCESS;\r
284}\r
285\r
286EFI_STATUS\r
287MD5Final (\r
288 IN MD5_CTX *Md5Ctx,\r
289 OUT UINT8 *HashVal\r
290 )\r
291/*++\r
292\r
293Routine Description:\r
294\r
295 GC_TODO: Add function description\r
296\r
297Arguments:\r
298\r
299 Md5Ctx - GC_TODO: add argument description\r
300 HashVal - GC_TODO: add argument description\r
301\r
302Returns:\r
303\r
304 EFI_SUCCESS - GC_TODO: Add description for return value\r
305\r
306--*/\r
307{\r
308 UINTN PadLength;\r
309\r
310 if (Md5Ctx->Status == EFI_ALREADY_STARTED) {\r
311 //\r
312 // Store Hashed value & Zeroize sensitive context information.\r
313 //\r
e48e37fc 314 CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);\r
315 ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));\r
6a690e23 316 \r
317 return EFI_SUCCESS;\r
318 }\r
319\r
320 if (EFI_ERROR (Md5Ctx->Status)) {\r
321 return Md5Ctx->Status;\r
322 }\r
323\r
324 PadLength = Md5Ctx->Count >= 56 ? 120 : 56;\r
325 PadLength -= Md5Ctx->Count;\r
326 MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);\r
327 Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);\r
328 MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);\r
329\r
e48e37fc 330 ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));\r
6a690e23 331 Md5Ctx->Length = 0;\r
332 Md5Ctx->Status = EFI_ALREADY_STARTED;\r
333 return MD5Final (Md5Ctx, HashVal);\r
334}\r
335\r