1. Add new API supports for PEM & X509 key retrieving & verification;
[mirror_edk2.git] / CryptoPkg / Application / Cryptest / HashVerify.c
1 /** @file  \r
2   Application for Hash 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 // Max Known Digest Size is SHA512 Output (64 bytes) by far\r
19 //\r
20 #define MAX_DIGEST_SIZE    64\r
21 \r
22 //\r
23 // Message string for digest validation\r
24 //\r
25 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HashData = "abc";\r
26 \r
27 //\r
28 // Result for MD4("abc"). (From "A.5 Test suite" of IETF RFC1320)\r
29 //\r
30 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md4Digest[MD4_DIGEST_SIZE] = {\r
31   0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52, 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d\r
32   };\r
33 \r
34 //\r
35 // Result for MD5("abc"). (From "A.5 Test suite" of IETF RFC1321)\r
36 //\r
37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md5Digest[MD5_DIGEST_SIZE] = {\r
38   0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72\r
39   };\r
40 \r
41 //\r
42 // Result for SHA-1("abc"). (From "A.1 SHA-1 Example" of NIST FIPS 180-2)\r
43 //\r
44 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha1Digest[SHA1_DIGEST_SIZE] = {\r
45   0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,\r
46   0x9c, 0xd0, 0xd8, 0x9d\r
47   };\r
48 \r
49 //\r
50 // Result for SHA-256("abc"). (From "B.1 SHA-256 Example" of NIST FIPS 180-2)\r
51 //\r
52 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha256Digest[SHA256_DIGEST_SIZE] = {\r
53   0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,\r
54   0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad\r
55   };\r
56 \r
57 /**\r
58   Validate UEFI-OpenSSL Digest Interfaces.\r
59 \r
60   @retval  EFI_SUCCESS  Validation succeeded.\r
61   @retval  EFI_ABORTED  Validation failed.\r
62 \r
63 **/\r
64 EFI_STATUS\r
65 ValidateCryptDigest (\r
66   VOID\r
67   )\r
68 {\r
69   UINTN    CtxSize;\r
70   VOID     *HashCtx;\r
71   UINTN    DataSize;\r
72   UINT8    Digest[MAX_DIGEST_SIZE];\r
73   BOOLEAN  Status;\r
74 \r
75   Print (L" UEFI-OpenSSL Hash Engine Testing:\n");\r
76   DataSize = AsciiStrLen (HashData);\r
77 \r
78   Print (L"- MD4:    ");\r
79   \r
80   //\r
81   // MD4 Digest Validation\r
82   //\r
83   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
84   CtxSize = Md4GetContextSize ();\r
85   HashCtx = AllocatePool (CtxSize);\r
86 \r
87   Print (L"Init... ");\r
88   Status  = Md4Init (HashCtx);\r
89   if (!Status) {\r
90     Print (L"[Fail]");\r
91     return EFI_ABORTED;\r
92   }\r
93 \r
94   Print (L"Update... ");\r
95   Status  = Md4Update (HashCtx, HashData, DataSize);\r
96   if (!Status) {\r
97     Print (L"[Fail]");\r
98     return EFI_ABORTED;\r
99   }\r
100 \r
101   Print (L"Finalize... ");\r
102   Status  = Md4Final (HashCtx, Digest);\r
103   if (!Status) {\r
104     Print (L"[Fail]");\r
105     return EFI_ABORTED;\r
106   }\r
107 \r
108   FreePool (HashCtx);\r
109 \r
110   Print (L"Check Value... ");\r
111   if (CompareMem (Digest, Md4Digest, MD5_DIGEST_SIZE) != 0) {\r
112     Print (L"[Fail]");\r
113     return EFI_ABORTED;\r
114   }\r
115 \r
116   Print (L"[Pass]\n");\r
117 \r
118   Print (L"- MD5:    ");\r
119 \r
120   //\r
121   // MD5 Digest Validation\r
122   //\r
123   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
124   CtxSize = Md5GetContextSize ();\r
125   HashCtx = AllocatePool (CtxSize);\r
126 \r
127   Print (L"Init... ");\r
128   Status  = Md5Init (HashCtx);\r
129   if (!Status) {\r
130     Print (L"[Fail]");\r
131     return EFI_ABORTED;\r
132   }\r
133 \r
134   Print (L"Update... ");\r
135   Status  = Md5Update (HashCtx, HashData, DataSize);\r
136   if (!Status) {\r
137     Print (L"[Fail]");\r
138     return EFI_ABORTED;\r
139   }\r
140 \r
141   Print (L"Finalize... ");\r
142   Status  = Md5Final (HashCtx, Digest);\r
143   if (!Status) {\r
144     Print (L"[Fail]");\r
145     return EFI_ABORTED;\r
146   }\r
147 \r
148   FreePool (HashCtx);\r
149 \r
150   Print (L"Check Value... ");\r
151   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {\r
152     Print (L"[Fail]");\r
153     return EFI_ABORTED;\r
154   }\r
155 \r
156   Print (L"[Pass]\n");\r
157 \r
158   Print (L"- SHA1:   ");\r
159 \r
160   //\r
161   // SHA-1 Digest Validation\r
162   //\r
163   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
164   CtxSize = Sha1GetContextSize ();\r
165   HashCtx = AllocatePool (CtxSize);\r
166 \r
167   Print (L"Init... ");\r
168   Status  = Sha1Init (HashCtx);\r
169   if (!Status) {\r
170     Print (L"[Fail]");\r
171     return EFI_ABORTED;\r
172   }\r
173 \r
174   Print (L"Update... ");\r
175   Status  = Sha1Update (HashCtx, HashData, DataSize);\r
176   if (!Status) {\r
177     Print (L"[Fail]");\r
178     return EFI_ABORTED;\r
179   }\r
180 \r
181   Print (L"Finalize... ");\r
182   Status  = Sha1Final (HashCtx, Digest);\r
183   if (!Status) {\r
184     Print (L"[Fail]");\r
185     return EFI_ABORTED;\r
186   }\r
187 \r
188   FreePool (HashCtx);\r
189 \r
190   Print (L"Check Value... ");\r
191   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {\r
192     Print (L"[Fail]");\r
193     return EFI_ABORTED;\r
194   }\r
195 \r
196   Print (L"[Pass]\n");\r
197 \r
198   Print (L"- SHA256: ");\r
199 \r
200   //\r
201   // SHA256 Digest Validation\r
202   //\r
203   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
204   CtxSize = Sha256GetContextSize ();\r
205   HashCtx = AllocatePool (CtxSize);\r
206 \r
207   Print (L"Init... ");\r
208   Status  = Sha256Init (HashCtx);\r
209   if (!Status) {\r
210     Print (L"[Fail]");\r
211     return EFI_ABORTED;\r
212   }\r
213 \r
214   Print (L"Update... ");\r
215   Status  = Sha256Update (HashCtx, HashData, DataSize);\r
216   if (!Status) {\r
217     Print (L"[Fail]");\r
218     return EFI_ABORTED;\r
219   }\r
220 \r
221   Print (L"Finalize... ");\r
222   Status  = Sha256Final (HashCtx, Digest);\r
223   if (!Status) {\r
224     Print (L"[Fail]");\r
225     return EFI_ABORTED;\r
226   }\r
227 \r
228   FreePool (HashCtx);\r
229 \r
230   Print (L"Check Value... ");\r
231   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {\r
232     Print (L"[Fail]");\r
233     return EFI_ABORTED;\r
234   }\r
235 \r
236   Print (L"[Pass]\n");\r
237   \r
238   return EFI_SUCCESS;\r
239 }\r