| /** @file | |
| Application for HMAC Primitives Validation. | |
| Copyright (c) 2010, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "Cryptest.h" | |
| // | |
| // Max Known Digest Size is SHA512 Output (64 bytes) by far | |
| // | |
| #define MAX_DIGEST_SIZE 64 | |
| // | |
| // Data string for HMAC validation | |
| // | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *HmacData = "Hi There"; | |
| // | |
| // Key value for HMAC-MD5 validation. (From "2. Test Cases for HMAC-MD5" of IETF RFC2202) | |
| // | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Key[16] = { | |
| 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b | |
| }; | |
| // | |
| // Result for HMAC-MD5("Hi There"). (From "2. Test Cases for HMAC-MD5" of IETF RFC2202) | |
| // | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacMd5Digest[] = { | |
| 0x92, 0x94, 0x72, 0x7a, 0x36, 0x38, 0xbb, 0x1c, 0x13, 0xf4, 0x8e, 0xf8, 0x15, 0x8b, 0xfc, 0x9d | |
| }; | |
| // | |
| // Key value for HMAC-SHA-1 validation. (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202) | |
| // | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Key[20] = { | |
| 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, | |
| 0x0b, 0x0b, 0x0b, 0x0b | |
| }; | |
| // | |
| // Result for HMAC-SHA-1 ("Hi There"). (From "3. Test Cases for HMAC-SHA-1" of IETF RFC2202) | |
| // | |
| GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 HmacSha1Digest[] = { | |
| 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xe2, 0x8b, 0xc0, 0xb6, 0xfb, 0x37, 0x8c, 0x8e, | |
| 0xf1, 0x46, 0xbe, 0x00 | |
| }; | |
| /** | |
| Validate UEFI-OpenSSL Message Authentication Codes Interfaces. | |
| @retval EFI_SUCCESS Validation succeeded. | |
| @retval EFI_ABORTED Validation failed. | |
| **/ | |
| EFI_STATUS | |
| ValidateCryptHmac ( | |
| VOID | |
| ) | |
| { | |
| UINTN CtxSize; | |
| VOID *HmacCtx; | |
| UINT8 Digest[MAX_DIGEST_SIZE]; | |
| BOOLEAN Status; | |
| Print (L" \nUEFI-OpenSSL HMAC Engine Testing:\n"); | |
| Print (L"- HMAC-MD5: "); | |
| // | |
| // HMAC-MD5 Digest Validation | |
| // | |
| ZeroMem (Digest, MAX_DIGEST_SIZE); | |
| CtxSize = HmacMd5GetContextSize (); | |
| HmacCtx = AllocatePool (CtxSize); | |
| Print (L"Init... "); | |
| Status = HmacMd5Init (HmacCtx, HmacMd5Key, sizeof (HmacMd5Key)); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"Update... "); | |
| Status = HmacMd5Update (HmacCtx, HmacData, 8); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"Finalize... "); | |
| Status = HmacMd5Final (HmacCtx, Digest); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| FreePool (HmacCtx); | |
| Print (L"Check Value... "); | |
| if (CompareMem (Digest, HmacMd5Digest, MD5_DIGEST_SIZE) != 0) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"[Pass]\n"); | |
| Print (L"- HMAC-SHA1: "); | |
| // | |
| // HMAC-SHA1 Digest Validation | |
| // | |
| ZeroMem (Digest, MAX_DIGEST_SIZE); | |
| CtxSize = HmacSha1GetContextSize (); | |
| HmacCtx = AllocatePool (CtxSize); | |
| Print (L"Init... "); | |
| Status = HmacSha1Init (HmacCtx, HmacSha1Key, sizeof (HmacSha1Key)); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"Update... "); | |
| Status = HmacSha1Update (HmacCtx, HmacData, 8); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"Finalize... "); | |
| Status = HmacSha1Final (HmacCtx, Digest); | |
| if (!Status) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| FreePool (HmacCtx); | |
| Print (L"Check Value... "); | |
| if (CompareMem (Digest, HmacSha1Digest, SHA1_DIGEST_SIZE) != 0) { | |
| Print (L"[Fail]"); | |
| return EFI_ABORTED; | |
| } | |
| Print (L"[Pass]\n"); | |
| return EFI_SUCCESS; | |
| } |