]> git.proxmox.com Git - mirror_edk2.git/commitdiff
CryptoPkg: add new Hkdf api in Crypt Lib.
authorQi Zhang <qi1.zhang@intel.com>
Fri, 23 Sep 2022 06:25:07 +0000 (14:25 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Fri, 23 Sep 2022 07:35:08 +0000 (07:35 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4033

Signed-off-by: Qi Zhang <qi1.zhang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Xiaoyu Lu <xiaoyu1.lu@intel.com>
Cc: Guomin Jiang <guomin.jiang@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
CryptoPkg/Library/BaseCryptLib/Kdf/CryptHkdf.c
CryptoPkg/Library/BaseCryptLib/Kdf/CryptHkdfNull.c
CryptoPkg/Library/BaseCryptLibNull/Kdf/CryptHkdfNull.c

index 9457b04f723738848a2d55ace9b62b412f008864..ffaf5fb131ac49b855dd23a151b4a07ff265fdb9 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HMAC-SHA256 KDF Wrapper Implementation over OpenSSL.\r
 \r
-Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2018 - 2022, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -13,6 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 /**\r
   Derive HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
 \r
+  @param[in]   Md               Message Digest.\r
   @param[in]   Key              Pointer to the user-supplied key.\r
   @param[in]   KeySize          Key size in bytes.\r
   @param[in]   Salt             Pointer to the salt(non-secret) value.\r
@@ -27,16 +28,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 **/\r
 BOOLEAN\r
-EFIAPI\r
-HkdfSha256ExtractAndExpand (\r
-  IN   CONST UINT8  *Key,\r
-  IN   UINTN        KeySize,\r
-  IN   CONST UINT8  *Salt,\r
-  IN   UINTN        SaltSize,\r
-  IN   CONST UINT8  *Info,\r
-  IN   UINTN        InfoSize,\r
-  OUT  UINT8        *Out,\r
-  IN   UINTN        OutSize\r
+HkdfMdExtractAndExpand (\r
+  IN   CONST EVP_MD  *Md,\r
+  IN   CONST UINT8   *Key,\r
+  IN   UINTN         KeySize,\r
+  IN   CONST UINT8   *Salt,\r
+  IN   UINTN         SaltSize,\r
+  IN   CONST UINT8   *Info,\r
+  IN   UINTN         InfoSize,\r
+  OUT  UINT8         *Out,\r
+  IN   UINTN         OutSize\r
   )\r
 {\r
   EVP_PKEY_CTX  *pHkdfCtx;\r
@@ -55,7 +56,7 @@ HkdfSha256ExtractAndExpand (
 \r
   Result = EVP_PKEY_derive_init (pHkdfCtx) > 0;\r
   if (Result) {\r
-    Result = EVP_PKEY_CTX_set_hkdf_md (pHkdfCtx, EVP_sha256 ()) > 0;\r
+    Result = EVP_PKEY_CTX_set_hkdf_md (pHkdfCtx, Md) > 0;\r
   }\r
 \r
   if (Result) {\r
@@ -78,3 +79,340 @@ HkdfSha256ExtractAndExpand (
   pHkdfCtx = NULL;\r
   return Result;\r
 }\r
+\r
+/**\r
+  Derive HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Md               message digest.\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+HkdfMdExtract (\r
+  IN CONST EVP_MD  *Md,\r
+  IN CONST UINT8   *Key,\r
+  IN  UINTN        KeySize,\r
+  IN CONST UINT8   *Salt,\r
+  IN UINTN         SaltSize,\r
+  OUT UINT8        *PrkOut,\r
+  UINTN            PrkOutSize\r
+  )\r
+{\r
+  EVP_PKEY_CTX  *pHkdfCtx;\r
+  BOOLEAN       Result;\r
+\r
+  if ((Key == NULL) || (Salt == NULL) || (PrkOut == NULL) ||\r
+      (KeySize > INT_MAX) || (SaltSize > INT_MAX) ||\r
+      (PrkOutSize > INT_MAX))\r
+  {\r
+    return FALSE;\r
+  }\r
+\r
+  pHkdfCtx = EVP_PKEY_CTX_new_id (EVP_PKEY_HKDF, NULL);\r
+  if (pHkdfCtx == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  Result = EVP_PKEY_derive_init (pHkdfCtx) > 0;\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_set_hkdf_md (pHkdfCtx, Md) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result =\r
+      EVP_PKEY_CTX_hkdf_mode (\r
+        pHkdfCtx,\r
+        EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY\r
+        ) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_set1_hkdf_salt (\r
+               pHkdfCtx,\r
+               Salt,\r
+               (uint32_t)SaltSize\r
+               ) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_set1_hkdf_key (\r
+               pHkdfCtx,\r
+               Key,\r
+               (uint32_t)KeySize\r
+               ) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_derive (pHkdfCtx, PrkOut, &PrkOutSize) > 0;\r
+  }\r
+\r
+  EVP_PKEY_CTX_free (pHkdfCtx);\r
+  pHkdfCtx = NULL;\r
+  return Result;\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Md               Message Digest.\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+HkdfMdExpand (\r
+  IN   CONST EVP_MD  *Md,\r
+  IN   CONST UINT8   *Prk,\r
+  IN   UINTN         PrkSize,\r
+  IN   CONST UINT8   *Info,\r
+  IN   UINTN         InfoSize,\r
+  OUT  UINT8         *Out,\r
+  IN   UINTN         OutSize\r
+  )\r
+{\r
+  EVP_PKEY_CTX  *pHkdfCtx;\r
+  BOOLEAN       Result;\r
+\r
+  if ((Prk == NULL) || (Info == NULL) || (Out == NULL) ||\r
+      (PrkSize > INT_MAX) || (InfoSize > INT_MAX) || (OutSize > INT_MAX))\r
+  {\r
+    return FALSE;\r
+  }\r
+\r
+  pHkdfCtx = EVP_PKEY_CTX_new_id (EVP_PKEY_HKDF, NULL);\r
+  if (pHkdfCtx == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  Result = EVP_PKEY_derive_init (pHkdfCtx) > 0;\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_set_hkdf_md (pHkdfCtx, Md) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_hkdf_mode (pHkdfCtx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_set1_hkdf_key (pHkdfCtx, Prk, (UINT32)PrkSize) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_CTX_add1_hkdf_info (pHkdfCtx, Info, (UINT32)InfoSize) > 0;\r
+  }\r
+\r
+  if (Result) {\r
+    Result = EVP_PKEY_derive (pHkdfCtx, Out, &OutSize) > 0;\r
+  }\r
+\r
+  EVP_PKEY_CTX_free (pHkdfCtx);\r
+  pHkdfCtx = NULL;\r
+  return Result;\r
+}\r
+\r
+/**\r
+  Derive HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return HkdfMdExtractAndExpand (EVP_sha256 (), Key, KeySize, Salt, SaltSize, Info, InfoSize, Out, OutSize);\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  return HkdfMdExtract (\r
+           EVP_sha256 (),\r
+           Key,\r
+           KeySize,\r
+           Salt,\r
+           SaltSize,\r
+           PrkOut,\r
+           PrkOutSize\r
+           );\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return HkdfMdExpand (EVP_sha256 (), Prk, PrkSize, Info, InfoSize, Out, OutSize);\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return HkdfMdExtractAndExpand (EVP_sha384 (), Key, KeySize, Salt, SaltSize, Info, InfoSize, Out, OutSize);\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  return HkdfMdExtract (\r
+           EVP_sha384 (),\r
+           Key,\r
+           KeySize,\r
+           Salt,\r
+           SaltSize,\r
+           PrkOut,\r
+           PrkOutSize\r
+           );\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  return HkdfMdExpand (EVP_sha384 (), Prk, PrkSize, Info, InfoSize, Out, OutSize);\r
+}\r
index 19d795a4cc16dd08009b7bf0ccfe3d62aef05388..d8c967d669b221c92a96a699f2c5d9920c3f7ff2 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HMAC-SHA256 KDF Wrapper Implementation which does not provide real capabilities.\r
 \r
-Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2018 - 2022, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -41,3 +41,152 @@ HkdfSha256ExtractAndExpand (
   ASSERT (FALSE);\r
   return FALSE;\r
 }\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
index 19d795a4cc16dd08009b7bf0ccfe3d62aef05388..d8c967d669b221c92a96a699f2c5d9920c3f7ff2 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HMAC-SHA256 KDF Wrapper Implementation which does not provide real capabilities.\r
 \r
-Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2018 - 2022, Intel Corporation. All rights reserved.<BR>\r
 SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -41,3 +41,152 @@ HkdfSha256ExtractAndExpand (
   ASSERT (FALSE);\r
   return FALSE;\r
 }\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA256 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha256Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract-and-Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          Key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         Salt size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384ExtractAndExpand (\r
+  IN   CONST UINT8  *Key,\r
+  IN   UINTN        KeySize,\r
+  IN   CONST UINT8  *Salt,\r
+  IN   UINTN        SaltSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Extract key Derivation Function (HKDF).\r
+\r
+  @param[in]   Key              Pointer to the user-supplied key.\r
+  @param[in]   KeySize          key size in bytes.\r
+  @param[in]   Salt             Pointer to the salt(non-secret) value.\r
+  @param[in]   SaltSize         salt size in bytes.\r
+  @param[out]  PrkOut           Pointer to buffer to receive hkdf value.\r
+  @param[in]   PrkOutSize       size of hkdf bytes to generate.\r
+\r
+  @retval true   Hkdf generated successfully.\r
+  @retval false  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Extract (\r
+  IN CONST UINT8  *Key,\r
+  IN UINTN        KeySize,\r
+  IN CONST UINT8  *Salt,\r
+  IN UINTN        SaltSize,\r
+  OUT UINT8       *PrkOut,\r
+  UINTN           PrkOutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Derive SHA384 HMAC-based Expand Key Derivation Function (HKDF).\r
+\r
+  @param[in]   Prk              Pointer to the user-supplied key.\r
+  @param[in]   PrkSize          Key size in bytes.\r
+  @param[in]   Info             Pointer to the application specific info.\r
+  @param[in]   InfoSize         Info size in bytes.\r
+  @param[out]  Out              Pointer to buffer to receive hkdf value.\r
+  @param[in]   OutSize          Size of hkdf bytes to generate.\r
+\r
+  @retval TRUE   Hkdf generated successfully.\r
+  @retval FALSE  Hkdf generation failed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HkdfSha384Expand (\r
+  IN   CONST UINT8  *Prk,\r
+  IN   UINTN        PrkSize,\r
+  IN   CONST UINT8  *Info,\r
+  IN   UINTN        InfoSize,\r
+  OUT  UINT8        *Out,\r
+  IN   UINTN        OutSize\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return FALSE;\r
+}\r