1b218965ee3e74ea4321c309aaf860173d8e3881
[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 MD5("abc"). (From "A.5 Test suite" of IETF RFC1321)\r
29 //\r
30 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Md5Digest[MD5_DIGEST_SIZE] = {\r
31   0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72\r
32   };\r
33 \r
34 //\r
35 // Result for SHA-1("abc"). (From "A.1 SHA-1 Example" of NIST FIPS 180-2)\r
36 //\r
37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha1Digest[SHA1_DIGEST_SIZE] = {\r
38   0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,\r
39   0x9c, 0xd0, 0xd8, 0x9d\r
40   };\r
41 \r
42 //\r
43 // Result for SHA-256("abc"). (From "B.1 SHA-256 Example" of NIST FIPS 180-2)\r
44 //\r
45 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 Sha256Digest[SHA256_DIGEST_SIZE] = {\r
46   0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,\r
47   0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad\r
48   };\r
49 \r
50 /**\r
51   Validate UEFI-OpenSSL Digest Interfaces.\r
52 \r
53   @retval  EFI_SUCCESS  Validation succeeded.\r
54   @retval  EFI_ABORTED  Validation failed.\r
55 \r
56 **/\r
57 EFI_STATUS\r
58 ValidateCryptDigest (\r
59   VOID\r
60   )\r
61 {\r
62   UINTN    CtxSize;\r
63   VOID     *HashCtx;\r
64   UINTN    DataSize;\r
65   UINT8    Digest[MAX_DIGEST_SIZE];\r
66   BOOLEAN  Status;\r
67 \r
68   Print (L" UEFI-OpenSSL Hash Engine Testing:\n");\r
69   DataSize = AsciiStrLen (HashData);\r
70 \r
71   Print (L"- MD5:    ");\r
72 \r
73   //\r
74   // MD5 Digest Validation\r
75   //\r
76   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
77   CtxSize = Md5GetContextSize ();\r
78   HashCtx = AllocatePool (CtxSize);\r
79 \r
80   Print (L"Init... ");\r
81   Status  = Md5Init (HashCtx);\r
82   if (!Status) {\r
83     Print (L"[Fail]");\r
84     return EFI_ABORTED;\r
85   }\r
86 \r
87   Print (L"Update... ");\r
88   Status  = Md5Update (HashCtx, HashData, DataSize);\r
89   if (!Status) {\r
90     Print (L"[Fail]");\r
91     return EFI_ABORTED;\r
92   }\r
93 \r
94   Print (L"Finalize... ");\r
95   Status  = Md5Final (HashCtx, Digest);\r
96   if (!Status) {\r
97     Print (L"[Fail]");\r
98     return EFI_ABORTED;\r
99   }\r
100 \r
101   FreePool (HashCtx);\r
102 \r
103   Print (L"Check Value... ");\r
104   if (CompareMem (Digest, Md5Digest, MD5_DIGEST_SIZE) != 0) {\r
105     Print (L"[Fail]");\r
106     return EFI_ABORTED;\r
107   }\r
108 \r
109   Print (L"[Pass]\n");\r
110 \r
111   Print (L"- SHA1:   ");\r
112 \r
113   //\r
114   // SHA-1 Digest Validation\r
115   //\r
116   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
117   CtxSize = Sha1GetContextSize ();\r
118   HashCtx = AllocatePool (CtxSize);\r
119 \r
120   Print (L"Init... ");\r
121   Status  = Sha1Init (HashCtx);\r
122   if (!Status) {\r
123     Print (L"[Fail]");\r
124     return EFI_ABORTED;\r
125   }\r
126 \r
127   Print (L"Update... ");\r
128   Status  = Sha1Update (HashCtx, HashData, DataSize);\r
129   if (!Status) {\r
130     Print (L"[Fail]");\r
131     return EFI_ABORTED;\r
132   }\r
133 \r
134   Print (L"Finalize... ");\r
135   Status  = Sha1Final (HashCtx, Digest);\r
136   if (!Status) {\r
137     Print (L"[Fail]");\r
138     return EFI_ABORTED;\r
139   }\r
140 \r
141   FreePool (HashCtx);\r
142 \r
143   Print (L"Check Value... ");\r
144   if (CompareMem (Digest, Sha1Digest, SHA1_DIGEST_SIZE) != 0) {\r
145     Print (L"[Fail]");\r
146     return EFI_ABORTED;\r
147   }\r
148 \r
149   Print (L"[Pass]\n");\r
150 \r
151   Print (L"- SHA256: ");\r
152 \r
153   //\r
154   // SHA256 Digest Validation\r
155   //\r
156   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
157   CtxSize = Sha256GetContextSize ();\r
158   HashCtx = AllocatePool (CtxSize);\r
159 \r
160   Print (L"Init... ");\r
161   Status  = Sha256Init (HashCtx);\r
162   if (!Status) {\r
163     Print (L"[Fail]");\r
164     return EFI_ABORTED;\r
165   }\r
166 \r
167   Print (L"Update... ");\r
168   Status  = Sha256Update (HashCtx, HashData, DataSize);\r
169   if (!Status) {\r
170     Print (L"[Fail]");\r
171     return EFI_ABORTED;\r
172   }\r
173 \r
174   Print (L"Finalize... ");\r
175   Status  = Sha256Final (HashCtx, Digest);\r
176   if (!Status) {\r
177     Print (L"[Fail]");\r
178     return EFI_ABORTED;\r
179   }\r
180 \r
181   FreePool (HashCtx);\r
182 \r
183   Print (L"Check Value... ");\r
184   if (CompareMem (Digest, Sha256Digest, SHA256_DIGEST_SIZE) != 0) {\r
185     Print (L"[Fail]");\r
186     return EFI_ABORTED;\r
187   }\r
188 \r
189   Print (L"[Pass]\n");\r
190   \r
191   return EFI_SUCCESS;\r
192 }\r