]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Add authenticated variable store support
authorChen, Lin Z <lin.z.chen@intel.com>
Thu, 4 Nov 2021 11:28:53 +0000 (19:28 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 11 Nov 2021 08:12:19 +0000 (08:12 +0000)
In order to support secure boot with authenticated type variable store
and non secure boot with normal type variable store, add one flag to
switch them.

User can append '-D VPD_AUTHENTICATED_VARIABLE_STORE' to build command
to enable authenticated type varaible store.

Also, user can add 'VPD_AUTHENTICATED_VARIABLE_STORE = TRUE/FALSE' to the
defines section of Dsc file to switch authenticated/normal type variable
store.

VPD_AUTHENTICATED_VARIABLE_STORE is a new reserved key word for this function.

Signed-off-by: Chen Lin Z <lin.z.chen@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
BaseTools/Source/Python/AutoGen/GenVar.py
BaseTools/Source/Python/Common/DataType.py
BaseTools/Source/Python/Workspace/DscBuildData.py

index 591ef3df55a3b1fa8f184c76587fa13b4e407686..3f3dc69e90b273a4e959d82b68485be9ba310788 100644 (file)
@@ -15,6 +15,7 @@ from Common.VariableAttributes import VariableAttributes
 from Common.Misc import *\r
 import collections\r
 import Common.DataType as DataType\r
+import Common.GlobalData as GlobalData\r
 \r
 var_info = collections.namedtuple("uefi_var", "pcdindex,pcdname,defaultstoragename,skuname,var_name, var_guid, var_offset,var_attribute,pcd_default_value, default_value, data_type,PcdDscLine,StructurePcd")\r
 NvStorageHeaderSize = 28\r
@@ -173,11 +174,16 @@ class VariableMgr(object):
             offset += VariableHeaderSize + len(default_info.var_name.split(","))\r
             var_data_offset[default_info.pcdindex] = offset\r
             offset += data_size - len(default_info.var_name.split(","))\r
-\r
-            var_header_buffer = VariableMgr.PACK_VARIABLE_HEADER(var_attr_value, len(default_info.var_name.split(",")), len (default_data), vendorguid)\r
+            if GlobalData.gCommandLineDefines.get(TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE,"FALSE").upper() == "TRUE":\r
+                var_header_buffer = VariableMgr.PACK_AUTHENTICATED_VARIABLE_HEADER(var_attr_value, len(default_info.var_name.split(",")), len (default_data), vendorguid)\r
+            else:\r
+                var_header_buffer = VariableMgr.PACK_VARIABLE_HEADER(var_attr_value, len(default_info.var_name.split(",")), len (default_data), vendorguid)\r
             NvStoreDataBuffer += (var_header_buffer + DataBuffer)\r
 \r
-        variable_storage_header_buffer = VariableMgr.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28)\r
+        if GlobalData.gCommandLineDefines.get(TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE,"FALSE").upper() == "TRUE":\r
+            variable_storage_header_buffer = VariableMgr.PACK_AUTHENTICATED_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28)\r
+        else:\r
+            variable_storage_header_buffer = VariableMgr.PACK_VARIABLE_STORE_HEADER(len(NvStoreDataBuffer) + 28)\r
 \r
         nv_default_part = VariableMgr.AlignData(VariableMgr.PACK_DEFAULT_DATA(0, 0, VariableMgr.unpack_data(variable_storage_header_buffer+NvStoreDataBuffer)), 8)\r
 \r
@@ -252,6 +258,20 @@ class VariableMgr(object):
 \r
         return GuidBuffer + SizeBuffer + FormatBuffer + StateBuffer + reservedBuffer\r
 \r
+    def PACK_AUTHENTICATED_VARIABLE_STORE_HEADER(size):\r
+        #Signature: gEfiAuthenticatedVariableGuid\r
+        Guid = "{ 0xaaf32c78, 0x947b, 0x439a, { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }}"\r
+        Guid = GuidStructureStringToGuidString(Guid)\r
+        GuidBuffer = PackGUID(Guid.split('-'))\r
+\r
+        SizeBuffer = pack('=L', size)\r
+        FormatBuffer = pack('=B', 0x5A)\r
+        StateBuffer = pack('=B', 0xFE)\r
+        reservedBuffer = pack('=H', 0)\r
+        reservedBuffer += pack('=L', 0)\r
+\r
+        return GuidBuffer + SizeBuffer + FormatBuffer + StateBuffer + reservedBuffer\r
+\r
     @staticmethod\r
     def PACK_NV_STORE_DEFAULT_HEADER(size, maxsize):\r
         Signature = pack('=B', ord('N'))\r
@@ -279,6 +299,37 @@ class VariableMgr(object):
 \r
         return Buffer\r
 \r
+    @staticmethod\r
+    def PACK_AUTHENTICATED_VARIABLE_HEADER(attribute, namesize, datasize, vendorguid):\r
+\r
+        Buffer = pack('=H', 0x55AA)    # pack StartID\r
+        Buffer += pack('=B', 0x3F)     # pack State\r
+        Buffer += pack('=B', 0)        # pack reserved\r
+\r
+        Buffer += pack('=L', attribute)\r
+\r
+        Buffer += pack('=Q', 0)        # pack MonotonicCount\r
+        Buffer += pack('=HBBBBBBLhBB', # pack TimeStamp\r
+                         0,            # UINT16 Year\r
+                         0,            # UINT8  Month\r
+                         0,            # UINT8  Day\r
+                         0,            # UINT8  Hour\r
+                         0,            # UINT8  Minute\r
+                         0,            # UINT8  Second\r
+                         0,            # UINT8  Pad1\r
+                         0,            # UINT32 Nanosecond\r
+                         0,            # INT16  TimeZone\r
+                         0,            # UINT8  Daylight\r
+                         0)            # UINT8  Pad2\r
+        Buffer += pack('=L', 0)        # pack PubKeyIndex\r
+\r
+        Buffer += pack('=L', namesize)\r
+        Buffer += pack('=L', datasize)\r
+\r
+        Buffer += PackGUID(vendorguid)\r
+\r
+        return Buffer\r
+\r
     @staticmethod\r
     def PACK_VARIABLES_DATA(var_value,data_type, tail = None):\r
         Buffer = bytearray()\r
index 4e9c9e34afa74038593bc8b57c9592f00030d9a0..dc4962333351fd0fe47c90bb3f1abc6b8b4d0440 100644 (file)
@@ -406,6 +406,7 @@ TAB_DSC_DEFINES_SKUID_IDENTIFIER = 'SKUID_IDENTIFIER'
 TAB_DSC_DEFINES_PCD_INFO_GENERATION = 'PCD_INFO_GENERATION'\r
 TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX = 'PCD_DYNAMIC_AS_DYNAMICEX'\r
 TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION = 'PCD_VAR_CHECK_GENERATION'\r
+TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE = 'VPD_AUTHENTICATED_VARIABLE_STORE'\r
 TAB_DSC_DEFINES_FLASH_DEFINITION = 'FLASH_DEFINITION'\r
 TAB_DSC_DEFINES_BUILD_NUMBER = 'BUILD_NUMBER'\r
 TAB_DSC_DEFINES_MAKEFILE_NAME = 'MAKEFILE_NAME'\r
index d1ee0ccaea7e3b7bf767e1780691902a24d7ff40..35ec5b37ff44da3da46b9914908f845b3323afe5 100644 (file)
@@ -387,6 +387,10 @@ class DscBuildData(PlatformBuildClassObject):
                 for i in range(0, len(LanguageCodes), 3):\r
                     LanguageList.append(LanguageCodes[i:i + 3])\r
                 self._ISOLanguages = LanguageList\r
+            elif Name == TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE:\r
+                if TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE not in gCommandLineDefines:\r
+                    gCommandLineDefines[TAB_DSC_DEFINES_VPD_AUTHENTICATED_VARIABLE_STORE] = Record[2].strip()\r
+\r
             elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
                 #\r
                 # try to convert GUID to a real UUID value to see whether the GUID is format\r