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