1 /** @file
2 Application for HMAC Primitives Validation.
3
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT 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 //
25 GLOBAL_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 //
30 GLOBAL_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 //
37 GLOBAL_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 //
44 GLOBAL_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 //
52 GLOBAL_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 Validate UEFI-OpenSSL Message Authentication Codes Interfaces.
59
60 @retval EFI_SUCCESS Validation succeeded.
61 @retval EFI_ABORTED Validation failed.
62
63 **/
64 EFI_STATUS
ValidateCryptHmac(VOID)65 ValidateCryptHmac (
66 VOID
67 )
68 {
69 UINTN CtxSize;
70 VOID *HmacCtx;
71 UINT8 Digest[MAX_DIGEST_SIZE];
72 BOOLEAN Status;
73
74 Print (L" \nUEFI-OpenSSL HMAC Engine Testing:\n");
75
76 Print (L"- HMAC-MD5: ");
77
78 //
79 // HMAC-MD5 Digest Validation
80 //
81 ZeroMem (Digest, MAX_DIGEST_SIZE);
82 CtxSize = HmacMd5GetContextSize ();
83 HmacCtx = AllocatePool (CtxSize);
84
85 Print (L"Init... ");
86 Status = HmacMd5Init (HmacCtx, HmacMd5Key, sizeof (HmacMd5Key));
87 if (!Status) {
88 Print (L"[Fail]");
89 return EFI_ABORTED;
90 }
91
92 Print (L"Update... ");
93 Status = HmacMd5Update (HmacCtx, HmacData, 8);
94 if (!Status) {
95 Print (L"[Fail]");
96 return EFI_ABORTED;
97 }
98
99 Print (L"Finalize... ");
100 Status = HmacMd5Final (HmacCtx, Digest);
101 if (!Status) {
102 Print (L"[Fail]");
103 return EFI_ABORTED;
104 }
105
106 FreePool (HmacCtx);
107
108 Print (L"Check Value... ");
109 if (CompareMem (Digest, HmacMd5Digest, MD5_DIGEST_SIZE) != 0) {
110 Print (L"[Fail]");
111 return EFI_ABORTED;
112 }
113
114 Print (L"[Pass]\n");
115
116 Print (L"- HMAC-SHA1: ");
117
118 //
119 // HMAC-SHA1 Digest Validation
120 //
121 ZeroMem (Digest, MAX_DIGEST_SIZE);
122 CtxSize = HmacSha1GetContextSize ();
123 HmacCtx = AllocatePool (CtxSize);
124
125 Print (L"Init... ");
126 Status = HmacSha1Init (HmacCtx, HmacSha1Key, sizeof (HmacSha1Key));
127 if (!Status) {
128 Print (L"[Fail]");
129 return EFI_ABORTED;
130 }
131
132 Print (L"Update... ");
133 Status = HmacSha1Update (HmacCtx, HmacData, 8);
134 if (!Status) {
135 Print (L"[Fail]");
136 return EFI_ABORTED;
137 }
138
139 Print (L"Finalize... ");
140 Status = HmacSha1Final (HmacCtx, Digest);
141 if (!Status) {
142 Print (L"[Fail]");
143 return EFI_ABORTED;
144 }
145
146 FreePool (HmacCtx);
147
148 Print (L"Check Value... ");
149 if (CompareMem (Digest, HmacSha1Digest, SHA1_DIGEST_SIZE) != 0) {
150 Print (L"[Fail]");
151 return EFI_ABORTED;
152 }
153
154 Print (L"[Pass]\n");
155
156 return EFI_SUCCESS;
157 }
158