1a8c4464502aabcbda7032daddc772a1bc7386bdfqlong/** @file
2a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Application for HMAC Primitives Validation.
3a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
4a8c4464502aabcbda7032daddc772a1bc7386bdfqlongCopyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5a8c4464502aabcbda7032daddc772a1bc7386bdfqlongThis program and the accompanying materials
6a8c4464502aabcbda7032daddc772a1bc7386bdfqlongare licensed and made available under the terms and conditions of the BSD License
7a8c4464502aabcbda7032daddc772a1bc7386bdfqlongwhich accompanies this distribution.  The full text of the license may be found at
8a8c4464502aabcbda7032daddc772a1bc7386bdfqlonghttp://opensource.org/licenses/bsd-license.php
9a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
10a8c4464502aabcbda7032daddc772a1bc7386bdfqlongTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11a8c4464502aabcbda7032daddc772a1bc7386bdfqlongWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
13a8c4464502aabcbda7032daddc772a1bc7386bdfqlong**/
14a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
15a8c4464502aabcbda7032daddc772a1bc7386bdfqlong#include "Cryptest.h"
16a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
17a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
18a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Max Known Digest Size is SHA512 Output (64 bytes) by far
19a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
20a8c4464502aabcbda7032daddc772a1bc7386bdfqlong#define MAX_DIGEST_SIZE    64
21a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
22a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
23a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Data string for HMAC validation
24a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
25a8c4464502aabcbda7032daddc772a1bc7386bdfqlongGLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HmacData = "Hi There";
26a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
27a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
28a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Key value for HMAC-MD5 validation. (From "2. Test Cases for HMAC-MD5" of IETF RFC2202)
29a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
30a8c4464502aabcbda7032daddc772a1bc7386bdfqlongGLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Key[16] = {
31a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b
32a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  };
33a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
34a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
35a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Result for HMAC-MD5("Hi There"). (From "2. Test Cases for HMAC-MD5" of IETF RFC2202)
36a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
37a8c4464502aabcbda7032daddc772a1bc7386bdfqlongGLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Digest[] = {
38a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d
39a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  };
40a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
41a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
42a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Key value for HMAC-SHA-1 validation. (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202)
43a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
44a8c4464502aabcbda7032daddc772a1bc7386bdfqlongGLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Key[20] = {
45a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
46a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0x0b, 0x0b, 0x0b, 0x0b
47a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  };
48a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
49a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
50a8c4464502aabcbda7032daddc772a1bc7386bdfqlong// Result for HMAC-SHA-1 ("Hi There"). (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202)
51a8c4464502aabcbda7032daddc772a1bc7386bdfqlong//
52a8c4464502aabcbda7032daddc772a1bc7386bdfqlongGLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Digest[] = {
53a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e,
54a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  0xf1, 0x46, 0xbe, 0x00
55a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  };
56a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
57a8c4464502aabcbda7032daddc772a1bc7386bdfqlong/**
58a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Validate UEFI-OpenSSL Message Authentication Codes Interfaces.
59a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
60a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  @retval  EFI_SUCCESS  Validation succeeded.
61a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  @retval  EFI_ABORTED  Validation failed.
62a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
63a8c4464502aabcbda7032daddc772a1bc7386bdfqlong**/
64a8c4464502aabcbda7032daddc772a1bc7386bdfqlongEFI_STATUS
65a8c4464502aabcbda7032daddc772a1bc7386bdfqlongValidateCryptHmac (
66a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  VOID
67a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  )
68a8c4464502aabcbda7032daddc772a1bc7386bdfqlong{
69a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  UINTN    CtxSize;
70a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  VOID     *HmacCtx;
71a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  UINT8    Digest[MAX_DIGEST_SIZE];
72a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  BOOLEAN  Status;
73a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
74a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L" \nUEFI-OpenSSL HMAC Engine Testing:\n");
75a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
76a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"- HMAC-MD5:  ");
77a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
78a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  //
79a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  // HMAC-MD5 Digest Validation
80a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  //
81a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  ZeroMem (Digest, MAX_DIGEST_SIZE);
82a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  CtxSize = HmacMd5GetContextSize ();
83a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  HmacCtx = AllocatePool (CtxSize);
84a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
85a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Init... ");
86a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacMd5Init (HmacCtx, HmacMd5Key, sizeof (HmacMd5Key));
87a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
88a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
89a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
90a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
91a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
92a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Update... ");
93a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacMd5Update (HmacCtx, HmacData, 8);
94a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
95a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
96a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
97a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
98a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
99a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Finalize... ");
100a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacMd5Final (HmacCtx, Digest);
101a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
102a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
103a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
104a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
105a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
106a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  FreePool (HmacCtx);
107a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
108a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Check Value... ");
109a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (CompareMem (Digest, HmacMd5Digest, MD5_DIGEST_SIZE) != 0) {
110a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
111a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
112a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
113a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
114a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"[Pass]\n");
115a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
116a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"- HMAC-SHA1: ");
117a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
118a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  //
119a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  // HMAC-SHA1 Digest Validation
120a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  //
121a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  ZeroMem (Digest, MAX_DIGEST_SIZE);
122a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  CtxSize = HmacSha1GetContextSize ();
123a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  HmacCtx = AllocatePool (CtxSize);
124a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
125a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Init... ");
126a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacSha1Init (HmacCtx, HmacSha1Key, sizeof (HmacSha1Key));
127a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
128a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
129a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
130a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
131a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
132a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Update... ");
133a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacSha1Update (HmacCtx, HmacData, 8);
134a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
135a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
136a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
137a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
138a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
139a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Finalize... ");
140a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Status  = HmacSha1Final (HmacCtx, Digest);
141a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (!Status) {
142a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
143a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
144a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
145a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
146a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  FreePool (HmacCtx);
147a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
148a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"Check Value... ");
149a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  if (CompareMem (Digest, HmacSha1Digest, SHA1_DIGEST_SIZE) != 0) {
150a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    Print (L"[Fail]");
151a8c4464502aabcbda7032daddc772a1bc7386bdfqlong    return EFI_ABORTED;
152a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  }
153a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
154a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  Print (L"[Pass]\n");
155a8c4464502aabcbda7032daddc772a1bc7386bdfqlong
156a8c4464502aabcbda7032daddc772a1bc7386bdfqlong  return EFI_SUCCESS;
157a8c4464502aabcbda7032daddc772a1bc7386bdfqlong}
158