• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Application for Hash Primitives Validation.
3 
4 Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include "Cryptest.h"
16 
17 //
18 // Max Known Digest Size is SHA512 Output (64 bytes) by far
19 //
20 #define MAX_DIGEST_SIZE    64
21 
22 //
23 // Message string for digest validation
24 //
25 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HashData = "abc";
26 
27 //
28 // Result for MD4("abc"). (From "A.5 Test suite" of IETF RFC1320)
29 //
30 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md4Digest[MD4_DIGEST_SIZE] = {
31   0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52, 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d
32   };
33 
34 //
35 // Result for MD5("abc"). (From "A.5 Test suite" of IETF RFC1321)
36 //
37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md5Digest[MD5_DIGEST_SIZE] = {
38   0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72
39   };
40 
41 //
42 // Result for SHA-1("abc"). (From "A.1 SHA-1 Example" of NIST FIPS 180-2)
43 //
44 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha1Digest[SHA1_DIGEST_SIZE] = {
45   0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,
46   0x9c, 0xd0, 0xd8, 0x9d
47   };
48 
49 //
50 // Result for SHA-256("abc"). (From "B.1 SHA-256 Example" of NIST FIPS 180-2)
51 //
52 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha256Digest[SHA256_DIGEST_SIZE] = {
53   0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
54   0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
55   };
56 
57 //
58 // Result for SHA-384("abc"). (From "D.1 SHA-384 Example" of NIST FIPS 180-2)
59 //
60 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha384Digest[SHA384_DIGEST_SIZE] = {
61   0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
62   0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63, 0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
63   0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7
64   };
65 
66 //
67 // Result for SHA-512("abc"). (From "C.1 SHA-512 Example" of NIST FIPS 180-2)
68 //
69 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha512Digest[SHA512_DIGEST_SIZE] = {
70   0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
71   0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
72   0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
73   0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f
74   };
75 
76 /**
77   Validate UEFI-OpenSSL Digest Interfaces.
78 
79   @retval  EFI_SUCCESS  Validation succeeded.
80   @retval  EFI_ABORTED  Validation failed.
81 
82 **/
83 EFI_STATUS
ValidateCryptDigest(VOID)84 ValidateCryptDigest (
85   VOID
86   )
87 {
88   UINTN    CtxSize;
89   VOID     *HashCtx;
90   UINTN    DataSize;
91   UINT8    Digest[MAX_DIGEST_SIZE];
92   BOOLEAN  Status;
93 
94   Print (L" UEFI-OpenSSL Hash Engine Testing:\n");
95   DataSize = AsciiStrLen (HashData);
96 
97   Print (L"- MD4:    ");
98 
99   //
100   // MD4 Digest Validation
101   //
102   ZeroMem (Digest, MAX_DIGEST_SIZE);
103   CtxSize = Md4GetContextSize ();
104   HashCtx = AllocatePool (CtxSize);
105 
106   Print (L"Init... ");
107   Status  = Md4Init (HashCtx);
108   if (!Status) {
109     Print (L"[Fail]");
110     return EFI_ABORTED;
111   }
112 
113   Print (L"Update... ");
114   Status  = Md4Update (HashCtx, HashData, DataSize);
115   if (!Status) {
116     Print (L"[Fail]");
117     return EFI_ABORTED;
118   }
119 
120   Print (L"Finalize... ");
121   Status  = Md4Final (HashCtx, Digest);
122   if (!Status) {
123     Print (L"[Fail]");
124     return EFI_ABORTED;
125   }
126 
127   FreePool (HashCtx);
128 
129   Print (L"Check Value... ");
130   if (CompareMem (Digest, Md4Digest, MD4_DIGEST_SIZE) != 0) {
131     Print (L"[Fail]");
132     return EFI_ABORTED;
133   }
134 
135   Print (L"HashAll... ");
136   ZeroMem (Digest, MD5_DIGEST_SIZE);
137   Status  = Md4HashAll (HashData, DataSize, Digest);
138   if (!Status) {
139     Print (L"[Fail]");
140     return EFI_ABORTED;
141   }
142   if (CompareMem (Digest, Md4Digest, MD4_DIGEST_SIZE) != 0) {
143     Print (L"[Fail]");
144     return EFI_ABORTED;
145   }
146 
147   Print (L"[Pass]\n");
148 
149   Print (L"- MD5:    ");
150 
151   //
152   // MD5 Digest Validation
153   //
154   ZeroMem (Digest, MAX_DIGEST_SIZE);
155   CtxSize = Md5GetContextSize ();
156   HashCtx = AllocatePool (CtxSize);
157 
158   Print (L"Init... ");
159   Status  = Md5Init (HashCtx);
160   if (!Status) {
161     Print (L"[Fail]");
162     return EFI_ABORTED;
163   }
164 
165   Print (L"Update... ");
166   Status  = Md5Update (HashCtx, HashData, DataSize);
167   if (!Status) {
168     Print (L"[Fail]");
169     return EFI_ABORTED;
170   }
171 
172   Print (L"Finalize... ");
173   Status  = Md5Final (HashCtx, Digest);
174   if (!Status) {
175     Print (L"[Fail]");
176     return EFI_ABORTED;
177   }
178 
179   FreePool (HashCtx);
180 
181   Print (L"Check Value... ");
182   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {
183     Print (L"[Fail]");
184     return EFI_ABORTED;
185   }
186 
187   Print (L"HashAll... ");
188   ZeroMem (Digest, MD5_DIGEST_SIZE);
189   Status  = Md5HashAll (HashData, DataSize, Digest);
190   if (!Status) {
191     Print (L"[Fail]");
192     return EFI_ABORTED;
193   }
194   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {
195     Print (L"[Fail]");
196     return EFI_ABORTED;
197   }
198 
199   Print (L"[Pass]\n");
200 
201   Print (L"- SHA1:   ");
202 
203   //
204   // SHA-1 Digest Validation
205   //
206   ZeroMem (Digest, MAX_DIGEST_SIZE);
207   CtxSize = Sha1GetContextSize ();
208   HashCtx = AllocatePool (CtxSize);
209 
210   Print (L"Init... ");
211   Status  = Sha1Init (HashCtx);
212   if (!Status) {
213     Print (L"[Fail]");
214     return EFI_ABORTED;
215   }
216 
217   Print (L"Update... ");
218   Status  = Sha1Update (HashCtx, HashData, DataSize);
219   if (!Status) {
220     Print (L"[Fail]");
221     return EFI_ABORTED;
222   }
223 
224   Print (L"Finalize... ");
225   Status  = Sha1Final (HashCtx, Digest);
226   if (!Status) {
227     Print (L"[Fail]");
228     return EFI_ABORTED;
229   }
230 
231   FreePool (HashCtx);
232 
233   Print (L"Check Value... ");
234   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {
235     Print (L"[Fail]");
236     return EFI_ABORTED;
237   }
238 
239   Print (L"HashAll... ");
240   ZeroMem (Digest, SHA1_DIGEST_SIZE);
241   Status  = Sha1HashAll (HashData, DataSize, Digest);
242   if (!Status) {
243     Print (L"[Fail]");
244     return EFI_ABORTED;
245   }
246   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {
247     Print (L"[Fail]");
248     return EFI_ABORTED;
249   }
250 
251   Print (L"[Pass]\n");
252 
253   Print (L"- SHA256: ");
254 
255   //
256   // SHA256 Digest Validation
257   //
258   ZeroMem (Digest, MAX_DIGEST_SIZE);
259   CtxSize = Sha256GetContextSize ();
260   HashCtx = AllocatePool (CtxSize);
261 
262   Print (L"Init... ");
263   Status  = Sha256Init (HashCtx);
264   if (!Status) {
265     Print (L"[Fail]");
266     return EFI_ABORTED;
267   }
268 
269   Print (L"Update... ");
270   Status  = Sha256Update (HashCtx, HashData, DataSize);
271   if (!Status) {
272     Print (L"[Fail]");
273     return EFI_ABORTED;
274   }
275 
276   Print (L"Finalize... ");
277   Status  = Sha256Final (HashCtx, Digest);
278   if (!Status) {
279     Print (L"[Fail]");
280     return EFI_ABORTED;
281   }
282 
283   FreePool (HashCtx);
284 
285   Print (L"Check Value... ");
286   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {
287     Print (L"[Fail]");
288     return EFI_ABORTED;
289   }
290 
291   Print (L"HashAll... ");
292   ZeroMem (Digest, SHA256_DIGEST_SIZE);
293   Status  = Sha256HashAll (HashData, DataSize, Digest);
294   if (!Status) {
295     Print (L"[Fail]");
296     return EFI_ABORTED;
297   }
298   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {
299     Print (L"[Fail]");
300     return EFI_ABORTED;
301   }
302 
303   Print (L"[Pass]\n");
304 
305   Print (L"- SHA384: ");
306 
307   //
308   // SHA384 Digest Validation
309   //
310   ZeroMem (Digest, MAX_DIGEST_SIZE);
311   CtxSize = Sha384GetContextSize ();
312   HashCtx = AllocatePool (CtxSize);
313 
314   Print (L"Init... ");
315   Status  = Sha384Init (HashCtx);
316   if (!Status) {
317     Print (L"[Fail]");
318     return EFI_ABORTED;
319   }
320 
321   Print (L"Update... ");
322   Status  = Sha384Update (HashCtx, HashData, DataSize);
323   if (!Status) {
324     Print (L"[Fail]");
325     return EFI_ABORTED;
326   }
327 
328   Print (L"Finalize... ");
329   Status  = Sha384Final (HashCtx, Digest);
330   if (!Status) {
331     Print (L"[Fail]");
332     return EFI_ABORTED;
333   }
334 
335   FreePool (HashCtx);
336 
337   Print (L"Check Value... ");
338   if (CompareMem (Digest, Sha384Digest, SHA384_DIGEST_SIZE) != 0) {
339     Print (L"[Fail]");
340     return EFI_ABORTED;
341   }
342 
343   Print (L"HashAll... ");
344   ZeroMem (Digest, SHA384_DIGEST_SIZE);
345   Status  = Sha384HashAll (HashData, DataSize, Digest);
346   if (!Status) {
347     Print (L"[Fail]");
348     return EFI_ABORTED;
349   }
350   if (CompareMem (Digest, Sha384Digest, SHA384_DIGEST_SIZE) != 0) {
351     Print (L"[Fail]");
352     return EFI_ABORTED;
353   }
354 
355   Print (L"[Pass]\n");
356 
357   Print (L"- SHA512: ");
358 
359   //
360   // SHA512 Digest Validation
361   //
362   ZeroMem (Digest, MAX_DIGEST_SIZE);
363   CtxSize = Sha512GetContextSize ();
364   HashCtx = AllocatePool (CtxSize);
365 
366   Print (L"Init... ");
367   Status  = Sha512Init (HashCtx);
368   if (!Status) {
369     Print (L"[Fail]");
370     return EFI_ABORTED;
371   }
372 
373   Print (L"Update... ");
374   Status  = Sha512Update (HashCtx, HashData, DataSize);
375   if (!Status) {
376     Print (L"[Fail]");
377     return EFI_ABORTED;
378   }
379 
380   Print (L"Finalize... ");
381   Status  = Sha512Final (HashCtx, Digest);
382   if (!Status) {
383     Print (L"[Fail]");
384     return EFI_ABORTED;
385   }
386 
387   FreePool (HashCtx);
388 
389   Print (L"Check Value... ");
390   if (CompareMem (Digest, Sha512Digest, SHA512_DIGEST_SIZE) != 0) {
391     Print (L"[Fail]");
392     return EFI_ABORTED;
393   }
394 
395   Print (L"HashAll... ");
396   ZeroMem (Digest, SHA512_DIGEST_SIZE);
397   Status  = Sha512HashAll (HashData, DataSize, Digest);
398   if (!Status) {
399     Print (L"[Fail]");
400     return EFI_ABORTED;
401   }
402   if (CompareMem (Digest, Sha512Digest, SHA512_DIGEST_SIZE) != 0) {
403     Print (L"[Fail]");
404     return EFI_ABORTED;
405   }
406 
407   Print (L"[Pass]\n");
408 
409   return EFI_SUCCESS;
410 }
411