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