/** @file\r
HMAC-MD5 Wrapper Implementation over OpenSSL.\r
\r
-Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "InternalCryptLib.h"\r
#include <openssl/hmac.h>\r
\r
+#define HMAC_MD5_CTX_SIZE sizeof(void *) * 4 + sizeof(unsigned int) + \\r
+ sizeof(unsigned char) * HMAC_MAX_MD_CBLOCK\r
+\r
/**\r
Retrieves the size, in bytes, of the context buffer required for HMAC-MD5 operations.\r
+ (NOTE: This API is deprecated.\r
+ Use HmacMd5New() / HmacMd5Free() for HMAC-MD5 Context operations.)\r
\r
@return The size, in bytes, of the context buffer required for HMAC-MD5 operations.\r
\r
{\r
//\r
// Retrieves the OpenSSL HMAC-MD5 Context Size\r
+ // NOTE: HMAC_CTX object was made opaque in openssl-1.1.x, here we just use the\r
+ // fixed size as a workaround to make this API work for compatibility.\r
+ // We should retire HmacMd5GetContextSize() in future, and use HmacMd5New()\r
+ // and HmacMd5Free() for context allocation and release.\r
+ //\r
+ return (UINTN) HMAC_MD5_CTX_SIZE;\r
+}\r
+\r
+/**\r
+ Allocates and initializes one HMAC_CTX context for subsequent HMAC-MD5 use.\r
+\r
+ @return Pointer to the HMAC_CTX context that has been initialized.\r
+ If the allocations fails, HmacMd5New() returns NULL.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+HmacMd5New (\r
+ VOID\r
+ )\r
+{\r
+ //\r
+ // Allocates & Initializes HMAC_CTX Context by OpenSSL HMAC_CTX_new()\r
+ //\r
+ return (VOID *) HMAC_CTX_new ();\r
+}\r
+\r
+/**\r
+ Release the specified HMAC_CTX context.\r
+\r
+ @param[in] HmacMd5Ctx Pointer to the HMAC_CTX context to be released.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HmacMd5Free (\r
+ IN VOID *HmacMd5Ctx\r
+ )\r
+{\r
//\r
- return (UINTN) (sizeof (HMAC_CTX));\r
+ // Free OpenSSL HMAC_CTX Context\r
+ //\r
+ HMAC_CTX_free ((HMAC_CTX *)HmacMd5Ctx);\r
}\r
\r
/**\r
//\r
// OpenSSL HMAC-MD5 Context Initialization\r
//\r
- HMAC_CTX_init (HmacMd5Context);\r
- HMAC_Init_ex (HmacMd5Context, Key, (UINT32) KeySize, EVP_md5(), NULL);\r
+ memset(HmacMd5Context, 0, HMAC_MD5_CTX_SIZE);\r
+ if (HMAC_CTX_reset ((HMAC_CTX *)HmacMd5Context) != 1) {\r
+ return FALSE;\r
+ }\r
+ if (HMAC_Init_ex ((HMAC_CTX *)HmacMd5Context, Key, (UINT32) KeySize, EVP_md5(), NULL) != 1) {\r
+ return FALSE;\r
+ }\r
\r
return TRUE;\r
}\r
if (HmacMd5Context == NULL || NewHmacMd5Context == NULL) {\r
return FALSE;\r
}\r
- \r
- CopyMem (NewHmacMd5Context, HmacMd5Context, sizeof (HMAC_CTX));\r
+\r
+ if (HMAC_CTX_copy ((HMAC_CTX *)NewHmacMd5Context, (HMAC_CTX *)HmacMd5Context) != 1) {\r
+ return FALSE;\r
+ }\r
\r
return TRUE;\r
}\r
//\r
// OpenSSL HMAC-MD5 digest update\r
//\r
- HMAC_Update (HmacMd5Context, Data, DataSize);\r
+ if (HMAC_Update ((HMAC_CTX *)HmacMd5Context, Data, DataSize) != 1) {\r
+ return FALSE;\r
+ }\r
\r
return TRUE;\r
}\r
//\r
// OpenSSL HMAC-MD5 digest finalization\r
//\r
- HMAC_Final (HmacMd5Context, HmacValue, &Length);\r
- HMAC_CTX_cleanup (HmacMd5Context);\r
+ if (HMAC_Final ((HMAC_CTX *)HmacMd5Context, HmacValue, &Length) != 1) {\r
+ return FALSE;\r
+ }\r
+ if (HMAC_CTX_reset ((HMAC_CTX *)HmacMd5Context) != 1) {\r
+ return FALSE;\r
+ }\r
\r
return TRUE;\r
}\r