CryptoPkg: Add new API to retrieve commonName of X.509 certificate
[mirror_edk2.git] / CryptoPkg / Application / Cryptest / BlockCipherVerify.c
1 /** @file  \r
2   Application for Block Cipher Primitives Validation.\r
3 \r
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT 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
20 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbData[] = {\r
21   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
22   };\r
23 \r
24 GLOBAL_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
29 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcbCipher[] = {\r
30   0x8C, 0xA6, 0x4D, 0xE9, 0xC1, 0xB1, 0x23, 0xA7,\r
31   };\r
32 \r
33 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 TdesEcb2Cipher[] = {\r
34   0x92, 0x95, 0xB5, 0x9B, 0xB3, 0x84, 0x73, 0x6E,\r
35   };\r
36 \r
37 GLOBAL_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
43 GLOBAL_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
49 GLOBAL_REMOVE_IF_UNREFERENCED UINT8 TdesCbcIvec[] = {\r
50   0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10\r
51   };\r
52 \r
53 GLOBAL_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
62 GLOBAL_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
66 GLOBAL_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
70 GLOBAL_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
74 GLOBAL_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
78 GLOBAL_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
83 GLOBAL_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
87 GLOBAL_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
91 GLOBAL_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
96 GLOBAL_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
100 GLOBAL_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
105 GLOBAL_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
109 GLOBAL_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
113 GLOBAL_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
122 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Data[] = {\r
123   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
124   };\r
125 \r
126 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Arc4Key[] = {\r
127   0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF\r
128   };\r
129 \r
130 GLOBAL_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
141 EFI_STATUS\r
142 ValidateCryptBlockCipher (\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