受信任的執行環境 EFI 通訊協定
授權:Microsoft 同意授與貴使用者任何免費、免費授權給其必要宣告,僅依據合理且不具區別的條款進行、使用、銷售、供應專案以供銷售、匯入或散佈此規格的任何實作。 「必要宣告」是 Microsoft 擁有或 Microsoft 控制專利的宣告,技術上必須實作必要部分 (,其中也包含此規格之選擇性部分) 的必要元素,其中造成違規的功能會詳細說明,而不只是在此規格中參考。
1.0 簡介
本檔會指定 EFI 通訊協定,以便與 Trusted Execution Environment (TrEE) 互動,並為每個信賴運算群組的子集實作 TPM 2.0 功能, (TCG) Trusted Platform Module 2.0 程式庫規格。 本檔也會指定平臺韌體測量需求。 此處定義的 EFI 通訊協定會運用到大度 [TCG06a] 和 [TCG06b]。
2.0 資料結構和縮略字
2.1 資料結構
如同 [TCG06a],所有資料值都應該以Little-Endian格式表示。 字串應以 ASCII 位元組陣列表示,其中最左邊的字元放在最低記憶體位置。
2.2 縮寫和慣例
(如需此處未定義的縮略字,請參閱 [TCG06a])
TrEETrusted 執行環境
本檔中使用 「MUST」 和 「SHALL」 詞彙,將會根據 [RFC2119] 來解譯。
3.0 EFI TrEE 通訊協定
本節提供EFI_TREE_PROTOCOL和EFI_TREE_SERVICE_BINDING_PROTOCOL的詳細描述。 EFI TrEE 通訊協定是用來與 TrEE 通訊。
3.1 TrEE EFI 服務系結通訊協定
本節會定義 TrEE EFI 服務系結通訊協定。
摘要 - EFI TrEE 服務系結通訊協定可用來尋找 EFI TrEE 通訊協定驅動程式支援的 TrEE 裝置,以及建立及終結可使用基礎 TrEE 裝置的 EFI TrEE 通訊協定子驅動程式實例。
Guid - #define EFI_TREE_SERVICE_BINDING_PROTOCOL_GUID \ {0x4cf01d0a, 0xc48c, 0x4271, 0xa2, 0x2a, 0xad, 0x8e, 0x55, 0x97,\ 0x81, 0x88}
描述需要 TrEE 服務的應用程式 (或驅動程式) 可以使用其中一個通訊協定處理常式服務,例如 BS-LocateHandleBuffer > () 來搜尋發佈 EFI TrEE 服務系結通訊協定的裝置。 每個具有已發佈 EFI TrEE 服務系結通訊協定的裝置都支援 EFI TrEE 通訊協定,而且可能可供使用。
成功呼叫EFI_TREE_SERVICE_BINDING_PROTOCOL之後。CreateChild () 函式,子 EFI TrEE 通訊協定驅動程式實例已可供使用。
在 EFI 應用程式或驅動程式終止執行之前,每次成功呼叫EFI_TREE_SERVICE_BINDING_PROTOCOL。CreateChild () 函式必須與對EFI_TREE_SERVICE_BINDING_PROTOCOL的呼叫相符。DestroyChild () 函式。
3.2 TrEE EFI 通訊協定
摘要 - EFI TrEE 通訊協定是用來與 TrEE 通訊 - 將命令傳送至 TrEE、將它用於受信任的執行作業,並提供存取 TrEE 中擴充之度量的韌體記錄。 通訊協定會維護 TrEE 中記錄的度量事件記錄檔,其格式與 TCG 1.2 TCG 事件記錄檔相同 (請參閱 [TCG06b]) ;在此規格中稱為 TrEE 事件記錄檔格式 TCG 1.2 事件記錄檔。 實作者可能會建立其他格式的事件記錄檔,但這個版本的通訊協定並未定義擷取它們的方式。
Guid - #define EFI_TREE_PROTOCOL_GUID \ {0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2,\ 0x72, 0x0f}
通訊協定介面結構 -
typedef struct _EFI_TREE_PROTOCOL {
EFI_TREE_GET_CAPABILITYGetCapability;
EFI_TREE_GET_EVENT_LOGGetEventLog;
EFI_TREE_HASH_LOG_EXTEND_EVENTHashLogExtendEvent;
EFI_TREE_SUBMIT_COMMANDSubmitCommand;
} EFI_TREE_PROTOCOL;
參數
GetCapability |
此服務提供 TrEE 和韌體功能的相關資訊 |
GetEventLog |
取得韌體事件記錄檔的指標 |
HashLogExtendEvent |
此服務會導致 EFI TrEE 驅動程式擴充事件,並選擇性地) 將事件寫入 TrEE 記錄檔 (。 |
SubmitCommand |
此服務會將命令直接提交至 TrEE。 |
描述 - EFI_TREE_PROTOCOL抽象 TrEE 活動。 此通訊協定實例提供開機服務,並具現化為開機服務驅動程式。
呼叫 ExitBootServices ( ) ,並釋放開機服務驅動程式所耗用的所有記憶體資源,以便在作業系統環境中使用時,就會終止開機服務驅動程式。
此開機服務必須建立EVT_SIGNAL_EXIT_BOOT_SERVICES事件。 叫用 ExitBootServices ( ) 時,系統會通知此事件。
EVT_SIGNAL_EXIT_BOOT_SERVICES是同步事件,用來確保特定活動會在呼叫特定介面函式之後發生;在此情況下,這是為了回應 ExitBootServices ( ) 函式而必須完成的清除。 ExitBootServices ( ) 無法代表已載入系統的驅動程式清除。 驅動程式必須藉由建立類型為 EVT_SIGNAL_EXIT_BOOT_SERVICES 的事件,以及其通知函式是驅動程式本身內的函式,來自行執行此動作。 然後,當 ExitBootServices ( ) 完成清除時,它會發出事件種類EVT_SIGNAL_EXIT_BOOT_SERVICES的訊號。
如需如何具現化為 EFI 驅動程式的開機服務建立此必要EVT_SIGNAL_EXIT_BOOT_SERVICES事件的實作詳細資料,請參閱 [UEFI12] 的 6.1 節。
3.3 EFI_TREE_PROTOCOL。GetCapability
EFI_TREE_PROTOCOL GetCapability 函式呼叫提供 TrEE 的通訊協定功能資訊和狀態資訊。
原型
typedef
EFI_STATUS
(EFIAPI *EFI_TREE_GET_CAPABILITY) (
IN EFI_TREE_PROTOCOL *This,
IN OUT TREE_BOOT_SERVICE_CAPABILITY*ProtocolCapability,
);
參數
這 |
表示呼叫內容。 |
ProtocolCapability |
呼叫端會為TREE_BOOT_SERVICE_CAPABILITY結構配置記憶體,並將大小欄位設定為配置的結構大小。 被呼叫端會在欄位中填入 EFI 通訊協定功能資訊和目前的 TrEE 狀態資訊,以符合傳入之結構大小內的欄位數目。 |
相關定義
typedef struct _TREE_VERSION {
UINT8 Major;
UINT8 Minor;
} TREE_VERSION;
typedef UINT64 EFI_PHYSICAL_ADDRESS;
typedef UINT32 TREE_EVENT_LOG_BITMAP;
typedef UINT32 TREE_EVENT_LOG_FORMAT;
#define TREE_EVENT_LOG_FORMAT_TCG_1_2 0x00000001
typedef struct _TREE_BOOT_SERVICE_CAPABILITY {
UINT8 Size;
TREE_VERSION StructureVersion;
TREE_VERSION ProtocolVersion;
UINT32 HashAlgorithmBitmap;
TREE_EVENT_LOG_BITMAPSupportedEventLogs;
BOOLEAN TrEEPresentFlag;
UINT16MaxCommandSize;
UINT16MaxResponseSize;
UINT32ManufacturerID;
} TREE_BOOT_SERVICE_CAPABILITY;
#define TREE_BOOT_HASH_ALG_SHA1 0x00000001
#define TREE_BOOT_HASH_ALG_SHA256 0x00000002
#define TREE_BOOT_HASH_ALG_SHA384 0x00000004
#define TREE_BOOT_HASH_ALG_SHA512 0x00000008
大小 |
傳入之結構的已配置大小 |
StructureVersion |
TREE_BOOT_SERVICE_CAPABILITY結構本身的版本。 針對此版本的通訊協定, 主要 版本應設定為 1,而 次要 版本應設定為 0。 |
ProtocolVersion |
TrEE 通訊協定的版本。 針對此版本的通訊協定, 主要 版本應設定為 1,而 次要 版本應設定為 0。 |
HashAlgorithmBitMap |
支援的雜湊演算法 |
SupportedEventLogs |
支援事件記錄檔格式的點陣圖, (請參閱上述) |
TrEEPresentFlag |
False = TrEE 不存在 |
MaxCommandSize |
命令的大小上限 (位元組) ,可傳送至 TrEE |
MaxResponseSize |
TrEE 可提供的回應) 位元組大小上限 ( |
製造商識別碼 |
4-byte Vendor ID (see [TCG07], "TPM Capabilities Vendor ID" section) |
說明
EFI_TREE_PROTOCOL Get Capability 函式呼叫提供 EFI 通訊協定版本和功能資訊,以及 TrEE 的狀態資訊。 呼叫端必須設定所配置TREE_BOOT_SERVICE_CAPABILITY結構的 [大小] 欄位。 此函式呼叫的未來版本預期會將其他欄位新增至 結構。 傳入的 Size 值可讓函式只填入呼叫端配置記憶體的欄位。 例如:
ProtocolCapability.Size = sizeof (TREE_BOOT_SERVICE_CAPABILITY) ;
針對此版本的規格:
如果 This 或 ProtocolCapability 參數為 Null,則功能呼叫會傳回EFI_INVALID_PARAMETER。
如果輸入 ProtocolCapability.Sizeof < (TREE_BOOT_SERVICE_CAPABILITY) 函式會將 ProtocolCapability.Size 設定為此規格中所定義的 sizeof (TREE_BOOT_SERVICE_CAPABILITY) ,並將傳回錯誤碼EFI_BUFFER_TOO_SMALL,則其餘欄位的值將會未定義。
必須設定下列傳回值:
ProtocolCapability.StructureVersion.Major = 1
ProtocolCapability.StructureVersion.Minor = 0
ProtocolCapability.ProtocolVersion.Major = 1
ProtocolCapability.ProtocolVersion.Minor = 0
如果平臺沒有 TrEE,則必須傳回下列值:
ProtocolCapability.SupportedEventLogs = 0
ProtocolCapability.HashAlgorithmBitmap = 0
ProtocolCapability.TrEEPresentFlag = FALSE
ProtocolCapability.MaxCommandSize = 0
ProtocolCapability.MaxResponseSize = 0
ProtocolCapability.ManufacturerID = 0
Windows 的最低 MaxCommandSize 和 MaxResponseSize 必須0x500 (或更新) 。
傳回的狀態碼
EFI_SUCCESS |
作業順利完成。 |
EFI_DEVICE_ERROR |
命令失敗。 ProtocolCapability變數將不會填入。 |
EFI_INVALID_PARAMETER |
一或多個參數不正確。 ProtocolCapability變數將不會填入。 |
EFI_BUFFER_TOO_SMALL |
ProtocolCapability變數太小,無法保存完整的回應。 系統會在必要 [大小 ] 欄位 (部分填入) 。 |
3.4 EFI_TREE_PROTOCOL。GetEventLog
EFI_TREE_PROTOCOL取得事件記錄函式呼叫可讓呼叫端擷取指定事件記錄檔的位址及其最後一個專案。
原型
typedef
EFI_STATUS
(EFIAPI *EFI_TREE_GET_EVENT_LOG) (
IN EFI_TREE_PROTOCOL *This,
IN TREE_EVENT_LOG_FORMATEventLogFormat,
OUT EFI_PHYSICAL_ADDRESS*EventLogLocation,
OUT EFI_PHYSICAL_ADDRESS*EventLogLastEntry,
OUT BOOLEAN*EventLogTruncated
);
參數
EventLogFormat |
要求資訊的事件記錄檔類型。 |
EventLogLocation |
事件記錄檔記憶體位址的指標。 |
EventLogLastEntry |
如果事件記錄檔包含多個專案,則這是記憶體中事件記錄檔中最後一個專案開頭的指標。 如需在空白事件記錄檔或只有一個專案的事件記錄檔的特殊案例中傳回哪些值的相關資訊,請參閱下面的描述一節。 |
EventLogTruncated |
如果事件記錄檔遺失至少一個專案,因為事件已超過為事件配置的區域,此值會設定為 TRUE。 否則,此值會是 FALSE,而且事件記錄檔將會完成。 |
說明
韌體會在開機程式期間管理 TrEE 中記錄之測量的事件記錄檔。 在開機程式期間,在 UEFI 平臺初始化之前,會針對 TrEE 中擴充的每個度量,在事件記錄檔中建立專案。 在 UEFI 環境中,每次呼叫 HashLogExtendEvent 以擴充 TrEE 中的度量時,事件通常會記錄在包含擴充度量的事件記錄檔中。 如果韌體配置給事件記錄檔的區域太小而無法保存新增的所有事件,則函式呼叫會指出事件記錄檔遭到截斷,且專案遺失。 此規格版本只需要維護 SHA1 測量的事件記錄檔。 此規格的未來版本可能會維護支援不同雜湊演算法的其他事件記錄檔。
呼叫 ExitBootServices ( ) 時,會釋放此函式傳回的事件記錄區。 呼叫這個方法的呼叫端不得存取 ExitBootServices ( ) 之後的區域。針對此版本的規格:
如果 EventLogFormat 不等於TREE_EVENT_LOG_FORMAT_TCG_1_2,則函式呼叫 MUST 會傳回EFI_INVALID_PARAMETER。
如果沒有 TrEE,函式必須設定下列值,並傳回EFI_SUCCESS:
EventLogLocation = Null
EventLogLastEntry = Null
EventLogTruncated = FALSE
EventLogLocation 值必須設定為記憶體中指定事件記錄檔格式的開頭
如果指定的事件記錄檔:
不包含任何事件,則 EventLogLastEntry 必須設定為 0
包含一個專案,然後 EventLogLastEntry 必須設定為與 EventLogLocation 相同的值
包含多個事件,然後 EventLogLastEntry 必須設定為指定事件記錄檔最後一個事件的起始位址
如果先前呼叫 EFI_TREE_PROTOCOL。HashLogExtendEvent 傳回EFI_VOLUME_FULL然後 EventLogTruncated 必須設定為 TRUE,否則必須設定為 FALSE。
傳回的狀態碼
EFI_SUCCESS |
作業順利完成。 |
EFI_INVALID_PARAMETER |
一或多個參數 (不正確,例如要求不支援其格式的事件記錄檔) 。 |
3.5 EFI_TREE_PROTOCOL。HashLogExtendEvent
EFI_TREE_PROTOCOL HashLogExtendEvent 函式呼叫可讓呼叫端有機會擴充和選擇性地記錄事件,而不需要瞭解實際的 TPM 命令。即使此函式無法建立事件記錄檔專案,仍會發生擴充作業 (例如,因為事件記錄檔已滿) 。
原型
typedef
EFI_STATUS
(EFIAPI * EFI_TREE_HASH_LOG_EXTEND_EVENT) (
IN EFI_TREE_PROTOCOL*This,
IN UINT64Flags,
IN EFI_PHYSICAL_ADDRESSDataToHash,
IN UINT64DataToHashLen,
IN TrEE_EVENT*Event,
);
參數
這 |
表示呼叫內容。 |
旗標 |
提供其他資訊的點陣圖 (請參閱下方) 。 |
DataToHash |
資料緩衝區開頭的實體位址 |
散 列。 |
|
DataToHashLen |
DataToHash所參考之緩衝區的位元組長度。 |
事件 |
包含事件相關資訊的資料緩衝區指標。 |
相關定義
#pragma pack(1)
typedef struct _TrEE_EVENT {
UINT32Size;
TrEE_EVENT_HEADERHeader;
UINT8Event[ANYSIZE_ARRAY];
} TrEE_EVENT;
typedef struct _TrEE_EVENT_HEADER {
UINT32HeaderSize;
UINT16HeaderVersion;
TrEE_PCRINDEXPCRIndex;
TrEE_EVENTTYPEEventType;
} TrEE_EVENT_HEADER;
#pragma pack()
typedef UINT32 TrEE_PCRINDEX;
typedef UINT32 TrEE_EVENTTYPE;
大小 |
事件的大小總計,包括 Size 元件、標頭和 事件 資料。 |
HeaderSize |
事件標頭本身的大小 (sizeof (TrEE_EVENT_HEADER) ) 。 |
HeaderVersion |
標頭版本。 針對此規格的這個版本,此值應為 1。 |
PCIndex |
應擴充 (0 - 23) 的PCR 索引。 |
EventType |
應擴充 (和選擇性記錄) 的事件種類。 |
旗標值
Flags 變數是提供其他資料的點陣圖,如下所示:
#define TREE_EXTEND_ONLY 0x0000000000000001
當事件應擴充但未記錄時,應該設定這個位。
#define PE_COFF_IMAGE 0x0000000000000010
當意圖是測量 PE/COFF 影像時,應該設定此位。
說明
EFI_TREE_PROTOCOL雜湊記錄擴充事件函式呼叫會計算資料緩衝區的度量, (可能包含 PE/COFF 二進位影像) ,並導致 TrEE 驅動程式擴充測量。 此外,服務會選擇性地建立事件記錄檔專案,並將它附加至服務所支援之每個事件記錄檔格式的事件記錄檔。 服務可讓呼叫端使用 TrEE,而不需要知道特定 TrEE 命令的任何專案。
在重新配置套用至影像之前,必須先使用此函式來測量 PE/COFF 影像。 注意:請小心使用此方法來測量 PE/COFF 影像。 一般而言,從影像載入程式期間載入 PE/COFF 影像等量重要資料的實作,而且可能會變更記憶體中的影像區段對齊方式。 淨結果是計算記憶體內部影像的雜湊,與從儲存媒體載入影像時所正確計算的影像實際測量不符。
叫用時,函式應執行下列動作:
如果任何參數這個、DataToHash 或 Event 都是 Null,則函式必須傳回EFI_INVALID_PARAMETER。
如果 Event.Size 小於 Event.Header.HeaderSize + sizeof (UINT32) ,函式必須傳回EFI_INVALID_PARAMETER。
如果 Event.Header.PCIndex 不是 0 到 23,包含,則函式必須傳回EFI_INVALID_PARAMETER。
如果 Flags 點陣圖具有PE_COFF_IMAGE位 SET,但 PE/COFF 影像已損毀或無法理解,則函式必須傳回EFI_UNSUPPORTED。
函式允許 Event.Header.EventType 參數的任何值。
函式必須計算資料摘要 (測量) ,從 DataToHash 開始,長度為 DataToHashLen。 設定PE_COFF_IMAGE位時,函式必須根據下列附錄 A 中的「測量 PE/COFF 影像」來計算 PE/COFF 影像的度量。
函式必須成功將 TPM2_PCR_Extend 命令傳送至 TrEE,以使用測量摘要擴充 Event.Header.PCIndex 所指示的PCR。 如果無法成功傳送命令,函式必須傳回EFI_DEVICE_ERROR。 如果韌體支援比 SHA1 更多的演算法,它可能會使用其他演算法來計算摘要,並加以擴充。
如果前一次呼叫此函式傳回EFI_VOLUME_FULL,且已在 Flags 參數中設定TREE_EXTEND_ONLY位,則函式必須傳回EFI_VOLUME_FULL。 (不會嘗試將事件記錄檔專案新增至事件記錄檔 (s) .)
函式必須建置 TCG 事件記錄檔專案,如下所示: (注意:TCG_PCR_EVENT結構是在 [TCG06b] 中定義,且應視為位元組對齊。)
TCG_PCR_EVENT。PCIndex = Event.Header.PCIndex
TCG_PCR_EVENT。EventType = Event.Header.EventType
TCG_PCR_EVENT。摘要 = < 上面計算的 SHA1 度量摘要>
TCG_PCR_EVENT。EventSize = Event.Size - sizeof (UINT32) - Event.Header.HeaderSize
TCG_PCR_EVENT。事件 = Event.Event (注意:這是 EventSize 位元組的記憶體複本)
函式可能會針對其他支援的事件記錄檔格式建置類似的事件記錄檔專案。
如果上面建立的TCG_PCR_EVENT事件記錄檔專案不符合針對 TrEE 事件記錄檔格式 TCG 1.2 事件記錄檔配置的區域,函式必須傳回EFI_VOLUME_FULL。
如果韌體支援其他事件記錄檔格式,而且針對這些事件記錄檔建立的任何事件都會超過為事件記錄檔配置的區域,則函式必須傳回EFI_VOLUME_FULL。
函式必須將建立的事件附加至其對應的事件記錄檔,而服務必須更新其內部指標至每個事件記錄檔最後一個事件的開頭。
傳回的狀態碼。
EFI_SUCCESS |
作業順利完成。 |
EFI_DEVICE_ERROR |
命令失敗。 |
EFI_VOLUME_FULL |
發生擴充作業,但事件無法寫入一或多個事件記錄檔。 |
EFI_INVALID_PARAMETER |
一或多個參數不正確。 |
EFI_UNSUPPORTED |
不支援 PE/COFF 映射類型。 |
3.6 EFI_TREE_PROTOCOL。SubmitCommand
此服務可讓命令傳送至 TrEE。
原型
typedef
EFI_STATUS
(EFIAPI *EFI_TREE_SUBMIT_COMMAND) (
IN EFI_TREE_PROTOCOL*This,
IN UINT32InputParameterBlockSize,
IN UINT8*InputParameterBlock,
IN UINT32OutputParameterBlockSize,
IN UINT8*OutputParameterBlock
);
參數
這 |
表示呼叫內容。 |
InputParameterBlockSize |
TrEE 輸入參數區塊的大小。 |
InputParameterBlock |
TrEE 輸入參數區塊的指標。 |
OutputParameterBlockSize |
TrEE 輸出參數區塊的大小。 |
OutputParameterBlock |
TrEE 輸出參數區塊的指標。 |
說明
EFI_TREE_PROTOCOL Submit Command 函式呼叫提供從呼叫端到系統 TrEE 的傳遞功能。
呼叫端負責建置要傳送至 TrEE 的命令位元組資料流程,並負責解譯 TrEE 傳回的結果位元組資料流程。 每個 TrEE 命令的 TrEE 輸入和輸出運算元都會定義于其他地方。
請注意,傳回的狀態碼反映函式調用的結果,而不是基礎 TrEE 命令的成功 (或失敗) 。
在結束 ExitBootServices () 呼叫之前,TPM 2.0 不得傳回TPM2_RC_RETRY。 (此需求的原因是傳回碼會封鎖開機程式,直到 TPM 命令可以 compeleted.)
TPM 2.0 必須先存取其持續性儲存體,才能完成 ExitBootServices 呼叫。 如果 TPM 2.0 實作在呼叫 ExitBootServices 之後無法存取持續性儲存體,請連絡 Microsoft 以取得其他需求。
傳回的狀態碼
EFI_SUCCESS |
命令位元組資料流程已成功傳送至裝置,且已成功接收回應。 |
EFI_DEVICE_ERROR |
命令未成功傳送至裝置,或未從裝置成功接收回應。 |
EFI_INVALID_PARAMETER |
一或多個參數不正確。 |
EFI_BUFFER_TOO_SMALL |
輸出參數區塊太小。 |
引用
[MSFT08] |
Microsoft Corporation,「Windows Authenticode 可攜式可執行簽章格式」,版本 1.0,2008 年 3 月 21 日。 |
[RFC2119] |
Bradner,S.,「用於 RFC 以指出需求等級的關鍵字」,IETF RFC 2119,1997 年 3 月。 |
[TCG06a] |
信任的運算群組「TCG EFI 通訊協定」版本 1.20 修訂 1.00,2006 年 6 月 9 日。 |
[TCG06b] |
信任的運算群組「TCG EFI 平臺規格」版本 1.20 修訂 1.0,2006 年 6 月 7 日。 |
[TCG07] |
信任的運算群組「TCG 廠商識別碼登錄」版本 1.0,修訂 0.1,2007 年 8 月 31 日。 |
[UEFI12] |
UEFI,「統一可擴展韌體介面規格」2.3.1 版 Errata C, |
2012 年 6 月。 |
附錄 A:信任度量的靜態根目錄
重要
附錄:InstantGo 系統必須實作PCR[7] 度量。
概括而言,韌體負責在開機期間測量下列元件:
包含或測量 UEFI 開機服務和 UEFI 執行時間服務的平臺韌體
與平臺韌體相關聯的安全性相關變數
個別載入的 UEFI 驅動程式或開機應用程式
與個別載入的 UEFI 驅動程式或 UEFI 開機應用程式相關聯的變數
上述度量是由 TCG EFI 平臺規格 [TCG06b] 第 5.1 - 5.5 節所定義,而且不會在此進一步參考。 根據平臺組態,測量為PCR[1] 和PCR[3] 是選擇性的。
針對 Windows,使用PCR[7] 來反映 UEFI 2.3.1 安全開機原則。 此原則依賴韌體驗證在 UEFI 環境之前啟動的所有開機元件,以及 UEFI 平臺初始化程式碼 (或舊版韌體程式碼,) 不一定地將安全開機原則資訊記錄到PCR[7]。
因此,遵守原則的平臺韌體必須將下列值測量為PCR[7]:
PK 變數的內容
KEK 變數的內容
EFI_IMAGE_SECURITY_DATABASE變數的內容
EFI_IMAGE_SECURITY_DATABASE1變數的內容
用來驗證開機路徑中 EFI 驅動程式或 EFI 開機應用程式之EFI_IMAGE_SECURITY_DATABASE中的專案
SecureBoot 變數的內容
由於上述原因,UEFI 變數 PK、KEK、EFI_IMAGE_SECURITY_DATABASE、EFI_IMAGE_SECURITY_DATABASE1和 SecureBoot 不應測量為PCR[3]。
此外,如果平臺提供可能會在 UEFI 環境之前啟動的韌體偵錯工具,則必須在PCR[7] 中記錄此事實。 同樣地,如果平臺為 UEFI 環境提供偵錯工具,則必須在PCR[7] 中記錄偵錯工具的啟動。
實作注意事項
UEFI LoadImage 函式必須針對 [TCG06b] 中所述的每個事件,以及下列「測量 UEFI 組態至PCR[7]一節中所述的每個事件,記錄在PCR[2] 或 HTTP[4] 中的測量。 若要判斷影像量測適用于PC[2] 或PC[4],LoadImage 必須檢查 PE/COFF 影像中的子系統欄位。 值IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER、IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER和IMAGE_SUBSYSTEM_EFI_ROM對應至IMAGE_SUBSYSTEM_EFI_ROM[2]。 值IMAGE_SUBSYSTEM_EFI_APPLICATION對應至IMAGE_SUBSYSTEM_EFI_APPLICATION[4]。 如果載入的影像是一些其他類型的影像,則必須以[4] 記錄它。 LoadImage 因為 () 簽章驗證失敗或 b (b) ,因為映射不符合目前強制執行的 UEFI 2.3.1 安全開機原則而無法載入的映射,因此不需要在 USB 中測量。
相關定義
#define EV_EFI_VARIABLE_DRIVER_CONFIG \
0x80000001 /* Defined in [TCG06b] */
#define EV_EFI_ACTION 0x80000007 /* Defined in [TCG06b] */
#define EV_EFI_VARIABLE_AUTHORITY 0x800000E0
This specification requires a modified TCG structure definition for EFI_VARIABLE_DATA. The revised structure is:
typedef struct {
EFI_GUIDVariableName;
UINT64 UnicodeNameLength; // The TCG Defintion used UINTN
UINT64 VariableDataLength; // The TCG Defintion used UINTN
CHAR16 UnicodeName[1];
INT8 VariableData[1];
} EFI_VARIABLE_DATA;
測量 PE/COFF 影像
測量 PE/COFF 映射時,EventType 應該如 [TCG06b] 中所定義 (,例如,測量 EFI 開機應用程式時,EventType 應該EV_EFI_BOOT_SERVICES_APPLICATION) ,而 Event 值應該是 [TCG06b] 中所定義之EFI_IMAGE_LOAD_EVENT結構的值。
HashLogExtendEvent 服務必須根據 [MSFT08] 的 [計算 PE 映射雜湊] 區段中指定的程式雜湊 PE/COFF 映射。
將 UEFI 組態測量為[7]
對於所有 EFI 變數值事件,EventType 應EV_EFI_VARIABLE_DRIVER_CONFIG定義于上方,而 Event 值應為此規格中定義的EFI_VARIABLE_DATA結構值, (此結構應視為位元組對齊) 。 度量摘要應該是事件資料的 SHA-1 雜湊,這是EFI_VARIABLE_DATA結構。 (注意:這是與 [TCG06b].) The EFI_VARIABLE_DATA所指定的摘要不同。UnicodeNameLength 值是 CHAR16 字元的數目, (不是) 的位元組數目。 EFI_VARIABLE_DATA。UnicodeName 內容不得包含 Null 結束字元。 如果讀取 EFI 變數傳回EFI_NOT_FOUND,則EFI_VARIABLE_DATA。VariableDataLength 欄位必須設定為零且EFI_VARIABLE_DATA。VariableData 欄位的大小會是零。
如果平臺提供可在 UEFI 環境之前使用的韌體偵錯工具模式,或平臺為 UEFI 環境提供偵錯工具,則平臺「應」將 [TCG06b] 中指定的EV_EFI_ACTION事件延伸至[7],再允許使用偵錯工具。 事件字串應該是 「UEFI 偵錯模式」。 此外,平臺必須建立 TCG 事件記錄檔專案,如下所示:
TCG_PCR_EVENT。PCIndex = 7
TCG_PCR_EVENT。EventType = EV_EFI_ACTION
TCG_PCR_EVENT。Digest = < 字串值 「UEFI 偵錯模式」 的 SHA-1 摘要,不含終止的 Null 字元>
TCG_PCR_EVENT。EventSize = strlen (「UEFI 偵錯模式」)
TCG_PCR_EVENT。事件 = 「UEFI 偵錯模式」
平臺可能會針對其他支援的事件記錄檔格式建置類似的事件記錄檔專案。
在執行未以密碼編譯方式驗證為平臺製造商提供的任何程式碼之前,平臺製造商韌體必須依照使用EV_EFI_VARIABLE_DRIVER_CONFIG事件種類對EV_EFI_VARIABLE_DRIVER_CONFIG事件種類來測量下列值[7]:
SecureBoot 變數值
PK 變數值
KEK 變數值
變數值EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE
EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE1變數值
如果平臺支援變更下列任何 UEFI 原則變數之後,這些變數一開始會測量為[7] 且 在 ExitBootServices ( ) 完成之前,而不需無條件地重新開機平臺,則必須在變更時立即重新測量變數。 此外,設定下列任一 UEFI 變數的一般更新程式,必須發生在在啟動至 EXITBootServices () 的初始測量完成之前。
SecureBoot 變數值
PK 變數值
KEK 變數值
變數值EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE
EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE1變數值
系統 SHALL 會測量EV_SEPARATOR事件在EV_SEPARATOR[7]。 (這會在分隔符號測量為 (至) 至) 為)
啟動 EFI 驅動程式或 EFI 開機應用程式 (之前,不論啟動是因為 EFI 開機管理員從 DriverOrder 或 BootOrder UEFI 變數挑選映射,還是已啟動的映射呼叫 UEFI LoadImage () 函式) ,UEFI 韌體應測量用來驗證 EFI 映射的 EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE 變數中的專案PC[7]。 測量應與影像載入一起發生。 在此事件中,EventType 應EV_EFI_VARIABLE_AUTHORITY,而 Event 值應該是EFI_VARIABLE_DATA結構的值, (此規格中,結構的定義與 TCG 規格) 不同。 EFI_VARIABLE_DATA。VariableData 值應該是來自EFI_SIGNATURE_LIST的EFI_SIGNATURE_DATA值,其中包含用來驗證映射和EFI_VARIABLE_DATA的授權單位。VariableName 應設定為 EFI_IMAGE_SECURITY_DATABASE_GUID。 EFI_VARIABLE_DATA。UnicodeName 應設定為 EFI_IMAGE_SECURITY_DATABASE 的值。 值不得包含終止的 Null 字元。
啟動任何其他 EFI 驅動程式或 EFI 開機應用程式之前,UEFI 韌體應該先檢查EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE變數中的專案,該變數會驗證 EFI 映射先前已使用EV_EFI_VARIABLE_AUTHORITY事件種類在EV_EFI_VARIABLE_AUTHORITY[7]。 如果尚未進行,則必須如上一個步驟所述來測量。 如果先前已測量過,則必須再次測量它。
注意
根據 Microsoft 的要求,有一個測量範例可供使用,例如,即可使用對PCR[7] 的測量。