CryptoPkg: Add HMAC-SHA256 cipher support
[mirror_edk2.git] / CryptoPkg / Application / Cryptest / HmacVerify.c
1 /** @file  \r
2   Application for HMAC Primitives Validation.\r
3 \r
4 Copyright (c) 2010 - 2016, 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 // Data string for HMAC validation\r
24 //\r
25 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HmacData = "Hi There";\r
26 \r
27 //\r
28 // Key value for HMAC-MD5 validation. (From "2. Test Cases for HMAC-MD5" of IETF RFC2202)\r
29 //\r
30 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Key[16] = {\r
31   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b\r
32   };\r
33 \r
34 //\r
35 // Result for HMAC-MD5("Hi There"). (From "2. Test Cases for HMAC-MD5" of IETF RFC2202)\r
36 //\r
37 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Digest[] = {\r
38   0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d\r
39   };\r
40 \r
41 //\r
42 // Key value for HMAC-SHA-1 validation. (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202)\r
43 //\r
44 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Key[20] = {\r
45   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,\r
46   0x0b, 0x0b, 0x0b, 0x0b\r
47   };\r
48 \r
49 //\r
50 // Result for HMAC-SHA-1 ("Hi There"). (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202)\r
51 //\r
52 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Digest[] = {\r
53   0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e,\r
54   0xf1, 0x46, 0xbe, 0x00\r
55   };\r
56 \r
57 //\r
58 // Key value for HMAC-SHA-256 validation. (From "4. Test Vectors" of IETF RFC4231)\r
59 //\r
60 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha256Key[20] = {\r
61   0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,\r
62   0x0b, 0x0b, 0x0b, 0x0b\r
63   };\r
64 \r
65 //\r
66 // Result for HMAC-SHA-256 ("Hi There"). (From "4. Test Vectors" of IETF RFC4231)\r
67 //\r
68 GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha256Digest[] = {\r
69   0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b,\r
70   0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7\r
71   };\r
72 \r
73 /**\r
74   Validate UEFI-OpenSSL Message Authentication Codes Interfaces.\r
75 \r
76   @retval  EFI_SUCCESS  Validation succeeded.\r
77   @retval  EFI_ABORTED  Validation failed.\r
78 \r
79 **/\r
80 EFI_STATUS\r
81 ValidateCryptHmac (\r
82   VOID\r
83   )\r
84 {\r
85   UINTN    CtxSize;\r
86   VOID     *HmacCtx;\r
87   UINT8    Digest[MAX_DIGEST_SIZE];\r
88   BOOLEAN  Status;\r
89 \r
90   Print (L" \nUEFI-OpenSSL HMAC Engine Testing:\n");\r
91 \r
92   Print (L"- HMAC-MD5:    ");\r
93 \r
94   //\r
95   // HMAC-MD5 Digest Validation\r
96   //\r
97   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
98   CtxSize = HmacMd5GetContextSize ();\r
99   HmacCtx = AllocatePool (CtxSize);\r
100 \r
101   Print (L"Init... ");\r
102   Status  = HmacMd5Init (HmacCtx, HmacMd5Key, sizeof (HmacMd5Key));\r
103   if (!Status) {\r
104     Print (L"[Fail]");\r
105     return EFI_ABORTED;\r
106   }\r
107 \r
108   Print (L"Update... ");\r
109   Status  = HmacMd5Update (HmacCtx, HmacData, 8);\r
110   if (!Status) {\r
111     Print (L"[Fail]");\r
112     return EFI_ABORTED;\r
113   }\r
114 \r
115   Print (L"Finalize... ");\r
116   Status  = HmacMd5Final (HmacCtx, Digest);\r
117   if (!Status) {\r
118     Print (L"[Fail]");\r
119     return EFI_ABORTED;\r
120   }\r
121 \r
122   FreePool (HmacCtx);\r
123 \r
124   Print (L"Check Value... ");\r
125   if (CompareMem (Digest, HmacMd5Digest, MD5_DIGEST_SIZE) != 0) {\r
126     Print (L"[Fail]");\r
127     return EFI_ABORTED;\r
128   }\r
129 \r
130   Print (L"[Pass]\n");\r
131 \r
132   Print (L"- HMAC-SHA1:   ");\r
133 \r
134   //\r
135   // HMAC-SHA1 Digest Validation\r
136   //\r
137   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
138   CtxSize = HmacSha1GetContextSize ();\r
139   HmacCtx = AllocatePool (CtxSize);\r
140 \r
141   Print (L"Init... ");\r
142   Status  = HmacSha1Init (HmacCtx, HmacSha1Key, sizeof (HmacSha1Key));\r
143   if (!Status) {\r
144     Print (L"[Fail]");\r
145     return EFI_ABORTED;\r
146   }\r
147 \r
148   Print (L"Update... ");\r
149   Status  = HmacSha1Update (HmacCtx, HmacData, 8);\r
150   if (!Status) {\r
151     Print (L"[Fail]");\r
152     return EFI_ABORTED;\r
153   }\r
154 \r
155   Print (L"Finalize... ");\r
156   Status  = HmacSha1Final (HmacCtx, Digest);\r
157   if (!Status) {\r
158     Print (L"[Fail]");\r
159     return EFI_ABORTED;\r
160   }\r
161 \r
162   FreePool (HmacCtx);\r
163 \r
164   Print (L"Check Value... ");\r
165   if (CompareMem (Digest, HmacSha1Digest, SHA1_DIGEST_SIZE) != 0) {\r
166     Print (L"[Fail]");\r
167     return EFI_ABORTED;\r
168   }\r
169 \r
170   Print (L"[Pass]\n");\r
171 \r
172   Print (L"- HMAC-SHA256: ");\r
173   //\r
174   // HMAC-SHA-256 Digest Validation\r
175   //\r
176   ZeroMem (Digest, MAX_DIGEST_SIZE);\r
177   CtxSize = HmacSha256GetContextSize ();\r
178   HmacCtx = AllocatePool (CtxSize);\r
179 \r
180   Print (L"Init... ");\r
181   Status  = HmacSha256Init (HmacCtx, HmacSha256Key, sizeof (HmacSha256Key));\r
182   if (!Status) {\r
183     Print (L"[Fail]");\r
184     return EFI_ABORTED;\r
185   }\r
186 \r
187   Print (L"Update... ");\r
188   Status  = HmacSha256Update (HmacCtx, HmacData, 8);\r
189   if (!Status) {\r
190     Print (L"[Fail]");\r
191     return EFI_ABORTED;\r
192   }\r
193 \r
194   Print (L"Finalize... ");\r
195   Status  = HmacSha256Final (HmacCtx, Digest);\r
196   if (!Status) {\r
197     Print (L"[Fail]");\r
198     return EFI_ABORTED;\r
199   }\r
200 \r
201   FreePool (HmacCtx);\r
202 \r
203   Print (L"Check Value... ");\r
204   if (CompareMem (Digest, HmacSha256Digest, SHA256_DIGEST_SIZE) != 0) {\r
205     Print (L"[Fail]");\r
206     return EFI_ABORTED;\r
207   }\r
208 \r
209   Print (L"[Pass]\n");\r
210 \r
211   return EFI_SUCCESS;\r
212 }\r