]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Application/Cryptest/BlockCipherVerify.c
SecurityPkg: Remove RngTest Application from SecurityPkg
[mirror_edk2.git] / CryptoPkg / Application / Cryptest / BlockCipherVerify.c
CommitLineData
a8c44645 1/** @file \r
2 Application for Block Cipher Primitives Validation.\r
3\r
4Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Cryptest.h"\r
16\r
17//\r
18// TDES test vectors are extracted from OpenSSL 0.9.8l, crypto\des\destest.c\r
19//\r
20GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbData[] = {\r
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
22 };\r
23\r
24GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbKey[] = {\r
25 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
26 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF\r
27 };\r
28\r
29GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbCipher[] = {\r
30 0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7,\r
31 };\r
32\r
33GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcb2Cipher[] = {\r
34 0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E,\r
35 };\r
36\r
37GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcData[] = {\r
38 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,\r
39 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,\r
40 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20\r
41 };\r
42\r
43GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbcKey[] = {\r
44 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, \r
45 0xf1, 0xe0, 0xd3, 0xc2, 0xb5, 0xa4, 0x97, 0x86,\r
46 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10\r
47 };\r
48\r
49GLOBAL_REMOVE_IF_UNREFERENCED UINT8 TdesCbcIvec[] = {\r
50 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10\r
51 };\r
52\r
53GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesCbc3Cipher[] = {\r
54 0x3F, 0xE3, 0x01, 0xC9, 0x62, 0xAC, 0x01, 0xD0,\r
55 0x22, 0x13, 0x76, 0x3C, 0x1C, 0xBD, 0x4C, 0xDC,\r
56 0x79, 0x96, 0x57, 0xC0, 0x64, 0xEC, 0xF5, 0xD4\r
57 };\r
58\r
59//\r
60// AES test vectors are from NIST KAT of AES\r
61//\r
62GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbData[] = {\r
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
64 };\r
65\r
66GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbKey[] = {\r
67 0x10, 0xa5, 0x88, 0x69, 0xd7, 0x4b, 0xe5, 0xa3, 0x74, 0xcf, 0x86, 0x7c, 0xfb, 0x47, 0x38, 0x59\r
68 };\r
69\r
70GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128EcbCipher[] = {\r
71 0x6d, 0x25, 0x1e, 0x69, 0x44, 0xb0, 0x51, 0xe0, 0x4e, 0xaa, 0x6f, 0xb4, 0xdb, 0xf7, 0x84, 0x65\r
72 };\r
73\r
74GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbData[] = {\r
75 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
76 };\r
77\r
78GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbKey[] = {\r
79 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
80 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\r
81 };\r
82\r
83GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes192EcbCipher[] = {\r
84 0xdd, 0x8a, 0x49, 0x35, 0x14, 0x23, 0x1c, 0xbf, 0x56, 0xec, 0xce, 0xe4, 0xc4, 0x08, 0x89, 0xfb\r
85 };\r
86\r
87GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbData[] = {\r
88 0x01, 0x47, 0x30, 0xf8, 0x0a, 0xc6, 0x25, 0xfe, 0x84, 0xf0, 0x26, 0xc6, 0x0b, 0xfd, 0x54, 0x7d\r
89 };\r
90\r
91GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbKey[] = {\r
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
94 };\r
95\r
96GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes256EcbCipher[] = {\r
97 0x5c, 0x9d, 0x84, 0x4e, 0xd4, 0x6f, 0x98, 0x85, 0x08, 0x5e, 0x5d, 0x6a, 0x4f, 0x94, 0xc7, 0xd7\r
98 };\r
99\r
100GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcData[] = {\r
101 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\r
102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f\r
103 };\r
104\r
105GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcKey[] = {\r
106 0xc2, 0x86, 0x69, 0x6d, 0x88, 0x7c, 0x9a, 0xa0, 0x61, 0x1b, 0xbb, 0x3e, 0x20, 0x25, 0xa4, 0x5a\r
107 };\r
108\r
109GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcIvec[] = {\r
110 0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58\r
111 };\r
112\r
113GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Aes128CbcCipher[] = {\r
114 0xd2, 0x96, 0xcd, 0x94, 0xc2, 0xcc, 0xcf, 0x8a, 0x3a, 0x86, 0x30, 0x28, 0xb5, 0xe1, 0xdc, 0x0a,\r
115 0x75, 0x86, 0x60, 0x2d, 0x25, 0x3c, 0xff, 0xf9, 0x1b, 0x82, 0x66, 0xbe, 0xa6, 0xd6, 0x1a, 0xb1\r
116 };\r
117\r
118//\r
119// ARC4 Test Vector defined in "Appendix A.1 Test Vectors from [CRYPTLIB]" of\r
120// IETF Draft draft-kaukonen-cipher-arcfour-03 ("A Stream Cipher Encryption Algorithm 'Arcfour'").\r
121//\r
122GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Data[] = {\r
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
124 };\r
125\r
126GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Key[] = {\r
127 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF\r
128 };\r
129\r
130GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Cipher[] = {\r
131 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79\r
132 };\r
133\r
134/**\r
135 Validate UEFI-OpenSSL Block Ciphers (Symmetric Crypto) Interfaces.\r
136\r
137 @retval EFI_SUCCESS Validation succeeded.\r
138 @retval EFI_ABORTED Validation failed.\r
139\r
140**/\r
141EFI_STATUS\r
142ValidateCryptBlockCipher (\r
143 VOID\r
144 )\r
145{\r
146 UINTN CtxSize;\r
147 VOID *CipherCtx;\r
148 UINT8 Encrypt[256];\r
149 UINT8 Decrypt[256];\r
150 BOOLEAN Status;\r
151\r
152 Print (L"\nUEFI-OpenSSL Block Cipher Engine Testing: ");\r
153\r
154 CtxSize = TdesGetContextSize ();\r
155 CipherCtx = AllocatePool (CtxSize);\r
156\r
157 Print (L"\n- TDES Validation: ");\r
158\r
159\r
160 Print (L"ECB... ");\r
161\r
162 //\r
163 // TDES ECB Validation\r
164 //\r
165 ZeroMem (Encrypt, sizeof (Encrypt));\r
166 ZeroMem (Decrypt, sizeof (Decrypt));\r
167\r
168 Status = TdesInit (CipherCtx, TdesEcbKey, 64);\r
169 if (!Status) {\r
170 Print (L"[Fail]");\r
171 return EFI_ABORTED;\r
172 }\r
173\r
174 Status = TdesEcbEncrypt (CipherCtx, TdesEcbData, 8, Encrypt);\r
175 if (!Status) {\r
176 Print (L"[Fail]");\r
177 return EFI_ABORTED;\r
178 }\r
179\r
180 Status = TdesEcbDecrypt (CipherCtx, Encrypt, 8, Decrypt);\r
181 if (!Status) {\r
182 Print (L"[Fail]");\r
183 return EFI_ABORTED;\r
184 }\r
185\r
186 if (CompareMem (Encrypt, TdesEcbCipher, 8) != 0) {\r
187 Print (L"[Fail]");\r
188 return EFI_ABORTED;\r
189 }\r
190\r
191 if (CompareMem (Decrypt, TdesEcbData, 8) != 0) {\r
192 Print (L"[Fail]");\r
193 return EFI_ABORTED;\r
194 }\r
195\r
196 Print (L"EDE2 ECB... ");\r
197\r
198 //\r
199 // TDES EDE2 ECB Validation\r
200 //\r
201 ZeroMem (Encrypt, sizeof (Encrypt));\r
202 ZeroMem (Decrypt, sizeof (Decrypt));\r
203\r
204 Status = TdesInit (CipherCtx, TdesEcbKey, 128);\r
205 if (!Status) {\r
206 Print (L"[Fail]");\r
207 return EFI_ABORTED;\r
208 }\r
209\r
210 Status = TdesEcbEncrypt (CipherCtx, TdesEcbData, 8, Encrypt);\r
211 if (!Status) {\r
212 Print (L"[Fail]");\r
213 return EFI_ABORTED;\r
214 }\r
215\r
216 Status = TdesEcbDecrypt (CipherCtx, Encrypt, 8, Decrypt);\r
217 if (!Status) {\r
218 Print (L"[Fail]");\r
219 return EFI_ABORTED;\r
220 }\r
221\r
222 if (CompareMem (Encrypt, TdesEcb2Cipher, 8) != 0) {\r
223 Print (L"[Fail]");\r
224 return EFI_ABORTED;\r
225 } \r
226\r
227 if (CompareMem (Decrypt, TdesEcbData, 8) != 0) {\r
228 Print (L"[Fail]");\r
229 return EFI_ABORTED;\r
230 }\r
231\r
232 Print (L"EDE3 CBC... ");\r
233\r
234 //\r
235 // TDES EDE3 CBC Validation\r
236 //\r
237 ZeroMem (Encrypt, 256);\r
238 ZeroMem (Decrypt, 256);\r
239\r
240 Status = TdesInit (CipherCtx, TdesCbcKey, 192);\r
241 if (!Status) {\r
242 Print (L"[Fail]");\r
243 return EFI_ABORTED;\r
244 }\r
245\r
246 Status = TdesCbcEncrypt (CipherCtx, TdesCbcData, sizeof (TdesCbcData), TdesCbcIvec, Encrypt);\r
247 if (!Status) {\r
248 Print (L"[Fail]");\r
249 return EFI_ABORTED;\r
250 }\r
251\r
252 Status = TdesCbcDecrypt (CipherCtx, Encrypt, sizeof (TdesCbcData), TdesCbcIvec, Decrypt);\r
253 if (!Status) {\r
254 Print (L"[Fail]");\r
255 return EFI_ABORTED;\r
256 }\r
257\r
258 if (CompareMem (Encrypt, TdesCbc3Cipher, sizeof (TdesCbc3Cipher)) != 0) {\r
259 Print (L"[Fail]");\r
260 return EFI_ABORTED;\r
261 }\r
262\r
263 if (CompareMem (Decrypt, TdesCbcData, sizeof (TdesCbcData)) != 0) {\r
264 Print (L"[Fail]");\r
265 return EFI_ABORTED;\r
266 }\r
267\r
268 Print (L"[Pass]");\r
269\r
270 FreePool (CipherCtx);\r
271\r
272 CtxSize = AesGetContextSize ();\r
273 CipherCtx = AllocatePool (CtxSize);\r
274 \r
275 Print (L"\n- AES Validation: ");\r
276\r
277 Print (L"ECB-128... ");\r
278\r
279 //\r
280 // AES-128 ECB Validation\r
281 //\r
282 ZeroMem (Encrypt, sizeof (Encrypt));\r
283 ZeroMem (Decrypt, sizeof (Decrypt));\r
284\r
285 Status = AesInit (CipherCtx, Aes128EcbKey, 128);\r
286 if (!Status) {\r
287 Print (L"[Fail]");\r
288 return EFI_ABORTED;\r
289 }\r
290\r
291 Status = AesEcbEncrypt (CipherCtx, Aes128EcbData, sizeof (Aes128EcbData), Encrypt);\r
292 if (!Status) {\r
293 Print (L"[Fail]");\r
294 return EFI_ABORTED;\r
295 }\r
296\r
297 Status = AesEcbDecrypt (CipherCtx, Encrypt, sizeof (Aes128EcbData), Decrypt);\r
298 if (!Status) {\r
299 Print (L"[Fail]");\r
300 return EFI_ABORTED;\r
301 }\r
302\r
303 if (CompareMem (Encrypt, Aes128EcbCipher, sizeof (Aes128EcbCipher)) != 0) {\r
304 Print (L"[Fail]");\r
305 return EFI_ABORTED;\r
306 } \r
307\r
308 if (CompareMem (Decrypt, Aes128EcbData, sizeof (Aes128EcbData)) != 0) {\r
309 Print (L"[Fail]");\r
310 return EFI_ABORTED;\r
311 }\r
312\r
313 Print (L"ECB-192... ");\r
314\r
315 //\r
316 // AES-192 ECB Validation\r
317 //\r
318 ZeroMem (Encrypt, sizeof (Encrypt));\r
319 ZeroMem (Decrypt, sizeof (Decrypt));\r
320\r
321 Status = AesInit (CipherCtx, Aes192EcbKey, 192);\r
322 if (!Status) {\r
323 Print (L"[Fail]");\r
324 return EFI_ABORTED;\r
325 }\r
326\r
327 Status = AesEcbEncrypt (CipherCtx, Aes192EcbData, sizeof (Aes192EcbData), Encrypt);\r
328 if (!Status) {\r
329 Print (L"[Fail]");\r
330 return EFI_ABORTED;\r
331 }\r
332\r
333 Status = AesEcbDecrypt (CipherCtx, Encrypt, sizeof (Aes192EcbData), Decrypt);\r
334 if (!Status) {\r
335 Print (L"[Fail]");\r
336 return EFI_ABORTED;\r
337 }\r
338\r
339 if (CompareMem (Encrypt, Aes192EcbCipher, sizeof (Aes192EcbCipher)) != 0) {\r
340 Print (L"[Fail]");\r
341 return EFI_ABORTED;\r
342 }\r
343\r
344 if (CompareMem (Decrypt, Aes192EcbData, sizeof (Aes192EcbData)) != 0) {\r
345 Print (L"[Fail]");\r
346 return EFI_ABORTED;\r
347 }\r
348\r
349 Print (L"ECB-256... ");\r
350\r
351 //\r
352 // AES-256 ECB Validation\r
353 //\r
354 ZeroMem (Encrypt, sizeof (Encrypt));\r
355 ZeroMem (Decrypt, sizeof (Decrypt));\r
356\r
357 Status = AesInit (CipherCtx, Aes256EcbKey, 256);\r
358 if (!Status) {\r
359 Print (L"[Fail]");\r
360 return EFI_ABORTED;\r
361 }\r
362\r
363 Status = AesEcbEncrypt (CipherCtx, Aes256EcbData, sizeof (Aes256EcbData), Encrypt);\r
364 if (!Status) {\r
365 Print (L"[Fail]");\r
366 return EFI_ABORTED;\r
367 }\r
368\r
369 Status = AesEcbDecrypt (CipherCtx, Encrypt, sizeof (Aes256EcbData), Decrypt);\r
370 if (!Status) {\r
371 Print (L"[Fail]");\r
372 return EFI_ABORTED;\r
373 }\r
374\r
375 if (CompareMem (Encrypt, Aes256EcbCipher, sizeof (Aes256EcbCipher)) != 0) {\r
376 Print (L"[Fail]");\r
377 return EFI_ABORTED;\r
378 }\r
379\r
380 if (CompareMem (Decrypt, Aes256EcbData, sizeof (Aes256EcbData)) != 0) {\r
381 Print (L"[Fail]");\r
382 return EFI_ABORTED;\r
383 }\r
384\r
385 Print (L"CBC-128... ");\r
386\r
387 //\r
388 // AES-128 CBC Validation\r
389 //\r
390 ZeroMem (Encrypt, sizeof (Encrypt));\r
391 ZeroMem (Decrypt, sizeof (Decrypt));\r
392\r
393 Status = AesInit (CipherCtx, Aes128CbcKey, 128);\r
394 if (!Status) {\r
395 Print (L"[Fail]");\r
396 return EFI_ABORTED;\r
397 }\r
398\r
399 Status = AesCbcEncrypt (CipherCtx, Aes128CbcData, sizeof (Aes128CbcData), Aes128CbcIvec, Encrypt);\r
400 if (!Status) {\r
401 Print (L"[Fail]");\r
402 return EFI_ABORTED;\r
403 }\r
404\r
405 Status = AesCbcDecrypt (CipherCtx, Encrypt, sizeof (Aes128CbcData), Aes128CbcIvec, Decrypt);\r
406 if (!Status) {\r
407 Print (L"[Fail]");\r
408 return EFI_ABORTED;\r
409 }\r
410\r
411 if (CompareMem (Encrypt, Aes128CbcCipher, sizeof (Aes128CbcCipher)) != 0) {\r
412 Print (L"[Fail]");\r
413 return EFI_ABORTED;\r
414 }\r
415\r
416 if (CompareMem (Decrypt, Aes128CbcData, sizeof (Aes128CbcData)) != 0) {\r
417 Print (L"[Fail]");\r
418 return EFI_ABORTED;\r
419 }\r
420\r
421 Print (L"[Pass]");\r
422\r
423 Print (L"\n- ARC4 Validation: ");\r
424\r
425 //\r
426 // ARC4 Validation\r
427 //\r
428 CtxSize = Arc4GetContextSize ();\r
429 CipherCtx = AllocatePool (CtxSize);\r
430\r
431 ZeroMem (Encrypt, sizeof (Encrypt));\r
432 ZeroMem (Decrypt, sizeof (Decrypt));\r
433\r
434 Status = Arc4Init (CipherCtx, Arc4Key, sizeof (Arc4Key));\r
435 if (!Status) {\r
436 Print (L"[Fail]");\r
437 return EFI_ABORTED;\r
438 }\r
439\r
440 Status = Arc4Encrypt (CipherCtx, Arc4Data, sizeof (Arc4Data), Encrypt);\r
441 if (!Status) {\r
442 Print (L"[Fail]");\r
443 return EFI_ABORTED;\r
444 }\r
445\r
446 Status = Arc4Reset (CipherCtx);\r
447 if (!Status) {\r
448 Print (L"[Fail]");\r
449 return EFI_ABORTED;\r
450 }\r
451\r
452 Status = Arc4Decrypt (CipherCtx, Encrypt, sizeof (Arc4Data), Decrypt);\r
453 if (!Status) {\r
454 Print (L"[Fail]");\r
455 return EFI_ABORTED;\r
456 }\r
457\r
458 if (CompareMem (Encrypt, Arc4Cipher, sizeof (Arc4Cipher)) != 0) {\r
459 Print (L"[Fail]");\r
460 return EFI_ABORTED;\r
461 }\r
462\r
463 if (CompareMem (Decrypt, Arc4Data, sizeof (Arc4Data)) != 0) {\r
464 Print (L"[Fail]");\r
465 return EFI_ABORTED;\r
466 }\r
467\r
468 Print (L"[Pass]");\r
469\r
470 Print (L"\n");\r
471\r
472 return EFI_SUCCESS;\r
473}\r