]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Library/AuthVariableLib/AuthService.c
SecurityPkg/AuthVariableLib: Check SHA-256 OID with ContentInfo present
[mirror_edk2.git] / SecurityPkg / Library / AuthVariableLib / AuthService.c
index a37ec0bd0fc604f4333d29fdeb89fb4c2b119bcd..9beeca09aebaf5dfa0afd1040a2b43b4ed5575f1 100644 (file)
   They will do basic validation for authentication data structure, then call crypto library\r
   to verify the signature.\r
 \r
-Copyright (c) 2009 - 2017, 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) 2009 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) Microsoft Corporation.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "AuthServiceInternal.h"\r
 \r
+#include <Protocol/VariablePolicy.h>\r
+#include <Library/VariablePolicyLib.h>\r
+\r
 //\r
 // Public Exponent of RSA Key.\r
 //\r
-CONST UINT8 mRsaE[] = { 0x01, 0x00, 0x01 };\r
+CONST UINT8  mRsaE[] = { 0x01, 0x00, 0x01 };\r
 \r
-CONST UINT8 mSha256OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01 };\r
+CONST UINT8  mSha256OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01 };\r
 \r
 //\r
 // Requirement for different signature type which have been defined in UEFI spec.\r
 // These data are used to perform SignatureList format check while setting PK/KEK variable.\r
 //\r
-EFI_SIGNATURE_ITEM mSupportSigItem[] = {\r
-//{SigType,                       SigHeaderSize,   SigDataSize  }\r
-  {EFI_CERT_SHA256_GUID,          0,               32           },\r
-  {EFI_CERT_RSA2048_GUID,         0,               256          },\r
-  {EFI_CERT_RSA2048_SHA256_GUID,  0,               256          },\r
-  {EFI_CERT_SHA1_GUID,            0,               20           },\r
-  {EFI_CERT_RSA2048_SHA1_GUID,    0,               256          },\r
-  {EFI_CERT_X509_GUID,            0,               ((UINT32) ~0)},\r
-  {EFI_CERT_SHA224_GUID,          0,               28           },\r
-  {EFI_CERT_SHA384_GUID,          0,               48           },\r
-  {EFI_CERT_SHA512_GUID,          0,               64           },\r
-  {EFI_CERT_X509_SHA256_GUID,     0,               48           },\r
-  {EFI_CERT_X509_SHA384_GUID,     0,               64           },\r
-  {EFI_CERT_X509_SHA512_GUID,     0,               80           }\r
+EFI_SIGNATURE_ITEM  mSupportSigItem[] = {\r
+  // {SigType,                       SigHeaderSize,   SigDataSize  }\r
+  { EFI_CERT_SHA256_GUID,         0, 32            },\r
+  { EFI_CERT_RSA2048_GUID,        0, 256           },\r
+  { EFI_CERT_RSA2048_SHA256_GUID, 0, 256           },\r
+  { EFI_CERT_SHA1_GUID,           0, 20            },\r
+  { EFI_CERT_RSA2048_SHA1_GUID,   0, 256           },\r
+  { EFI_CERT_X509_GUID,           0, ((UINT32) ~0) },\r
+  { EFI_CERT_SHA224_GUID,         0, 28            },\r
+  { EFI_CERT_SHA384_GUID,         0, 48            },\r
+  { EFI_CERT_SHA512_GUID,         0, 64            },\r
+  { EFI_CERT_X509_SHA256_GUID,    0, 48            },\r
+  { EFI_CERT_X509_SHA384_GUID,    0, 64            },\r
+  { EFI_CERT_X509_SHA512_GUID,    0, 80            }\r
 };\r
 \r
 /**\r
@@ -78,22 +76,22 @@ EFI_SIGNATURE_ITEM mSupportSigItem[] = {
 **/\r
 EFI_STATUS\r
 AuthServiceInternalFindVariable (\r
-  IN  CHAR16            *VariableName,\r
-  IN  EFI_GUID          *VendorGuid,\r
-  OUT VOID              **Data,\r
-  OUT UINTN             *DataSize\r
+  IN  CHAR16    *VariableName,\r
+  IN  EFI_GUID  *VendorGuid,\r
+  OUT VOID      **Data,\r
+  OUT UINTN     *DataSize\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  AUTH_VARIABLE_INFO    AuthVariableInfo;\r
+  EFI_STATUS          Status;\r
+  AUTH_VARIABLE_INFO  AuthVariableInfo;\r
 \r
   ZeroMem (&AuthVariableInfo, sizeof (AuthVariableInfo));\r
   Status = mAuthVarLibContextIn->FindVariable (\r
-           VariableName,\r
-           VendorGuid,\r
-           &AuthVariableInfo\r
-           );\r
-  *Data = AuthVariableInfo.Data;\r
+                                   VariableName,\r
+                                   VendorGuid,\r
+                                   &AuthVariableInfo\r
+                                   );\r
+  *Data     = AuthVariableInfo.Data;\r
   *DataSize = AuthVariableInfo.DataSize;\r
   return Status;\r
 }\r
@@ -115,69 +113,25 @@ AuthServiceInternalFindVariable (
 **/\r
 EFI_STATUS\r
 AuthServiceInternalUpdateVariable (\r
-  IN CHAR16             *VariableName,\r
-  IN EFI_GUID           *VendorGuid,\r
-  IN VOID               *Data,\r
-  IN UINTN              DataSize,\r
-  IN UINT32             Attributes\r
+  IN CHAR16    *VariableName,\r
+  IN EFI_GUID  *VendorGuid,\r
+  IN VOID      *Data,\r
+  IN UINTN     DataSize,\r
+  IN UINT32    Attributes\r
   )\r
 {\r
-  AUTH_VARIABLE_INFO    AuthVariableInfo;\r
+  AUTH_VARIABLE_INFO  AuthVariableInfo;\r
 \r
   ZeroMem (&AuthVariableInfo, sizeof (AuthVariableInfo));\r
   AuthVariableInfo.VariableName = VariableName;\r
-  AuthVariableInfo.VendorGuid = VendorGuid;\r
-  AuthVariableInfo.Data = Data;\r
-  AuthVariableInfo.DataSize = DataSize;\r
-  AuthVariableInfo.Attributes = Attributes;\r
+  AuthVariableInfo.VendorGuid   = VendorGuid;\r
+  AuthVariableInfo.Data         = Data;\r
+  AuthVariableInfo.DataSize     = DataSize;\r
+  AuthVariableInfo.Attributes   = Attributes;\r
 \r
   return mAuthVarLibContextIn->UpdateVariable (\r
-           &AuthVariableInfo\r
-           );\r
-}\r
-\r
-/**\r
-  Update the variable region with Variable information.\r
-\r
-  @param[in] VariableName           Name of variable.\r
-  @param[in] VendorGuid             Guid of variable.\r
-  @param[in] Data                   Data pointer.\r
-  @param[in] DataSize               Size of Data.\r
-  @param[in] Attributes             Attribute value of the variable.\r
-  @param[in] KeyIndex               Index of associated public key.\r
-  @param[in] MonotonicCount         Value of associated monotonic count.\r
-\r
-  @retval EFI_SUCCESS               The update operation is success.\r
-  @retval EFI_INVALID_PARAMETER     Invalid parameter.\r
-  @retval EFI_WRITE_PROTECTED       Variable is write-protected.\r
-  @retval EFI_OUT_OF_RESOURCES      There is not enough resource.\r
-\r
-**/\r
-EFI_STATUS\r
-AuthServiceInternalUpdateVariableWithMonotonicCount (\r
-  IN CHAR16             *VariableName,\r
-  IN EFI_GUID           *VendorGuid,\r
-  IN VOID               *Data,\r
-  IN UINTN              DataSize,\r
-  IN UINT32             Attributes,\r
-  IN UINT32             KeyIndex,\r
-  IN UINT64             MonotonicCount\r
-  )\r
-{\r
-  AUTH_VARIABLE_INFO    AuthVariableInfo;\r
-\r
-  ZeroMem (&AuthVariableInfo, sizeof (AuthVariableInfo));\r
-  AuthVariableInfo.VariableName = VariableName;\r
-  AuthVariableInfo.VendorGuid = VendorGuid;\r
-  AuthVariableInfo.Data = Data;\r
-  AuthVariableInfo.DataSize = DataSize;\r
-  AuthVariableInfo.Attributes = Attributes;\r
-  AuthVariableInfo.PubKeyIndex = KeyIndex;\r
-  AuthVariableInfo.MonotonicCount = MonotonicCount;\r
-\r
-  return mAuthVarLibContextIn->UpdateVariable (\r
-           &AuthVariableInfo\r
-           );\r
+                                 &AuthVariableInfo\r
+                                 );\r
 }\r
 \r
 /**\r
@@ -198,18 +152,18 @@ AuthServiceInternalUpdateVariableWithMonotonicCount (
 **/\r
 EFI_STATUS\r
 AuthServiceInternalUpdateVariableWithTimeStamp (\r
-  IN CHAR16             *VariableName,\r
-  IN EFI_GUID           *VendorGuid,\r
-  IN VOID               *Data,\r
-  IN UINTN              DataSize,\r
-  IN UINT32             Attributes,\r
-  IN EFI_TIME           *TimeStamp\r
+  IN CHAR16    *VariableName,\r
+  IN EFI_GUID  *VendorGuid,\r
+  IN VOID      *Data,\r
+  IN UINTN     DataSize,\r
+  IN UINT32    Attributes,\r
+  IN EFI_TIME  *TimeStamp\r
   )\r
 {\r
-  EFI_STATUS            FindStatus;\r
-  VOID                  *OrgData;\r
-  UINTN                 OrgDataSize;\r
-  AUTH_VARIABLE_INFO    AuthVariableInfo;\r
+  EFI_STATUS          FindStatus;\r
+  VOID                *OrgData;\r
+  UINTN               OrgDataSize;\r
+  AUTH_VARIABLE_INFO  AuthVariableInfo;\r
 \r
   FindStatus = AuthServiceInternalFindVariable (\r
                  VariableName,\r
@@ -223,9 +177,10 @@ AuthServiceInternalUpdateVariableWithTimeStamp (
   //\r
   if (!EFI_ERROR (FindStatus) && ((Attributes & EFI_VARIABLE_APPEND_WRITE) != 0)) {\r
     if ((CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) &&\r
-        ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) ||\r
-        (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0))) ||\r
-        (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0))) {\r
+         ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) ||\r
+          (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0))) ||\r
+        (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0)))\r
+    {\r
       //\r
       // For variables with formatted as EFI_SIGNATURE_LIST, the driver shall not perform an append of\r
       // EFI_SIGNATURE_DATA values that are already part of the existing variable value.\r
@@ -241,14 +196,14 @@ AuthServiceInternalUpdateVariableWithTimeStamp (
 \r
   ZeroMem (&AuthVariableInfo, sizeof (AuthVariableInfo));\r
   AuthVariableInfo.VariableName = VariableName;\r
-  AuthVariableInfo.VendorGuid = VendorGuid;\r
-  AuthVariableInfo.Data = Data;\r
-  AuthVariableInfo.DataSize = DataSize;\r
-  AuthVariableInfo.Attributes = Attributes;\r
-  AuthVariableInfo.TimeStamp = TimeStamp;\r
+  AuthVariableInfo.VendorGuid   = VendorGuid;\r
+  AuthVariableInfo.Data         = Data;\r
+  AuthVariableInfo.DataSize     = DataSize;\r
+  AuthVariableInfo.Attributes   = Attributes;\r
+  AuthVariableInfo.TimeStamp    = TimeStamp;\r
   return mAuthVarLibContextIn->UpdateVariable (\r
-           &AuthVariableInfo\r
-           );\r
+                                 &AuthVariableInfo\r
+                                 );\r
 }\r
 \r
 /**\r
@@ -262,14 +217,18 @@ AuthServiceInternalUpdateVariableWithTimeStamp (
 \r
 **/\r
 BOOLEAN\r
-NeedPhysicallyPresent(\r
-  IN     CHAR16         *VariableName,\r
-  IN     EFI_GUID       *VendorGuid\r
+NeedPhysicallyPresent (\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid\r
   )\r
 {\r
-  if ((CompareGuid (VendorGuid, &gEfiSecureBootEnableDisableGuid) && (StrCmp (VariableName, EFI_SECURE_BOOT_ENABLE_NAME) == 0))\r
-    || (CompareGuid (VendorGuid, &gEfiCustomModeEnableGuid) && (StrCmp (VariableName, EFI_CUSTOM_MODE_NAME) == 0))) {\r
-    return TRUE;\r
+  // If the VariablePolicy engine is disabled, allow deletion of any authenticated variables.\r
+  if (IsVariablePolicyEnabled ()) {\r
+    if (  (CompareGuid (VendorGuid, &gEfiSecureBootEnableDisableGuid) && (StrCmp (VariableName, EFI_SECURE_BOOT_ENABLE_NAME) == 0))\r
+       || (CompareGuid (VendorGuid, &gEfiCustomModeEnableGuid) && (StrCmp (VariableName, EFI_CUSTOM_MODE_NAME) == 0)))\r
+    {\r
+      return TRUE;\r
+    }\r
   }\r
 \r
   return FALSE;\r
@@ -287,318 +246,18 @@ InCustomMode (
   VOID\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
-  VOID          *Data;\r
-  UINTN         DataSize;\r
+  EFI_STATUS  Status;\r
+  VOID        *Data;\r
+  UINTN       DataSize;\r
 \r
   Status = AuthServiceInternalFindVariable (EFI_CUSTOM_MODE_NAME, &gEfiCustomModeEnableGuid, &Data, &DataSize);\r
-  if (!EFI_ERROR (Status) && (*(UINT8 *) Data == CUSTOM_SECURE_BOOT_MODE)) {\r
+  if (!EFI_ERROR (Status) && (*(UINT8 *)Data == CUSTOM_SECURE_BOOT_MODE)) {\r
     return TRUE;\r
   }\r
 \r
   return FALSE;\r
 }\r
 \r
-/**\r
-  Get available public key index.\r
-\r
-  @param[in] PubKey     Pointer to Public Key data.\r
-\r
-  @return Public key index, 0 if no any public key index available.\r
-\r
-**/\r
-UINT32\r
-GetAvailableKeyIndex (\r
-  IN  UINT8             *PubKey\r
-  )\r
-{\r
-  EFI_STATUS            Status;\r
-  UINT8                 *Data;\r
-  UINTN                 DataSize;\r
-  UINT8                 *Ptr;\r
-  UINT32                Index;\r
-  BOOLEAN               IsFound;\r
-  EFI_GUID              VendorGuid;\r
-  CHAR16                Name[1];\r
-  AUTH_VARIABLE_INFO    AuthVariableInfo;\r
-  UINT32                KeyIndex;\r
-\r
-  Status = AuthServiceInternalFindVariable (\r
-             AUTHVAR_KEYDB_NAME,\r
-             &gEfiAuthenticatedVariableGuid,\r
-             (VOID **) &Data,\r
-             &DataSize\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Get public key database variable failure, Status = %r\n", Status));\r
-    return 0;\r
-  }\r
-\r
-  if (mPubKeyNumber == mMaxKeyNumber) {\r
-    Name[0] = 0;\r
-    AuthVariableInfo.VariableName = Name;\r
-    ZeroMem (&VendorGuid, sizeof (VendorGuid));\r
-    AuthVariableInfo.VendorGuid = &VendorGuid;\r
-    mPubKeyNumber = 0;\r
-    //\r
-    // Collect valid key data.\r
-    //\r
-    do {\r
-      Status = mAuthVarLibContextIn->FindNextVariable (AuthVariableInfo.VariableName, AuthVariableInfo.VendorGuid, &AuthVariableInfo);\r
-      if (!EFI_ERROR (Status)) {\r
-        if (AuthVariableInfo.PubKeyIndex != 0) {\r
-          for (Ptr = Data; Ptr < (Data + DataSize); Ptr += sizeof (AUTHVAR_KEY_DB_DATA)) {\r
-            if (ReadUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) Ptr)->KeyIndex)) == AuthVariableInfo.PubKeyIndex) {\r
-              //\r
-              // Check if the key data has been collected.\r
-              //\r
-              for (Index = 0; Index < mPubKeyNumber; Index++) {\r
-                if (ReadUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + Index)->KeyIndex)) == AuthVariableInfo.PubKeyIndex) {\r
-                  break;\r
-                }\r
-              }\r
-              if (Index == mPubKeyNumber) {\r
-                //\r
-                // New key data.\r
-                //\r
-                CopyMem ((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + mPubKeyNumber, Ptr, sizeof (AUTHVAR_KEY_DB_DATA));\r
-                mPubKeyNumber++;\r
-              }\r
-              break;\r
-            }\r
-          }\r
-        }\r
-      }\r
-    } while (Status != EFI_NOT_FOUND);\r
-\r
-    //\r
-    // No available space to add new public key.\r
-    //\r
-    if (mPubKeyNumber == mMaxKeyNumber) {\r
-      return 0;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Find available public key index.\r
-  //\r
-  for (KeyIndex = 1; KeyIndex <= mMaxKeyNumber; KeyIndex++) {\r
-    IsFound = FALSE;\r
-    for (Ptr = mPubKeyStore; Ptr < (mPubKeyStore + mPubKeyNumber * sizeof (AUTHVAR_KEY_DB_DATA)); Ptr += sizeof (AUTHVAR_KEY_DB_DATA)) {\r
-      if (ReadUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) Ptr)->KeyIndex)) == KeyIndex) {\r
-        IsFound = TRUE;\r
-        break;\r
-      }\r
-    }\r
-    if (!IsFound) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  return KeyIndex;\r
-}\r
-\r
-/**\r
-  Add public key in store and return its index.\r
-\r
-  @param[in] PubKey             Input pointer to Public Key data.\r
-  @param[in] VariableDataEntry  The variable data entry.\r
-\r
-  @return Index of new added public key.\r
-\r
-**/\r
-UINT32\r
-AddPubKeyInStore (\r
-  IN  UINT8                        *PubKey,\r
-  IN  VARIABLE_ENTRY_CONSISTENCY   *VariableDataEntry\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  UINT32                           Index;\r
-  VARIABLE_ENTRY_CONSISTENCY       PublicKeyEntry;\r
-  UINT32                           Attributes;\r
-  UINT32                           KeyIndex;\r
-\r
-  if (PubKey == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Check whether the public key entry does exist.\r
-  //\r
-  for (Index = 0; Index < mPubKeyNumber; Index++) {\r
-    if (CompareMem (((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + Index)->KeyData, PubKey, EFI_CERT_TYPE_RSA2048_SIZE) == 0) {\r
-      return ReadUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + Index)->KeyIndex));\r
-    }\r
-  }\r
-\r
-  KeyIndex = GetAvailableKeyIndex (PubKey);\r
-  if (KeyIndex == 0) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Check the variable space for both public key and variable data.\r
-  //\r
-  PublicKeyEntry.VariableSize = (mPubKeyNumber + 1) * sizeof (AUTHVAR_KEY_DB_DATA);\r
-  PublicKeyEntry.Guid         = &gEfiAuthenticatedVariableGuid;\r
-  PublicKeyEntry.Name         = AUTHVAR_KEYDB_NAME;\r
-  Attributes = VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;\r
-\r
-  if (!mAuthVarLibContextIn->CheckRemainingSpaceForConsistency (Attributes, &PublicKeyEntry, VariableDataEntry, NULL)) {\r
-    //\r
-    // No enough variable space.\r
-    //\r
-    return 0;\r
-  }\r
-\r
-  WriteUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + mPubKeyNumber)->KeyIndex), KeyIndex);\r
-  CopyMem (((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + mPubKeyNumber)->KeyData, PubKey, EFI_CERT_TYPE_RSA2048_SIZE);\r
-  mPubKeyNumber++;\r
-\r
-  //\r
-  // Update public key database variable.\r
-  //\r
-  Status = AuthServiceInternalUpdateVariable (\r
-             AUTHVAR_KEYDB_NAME,\r
-             &gEfiAuthenticatedVariableGuid,\r
-             mPubKeyStore,\r
-             mPubKeyNumber * sizeof (AUTHVAR_KEY_DB_DATA),\r
-             Attributes\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Update public key database variable failure, Status = %r\n", Status));\r
-    return 0;\r
-  }\r
-\r
-  return KeyIndex;\r
-}\r
-\r
-/**\r
-  Verify data payload with AuthInfo in EFI_CERT_TYPE_RSA2048_SHA256_GUID type.\r
-  Follow the steps in UEFI2.2.\r
-\r
-  Caution: This function may receive untrusted input.\r
-  This function may be invoked in SMM mode, and datasize and data are external input.\r
-  This function will do basic validation, before parse the data.\r
-  This function will parse the authentication carefully to avoid security issues, like\r
-  buffer overflow, integer overflow.\r
-\r
-  @param[in]      Data                    Pointer to data with AuthInfo.\r
-  @param[in]      DataSize                Size of Data.\r
-  @param[in]      PubKey                  Public key used for verification.\r
-\r
-  @retval EFI_INVALID_PARAMETER       Invalid parameter.\r
-  @retval EFI_SECURITY_VIOLATION      If authentication failed.\r
-  @retval EFI_SUCCESS                 Authentication successful.\r
-\r
-**/\r
-EFI_STATUS\r
-VerifyCounterBasedPayload (\r
-  IN     UINT8          *Data,\r
-  IN     UINTN          DataSize,\r
-  IN     UINT8          *PubKey\r
-  )\r
-{\r
-  BOOLEAN                         Status;\r
-  EFI_VARIABLE_AUTHENTICATION     *CertData;\r
-  EFI_CERT_BLOCK_RSA_2048_SHA256  *CertBlock;\r
-  UINT8                           Digest[SHA256_DIGEST_SIZE];\r
-  VOID                            *Rsa;\r
-  UINTN                           PayloadSize;\r
-\r
-  PayloadSize = DataSize - AUTHINFO_SIZE;\r
-  Rsa         = NULL;\r
-  CertData    = NULL;\r
-  CertBlock   = NULL;\r
-\r
-  if (Data == NULL || PubKey == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  CertData  = (EFI_VARIABLE_AUTHENTICATION *) Data;\r
-  CertBlock = (EFI_CERT_BLOCK_RSA_2048_SHA256 *) (CertData->AuthInfo.CertData);\r
-\r
-  //\r
-  // wCertificateType should be WIN_CERT_TYPE_EFI_GUID.\r
-  // Cert type should be EFI_CERT_TYPE_RSA2048_SHA256_GUID.\r
-  //\r
-  if ((CertData->AuthInfo.Hdr.wCertificateType != WIN_CERT_TYPE_EFI_GUID) ||\r
-      !CompareGuid (&CertData->AuthInfo.CertType, &gEfiCertTypeRsa2048Sha256Guid)) {\r
-    //\r
-    // Invalid AuthInfo type, return EFI_SECURITY_VIOLATION.\r
-    //\r
-    return EFI_SECURITY_VIOLATION;\r
-  }\r
-  //\r
-  // Hash data payload with SHA256.\r
-  //\r
-  ZeroMem (Digest, SHA256_DIGEST_SIZE);\r
-  Status  = Sha256Init (mHashCtx);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  Status  = Sha256Update (mHashCtx, Data + AUTHINFO_SIZE, PayloadSize);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Hash Size.\r
-  //\r
-  Status  = Sha256Update (mHashCtx, &PayloadSize, sizeof (UINTN));\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Hash Monotonic Count.\r
-  //\r
-  Status  = Sha256Update (mHashCtx, &CertData->MonotonicCount, sizeof (UINT64));\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  Status  = Sha256Final (mHashCtx, Digest);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Generate & Initialize RSA Context.\r
-  //\r
-  Rsa = RsaNew ();\r
-  ASSERT (Rsa != NULL);\r
-  //\r
-  // Set RSA Key Components.\r
-  // NOTE: Only N and E are needed to be set as RSA public key for signature verification.\r
-  //\r
-  Status = RsaSetKey (Rsa, RsaKeyN, PubKey, EFI_CERT_TYPE_RSA2048_SIZE);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  Status = RsaSetKey (Rsa, RsaKeyE, mRsaE, sizeof (mRsaE));\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-  //\r
-  // Verify the signature.\r
-  //\r
-  Status = RsaPkcs1Verify (\r
-             Rsa,\r
-             Digest,\r
-             SHA256_DIGEST_SIZE,\r
-             CertBlock->Signature,\r
-             EFI_CERT_TYPE_RSA2048_SHA256_SIZE\r
-             );\r
-\r
-Done:\r
-  if (Rsa != NULL) {\r
-    RsaFree (Rsa);\r
-  }\r
-  if (Status) {\r
-    return EFI_SUCCESS;\r
-  } else {\r
-    return EFI_SECURITY_VIOLATION;\r
-  }\r
-}\r
-\r
 /**\r
   Update platform mode.\r
 \r
@@ -610,15 +269,15 @@ Done:
 **/\r
 EFI_STATUS\r
 UpdatePlatformMode (\r
-  IN  UINT32                    Mode\r
+  IN  UINT32  Mode\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  VOID                    *Data;\r
-  UINTN                   DataSize;\r
-  UINT8                   SecureBootMode;\r
-  UINT8                   SecureBootEnable;\r
-  UINTN                   VariableDataSize;\r
+  EFI_STATUS  Status;\r
+  VOID        *Data;\r
+  UINTN       DataSize;\r
+  UINT8       SecureBootMode;\r
+  UINT8       SecureBootEnable;\r
+  UINTN       VariableDataSize;\r
 \r
   Status = AuthServiceInternalFindVariable (\r
              EFI_SETUP_MODE_NAME,\r
@@ -634,8 +293,8 @@ UpdatePlatformMode (
   // Update the value of SetupMode variable by a simple mem copy, this could avoid possible\r
   // variable storage reclaim at runtime.\r
   //\r
-  mPlatformMode = (UINT8) Mode;\r
-  CopyMem (Data, &mPlatformMode, sizeof(UINT8));\r
+  mPlatformMode = (UINT8)Mode;\r
+  CopyMem (Data, &mPlatformMode, sizeof (UINT8));\r
 \r
   if (mAuthVarLibContextIn->AtRuntime ()) {\r
     //\r
@@ -674,13 +333,13 @@ UpdatePlatformMode (
     }\r
   }\r
 \r
-  Status  = AuthServiceInternalUpdateVariable (\r
-              EFI_SECURE_BOOT_MODE_NAME,\r
-              &gEfiGlobalVariableGuid,\r
-              &SecureBootMode,\r
-              sizeof(UINT8),\r
-              EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS\r
-              );\r
+  Status = AuthServiceInternalUpdateVariable (\r
+             EFI_SECURE_BOOT_MODE_NAME,\r
+             &gEfiGlobalVariableGuid,\r
+             &SecureBootMode,\r
+             sizeof (UINT8),\r
+             EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -709,6 +368,7 @@ UpdatePlatformMode (
     if (EFI_ERROR (Status)) {\r
       return EFI_SUCCESS;\r
     }\r
+\r
     SecureBootEnable = SECURE_BOOT_DISABLE;\r
     VariableDataSize = 0;\r
   }\r
@@ -736,21 +396,21 @@ UpdatePlatformMode (
 \r
 **/\r
 EFI_STATUS\r
-CheckSignatureListFormat(\r
-  IN  CHAR16                    *VariableName,\r
-  IN  EFI_GUID                  *VendorGuid,\r
-  IN  VOID                      *Data,\r
-  IN  UINTN                     DataSize\r
+CheckSignatureListFormat (\r
+  IN  CHAR16    *VariableName,\r
+  IN  EFI_GUID  *VendorGuid,\r
+  IN  VOID      *Data,\r
+  IN  UINTN     DataSize\r
   )\r
 {\r
-  EFI_SIGNATURE_LIST     *SigList;\r
-  UINTN                  SigDataSize;\r
-  UINT32                 Index;\r
-  UINT32                 SigCount;\r
-  BOOLEAN                IsPk;\r
-  VOID                   *RsaContext;\r
-  EFI_SIGNATURE_DATA     *CertData;\r
-  UINTN                  CertLen;\r
+  EFI_SIGNATURE_LIST  *SigList;\r
+  UINTN               SigDataSize;\r
+  UINT32              Index;\r
+  UINT32              SigCount;\r
+  BOOLEAN             IsPk;\r
+  VOID                *RsaContext;\r
+  EFI_SIGNATURE_DATA  *CertData;\r
+  UINTN               CertLen;\r
 \r
   if (DataSize == 0) {\r
     return EFI_SUCCESS;\r
@@ -758,24 +418,25 @@ CheckSignatureListFormat(
 \r
   ASSERT (VariableName != NULL && VendorGuid != NULL && Data != NULL);\r
 \r
-  if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_PLATFORM_KEY_NAME) == 0)){\r
+  if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_PLATFORM_KEY_NAME) == 0)) {\r
     IsPk = TRUE;\r
   } else if ((CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0)) ||\r
              (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) &&\r
-             ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) ||\r
-              (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0)))) {\r
+              ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) ||\r
+               (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0))))\r
+  {\r
     IsPk = FALSE;\r
   } else {\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  SigCount = 0;\r
-  SigList  = (EFI_SIGNATURE_LIST *) Data;\r
-  SigDataSize  = DataSize;\r
-  RsaContext = NULL;\r
+  SigCount    = 0;\r
+  SigList     = (EFI_SIGNATURE_LIST *)Data;\r
+  SigDataSize = DataSize;\r
+  RsaContext  = NULL;\r
 \r
   //\r
-  // Walk throuth the input signature list and check the data format.\r
+  // Walk through the input signature list and check the data format.\r
   // If any signature is incorrectly formed, the whole check will fail.\r
   //\r
   while ((SigDataSize > 0) && (SigDataSize >= SigList->SignatureListSize)) {\r
@@ -785,14 +446,18 @@ CheckSignatureListFormat(
         // The value of SignatureSize should always be 16 (size of SignatureOwner\r
         // component) add the data length according to signature type.\r
         //\r
-        if (mSupportSigItem[Index].SigDataSize != ((UINT32) ~0) &&\r
-          (SigList->SignatureSize - sizeof (EFI_GUID)) != mSupportSigItem[Index].SigDataSize) {\r
+        if ((mSupportSigItem[Index].SigDataSize != ((UINT32) ~0)) &&\r
+            ((SigList->SignatureSize - sizeof (EFI_GUID)) != mSupportSigItem[Index].SigDataSize))\r
+        {\r
           return EFI_INVALID_PARAMETER;\r
         }\r
-        if (mSupportSigItem[Index].SigHeaderSize != ((UINT32) ~0) &&\r
-          SigList->SignatureHeaderSize != mSupportSigItem[Index].SigHeaderSize) {\r
+\r
+        if ((mSupportSigItem[Index].SigHeaderSize != ((UINT32) ~0)) &&\r
+            (SigList->SignatureHeaderSize != mSupportSigItem[Index].SigHeaderSize))\r
+        {\r
           return EFI_INVALID_PARAMETER;\r
         }\r
+\r
         break;\r
       }\r
     }\r
@@ -813,29 +478,32 @@ CheckSignatureListFormat(
       if (RsaContext == NULL) {\r
         return EFI_INVALID_PARAMETER;\r
       }\r
-      CertData = (EFI_SIGNATURE_DATA *) ((UINT8 *) SigList + sizeof (EFI_SIGNATURE_LIST) + SigList->SignatureHeaderSize);\r
-      CertLen = SigList->SignatureSize - sizeof (EFI_GUID);\r
+\r
+      CertData = (EFI_SIGNATURE_DATA *)((UINT8 *)SigList + sizeof (EFI_SIGNATURE_LIST) + SigList->SignatureHeaderSize);\r
+      CertLen  = SigList->SignatureSize - sizeof (EFI_GUID);\r
       if (!RsaGetPublicKeyFromX509 (CertData->SignatureData, CertLen, &RsaContext)) {\r
         RsaFree (RsaContext);\r
         return EFI_INVALID_PARAMETER;\r
       }\r
+\r
       RsaFree (RsaContext);\r
     }\r
 \r
     if ((SigList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - SigList->SignatureHeaderSize) % SigList->SignatureSize != 0) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
+\r
     SigCount += (SigList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - SigList->SignatureHeaderSize) / SigList->SignatureSize;\r
 \r
     SigDataSize -= SigList->SignatureListSize;\r
-    SigList = (EFI_SIGNATURE_LIST *) ((UINT8 *) SigList + SigList->SignatureListSize);\r
+    SigList      = (EFI_SIGNATURE_LIST *)((UINT8 *)SigList + SigList->SignatureListSize);\r
   }\r
 \r
-  if (((UINTN) SigList - (UINTN) Data) != DataSize) {\r
+  if (((UINTN)SigList - (UINTN)Data) != DataSize) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (IsPk && SigCount > 1) {\r
+  if (IsPk && (SigCount > 1)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -854,11 +522,12 @@ VendorKeyIsModified (
   VOID\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
+  EFI_STATUS  Status;\r
 \r
   if (mVendorKeyState == VENDOR_KEYS_MODIFIED) {\r
     return EFI_SUCCESS;\r
   }\r
+\r
   mVendorKeyState = VENDOR_KEYS_MODIFIED;\r
 \r
   Status = AuthServiceInternalUpdateVariable (\r
@@ -907,21 +576,22 @@ VendorKeyIsModified (
 **/\r
 EFI_STATUS\r
 ProcessVarWithPk (\r
-  IN  CHAR16                    *VariableName,\r
-  IN  EFI_GUID                  *VendorGuid,\r
-  IN  VOID                      *Data,\r
-  IN  UINTN                     DataSize,\r
-  IN  UINT32                    Attributes OPTIONAL,\r
-  IN  BOOLEAN                   IsPk\r
+  IN  CHAR16    *VariableName,\r
+  IN  EFI_GUID  *VendorGuid,\r
+  IN  VOID      *Data,\r
+  IN  UINTN     DataSize,\r
+  IN  UINT32    Attributes OPTIONAL,\r
+  IN  BOOLEAN   IsPk\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  BOOLEAN                     Del;\r
-  UINT8                       *Payload;\r
-  UINTN                       PayloadSize;\r
+  EFI_STATUS  Status;\r
+  BOOLEAN     Del;\r
+  UINT8       *Payload;\r
+  UINTN       PayloadSize;\r
 \r
-  if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0 ||\r
-      (Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
+  if (((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) ||\r
+      ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0))\r
+  {\r
     //\r
     // PK, KEK and db/dbx/dbt should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
     // authenticated variable.\r
@@ -933,14 +603,14 @@ ProcessVarWithPk (
   // Init state of Del. State may change due to secure check\r
   //\r
   Del = FALSE;\r
-  if ((InCustomMode() && UserPhysicalPresent()) || (mPlatformMode == SETUP_MODE && !IsPk)) {\r
-    Payload = (UINT8 *) Data + AUTHINFO2_SIZE (Data);\r
+  if ((InCustomMode () && UserPhysicalPresent ()) || ((mPlatformMode == SETUP_MODE) && !IsPk)) {\r
+    Payload     = (UINT8 *)Data + AUTHINFO2_SIZE (Data);\r
     PayloadSize = DataSize - AUTHINFO2_SIZE (Data);\r
     if (PayloadSize == 0) {\r
       Del = TRUE;\r
     }\r
 \r
-    Status = CheckSignatureListFormat(VariableName, VendorGuid, Payload, PayloadSize);\r
+    Status = CheckSignatureListFormat (VariableName, VendorGuid, Payload, PayloadSize);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -951,9 +621,9 @@ ProcessVarWithPk (
                Payload,\r
                PayloadSize,\r
                Attributes,\r
-               &((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp\r
+               &((EFI_VARIABLE_AUTHENTICATION_2 *)Data)->TimeStamp\r
                );\r
-    if (EFI_ERROR(Status)) {\r
+    if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
 \r
@@ -988,13 +658,13 @@ ProcessVarWithPk (
                );\r
   }\r
 \r
-  if (!EFI_ERROR(Status) && IsPk) {\r
-    if (mPlatformMode == SETUP_MODE && !Del) {\r
+  if (!EFI_ERROR (Status) && IsPk) {\r
+    if ((mPlatformMode == SETUP_MODE) && !Del) {\r
       //\r
       // If enroll PK in setup mode, need change to user mode.\r
       //\r
       Status = UpdatePlatformMode (USER_MODE);\r
-    } else if (mPlatformMode == USER_MODE && Del){\r
+    } else if ((mPlatformMode == USER_MODE) && Del) {\r
       //\r
       // If delete PK in user mode, need change to setup mode.\r
       //\r
@@ -1030,19 +700,20 @@ ProcessVarWithPk (
 **/\r
 EFI_STATUS\r
 ProcessVarWithKek (\r
-  IN  CHAR16                               *VariableName,\r
-  IN  EFI_GUID                             *VendorGuid,\r
-  IN  VOID                                 *Data,\r
-  IN  UINTN                                DataSize,\r
-  IN  UINT32                               Attributes OPTIONAL\r
+  IN  CHAR16    *VariableName,\r
+  IN  EFI_GUID  *VendorGuid,\r
+  IN  VOID      *Data,\r
+  IN  UINTN     DataSize,\r
+  IN  UINT32    Attributes OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  UINT8                           *Payload;\r
-  UINTN                           PayloadSize;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Payload;\r
+  UINTN       PayloadSize;\r
 \r
-  if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0 ||\r
-      (Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
+  if (((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) ||\r
+      ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0))\r
+  {\r
     //\r
     // DB, DBX and DBT should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
     // authenticated variable.\r
@@ -1051,7 +722,7 @@ ProcessVarWithKek (
   }\r
 \r
   Status = EFI_SUCCESS;\r
-  if (mPlatformMode == USER_MODE && !(InCustomMode() && UserPhysicalPresent())) {\r
+  if ((mPlatformMode == USER_MODE) && !(InCustomMode () && UserPhysicalPresent ())) {\r
     //\r
     // Time-based, verify against X509 Cert KEK.\r
     //\r
@@ -1068,10 +739,10 @@ ProcessVarWithKek (
     //\r
     // If in setup mode or custom secure boot mode, no authentication needed.\r
     //\r
-    Payload = (UINT8 *) Data + AUTHINFO2_SIZE (Data);\r
+    Payload     = (UINT8 *)Data + AUTHINFO2_SIZE (Data);\r
     PayloadSize = DataSize - AUTHINFO2_SIZE (Data);\r
 \r
-    Status = CheckSignatureListFormat(VariableName, VendorGuid, Payload, PayloadSize);\r
+    Status = CheckSignatureListFormat (VariableName, VendorGuid, Payload, PayloadSize);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -1082,7 +753,7 @@ ProcessVarWithKek (
                Payload,\r
                PayloadSize,\r
                Attributes,\r
-               &((EFI_VARIABLE_AUTHENTICATION_2 *) Data)->TimeStamp\r
+               &((EFI_VARIABLE_AUTHENTICATION_2 *)Data)->TimeStamp\r
                );\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
@@ -1110,14 +781,14 @@ ProcessVarWithKek (
 **/\r
 BOOLEAN\r
 IsDeleteAuthVariable (\r
-  IN  UINT32                    OrgAttributes,\r
-  IN  VOID                      *Data,\r
-  IN  UINTN                     DataSize,\r
-  IN  UINT32                    Attributes\r
+  IN  UINT32  OrgAttributes,\r
+  IN  VOID    *Data,\r
+  IN  UINTN   DataSize,\r
+  IN  UINT32  Attributes\r
   )\r
 {\r
-  BOOLEAN                       Del;\r
-  UINTN                         PayloadSize;\r
+  BOOLEAN  Del;\r
+  UINTN    PayloadSize;\r
 \r
   Del = FALSE;\r
 \r
@@ -1128,7 +799,8 @@ IsDeleteAuthVariable (
   // and the DataSize set to the size of the AuthInfo descriptor.\r
   //\r
   if ((Attributes == OrgAttributes) &&\r
-      ((Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) != 0)) {\r
+      ((Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) != 0))\r
+  {\r
     if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
       PayloadSize = DataSize - AUTHINFO2_SIZE (Data);\r
       if (PayloadSize == 0) {\r
@@ -1146,7 +818,7 @@ IsDeleteAuthVariable (
 }\r
 \r
 /**\r
-  Process variable with EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS/EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS set\r
+  Process variable with EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS set\r
 \r
   Caution: This function may receive untrusted input.\r
   This function may be invoked in SMM mode, and datasize and data are external input.\r
@@ -1163,9 +835,9 @@ IsDeleteAuthVariable (
 \r
   @return EFI_INVALID_PARAMETER           Invalid parameter.\r
   @return EFI_WRITE_PROTECTED             Variable is write-protected and needs authentication with\r
-                                          EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS set.\r
+                                          EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS set.\r
   @return EFI_OUT_OF_RESOURCES            The Database to save the public key is full.\r
-  @return EFI_SECURITY_VIOLATION          The variable is with EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS\r
+  @return EFI_SECURITY_VIOLATION          The variable is with EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS\r
                                           set, but the AuthInfo does NOT pass the validation\r
                                           check carried out by the firmware.\r
   @return EFI_SUCCESS                     Variable is not write-protected or pass validation successfully.\r
@@ -1173,50 +845,37 @@ IsDeleteAuthVariable (
 **/\r
 EFI_STATUS\r
 ProcessVariable (\r
-  IN     CHAR16                             *VariableName,\r
-  IN     EFI_GUID                           *VendorGuid,\r
-  IN     VOID                               *Data,\r
-  IN     UINTN                              DataSize,\r
-  IN     UINT32                             Attributes\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid,\r
+  IN     VOID      *Data,\r
+  IN     UINTN     DataSize,\r
+  IN     UINT32    Attributes\r
   )\r
 {\r
-  EFI_STATUS                      Status;\r
-  BOOLEAN                         IsDeletion;\r
-  BOOLEAN                         IsFirstTime;\r
-  UINT8                           *PubKey;\r
-  EFI_VARIABLE_AUTHENTICATION     *CertData;\r
-  EFI_CERT_BLOCK_RSA_2048_SHA256  *CertBlock;\r
-  UINT32                          KeyIndex;\r
-  UINT64                          MonotonicCount;\r
-  VARIABLE_ENTRY_CONSISTENCY      VariableDataEntry;\r
-  UINT32                          Index;\r
-  AUTH_VARIABLE_INFO              OrgVariableInfo;\r
-\r
-  KeyIndex    = 0;\r
-  CertData    = NULL;\r
-  CertBlock   = NULL;\r
-  PubKey      = NULL;\r
-  IsDeletion  = FALSE;\r
-  Status      = EFI_SUCCESS;\r
+  EFI_STATUS          Status;\r
+  AUTH_VARIABLE_INFO  OrgVariableInfo;\r
+\r
+  Status = EFI_SUCCESS;\r
 \r
   ZeroMem (&OrgVariableInfo, sizeof (OrgVariableInfo));\r
   Status = mAuthVarLibContextIn->FindVariable (\r
-             VariableName,\r
-             VendorGuid,\r
-             &OrgVariableInfo\r
-             );\r
+                                   VariableName,\r
+                                   VendorGuid,\r
+                                   &OrgVariableInfo\r
+                                   );\r
 \r
-  if ((!EFI_ERROR (Status)) && IsDeleteAuthVariable (OrgVariableInfo.Attributes, Data, DataSize, Attributes) && UserPhysicalPresent()) {\r
+  // If the VariablePolicy engine is disabled, allow deletion of any authenticated variables.\r
+  if ((!EFI_ERROR (Status)) && IsDeleteAuthVariable (OrgVariableInfo.Attributes, Data, DataSize, Attributes) && (UserPhysicalPresent () || !IsVariablePolicyEnabled ())) {\r
     //\r
-    // Allow the delete operation of common authenticated variable at user physical presence.\r
+    // Allow the delete operation of common authenticated variable(AT or AW) at user physical presence.\r
     //\r
     Status = AuthServiceInternalUpdateVariable (\r
-              VariableName,\r
-              VendorGuid,\r
-              NULL,\r
-              0,\r
-              0\r
-              );\r
+               VariableName,\r
+               VendorGuid,\r
+               NULL,\r
+               0,\r
+               0\r
+               );\r
     if (!EFI_ERROR (Status) && ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0)) {\r
       Status = DeleteCertsFromDb (VariableName, VendorGuid, Attributes);\r
     }\r
@@ -1224,7 +883,7 @@ ProcessVariable (
     return Status;\r
   }\r
 \r
-  if (NeedPhysicallyPresent (VariableName, VendorGuid) && !UserPhysicalPresent()) {\r
+  if (NeedPhysicallyPresent (VariableName, VendorGuid) && !UserPhysicalPresent ()) {\r
     //\r
     // This variable is protected, only physical present user could modify its value.\r
     //\r
@@ -1232,25 +891,15 @@ ProcessVariable (
   }\r
 \r
   //\r
-  // A time-based authenticated variable and a count-based authenticated variable\r
-  // can't be updated by each other.\r
-  //\r
-  if (OrgVariableInfo.Data != NULL) {\r
-    if (((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) &&\r
-        ((OrgVariableInfo.Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0)) {\r
-      return EFI_SECURITY_VIOLATION;\r
-    }\r
-\r
-    if (((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) &&\r
-        ((OrgVariableInfo.Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0)) {\r
-      return EFI_SECURITY_VIOLATION;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Process Time-based Authenticated variable.\r
-  //\r
-  if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
+  if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
+    //\r
+    // Reject Counter Based Auth Variable processing request.\r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  } else if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
+    //\r
+    // Process Time-based Authenticated variable.\r
+    //\r
     return VerifyTimeBasedPayloadAndUpdate (\r
              VariableName,\r
              VendorGuid,\r
@@ -1262,117 +911,20 @@ ProcessVariable (
              );\r
   }\r
 \r
-  //\r
-  // Determine if first time SetVariable with the EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS.\r
-  //\r
-  if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
-    //\r
-    // Determine current operation type.\r
-    //\r
-    if (DataSize == AUTHINFO_SIZE) {\r
-      IsDeletion = TRUE;\r
-    }\r
-    //\r
-    // Determine whether this is the first time with EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS set.\r
-    //\r
-    if (OrgVariableInfo.Data == NULL) {\r
-      IsFirstTime = TRUE;\r
-    } else if ((OrgVariableInfo.Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
-      IsFirstTime = TRUE;\r
-    } else {\r
-      KeyIndex   = OrgVariableInfo.PubKeyIndex;\r
-      IsFirstTime = FALSE;\r
-    }\r
-  } else if ((OrgVariableInfo.Data != NULL) &&\r
-             ((OrgVariableInfo.Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) != 0)\r
-            ) {\r
+  if ((OrgVariableInfo.Data != NULL) &&\r
+      ((OrgVariableInfo.Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) != 0))\r
+  {\r
     //\r
     // If the variable is already write-protected, it always needs authentication before update.\r
     //\r
     return EFI_WRITE_PROTECTED;\r
-  } else {\r
-    //\r
-    // If without EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, set and attributes collision.\r
-    // That means it is not authenticated variable, just update variable as usual.\r
-    //\r
-    Status = AuthServiceInternalUpdateVariable (VariableName, VendorGuid, Data, DataSize, Attributes);\r
-    return Status;\r
   }\r
 \r
   //\r
-  // Get PubKey and check Monotonic Count value corresponding to the variable.\r
+  // Not authenticated variable, just update variable as usual.\r
   //\r
-  CertData  = (EFI_VARIABLE_AUTHENTICATION *) Data;\r
-  CertBlock = (EFI_CERT_BLOCK_RSA_2048_SHA256 *) (CertData->AuthInfo.CertData);\r
-  PubKey    = CertBlock->PublicKey;\r
-\r
-  //\r
-  // Update Monotonic Count value.\r
-  //\r
-  MonotonicCount = CertData->MonotonicCount;\r
-\r
-  if (!IsFirstTime) {\r
-    //\r
-    // 2 cases need to check here\r
-    //   1. Internal PubKey variable. PubKeyIndex is always 0\r
-    //   2. Other counter-based AuthVariable. Check input PubKey.\r
-    //\r
-    if (KeyIndex == 0) {\r
-      return EFI_SECURITY_VIOLATION;\r
-    }\r
-    for (Index = 0; Index < mPubKeyNumber; Index++) {\r
-      if (ReadUnaligned32 (&(((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + Index)->KeyIndex)) == KeyIndex) {\r
-        if (CompareMem (((AUTHVAR_KEY_DB_DATA *) mPubKeyStore + Index)->KeyData, PubKey, EFI_CERT_TYPE_RSA2048_SIZE) == 0) {\r
-          break;\r
-        } else {\r
-          return EFI_SECURITY_VIOLATION;\r
-        }\r
-      }\r
-    }\r
-    if (Index == mPubKeyNumber) {\r
-      return EFI_SECURITY_VIOLATION;\r
-    }\r
-\r
-    //\r
-    // Compare the current monotonic count and ensure that it is greater than the last SetVariable\r
-    // operation with the EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS attribute set.\r
-    //\r
-    if (MonotonicCount <= OrgVariableInfo.MonotonicCount) {\r
-      //\r
-      // Monotonic count check fail, suspicious replay attack, return EFI_SECURITY_VIOLATION.\r
-      //\r
-      return EFI_SECURITY_VIOLATION;\r
-    }\r
-  }\r
-  //\r
-  // Verify the certificate in Data payload.\r
-  //\r
-  Status = VerifyCounterBasedPayload (Data, DataSize, PubKey);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Now, the signature has been verified!\r
-  //\r
-  if (IsFirstTime && !IsDeletion) {\r
-    VariableDataEntry.VariableSize = DataSize - AUTHINFO_SIZE;\r
-    VariableDataEntry.Guid         = VendorGuid;\r
-    VariableDataEntry.Name         = VariableName;\r
-\r
-    //\r
-    // Update public key database variable if need.\r
-    //\r
-    KeyIndex = AddPubKeyInStore (PubKey, &VariableDataEntry);\r
-    if (KeyIndex == 0) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Verification pass.\r
-  //\r
-  return AuthServiceInternalUpdateVariableWithMonotonicCount (VariableName, VendorGuid, (UINT8*)Data + AUTHINFO_SIZE, DataSize - AUTHINFO_SIZE, Attributes, KeyIndex, MonotonicCount);\r
+  Status = AuthServiceInternalUpdateVariable (VariableName, VendorGuid, Data, DataSize, Attributes);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -1386,56 +938,57 @@ ProcessVariable (
 **/\r
 EFI_STATUS\r
 FilterSignatureList (\r
-  IN     VOID       *Data,\r
-  IN     UINTN      DataSize,\r
-  IN OUT VOID       *NewData,\r
-  IN OUT UINTN      *NewDataSize\r
+  IN     VOID   *Data,\r
+  IN     UINTN  DataSize,\r
+  IN OUT VOID   *NewData,\r
+  IN OUT UINTN  *NewDataSize\r
   )\r
 {\r
-  EFI_SIGNATURE_LIST    *CertList;\r
-  EFI_SIGNATURE_DATA    *Cert;\r
-  UINTN                 CertCount;\r
-  EFI_SIGNATURE_LIST    *NewCertList;\r
-  EFI_SIGNATURE_DATA    *NewCert;\r
-  UINTN                 NewCertCount;\r
-  UINTN                 Index;\r
-  UINTN                 Index2;\r
-  UINTN                 Size;\r
-  UINT8                 *Tail;\r
-  UINTN                 CopiedCount;\r
-  UINTN                 SignatureListSize;\r
-  BOOLEAN               IsNewCert;\r
-  UINT8                 *TempData;\r
-  UINTN                 TempDataSize;\r
-  EFI_STATUS            Status;\r
+  EFI_SIGNATURE_LIST  *CertList;\r
+  EFI_SIGNATURE_DATA  *Cert;\r
+  UINTN               CertCount;\r
+  EFI_SIGNATURE_LIST  *NewCertList;\r
+  EFI_SIGNATURE_DATA  *NewCert;\r
+  UINTN               NewCertCount;\r
+  UINTN               Index;\r
+  UINTN               Index2;\r
+  UINTN               Size;\r
+  UINT8               *Tail;\r
+  UINTN               CopiedCount;\r
+  UINTN               SignatureListSize;\r
+  BOOLEAN             IsNewCert;\r
+  UINT8               *TempData;\r
+  UINTN               TempDataSize;\r
+  EFI_STATUS          Status;\r
 \r
   if (*NewDataSize == 0) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
   TempDataSize = *NewDataSize;\r
-  Status = mAuthVarLibContextIn->GetScratchBuffer (&TempDataSize, (VOID **) &TempData);\r
+  Status       = mAuthVarLibContextIn->GetScratchBuffer (&TempDataSize, (VOID **)&TempData);\r
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   Tail = TempData;\r
 \r
-  NewCertList = (EFI_SIGNATURE_LIST *) NewData;\r
+  NewCertList = (EFI_SIGNATURE_LIST *)NewData;\r
   while ((*NewDataSize > 0) && (*NewDataSize >= NewCertList->SignatureListSize)) {\r
-    NewCert      = (EFI_SIGNATURE_DATA *) ((UINT8 *) NewCertList + sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize);\r
+    NewCert      = (EFI_SIGNATURE_DATA *)((UINT8 *)NewCertList + sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize);\r
     NewCertCount = (NewCertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - NewCertList->SignatureHeaderSize) / NewCertList->SignatureSize;\r
 \r
     CopiedCount = 0;\r
     for (Index = 0; Index < NewCertCount; Index++) {\r
       IsNewCert = TRUE;\r
 \r
-      Size = DataSize;\r
-      CertList = (EFI_SIGNATURE_LIST *) Data;\r
+      Size     = DataSize;\r
+      CertList = (EFI_SIGNATURE_LIST *)Data;\r
       while ((Size > 0) && (Size >= CertList->SignatureListSize)) {\r
         if (CompareGuid (&CertList->SignatureType, &NewCertList->SignatureType) &&\r
-           (CertList->SignatureSize == NewCertList->SignatureSize)) {\r
-          Cert      = (EFI_SIGNATURE_DATA *) ((UINT8 *) CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
+            (CertList->SignatureSize == NewCertList->SignatureSize))\r
+        {\r
+          Cert      = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
           CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;\r
           for (Index2 = 0; Index2 < CertCount; Index2++) {\r
             //\r
@@ -1445,15 +998,17 @@ FilterSignatureList (
               IsNewCert = FALSE;\r
               break;\r
             }\r
-            Cert = (EFI_SIGNATURE_DATA *) ((UINT8 *) Cert + CertList->SignatureSize);\r
+\r
+            Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)Cert + CertList->SignatureSize);\r
           }\r
         }\r
 \r
         if (!IsNewCert) {\r
           break;\r
         }\r
-        Size -= CertList->SignatureListSize;\r
-        CertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) CertList + CertList->SignatureListSize);\r
+\r
+        Size    -= CertList->SignatureListSize;\r
+        CertList = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);\r
       }\r
 \r
       if (IsNewCert) {\r
@@ -1473,23 +1028,23 @@ FilterSignatureList (
         CopiedCount++;\r
       }\r
 \r
-      NewCert = (EFI_SIGNATURE_DATA *) ((UINT8 *) NewCert + NewCertList->SignatureSize);\r
+      NewCert = (EFI_SIGNATURE_DATA *)((UINT8 *)NewCert + NewCertList->SignatureSize);\r
     }\r
 \r
     //\r
     // Update SignatureListSize in the kept EFI_SIGNATURE_LIST.\r
     //\r
     if (CopiedCount != 0) {\r
-      SignatureListSize = sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize + (CopiedCount * NewCertList->SignatureSize);\r
-      CertList = (EFI_SIGNATURE_LIST *) (Tail - SignatureListSize);\r
-      CertList->SignatureListSize = (UINT32) SignatureListSize;\r
+      SignatureListSize           = sizeof (EFI_SIGNATURE_LIST) + NewCertList->SignatureHeaderSize + (CopiedCount * NewCertList->SignatureSize);\r
+      CertList                    = (EFI_SIGNATURE_LIST *)(Tail - SignatureListSize);\r
+      CertList->SignatureListSize = (UINT32)SignatureListSize;\r
     }\r
 \r
     *NewDataSize -= NewCertList->SignatureListSize;\r
-    NewCertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) NewCertList + NewCertList->SignatureListSize);\r
+    NewCertList   = (EFI_SIGNATURE_LIST *)((UINT8 *)NewCertList + NewCertList->SignatureListSize);\r
   }\r
 \r
-  TempDataSize = (Tail - (UINT8 *) TempData);\r
+  TempDataSize = (Tail - (UINT8 *)TempData);\r
 \r
   CopyMem (NewData, TempData, TempDataSize);\r
   *NewDataSize = TempDataSize;\r
@@ -1510,23 +1065,106 @@ FilterSignatureList (
 **/\r
 BOOLEAN\r
 AuthServiceInternalCompareTimeStamp (\r
-  IN EFI_TIME               *FirstTime,\r
-  IN EFI_TIME               *SecondTime\r
+  IN EFI_TIME  *FirstTime,\r
+  IN EFI_TIME  *SecondTime\r
   )\r
 {\r
   if (FirstTime->Year != SecondTime->Year) {\r
-    return (BOOLEAN) (FirstTime->Year < SecondTime->Year);\r
+    return (BOOLEAN)(FirstTime->Year < SecondTime->Year);\r
   } else if (FirstTime->Month != SecondTime->Month) {\r
-    return (BOOLEAN) (FirstTime->Month < SecondTime->Month);\r
+    return (BOOLEAN)(FirstTime->Month < SecondTime->Month);\r
   } else if (FirstTime->Day != SecondTime->Day) {\r
-    return (BOOLEAN) (FirstTime->Day < SecondTime->Day);\r
+    return (BOOLEAN)(FirstTime->Day < SecondTime->Day);\r
   } else if (FirstTime->Hour != SecondTime->Hour) {\r
-    return (BOOLEAN) (FirstTime->Hour < SecondTime->Hour);\r
+    return (BOOLEAN)(FirstTime->Hour < SecondTime->Hour);\r
   } else if (FirstTime->Minute != SecondTime->Minute) {\r
-    return (BOOLEAN) (FirstTime->Minute < SecondTime->Minute);\r
+    return (BOOLEAN)(FirstTime->Minute < SecondTime->Minute);\r
   }\r
 \r
-  return (BOOLEAN) (FirstTime->Second <= SecondTime->Second);\r
+  return (BOOLEAN)(FirstTime->Second <= SecondTime->Second);\r
+}\r
+\r
+/**\r
+  Calculate SHA256 digest of SignerCert CommonName + ToplevelCert tbsCertificate\r
+  SignerCert and ToplevelCert are inside the signer certificate chain.\r
+\r
+  @param[in]  SignerCert          A pointer to SignerCert data.\r
+  @param[in]  SignerCertSize      Length of SignerCert data.\r
+  @param[in]  TopLevelCert        A pointer to TopLevelCert data.\r
+  @param[in]  TopLevelCertSize    Length of TopLevelCert data.\r
+  @param[out] Sha256Digest       Sha256 digest calculated.\r
+\r
+  @return EFI_ABORTED          Digest process failed.\r
+  @return EFI_SUCCESS          SHA256 Digest is successfully calculated.\r
+\r
+**/\r
+EFI_STATUS\r
+CalculatePrivAuthVarSignChainSHA256Digest (\r
+  IN     UINT8  *SignerCert,\r
+  IN     UINTN  SignerCertSize,\r
+  IN     UINT8  *TopLevelCert,\r
+  IN     UINTN  TopLevelCertSize,\r
+  OUT    UINT8  *Sha256Digest\r
+  )\r
+{\r
+  UINT8       *TbsCert;\r
+  UINTN       TbsCertSize;\r
+  CHAR8       CertCommonName[128];\r
+  UINTN       CertCommonNameSize;\r
+  BOOLEAN     CryptoStatus;\r
+  EFI_STATUS  Status;\r
+\r
+  CertCommonNameSize = sizeof (CertCommonName);\r
+\r
+  //\r
+  // Get SignerCert CommonName\r
+  //\r
+  Status = X509GetCommonName (SignerCert, SignerCertSize, CertCommonName, &CertCommonNameSize);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_INFO, "%a Get SignerCert CommonName failed with status %x\n", __FUNCTION__, Status));\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  //\r
+  // Get TopLevelCert tbsCertificate\r
+  //\r
+  if (!X509GetTBSCert (TopLevelCert, TopLevelCertSize, &TbsCert, &TbsCertSize)) {\r
+    DEBUG ((DEBUG_INFO, "%a Get Top-level Cert tbsCertificate failed!\n", __FUNCTION__));\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  //\r
+  // Digest SignerCert CN + TopLevelCert tbsCertificate\r
+  //\r
+  ZeroMem (Sha256Digest, SHA256_DIGEST_SIZE);\r
+  CryptoStatus = Sha256Init (mHashCtx);\r
+  if (!CryptoStatus) {\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  //\r
+  // '\0' is forced in CertCommonName. No overflow issue\r
+  //\r
+  CryptoStatus = Sha256Update (\r
+                   mHashCtx,\r
+                   CertCommonName,\r
+                   AsciiStrLen (CertCommonName)\r
+                   );\r
+  if (!CryptoStatus) {\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  CryptoStatus = Sha256Update (mHashCtx, TbsCert, TbsCertSize);\r
+  if (!CryptoStatus) {\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  CryptoStatus = Sha256Final (mHashCtx, Sha256Digest);\r
+  if (!CryptoStatus) {\r
+    return EFI_ABORTED;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -1559,22 +1197,22 @@ AuthServiceInternalCompareTimeStamp (
 **/\r
 EFI_STATUS\r
 FindCertsFromDb (\r
-  IN     CHAR16           *VariableName,\r
-  IN     EFI_GUID         *VendorGuid,\r
-  IN     UINT8            *Data,\r
-  IN     UINTN            DataSize,\r
-  OUT    UINT32           *CertOffset,    OPTIONAL\r
-  OUT    UINT32           *CertDataSize,  OPTIONAL\r
-  OUT    UINT32           *CertNodeOffset,OPTIONAL\r
-  OUT    UINT32           *CertNodeSize   OPTIONAL\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid,\r
+  IN     UINT8     *Data,\r
+  IN     UINTN     DataSize,\r
+  OUT    UINT32    *CertOffset     OPTIONAL,\r
+  OUT    UINT32    *CertDataSize   OPTIONAL,\r
+  OUT    UINT32    *CertNodeOffset OPTIONAL,\r
+  OUT    UINT32    *CertNodeSize   OPTIONAL\r
   )\r
 {\r
-  UINT32                  Offset;\r
-  AUTH_CERT_DB_DATA       *Ptr;\r
-  UINT32                  CertSize;\r
-  UINT32                  NameSize;\r
-  UINT32                  NodeSize;\r
-  UINT32                  CertDbListSize;\r
+  UINT32             Offset;\r
+  AUTH_CERT_DB_DATA  *Ptr;\r
+  UINT32             CertSize;\r
+  UINT32             NameSize;\r
+  UINT32             NodeSize;\r
+  UINT32             CertDbListSize;\r
 \r
   if ((VariableName == NULL) || (VendorGuid == NULL) || (Data == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1587,9 +1225,9 @@ FindCertsFromDb (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  CertDbListSize = ReadUnaligned32 ((UINT32 *) Data);\r
+  CertDbListSize = ReadUnaligned32 ((UINT32 *)Data);\r
 \r
-  if (CertDbListSize != (UINT32) DataSize) {\r
+  if (CertDbListSize != (UINT32)DataSize) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1598,8 +1236,8 @@ FindCertsFromDb (
   //\r
   // Get corresponding certificates by VendorGuid and VariableName.\r
   //\r
-  while (Offset < (UINT32) DataSize) {\r
-    Ptr = (AUTH_CERT_DB_DATA *) (Data + Offset);\r
+  while (Offset < (UINT32)DataSize) {\r
+    Ptr = (AUTH_CERT_DB_DATA *)(Data + Offset);\r
     //\r
     // Check whether VendorGuid matches.\r
     //\r
@@ -1609,7 +1247,8 @@ FindCertsFromDb (
       CertSize = ReadUnaligned32 (&Ptr->CertDataSize);\r
 \r
       if (NodeSize != sizeof (EFI_GUID) + sizeof (UINT32) * 3 + CertSize +\r
-          sizeof (CHAR16) * NameSize) {\r
+          sizeof (CHAR16) * NameSize)\r
+      {\r
         return EFI_INVALID_PARAMETER;\r
       }\r
 \r
@@ -1618,7 +1257,8 @@ FindCertsFromDb (
       // Check whether VariableName matches.\r
       //\r
       if ((NameSize == StrLen (VariableName)) &&\r
-          (CompareMem (Data + Offset, VariableName, NameSize * sizeof (CHAR16)) == 0)) {\r
+          (CompareMem (Data + Offset, VariableName, NameSize * sizeof (CHAR16)) == 0))\r
+      {\r
         Offset = Offset + NameSize * sizeof (CHAR16);\r
 \r
         if (CertOffset != NULL) {\r
@@ -1630,7 +1270,7 @@ FindCertsFromDb (
         }\r
 \r
         if (CertNodeOffset != NULL) {\r
-          *CertNodeOffset = (UINT32) ((UINT8 *) Ptr - Data);\r
+          *CertNodeOffset = (UINT32)((UINT8 *)Ptr - Data);\r
         }\r
 \r
         if (CertNodeSize != NULL) {\r
@@ -1668,24 +1308,23 @@ FindCertsFromDb (
 **/\r
 EFI_STATUS\r
 GetCertsFromDb (\r
-  IN     CHAR16           *VariableName,\r
-  IN     EFI_GUID         *VendorGuid,\r
-  IN     UINT32           Attributes,\r
-  OUT    UINT8            **CertData,\r
-  OUT    UINT32           *CertDataSize\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid,\r
+  IN     UINT32    Attributes,\r
+  OUT    UINT8     **CertData,\r
+  OUT    UINT32    *CertDataSize\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  UINT8                   *Data;\r
-  UINTN                   DataSize;\r
-  UINT32                  CertOffset;\r
-  CHAR16                  *DbName;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Data;\r
+  UINTN       DataSize;\r
+  UINT32      CertOffset;\r
+  CHAR16      *DbName;\r
 \r
   if ((VariableName == NULL) || (VendorGuid == NULL) || (CertData == NULL) || (CertDataSize == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  \r
   if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {\r
     //\r
     // Get variable "certdb".\r
@@ -1704,7 +1343,7 @@ GetCertsFromDb (
   Status = AuthServiceInternalFindVariable (\r
              DbName,\r
              &gEfiCertDbGuid,\r
-             (VOID **) &Data,\r
+             (VOID **)&Data,\r
              &DataSize\r
              );\r
   if (EFI_ERROR (Status)) {\r
@@ -1737,7 +1376,7 @@ GetCertsFromDb (
 \r
 /**\r
   Delete matching signer's certificates when deleting common authenticated\r
-  variable by corresponding VariableName and VendorGuid from "certdb" or \r
+  variable by corresponding VariableName and VendorGuid from "certdb" or\r
   "certdbv" according to authenticated variable attributes.\r
 \r
   @param[in]  VariableName   Name of authenticated Variable.\r
@@ -1752,20 +1391,20 @@ GetCertsFromDb (
 **/\r
 EFI_STATUS\r
 DeleteCertsFromDb (\r
-  IN     CHAR16           *VariableName,\r
-  IN     EFI_GUID         *VendorGuid,\r
-  IN     UINT32           Attributes\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid,\r
+  IN     UINT32    Attributes\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  UINT8                   *Data;\r
-  UINTN                   DataSize;\r
-  UINT32                  VarAttr;\r
-  UINT32                  CertNodeOffset;\r
-  UINT32                  CertNodeSize;\r
-  UINT8                   *NewCertDb;\r
-  UINT32                  NewCertDbSize;\r
-  CHAR16                  *DbName;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Data;\r
+  UINTN       DataSize;\r
+  UINT32      VarAttr;\r
+  UINT32      CertNodeOffset;\r
+  UINT32      CertNodeSize;\r
+  UINT8       *NewCertDb;\r
+  UINT32      NewCertDbSize;\r
+  CHAR16      *DbName;\r
 \r
   if ((VariableName == NULL) || (VendorGuid == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1775,20 +1414,20 @@ DeleteCertsFromDb (
     //\r
     // Get variable "certdb".\r
     //\r
-    DbName = EFI_CERT_DB_NAME;\r
-    VarAttr  = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
+    DbName  = EFI_CERT_DB_NAME;\r
+    VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
   } else {\r
     //\r
     // Get variable "certdbv".\r
     //\r
-    DbName = EFI_CERT_DB_VOLATILE_NAME;\r
+    DbName  = EFI_CERT_DB_VOLATILE_NAME;\r
     VarAttr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
   }\r
 \r
   Status = AuthServiceInternalFindVariable (\r
              DbName,\r
              &gEfiCertDbGuid,\r
-             (VOID **) &Data,\r
+             (VOID **)&Data,\r
              &DataSize\r
              );\r
 \r
@@ -1833,8 +1472,8 @@ DeleteCertsFromDb (
   //\r
   // Construct new data content of variable "certdb" or "certdbv".\r
   //\r
-  NewCertDbSize = (UINT32) DataSize - CertNodeSize;\r
-  NewCertDb     = (UINT8*) mCertDbStore;\r
+  NewCertDbSize = (UINT32)DataSize - CertNodeSize;\r
+  NewCertDb     = (UINT8 *)mCertDbStore;\r
 \r
   //\r
   // Copy the DB entries before deleting node.\r
@@ -1858,13 +1497,13 @@ DeleteCertsFromDb (
   //\r
   // Set "certdb" or "certdbv".\r
   //\r
-  Status   = AuthServiceInternalUpdateVariable (\r
-               DbName,\r
-               &gEfiCertDbGuid,\r
-               NewCertDb,\r
-               NewCertDbSize,\r
-               VarAttr\r
-               );\r
+  Status = AuthServiceInternalUpdateVariable (\r
+             DbName,\r
+             &gEfiCertDbGuid,\r
+             NewCertDb,\r
+             NewCertDbSize,\r
+             VarAttr\r
+             );\r
 \r
   return Status;\r
 }\r
@@ -1872,13 +1511,16 @@ DeleteCertsFromDb (
 /**\r
   Insert signer's certificates for common authenticated variable with VariableName\r
   and VendorGuid in AUTH_CERT_DB_DATA to "certdb" or "certdbv" according to\r
-  time based authenticated variable attributes.\r
+  time based authenticated variable attributes. CertData is the SHA256 digest of\r
+  SignerCert CommonName + TopLevelCert tbsCertificate.\r
 \r
-  @param[in]  VariableName   Name of authenticated Variable.\r
-  @param[in]  VendorGuid     Vendor GUID of authenticated Variable.\r
-  @param[in]  Attributes     Attributes of authenticated variable.\r
-  @param[in]  CertData       Pointer to signer's certificates.\r
-  @param[in]  CertDataSize   Length of CertData in bytes.\r
+  @param[in]  VariableName      Name of authenticated Variable.\r
+  @param[in]  VendorGuid        Vendor GUID of authenticated Variable.\r
+  @param[in]  Attributes        Attributes of authenticated variable.\r
+  @param[in]  SignerCert        Signer certificate data.\r
+  @param[in]  SignerCertSize    Length of signer certificate.\r
+  @param[in]  TopLevelCert      Top-level certificate data.\r
+  @param[in]  TopLevelCertSize  Length of top-level certificate.\r
 \r
   @retval  EFI_INVALID_PARAMETER Any input parameter is invalid.\r
   @retval  EFI_ACCESS_DENIED     An AUTH_CERT_DB_DATA entry with same VariableName\r
@@ -1889,25 +1531,29 @@ DeleteCertsFromDb (
 **/\r
 EFI_STATUS\r
 InsertCertsToDb (\r
-  IN     CHAR16           *VariableName,\r
-  IN     EFI_GUID         *VendorGuid,\r
-  IN     UINT32           Attributes,\r
-  IN     UINT8            *CertData,\r
-  IN     UINTN            CertDataSize\r
+  IN     CHAR16    *VariableName,\r
+  IN     EFI_GUID  *VendorGuid,\r
+  IN     UINT32    Attributes,\r
+  IN     UINT8     *SignerCert,\r
+  IN     UINTN     SignerCertSize,\r
+  IN     UINT8     *TopLevelCert,\r
+  IN     UINTN     TopLevelCertSize\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  UINT8                   *Data;\r
-  UINTN                   DataSize;\r
-  UINT32                  VarAttr;\r
-  UINT8                   *NewCertDb;\r
-  UINT32                  NewCertDbSize;\r
-  UINT32                  CertNodeSize;\r
-  UINT32                  NameSize;\r
-  AUTH_CERT_DB_DATA       *Ptr;\r
-  CHAR16                  *DbName;\r
-\r
-  if ((VariableName == NULL) || (VendorGuid == NULL) || (CertData == NULL)) {\r
+  EFI_STATUS         Status;\r
+  UINT8              *Data;\r
+  UINTN              DataSize;\r
+  UINT32             VarAttr;\r
+  UINT8              *NewCertDb;\r
+  UINT32             NewCertDbSize;\r
+  UINT32             CertNodeSize;\r
+  UINT32             NameSize;\r
+  UINT32             CertDataSize;\r
+  AUTH_CERT_DB_DATA  *Ptr;\r
+  CHAR16             *DbName;\r
+  UINT8              Sha256Digest[SHA256_DIGEST_SIZE];\r
+\r
+  if ((VariableName == NULL) || (VendorGuid == NULL) || (SignerCert == NULL) || (TopLevelCert == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -1915,13 +1561,13 @@ InsertCertsToDb (
     //\r
     // Get variable "certdb".\r
     //\r
-    DbName = EFI_CERT_DB_NAME;\r
-    VarAttr  = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
+    DbName  = EFI_CERT_DB_NAME;\r
+    VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
   } else {\r
     //\r
     // Get variable "certdbv".\r
     //\r
-    DbName = EFI_CERT_DB_VOLATILE_NAME;\r
+    DbName  = EFI_CERT_DB_VOLATILE_NAME;\r
     VarAttr = EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
   }\r
 \r
@@ -1931,7 +1577,7 @@ InsertCertsToDb (
   Status = AuthServiceInternalFindVariable (\r
              DbName,\r
              &gEfiCertDbGuid,\r
-             (VOID **) &Data,\r
+             (VOID **)&Data,\r
              &DataSize\r
              );\r
   if (EFI_ERROR (Status)) {\r
@@ -1966,13 +1612,26 @@ InsertCertsToDb (
   //\r
   // Construct new data content of variable "certdb" or "certdbv".\r
   //\r
-  NameSize      = (UINT32) StrLen (VariableName);\r
-  CertNodeSize  = sizeof (AUTH_CERT_DB_DATA) + (UINT32) CertDataSize + NameSize * sizeof (CHAR16);\r
-  NewCertDbSize = (UINT32) DataSize + CertNodeSize;\r
+  NameSize      = (UINT32)StrLen (VariableName);\r
+  CertDataSize  = sizeof (Sha256Digest);\r
+  CertNodeSize  = sizeof (AUTH_CERT_DB_DATA) + (UINT32)CertDataSize + NameSize * sizeof (CHAR16);\r
+  NewCertDbSize = (UINT32)DataSize + CertNodeSize;\r
   if (NewCertDbSize > mMaxCertDbSize) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  NewCertDb     = (UINT8*) mCertDbStore;\r
+\r
+  Status = CalculatePrivAuthVarSignChainSHA256Digest (\r
+             SignerCert,\r
+             SignerCertSize,\r
+             TopLevelCert,\r
+             TopLevelCertSize,\r
+             Sha256Digest\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  NewCertDb = (UINT8 *)mCertDbStore;\r
 \r
   //\r
   // Copy the DB entries before inserting node.\r
@@ -1985,34 +1644,34 @@ InsertCertsToDb (
   //\r
   // Construct new cert node.\r
   //\r
-  Ptr = (AUTH_CERT_DB_DATA *) (NewCertDb + DataSize);\r
+  Ptr = (AUTH_CERT_DB_DATA *)(NewCertDb + DataSize);\r
   CopyGuid (&Ptr->VendorGuid, VendorGuid);\r
   CopyMem (&Ptr->CertNodeSize, &CertNodeSize, sizeof (UINT32));\r
   CopyMem (&Ptr->NameSize, &NameSize, sizeof (UINT32));\r
   CopyMem (&Ptr->CertDataSize, &CertDataSize, sizeof (UINT32));\r
 \r
   CopyMem (\r
-    (UINT8 *) Ptr + sizeof (AUTH_CERT_DB_DATA),\r
+    (UINT8 *)Ptr + sizeof (AUTH_CERT_DB_DATA),\r
     VariableName,\r
     NameSize * sizeof (CHAR16)\r
     );\r
 \r
   CopyMem (\r
-    (UINT8 *) Ptr +  sizeof (AUTH_CERT_DB_DATA) + NameSize * sizeof (CHAR16),\r
-    CertData,\r
+    (UINT8 *)Ptr +  sizeof (AUTH_CERT_DB_DATA) + NameSize * sizeof (CHAR16),\r
+    Sha256Digest,\r
     CertDataSize\r
     );\r
 \r
   //\r
   // Set "certdb" or "certdbv".\r
   //\r
-  Status   = AuthServiceInternalUpdateVariable (\r
-               DbName,\r
-               &gEfiCertDbGuid,\r
-               NewCertDb,\r
-               NewCertDbSize,\r
-               VarAttr\r
-               );\r
+  Status = AuthServiceInternalUpdateVariable (\r
+             DbName,\r
+             &gEfiCertDbGuid,\r
+             NewCertDb,\r
+             NewCertDbSize,\r
+             VarAttr\r
+             );\r
 \r
   return Status;\r
 }\r
@@ -2034,17 +1693,17 @@ CleanCertsFromDb (
   VOID\r
   )\r
 {\r
-  UINT32                  Offset;\r
-  AUTH_CERT_DB_DATA       *Ptr;\r
-  UINT32                  NameSize;\r
-  UINT32                  NodeSize;\r
-  CHAR16                  *VariableName;\r
-  EFI_STATUS              Status;\r
-  BOOLEAN                 CertCleaned;\r
-  UINT8                   *Data;\r
-  UINTN                   DataSize;\r
-  EFI_GUID                AuthVarGuid;\r
-  AUTH_VARIABLE_INFO      AuthVariableInfo;\r
+  UINT32              Offset;\r
+  AUTH_CERT_DB_DATA   *Ptr;\r
+  UINT32              NameSize;\r
+  UINT32              NodeSize;\r
+  CHAR16              *VariableName;\r
+  EFI_STATUS          Status;\r
+  BOOLEAN             CertCleaned;\r
+  UINT8               *Data;\r
+  UINTN               DataSize;\r
+  EFI_GUID            AuthVarGuid;\r
+  AUTH_VARIABLE_INFO  AuthVariableInfo;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -2060,7 +1719,7 @@ CleanCertsFromDb (
     Status = AuthServiceInternalFindVariable (\r
                EFI_CERT_DB_NAME,\r
                &gEfiCertDbGuid,\r
-               (VOID **) &Data,\r
+               (VOID **)&Data,\r
                &DataSize\r
                );\r
     if (EFI_ERROR (Status)) {\r
@@ -2074,23 +1733,24 @@ CleanCertsFromDb (
 \r
     Offset = sizeof (UINT32);\r
 \r
-    while (Offset < (UINT32) DataSize) {\r
-      Ptr = (AUTH_CERT_DB_DATA *) (Data + Offset);\r
+    while (Offset < (UINT32)DataSize) {\r
+      Ptr      = (AUTH_CERT_DB_DATA *)(Data + Offset);\r
       NodeSize = ReadUnaligned32 (&Ptr->CertNodeSize);\r
       NameSize = ReadUnaligned32 (&Ptr->NameSize);\r
 \r
       //\r
       // Get VarName tailed with '\0'\r
       //\r
-      VariableName = AllocateZeroPool((NameSize + 1) * sizeof(CHAR16));\r
+      VariableName = AllocateZeroPool ((NameSize + 1) * sizeof (CHAR16));\r
       if (VariableName == NULL) {\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
-      CopyMem (VariableName, (UINT8 *) Ptr + sizeof (AUTH_CERT_DB_DATA), NameSize * sizeof(CHAR16));\r
+\r
+      CopyMem (VariableName, (UINT8 *)Ptr + sizeof (AUTH_CERT_DB_DATA), NameSize * sizeof (CHAR16));\r
       //\r
       // Keep VarGuid  aligned\r
       //\r
-      CopyMem (&AuthVarGuid, &Ptr->VendorGuid, sizeof(EFI_GUID));\r
+      CopyMem (&AuthVarGuid, &Ptr->VendorGuid, sizeof (EFI_GUID));\r
 \r
       //\r
       // Find corresponding time auth variable\r
@@ -2102,19 +1762,22 @@ CleanCertsFromDb (
                                        &AuthVariableInfo\r
                                        );\r
 \r
-      if (EFI_ERROR(Status) || (AuthVariableInfo.Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
-        Status      = DeleteCertsFromDb(\r
-                        VariableName,\r
-                        &AuthVarGuid,\r
-                        AuthVariableInfo.Attributes\r
-                        );\r
+      if (EFI_ERROR (Status) || ((AuthVariableInfo.Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0)) {\r
+        //\r
+        // While cleaning certdb, always delete the variable in certdb regardless of it attributes.\r
+        //\r
+        Status = DeleteCertsFromDb (\r
+                   VariableName,\r
+                   &AuthVarGuid,\r
+                   AuthVariableInfo.Attributes | EFI_VARIABLE_NON_VOLATILE\r
+                   );\r
         CertCleaned = TRUE;\r
-        DEBUG((EFI_D_INFO, "Recovery!! Cert for Auth Variable %s Guid %g is removed for consistency\n", VariableName, &AuthVarGuid));\r
-        FreePool(VariableName);\r
+        DEBUG ((DEBUG_INFO, "Recovery!! Cert for Auth Variable %s Guid %g is removed for consistency\n", VariableName, &AuthVarGuid));\r
+        FreePool (VariableName);\r
         break;\r
       }\r
 \r
-      FreePool(VariableName);\r
+      FreePool (VariableName);\r
       Offset = Offset + NodeSize;\r
     }\r
   } while (CertCleaned);\r
@@ -2153,48 +1816,58 @@ CleanCertsFromDb (
 **/\r
 EFI_STATUS\r
 VerifyTimeBasedPayload (\r
-  IN     CHAR16                             *VariableName,\r
-  IN     EFI_GUID                           *VendorGuid,\r
-  IN     VOID                               *Data,\r
-  IN     UINTN                              DataSize,\r
-  IN     UINT32                             Attributes,\r
-  IN     AUTHVAR_TYPE                       AuthVarType,\r
-  IN     EFI_TIME                           *OrgTimeStamp,\r
-  OUT    UINT8                              **VarPayloadPtr,\r
-  OUT    UINTN                              *VarPayloadSize\r
+  IN     CHAR16        *VariableName,\r
+  IN     EFI_GUID      *VendorGuid,\r
+  IN     VOID          *Data,\r
+  IN     UINTN         DataSize,\r
+  IN     UINT32        Attributes,\r
+  IN     AUTHVAR_TYPE  AuthVarType,\r
+  IN     EFI_TIME      *OrgTimeStamp,\r
+  OUT    UINT8         **VarPayloadPtr,\r
+  OUT    UINTN         *VarPayloadSize\r
   )\r
 {\r
-  EFI_VARIABLE_AUTHENTICATION_2    *CertData;\r
-  UINT8                            *SigData;\r
-  UINT32                           SigDataSize;\r
-  UINT8                            *PayloadPtr;\r
-  UINTN                            PayloadSize;\r
-  UINT32                           Attr;\r
-  BOOLEAN                          VerifyStatus;\r
-  EFI_STATUS                       Status;\r
-  EFI_SIGNATURE_LIST               *CertList;\r
-  EFI_SIGNATURE_DATA               *Cert;\r
-  UINTN                            Index;\r
-  UINTN                            CertCount;\r
-  UINT32                           KekDataSize;\r
-  UINT8                            *NewData;\r
-  UINTN                            NewDataSize;\r
-  UINT8                            *Buffer;\r
-  UINTN                            Length;\r
-  UINT8                            *RootCert;\r
-  UINTN                            RootCertSize;\r
-  UINT8                            *SignerCerts;\r
-  UINTN                            CertStackSize;\r
-  UINT8                            *CertsInCertDb;\r
-  UINT32                           CertsSizeinDb;\r
-\r
-  VerifyStatus           = FALSE;\r
-  CertData               = NULL;\r
-  NewData                = NULL;\r
-  Attr                   = Attributes;\r
-  SignerCerts            = NULL;\r
-  RootCert               = NULL;\r
-  CertsInCertDb          = NULL;\r
+  EFI_VARIABLE_AUTHENTICATION_2  *CertData;\r
+  UINT8                          *SigData;\r
+  UINT32                         SigDataSize;\r
+  UINT8                          *PayloadPtr;\r
+  UINTN                          PayloadSize;\r
+  UINT32                         Attr;\r
+  BOOLEAN                        VerifyStatus;\r
+  EFI_STATUS                     Status;\r
+  EFI_SIGNATURE_LIST             *CertList;\r
+  EFI_SIGNATURE_DATA             *Cert;\r
+  UINTN                          Index;\r
+  UINTN                          CertCount;\r
+  UINT32                         KekDataSize;\r
+  UINT8                          *NewData;\r
+  UINTN                          NewDataSize;\r
+  UINT8                          *Buffer;\r
+  UINTN                          Length;\r
+  UINT8                          *TopLevelCert;\r
+  UINTN                          TopLevelCertSize;\r
+  UINT8                          *TrustedCert;\r
+  UINTN                          TrustedCertSize;\r
+  UINT8                          *SignerCerts;\r
+  UINTN                          CertStackSize;\r
+  UINT8                          *CertsInCertDb;\r
+  UINT32                         CertsSizeinDb;\r
+  UINT8                          Sha256Digest[SHA256_DIGEST_SIZE];\r
+  EFI_CERT_DATA                  *CertDataPtr;\r
+\r
+  //\r
+  // 1. TopLevelCert is the top-level issuer certificate in signature Signer Cert Chain\r
+  // 2. TrustedCert is the certificate which firmware trusts. It could be saved in protected\r
+  //     storage or PK payload on PK init\r
+  //\r
+  VerifyStatus  = FALSE;\r
+  CertData      = NULL;\r
+  NewData       = NULL;\r
+  Attr          = Attributes;\r
+  SignerCerts   = NULL;\r
+  TopLevelCert  = NULL;\r
+  CertsInCertDb = NULL;\r
+  CertDataPtr   = NULL;\r
 \r
   //\r
   // When the attribute EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS is\r
@@ -2204,7 +1877,7 @@ VerifyTimeBasedPayload (
   // variable value. The authentication descriptor is not part of the variable data and is not\r
   // returned by subsequent calls to GetVariable().\r
   //\r
-  CertData = (EFI_VARIABLE_AUTHENTICATION_2 *) Data;\r
+  CertData = (EFI_VARIABLE_AUTHENTICATION_2 *)Data;\r
 \r
   //\r
   // Verify that Pad1, Nanosecond, TimeZone, Daylight and Pad2 components of the\r
@@ -2214,7 +1887,8 @@ VerifyTimeBasedPayload (
       (CertData->TimeStamp.Nanosecond != 0) ||\r
       (CertData->TimeStamp.TimeZone != 0) ||\r
       (CertData->TimeStamp.Daylight != 0) ||\r
-      (CertData->TimeStamp.Pad2 != 0)) {\r
+      (CertData->TimeStamp.Pad2 != 0))\r
+  {\r
     return EFI_SECURITY_VIOLATION;\r
   }\r
 \r
@@ -2232,7 +1906,8 @@ VerifyTimeBasedPayload (
   // Cert type should be EFI_CERT_TYPE_PKCS7_GUID.\r
   //\r
   if ((CertData->AuthInfo.Hdr.wCertificateType != WIN_CERT_TYPE_EFI_GUID) ||\r
-      !CompareGuid (&CertData->AuthInfo.CertType, &gEfiCertPkcs7Guid)) {\r
+      !CompareGuid (&CertData->AuthInfo.CertType, &gEfiCertPkcs7Guid))\r
+  {\r
     //\r
     // Invalid AuthInfo type, return EFI_SECURITY_VIOLATION.\r
     //\r
@@ -2243,37 +1918,78 @@ VerifyTimeBasedPayload (
   // Find out Pkcs7 SignedData which follows the EFI_VARIABLE_AUTHENTICATION_2 descriptor.\r
   // AuthInfo.Hdr.dwLength is the length of the entire certificate, including the length of the header.\r
   //\r
-  SigData = CertData->AuthInfo.CertData;\r
-  SigDataSize = CertData->AuthInfo.Hdr.dwLength - (UINT32) (OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData));\r
+  SigData     = CertData->AuthInfo.CertData;\r
+  SigDataSize = CertData->AuthInfo.Hdr.dwLength - (UINT32)(OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData));\r
 \r
   //\r
   // SignedData.digestAlgorithms shall contain the digest algorithm used when preparing the\r
   // signature. Only a digest algorithm of SHA-256 is accepted.\r
   //\r
-  //    According to PKCS#7 Definition:\r
+  //    According to PKCS#7 Definition (https://www.rfc-editor.org/rfc/rfc2315):\r
   //        SignedData ::= SEQUENCE {\r
   //            version Version,\r
   //            digestAlgorithms DigestAlgorithmIdentifiers,\r
   //            contentInfo ContentInfo,\r
   //            .... }\r
-  //    The DigestAlgorithmIdentifiers can be used to determine the hash algorithm \r
+  //    The DigestAlgorithmIdentifiers can be used to determine the hash algorithm\r
   //    in VARIABLE_AUTHENTICATION_2 descriptor.\r
-  //    This field has the fixed offset (+13) and be calculated based on two bytes of length encoding.\r
+  //    This field has the fixed offset (+13) or (+32) based on whether the DER-encoded\r
+  //    ContentInfo structure is present or not, and can be calculated based on two\r
+  //    bytes of length encoding.\r
+  //\r
+  //    Both condition can be handled in WrapPkcs7Data() in CryptPkcs7VerifyCommon.c.\r
+  //\r
+  //    See below examples:\r
+  //\r
+  // 1. Without ContentInfo\r
+  //    30 82 0c da // SEQUENCE (5 element) (3294 BYTES) -- SignedData\r
+  //       02 01 01 // INTEGER 1 -- Version\r
+  //       31 0f // SET (1 element) (15 BYTES) -- DigestAlgorithmIdentifiers\r
+  //          30 0d // SEQUENCE (2 element) (13 BYTES) -- AlgorithmIdentifier\r
+  //             06 09 // OBJECT-IDENTIFIER (9 BYTES) -- algorithm\r
+  //                60 86 48 01 65 03 04 02 01 // sha256 [2.16.840.1.101.3.4.2.1]\r
+  //             05 00 // NULL (0 BYTES) -- parameters\r
+  //\r
+  // Example from: https://uefi.org/revocationlistfile\r
+  //\r
+  // 2. With ContentInfo\r
+  //    30 82 05 90 // SEQUENCE (1424 BYTES) -- ContentInfo\r
+  //       06 09 // OBJECT-IDENTIFIER (9 BYTES) -- ContentType\r
+  //          2a 86 48 86 f7 0d 01 07 02 // signedData [1.2.840.113549.1.7.2]\r
+  //       a0 82 05 81 // CONTEXT-SPECIFIC CONSTRUCTED TAG 0 (1409 BYTES) -- content\r
+  //          30 82 05 7d // SEQUENCE (1405 BYTES) -- SignedData\r
+  //             02 01 01 // INTEGER 1 -- Version\r
+  //             31 0f // SET (1 element) (15 BYTES) -- DigestAlgorithmIdentifiers\r
+  //                30 0d // SEQUENCE (13 BYTES) -- AlgorithmIdentifier\r
+  //                   06 09 // OBJECT-IDENTIFIER (9 BYTES) -- algorithm\r
+  //                      60 86 48 01 65 03 04 02 01 // sha256 [2.16.840.1.101.3.4.2.1]\r
+  //                   05 00 // NULL (0 BYTES) -- parameters\r
+  //\r
+  // Example generated with: https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Manual_process\r
   //\r
   if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
-    if (SigDataSize >= (13 + sizeof (mSha256OidValue))) {\r
-      if (((*(SigData + 1) & TWO_BYTE_ENCODE) != TWO_BYTE_ENCODE) || \r
-           (CompareMem (SigData + 13, &mSha256OidValue, sizeof (mSha256OidValue)) != 0)) {\r
-          return EFI_SECURITY_VIOLATION;\r
-        }\r
+    if (  (  (SigDataSize >= (13 + sizeof (mSha256OidValue)))\r
+          && (  ((*(SigData + 1) & TWO_BYTE_ENCODE) != TWO_BYTE_ENCODE)\r
+             || (CompareMem (SigData + 13, &mSha256OidValue, sizeof (mSha256OidValue)) != 0)))\r
+       && (  (SigDataSize >= (32 + sizeof (mSha256OidValue)))\r
+          && (  ((*(SigData + 20) & TWO_BYTE_ENCODE) != TWO_BYTE_ENCODE)\r
+             || (CompareMem (SigData + 32, &mSha256OidValue, sizeof (mSha256OidValue)) != 0))))\r
+    {\r
+      return EFI_SECURITY_VIOLATION;\r
     }\r
   }\r
 \r
   //\r
   // Find out the new data payload which follows Pkcs7 SignedData directly.\r
   //\r
-  PayloadPtr = SigData + SigDataSize;\r
-  PayloadSize = DataSize - OFFSET_OF_AUTHINFO2_CERT_DATA - (UINTN) SigDataSize;\r
+  PayloadPtr  = SigData + SigDataSize;\r
+  PayloadSize = DataSize - OFFSET_OF_AUTHINFO2_CERT_DATA - (UINTN)SigDataSize;\r
+\r
+  // If the VariablePolicy engine is disabled, allow deletion of any authenticated variables.\r
+  if ((PayloadSize == 0) && ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && !IsVariablePolicyEnabled ()) {\r
+    VerifyStatus = TRUE;\r
+    goto Exit;\r
+  }\r
 \r
   //\r
   // Construct a serialization buffer of the values of the VariableName, VendorGuid and Attributes\r
@@ -2291,7 +2007,7 @@ VerifyTimeBasedPayload (
   // because it is only used at here to do verification temporarily first\r
   // and then used in UpdateVariable() for a time based auth variable set.\r
   //\r
-  Status = mAuthVarLibContextIn->GetScratchBuffer (&NewDataSize, (VOID **) &NewData);\r
+  Status = mAuthVarLibContextIn->GetScratchBuffer (&NewDataSize, (VOID **)&NewData);\r
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -2325,8 +2041,8 @@ VerifyTimeBasedPayload (
                      SigDataSize,\r
                      &SignerCerts,\r
                      &CertStackSize,\r
-                     &RootCert,\r
-                     &RootCertSize\r
+                     &TopLevelCert,\r
+                     &TopLevelCertSize\r
                      );\r
     if (!VerifyStatus) {\r
       goto Exit;\r
@@ -2346,10 +2062,12 @@ VerifyTimeBasedPayload (
       VerifyStatus = FALSE;\r
       goto Exit;\r
     }\r
-    CertList = (EFI_SIGNATURE_LIST *) Data;\r
-    Cert     = (EFI_SIGNATURE_DATA *) ((UINT8 *) CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
-    if ((RootCertSize != (CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1))) ||\r
-        (CompareMem (Cert->SignatureData, RootCert, RootCertSize) != 0)) {\r
+\r
+    CertList = (EFI_SIGNATURE_LIST *)Data;\r
+    Cert     = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
+    if ((TopLevelCertSize != (CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1))) ||\r
+        (CompareMem (Cert->SignatureData, TopLevelCert, TopLevelCertSize) != 0))\r
+    {\r
       VerifyStatus = FALSE;\r
       goto Exit;\r
     }\r
@@ -2360,14 +2078,12 @@ VerifyTimeBasedPayload (
     VerifyStatus = Pkcs7Verify (\r
                      SigData,\r
                      SigDataSize,\r
-                     RootCert,\r
-                     RootCertSize,\r
+                     TopLevelCert,\r
+                     TopLevelCertSize,\r
                      NewData,\r
                      NewDataSize\r
                      );\r
-\r
   } else if (AuthVarType == AuthVarTypeKek) {\r
-\r
     //\r
     // Get KEK database from variable.\r
     //\r
@@ -2384,18 +2100,18 @@ VerifyTimeBasedPayload (
     //\r
     // Ready to verify Pkcs7 SignedData. Go through KEK Signature Database to find out X.509 CertList.\r
     //\r
-    KekDataSize      = (UINT32) DataSize;\r
-    CertList         = (EFI_SIGNATURE_LIST *) Data;\r
+    KekDataSize = (UINT32)DataSize;\r
+    CertList    = (EFI_SIGNATURE_LIST *)Data;\r
     while ((KekDataSize > 0) && (KekDataSize >= CertList->SignatureListSize)) {\r
       if (CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) {\r
-        Cert       = (EFI_SIGNATURE_DATA *) ((UINT8 *) CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
-        CertCount  = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;\r
+        Cert      = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
+        CertCount = (CertList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - CertList->SignatureHeaderSize) / CertList->SignatureSize;\r
         for (Index = 0; Index < CertCount; Index++) {\r
           //\r
           // Iterate each Signature Data Node within this CertList for a verify\r
           //\r
-          RootCert      = Cert->SignatureData;\r
-          RootCertSize  = CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1);\r
+          TrustedCert     = Cert->SignatureData;\r
+          TrustedCertSize = CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1);\r
 \r
           //\r
           // Verify Pkcs7 SignedData via Pkcs7Verify library.\r
@@ -2403,22 +2119,23 @@ VerifyTimeBasedPayload (
           VerifyStatus = Pkcs7Verify (\r
                            SigData,\r
                            SigDataSize,\r
-                           RootCert,\r
-                           RootCertSize,\r
+                           TrustedCert,\r
+                           TrustedCertSize,\r
                            NewData,\r
                            NewDataSize\r
                            );\r
           if (VerifyStatus) {\r
             goto Exit;\r
           }\r
-          Cert = (EFI_SIGNATURE_DATA *) ((UINT8 *) Cert + CertList->SignatureSize);\r
+\r
+          Cert = (EFI_SIGNATURE_DATA *)((UINT8 *)Cert + CertList->SignatureSize);\r
         }\r
       }\r
+\r
       KekDataSize -= CertList->SignatureListSize;\r
-      CertList = (EFI_SIGNATURE_LIST *) ((UINT8 *) CertList + CertList->SignatureListSize);\r
+      CertList     = (EFI_SIGNATURE_LIST *)((UINT8 *)CertList + CertList->SignatureListSize);\r
     }\r
   } else if (AuthVarType == AuthVarTypePriv) {\r
-\r
     //\r
     // Process common authenticated variable except PK/KEK/DB/DBX/DBT.\r
     // Get signer's certificates from SignedData.\r
@@ -2428,8 +2145,8 @@ VerifyTimeBasedPayload (
                      SigDataSize,\r
                      &SignerCerts,\r
                      &CertStackSize,\r
-                     &RootCert,\r
-                     &RootCertSize\r
+                     &TopLevelCert,\r
+                     &TopLevelCertSize\r
                      );\r
     if (!VerifyStatus) {\r
       goto Exit;\r
@@ -2448,17 +2165,38 @@ VerifyTimeBasedPayload (
         goto Exit;\r
       }\r
 \r
-      if ((CertStackSize != CertsSizeinDb) ||\r
-          (CompareMem (SignerCerts, CertsInCertDb, CertsSizeinDb) != 0)) {\r
-        goto Exit;\r
+      if (CertsSizeinDb == SHA256_DIGEST_SIZE) {\r
+        //\r
+        // Check hash of signer cert CommonName + Top-level issuer tbsCertificate against data in CertDb\r
+        //\r
+        CertDataPtr = (EFI_CERT_DATA *)(SignerCerts + 1);\r
+        Status      = CalculatePrivAuthVarSignChainSHA256Digest (\r
+                        CertDataPtr->CertDataBuffer,\r
+                        ReadUnaligned32 ((UINT32 *)&(CertDataPtr->CertDataLength)),\r
+                        TopLevelCert,\r
+                        TopLevelCertSize,\r
+                        Sha256Digest\r
+                        );\r
+        if (EFI_ERROR (Status) || (CompareMem (Sha256Digest, CertsInCertDb, CertsSizeinDb) != 0)) {\r
+          goto Exit;\r
+        }\r
+      } else {\r
+        //\r
+        // Keep backward compatible with previous solution which saves whole signer certs stack in CertDb\r
+        //\r
+        if ((CertStackSize != CertsSizeinDb) ||\r
+            (CompareMem (SignerCerts, CertsInCertDb, CertsSizeinDb) != 0))\r
+        {\r
+          goto Exit;\r
+        }\r
       }\r
     }\r
 \r
     VerifyStatus = Pkcs7Verify (\r
                      SigData,\r
                      SigDataSize,\r
-                     RootCert,\r
-                     RootCertSize,\r
+                     TopLevelCert,\r
+                     TopLevelCertSize,\r
                      NewData,\r
                      NewDataSize\r
                      );\r
@@ -2468,27 +2206,36 @@ VerifyTimeBasedPayload (
 \r
     if ((OrgTimeStamp == NULL) && (PayloadSize != 0)) {\r
       //\r
-      // Insert signer's certificates when adding a new common authenticated variable.\r
+      // When adding a new common authenticated variable, always save Hash of cn of signer cert + tbsCertificate of Top-level issuer\r
       //\r
-      Status = InsertCertsToDb (VariableName, VendorGuid, Attributes, SignerCerts, CertStackSize);\r
+      CertDataPtr = (EFI_CERT_DATA *)(SignerCerts + 1);\r
+      Status      = InsertCertsToDb (\r
+                      VariableName,\r
+                      VendorGuid,\r
+                      Attributes,\r
+                      CertDataPtr->CertDataBuffer,\r
+                      ReadUnaligned32 ((UINT32 *)&(CertDataPtr->CertDataLength)),\r
+                      TopLevelCert,\r
+                      TopLevelCertSize\r
+                      );\r
       if (EFI_ERROR (Status)) {\r
         VerifyStatus = FALSE;\r
         goto Exit;\r
       }\r
     }\r
   } else if (AuthVarType == AuthVarTypePayload) {\r
-    CertList = (EFI_SIGNATURE_LIST *) PayloadPtr;\r
-    Cert     = (EFI_SIGNATURE_DATA *) ((UINT8 *) CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
-    RootCert      = Cert->SignatureData;\r
-    RootCertSize  = CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1);\r
+    CertList        = (EFI_SIGNATURE_LIST *)PayloadPtr;\r
+    Cert            = (EFI_SIGNATURE_DATA *)((UINT8 *)CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
+    TrustedCert     = Cert->SignatureData;\r
+    TrustedCertSize = CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1);\r
     //\r
     // Verify Pkcs7 SignedData via Pkcs7Verify library.\r
     //\r
     VerifyStatus = Pkcs7Verify (\r
                      SigData,\r
                      SigDataSize,\r
-                     RootCert,\r
-                     RootCertSize,\r
+                     TrustedCert,\r
+                     TrustedCertSize,\r
                      NewData,\r
                      NewDataSize\r
                      );\r
@@ -2498,21 +2245,26 @@ VerifyTimeBasedPayload (
 \r
 Exit:\r
 \r
-  if (AuthVarType == AuthVarTypePk || AuthVarType == AuthVarTypePriv) {\r
-    Pkcs7FreeSigners (RootCert);\r
-    Pkcs7FreeSigners (SignerCerts);\r
+  if ((AuthVarType == AuthVarTypePk) || (AuthVarType == AuthVarTypePriv)) {\r
+    if (TopLevelCert != NULL) {\r
+      Pkcs7FreeSigners (TopLevelCert);\r
+    }\r
+\r
+    if (SignerCerts != NULL) {\r
+      Pkcs7FreeSigners (SignerCerts);\r
+    }\r
   }\r
 \r
   if (!VerifyStatus) {\r
     return EFI_SECURITY_VIOLATION;\r
   }\r
 \r
-  Status = CheckSignatureListFormat(VariableName, VendorGuid, PayloadPtr, PayloadSize);\r
+  Status = CheckSignatureListFormat (VariableName, VendorGuid, PayloadPtr, PayloadSize);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  *VarPayloadPtr = PayloadPtr;\r
+  *VarPayloadPtr  = PayloadPtr;\r
   *VarPayloadSize = PayloadSize;\r
 \r
   return EFI_SUCCESS;\r
@@ -2546,29 +2298,29 @@ Exit:
 **/\r
 EFI_STATUS\r
 VerifyTimeBasedPayloadAndUpdate (\r
-  IN     CHAR16                             *VariableName,\r
-  IN     EFI_GUID                           *VendorGuid,\r
-  IN     VOID                               *Data,\r
-  IN     UINTN                              DataSize,\r
-  IN     UINT32                             Attributes,\r
-  IN     AUTHVAR_TYPE                       AuthVarType,\r
-  OUT    BOOLEAN                            *VarDel\r
+  IN     CHAR16        *VariableName,\r
+  IN     EFI_GUID      *VendorGuid,\r
+  IN     VOID          *Data,\r
+  IN     UINTN         DataSize,\r
+  IN     UINT32        Attributes,\r
+  IN     AUTHVAR_TYPE  AuthVarType,\r
+  OUT    BOOLEAN       *VarDel\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  EFI_STATUS                       FindStatus;\r
-  UINT8                            *PayloadPtr;\r
-  UINTN                            PayloadSize;\r
-  EFI_VARIABLE_AUTHENTICATION_2    *CertData;\r
-  AUTH_VARIABLE_INFO               OrgVariableInfo;\r
-  BOOLEAN                          IsDel;\r
+  EFI_STATUS                     Status;\r
+  EFI_STATUS                     FindStatus;\r
+  UINT8                          *PayloadPtr;\r
+  UINTN                          PayloadSize;\r
+  EFI_VARIABLE_AUTHENTICATION_2  *CertData;\r
+  AUTH_VARIABLE_INFO             OrgVariableInfo;\r
+  BOOLEAN                        IsDel;\r
 \r
   ZeroMem (&OrgVariableInfo, sizeof (OrgVariableInfo));\r
   FindStatus = mAuthVarLibContextIn->FindVariable (\r
-             VariableName,\r
-             VendorGuid,\r
-             &OrgVariableInfo\r
-             );\r
+                                       VariableName,\r
+                                       VendorGuid,\r
+                                       &OrgVariableInfo\r
+                                       );\r
 \r
   Status = VerifyTimeBasedPayload (\r
              VariableName,\r
@@ -2585,15 +2337,16 @@ VerifyTimeBasedPayloadAndUpdate (
     return Status;\r
   }\r
 \r
-  if (!EFI_ERROR(FindStatus)\r
-   && (PayloadSize == 0)\r
-   && ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0)) {\r
+  if (  !EFI_ERROR (FindStatus)\r
+     && (PayloadSize == 0)\r
+     && ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0))\r
+  {\r
     IsDel = TRUE;\r
   } else {\r
     IsDel = FALSE;\r
   }\r
 \r
-  CertData = (EFI_VARIABLE_AUTHENTICATION_2 *) Data;\r
+  CertData = (EFI_VARIABLE_AUTHENTICATION_2 *)Data;\r
 \r
   //\r
   // Final step: Update/Append Variable if it pass Pkcs7Verify\r
@@ -2610,12 +2363,12 @@ VerifyTimeBasedPayloadAndUpdate (
   //\r
   // Delete signer's certificates when delete the common authenticated variable.\r
   //\r
-  if (IsDel && AuthVarType == AuthVarTypePriv && !EFI_ERROR(Status) ) {\r
+  if (IsDel && (AuthVarType == AuthVarTypePriv) && !EFI_ERROR (Status)) {\r
     Status = DeleteCertsFromDb (VariableName, VendorGuid, Attributes);\r
   }\r
 \r
   if (VarDel != NULL) {\r
-    if (IsDel && !EFI_ERROR(Status)) {\r
+    if (IsDel && !EFI_ERROR (Status)) {\r
       *VarDel = TRUE;\r
     } else {\r
       *VarDel = FALSE;\r