次の方法で共有


信頼された実行環境の EFI プロトコル

ライセンス: Microsoft は、本仕様の実装の作成、使用、販売、販売申出、輸入、または配布のみを目的として、合理的かつ非差別的な条件で、「必要な請求」に対して無償 (無料) のライセンスをお客様に付与することに同意します。 「必要な請求」とは、本仕様の必須部分 (任意の部分の必須要素も含む) を実装するために技術的に必要な、Microsoft が所有または管理する特許の請求です。本仕様では、侵害の原因となる機能が単に参照されているだけでなく、詳細に説明されています。

1.0 はじめに

このドキュメントでは、Trusted Computing Group (TCG) のトラステッド プラットフォーム モジュール 2.0 ライブラリ仕様のサブセットに従って TPM 2.0 機能を実装する、高信頼実行環境 (TrEE) を操作するための EFI プロトコルを示します。 このドキュメントでは、プラットフォーム ファームウェアの測定要件も示します。 ここで定義されている EFI プロトコルでは、[TCG06a] と [TCG06b] を広く利用しています。

2.0 データ構造と頭字語

2.1 データ構造

[TCG06a] と同様に、すべてのデータ値はリトル エンディアン形式で表すものとします。 文字列は、最下位のメモリ位置に左端の文字が配置された ASCII バイト配列として表すものとします。

2.2 頭字語と規則

(ここで定義されていない頭字語については、[TCG06a] を参照してください)

TrEE - 高信頼実行環境

このドキュメントにおける "する必要がある" および "するものとする/しなければならない" という用語の使用は、[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 との通信に使用されます。 このプロトコルは、TCG 1.2 TCG イベント ログと同じ形式を使用して、TrEE で記録された測定のイベント ログを保持します ([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,
);

パラメーター

This

呼び出しコンテキストを示します。

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 構造体自体バージョン。 このバージョンのプロトコルでは、Major バージョンを 1 に設定し、Minor バージョンを 0 に設定するものとします。

ProtocolVersion

TrEE プロトコルのバージョン。 このバージョンのプロトコルでは、Major バージョンを 1 に設定し、Minor バージョンを 0 に設定するものとします。

HashAlgorithmBitMap

サポートされているハッシュ アルゴリズム

SupportedEventLogs

サポートされているイベント ログ形式のビットマップ (上記を参照)

TrEEPresentFlag

False = TrEE が存在しません

MaxCommandSize

TrEE に送信できるコマンドの最大サイズ (バイト単位)

MaxResponseSize

TrEE が提供できる応答の最大サイズ (バイト単位)

ManufacturerID

4 バイトのベンダー ID ([TCG07] の「TPM Capabilities Vendor ID」 (TPM 機能のベンダー ID) を参照)

説明

EFI_TREE_PROTOCOL GetCapability 関数呼び出しにより、EFI プロトコルのバージョンおよび機能情報と TrEE に関する状態情報が提供されます。 呼び出し元は、割り当てられた TREE_BOOT_SERVICE_CAPABILITY 構造体の Size フィールドを設定する必要があります。 この関数呼び出しの将来のバージョンでは、この構造体にフィールドが追加される可能性があります。 渡された Size 値により、関数は呼び出し元がメモリを割り当てたフィールドにのみ入力できるようになります。 次に例を示します。

ProtocolCapability.Size = sizeof(TREE_BOOT_SERVICE_CAPABILITY);

このバージョンの仕様の場合:

  1. This または ProtocolCapability パラメーターが NULL の場合、関数呼び出しで EFI_INVALID_PARAMETER が返されます。

  2. 入力の ProtocolCapability.Size が sizeof(TREE_BOOT_SERVICE_CAPABILITY) より小さい場合、関数はこの仕様で定義されている sizeof(TREE_BOOT_SERVICE_CAPABILITY) と等しくなるように ProtocolCapability.Size を設定し、エラー コード EFI_BUFFER_TOO_SMALL を返します。残りのフィールドの値は未定義になります。

  3. 次の戻り値を設定する必要があります。

    ProtocolCapability.StructureVersion.Major = 1

    ProtocolCapability.StructureVersion.Minor = 0

    ProtocolCapability.ProtocolVersion.Major = 1

    ProtocolCapability.ProtocolVersion.Minor = 0

  4. プラットフォームに TrEE がない場合は、次の値を返す必要があります。

    ProtocolCapability.SupportedEventLogs = 0

    ProtocolCapability.HashAlgorithmBitmap = 0

    ProtocolCapability.TrEEPresentFlag = FALSE

    ProtocolCapability.MaxCommandSize = 0

    ProtocolCapability.MaxResponseSize = 0

    ProtocolCapability.ManufacturerID = 0

  5. Windows の場合、MaxCommandSize と MaxResponseSize の最小値は 0x500 (以上) である必要があります。

返される状態コード

EFI_SUCCESS

操作は正常に完了しました。

EFI_DEVICE_ERROR

コマンドが失敗しました。 ProtocolCapability 変数は設定されません。

EFI_INVALID_PARAMETER

1 つ以上のパラメーターが正しくありません。 ProtocolCapability 変数は設定されません。

EFI_BUFFER_TOO_SMALL

ProtocolCapability 変数が小さすぎて、完全な応答を保持できません。 部分的に設定されます (必須の Size フィールドが設定されます)。

3.4 EFI_TREE_PROTOCOL.GetEventLog

EFI_TREE_PROTOCOL Get Event Log 関数呼び出しを使用すると、呼び出し元は特定のイベント ログとその最後のエントリのアドレスを取得できます。

プロトタイプ

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

イベント ログに複数のエントリが含まれている場合、これはイベント ログの最後のエントリの、メモリ内の開始アドレスへのポインターです。 空のイベント ログまたはエントリが 1 つしかないイベント ログという特殊なケースにおいて、このパラメーターで返される値については、後述の「説明」を参照してください。

EventLogTruncated

イベントが、イベント用に割り当てられた領域を超えたために、イベント ログの少なくとも 1 つのエントリが欠落している場合、この値は TRUE に設定されます。 それ以外の場合、値は FALSE になり、イベント ログが完了します。

説明

ファームウェアは、ブート プロセス中に TrEE で記録された測定のイベント ログを管理します。 ブート プロセス中、UEFI プラットフォームの初期化の前に、TrEE で拡張された各測定のイベント ログにエントリが作成されます。 UEFI 環境では、HashLogExtendEvent を呼び出して TrEE で測定を拡張するたびに、イベントは拡張された測定を含むイベント ログに通常記録されます。 ファームウェアによってイベント ログに割り当てられた領域が小さすぎて、追加されたすべてのイベントを保持できなかった場合、この関数呼び出しによって、イベント ログが切り詰められ、欠落しているエントリがあることが示されます。 このバージョンの仕様では、SHA1 測定のイベント ログのみを保持する必要があります。 この仕様の将来のバージョンでは、さまざまなハッシュ アルゴリズムをサポートするその他のイベント ログも保持される可能性があります。

この関数によって返されるイベント ログ領域は、ExitBootServices ( ) が呼び出されると解放されます。 このメソッドの呼び出し元は、ExitBootServices ( ) が呼び出された後に、その領域にアクセスすることはできません。このバージョンの仕様では、次のようになります。

  1. EventLogFormat が TREE_EVENT_LOG_FORMAT_TCG_1_2 ではない場合、関数呼び出しで EFI_INVALID_PARAMETER を返す必要があります。

  2. TrEE が存在しない場合、関数は次の値を設定し、EFI_SUCCESS を返す必要があります。

    1. EventLogLocation = NULL

    2. EventLogLastEntry = NULL

    3. EventLogTruncated = FALSE

  3. EventLogLocation 値は、指定されたイベント ログ形式の、メモリ内の開始位置に設定する必要があります。

  4. 指定されたイベント ログについて:

    1. イベントが含まれていない場合は、EventLogLastEntry を 0 に設定する必要があります。

    2. エントリが 1 つだけ含まれている場合は、EventLogLastEntry を EventLogLocation と同じ値に設定する必要があります。

    3. 複数のイベントが含まれている場合は、EventLogLastEntry を、指定されたイベント ログの最後のイベントの開始アドレスに設定する必要があります。

  5. EFI_TREE_PROTOCOL.HashLogExtendEvent の前の呼び出しで EFI_VOLUME_FULL が返された場合は、EventLogTruncated を TRUE に設定する必要があります。それ以外の場合は、FALSE に設定する必要があります。

返される状態コード

EFI_SUCCESS

操作は正常に完了しました。

EFI_INVALID_PARAMETER

1 つ以上のパラメーターが正しくありません (例: 形式がサポートされていないイベント ログを要求している)。

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,
);

パラメーター

This

呼び出しコンテキストを示します。

フラグ

追加情報を提供するビットマップ (下記を参照)。

DataToHash

ハッシュされるデータ バッファーの開始位置の

物理アドレス。

DataToHashLen

DataToHash によって参照されるバッファーの長さ (バイト単位)。

Event

イベントに関する情報を格納するデータ バッファーへのポインター。

関連する定義

#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 コンポーネント、ヘッダー、Event データを含むイベントの合計サイズ。

HeaderSize

イベント ヘッダー自体のサイズ (sizeof(TrEE_EVENT_HEADER))。

HeaderVersion

ヘッダー バージョン。 この仕様のこのバージョンでは、値は 1 でなければなりません。

PCRIndex

拡張しなければならない PCR のインデックス (0 - 23)。

EventType

拡張し、必要に応じてログに記録しなければならないイベントの種類。

フラグ値

Flags 変数は、次のように追加データを提供するビットマップです。

#define TREE_EXTEND_ONLY 0x0000000000000001

このビットは、イベントを拡張しなければならないが、ログには記録しない場合に設定するものとします。

#define PE_COFF_IMAGE 0x0000000000000010

このビットは、PE/COFF イメージの測定を目的としている場合に設定するものとします。

説明

EFI_TREE_PROTOCOL Hash Log Extend Event 関数呼び出しにより、(場合によっては PE/COFF バイナリ イメージを格納する) データ バッファーの測定値が計算され、TrEE ドライバーは測定を拡張します。 さらに、サービスは必要に応じてイベント ログ エントリを作成し、サービスでサポートされている各イベント ログ形式のイベント ログに追加します。 このサービスにより、呼び出し元は、特定の TrEE コマンドについて何も理解していなくても TrEE を使用できます。

この関数を使用した PE/COFF イメージの測定は、イメージに再配置を適用する前に実行する必要があります。 注: この方法を使用して PE/COFF イメージを測定する場合は注意が必要です。 一般に、PE/COFF イメージを読み込む実装では、イメージからの読み込みプロセス中に重要なデータが削除され、メモリ内のイメージ セクションの配置が変更される可能性があります。 最終的な結果として、メモリ内イメージのハッシュの計算が、記憶域メディアからそのイメージが読み込まれたときに正しく計算された実際の測定値と一致しなくなります。

呼び出し時に、この関数は次のアクションを実行するものとします。

  1. This、DataToHash、Event のいずれかのパラメーターが NULL の場合、関数は EFI_INVALID_PARAMETER を返す必要があります。

  2. Event.Size が Event.Header.HeaderSize と sizeof(UINT32) の合計より小さい場合、関数は EFI_INVALID_PARAMETER を返す必要があります。

  3. Event.Header.PCRIndex が 0 から 23 までではない場合、関数は EFI_INVALID_PARAMETER を返す必要があります。

  4. Flags ビットマップに PE_COFF_IMAGE ビットが設定されていても、PE/COFF イメージが破損しているか、理解されていない場合、関数は EFI_UNSUPPORTED を返す必要があります。

  5. この関数では、Event.Header.EventType パラメーターに任意の値を指定できます。

  6. 関数は、DataToHashLen の長さで DataToHash から始まるデータのダイジェスト (測定値) を計算する必要があります。 PE_COFF_IMAGE ビットが設定されている場合、関数は、後述の付録 A の「PE/COFF イメージの測定」に従って、PE/COFF イメージの測定値を計算する必要があります。

  7. 関数は、TrEE に TPM2_PCR_Extend コマンドを正常に送信して、Event.Header.PCRIndex によって示される PCR を測定ダイジェストで拡張する必要があります。 このコマンドを正常に送信できない場合、関数は EFI_DEVICE_ERROR を返す必要があります。 ファームウェアは、SHA1 以外のアルゴリズムもサポートしている場合、他のアルゴリズムを使用してダイジェストを計算し、それらも拡張できます。

  8. この関数の以前の呼び出しで EFI_VOLUME_FULL が返され、Flags パラメーターに TREE_EXTEND_ONLY ビットが設定されている場合、関数は EFI_VOLUME_FULL を返す必要があります (イベント ログへのイベント ログ エントリの追加は試行されません)。

  9. 関数は、次のように TCG イベント ログ エントリを作成する必要があります (注: TCG_PCR_EVENT 構造体は [TCG06b] で定義されており、バイト整列と見なされるものとします)。

    1. TCG_PCR_EVENT.PCRIndex = Event.Header.PCRIndex

    2. TCG_PCR_EVENT.EventType = Event.Header.EventType

    3. TCG_PCR_EVENT.Digest = <上記で計算された SHA1 測定ダイジェスト>

    4. TCG_PCR_EVENT.EventSize = Event.Size - sizeof(UINT32) - Event.Header.HeaderSize

    5. TCG_PCR_EVENT.Event = Event.Event (注: これは EventSize バイトのメモリ コピーです)

  10. 関数は、サポートされている他のイベント ログ形式に対して同様のイベント ログ エントリを作成できます。

  11. 上記で作成された TCG_PCR_EVENT イベント ログ エントリが、TrEE イベント ログ形式 TCG 1.2 イベント ログに割り当てられた領域に収まらない場合、関数は EFI_VOLUME_FULL を返す必要があります。

  12. ファームウェアが他のイベント ログ形式もサポートしており、それらのイベント ログに対して作成されたイベントのいずれかが、イベント ログに割り当てられた領域を超える場合、関数は EFI_VOLUME_FULL を返す必要があります。

  13. 関数は、作成されたイベントを対応するイベント ログに追加する必要があります。また、サービスは、各イベント ログの最後のイベントの開始位置への内部ポインターを更新する必要があります。

返される状態コード

EFI_SUCCESS

操作は正常に完了しました。

EFI_DEVICE_ERROR

コマンドが失敗しました。

EFI_VOLUME_FULL

拡張操作が実行されましたが、1 つ以上のイベント ログにイベントを書き込むことができませんでした。

EFI_INVALID_PARAMETER

1 つ以上のパラメーターが正しくありません。

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 
);

パラメーター

This

呼び出しコンテキストを示します。

InputParameterBlockSize

TrEE 入力パラメーター ブロックのサイズ。

InputParameterBlock

TrEE 入力パラメーター ブロックへのポインター。

OutputParameterBlockSize

TrEE 出力パラメーター ブロックのサイズ。

OutputParameterBlock

TrEE 出力パラメーター ブロックへのポインター。

説明

EFI_TREE_PROTOCOL Submit Command 関数呼び出しにより、呼び出し元からシステムの TrEE へのパススルー機能が提供されます。

呼び出し元は、TrEE に送信されるコマンド バイトストリームを作成する役割を担い、TrEE から返される結果のバイトストリームを解釈する役割も担います。 各 TrEE コマンドの TrEE 入出力オペランドは他の場所で定義されています。

返される状態コードは、関数呼び出しの結果を反映しており、基になる TrEE コマンドの成功 (または失敗) を反映しているわけではないことに注意してください。

TPM 2.0 では、ExitBootServices() の呼び出しが完了する前に TPM2_RC_RETRY を返すことはできません (この要件の理由は、TPM コマンドが完了するまで、リターン コードによってブート プロセスがブロックされるためです)。

TPM 2.0 では、ExitBootServices の呼び出しが完了する前に、固定記憶域にアクセスできる必要があります。 ExitBootServices の呼び出し後に、TPM 2.0 実装が固定記憶域にアクセスできない場合は、その他の要件について Microsoft にお問い合わせください。

返される状態コード

EFI_SUCCESS

コマンド バイト ストリームがデバイスに正常に送信され、応答が正常に受信されました。

EFI_DEVICE_ERROR

コマンドがデバイスに正常に送信されなかったか、デバイスからの応答が正常に受信されませんでした。

EFI_INVALID_PARAMETER

1 つ以上のパラメーターが正しくありません。

EFI_BUFFER_TOO_SMALL

出力パラメーター ブロックが小さすぎます。

参考資料

[MSFT08]

Microsoft Corporation、「Windows Authenticode Portable Executable Signature Format」 (Windows Authenticode の移植可能な実行可能署名形式)、Version 1.0、2008 年 3 月 21 日。

[RFC2119]

Bradner, S.、「Keywords for Use in RFCs to Indicate Requirement Levels」 (要求レベルを示すために RFC で使用されるキーワード)、IETF RFC 2119、1997 年 3 月。

[TCG06a]

Trusted Computing Group、「TCG EFI Protocol」 (TCG EFI プロトコル) Version 1.20 Revision 1.00、2006 年 6 月 9 日。

[TCG06b]

Trusted Computing Group、「TCG EFI Platform Specification」 (TCG EFI プラットフォーム仕様) Version 1.20 Revision 1.0、2006 年 6 月 7 日。

[TCG07]

Trusted Computing Group、「TCG Vendor ID Registry」 (TCG ベンダー ID レジストリ) Version 1.0、Revision 0.1、2007 年 8 月 31 日。

[UEFI12]

UEFI、「Unified Extensible Firmware Interface Specification」 (Unified Extensible Firmware Interface 仕様)、Version 2.3.1 Errata C、

2012 年 6 月。

付録 A: 信頼性測定の静的なルート

重要

InstantGo システムでは、PCR[7] 測定の付録 A の実装が必須です。

大まかに言うと、ファームウェアは起動中に次のコンポーネントを測定する役割を担います。

  • UEFI ブート サービスと UEFI ランタイム サービスを含むまたは測定するプラットフォーム ファームウェア

  • プラットフォーム ファームウェアに関連付けられているセキュリティ関連の変数

  • 個別に読み込まれる UEFI ドライバーまたはブート アプリケーション

  • 個別に読み込まれる UEFI ドライバーまたは UEFI ブート アプリケーションに関連付けられている変数

上記の測定は、TCG EFI プラットフォーム仕様 [TCG06b] のセクション 5.1 - 5.5 で定義されており、ここではこれ以上は言及しません。 PCR[1] および PCR[3] に記録する測定は、プラットフォームの構成によっては省略可能です。

Windows の場合、UEFI 2.3.1 セキュア ブート ポリシーを反映するために PCR[7] が使用されます。 このポリシーは、UEFI 環境より前に起動されるすべてのブート コンポーネントを認証するファームウェアと、セキュア ブート ポリシー情報を PCR[7] に不変的に記録する UEFI プラットフォーム初期化コード (または以前のファームウェア コード) に依存しています。

そのため、このポリシーに準拠しているプラットフォーム ファームウェアは、次の値を測定して PCR[7] に記録する必要があります。

  1. PK 変数の内容

  2. KEK 変数の内容

  3. EFI_IMAGE_SECURITY_DATABASE 変数の内容

  4. EFI_IMAGE_SECURITY_DATABASE1 変数の内容

  5. ブート パスの EFI ドライバーまたは EFI ブート アプリケーションの検証に使用される EFI_IMAGE_SECURITY_DATABASE のエントリ

  6. SecureBoot 変数の内容

上記の理由から、UEFI 変数 PK、KEK、EFI_IMAGE_SECURITY_DATABASE、EFI_IMAGE_SECURITY_DATABASE1、SecureBoot の測定値は、PCR[3] に記録してはいけません。

さらに、プラットフォームは、UEFI 環境より前に起動される可能性のあるファームウェア デバッガーを提供する場合、このことを PCR[7] に記録する必要があります。 同様に、プラットフォームが UEFI 環境のデバッガーを提供する場合は、デバッガーの起動を PCR[7] に記録する必要があります。

実装に関する注意事項

UEFI LoadImage 関数は、[TCG06b] に記載されているイベントごとに測定値を PCR[2] または PCR[4] に記録し、後述の「PCR[7] に記録する UEFI 構成の測定」に記載されているイベントごとに PCR [7] に記録する必要があります。 イメージの測定が PCR[2] と PCR[4] のどちらに適用されるのかを判断するために、LoadImage では PE/COFF イメージの Subsystem フィールドを調べる必要があります。 IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER、IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER、IMAGE_SUBSYSTEM_EFI_ROM の各値は PCR[2] に対応します。 値 IMAGE_SUBSYSTEM_EFI_APPLICATION は PCR[4] に対応します。 読み込まれたイメージが他の種類の場合は、PCR[4] に記録する必要があります。 (a) 署名検証エラーまたは (b) イメージが、現在適用されている UEFI 2.3.1 セキュア ブート ポリシーに準拠していないことが原因で、LoadImage が読み込みに失敗したイメージは、PCR で測定する必要はありません。

****関連する定義

#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] の「Calculating the PE Image Hash」 (PE イメージ ハッシュの計算) で指定されている手順に従って、PE/COFF イメージをハッシュする必要があります。

PCR[7] に記録する UEFI 構成の測定

すべての EFI 変数値イベントについて、EventType は上記で定義された EV_EFI_VARIABLE_DRIVER_CONFIG でなければなりません。また、Event 値はこの仕様において上記で定義された EFI_VARIABLE_DATA 構造体の値でなければなりません (この構造体は、バイト整列と見なされるものとします)。 測定ダイジェストは、EFI_VARIABLE_DATA 構造体であるイベント データの SHA-1 ハッシュでなければなりません (注: これは、[TCG06b] で指定されたものとは異なるダイジェストです)。EFI_VARIABLE_DATA。UnicodeNameLength 値は CHAR16 文字の数です (バイト数ではありません)。 EFI_VARIABLE_DATA.UnicodeName の内容には、null 終端文字を含めることはできません。 EFI 変数の読み取りで EFI_NOT_FOUND が返された場合、EFI_VARIABLE_DATA.VariableDataLength フィールドを 0 に設定する必要があり、EFI_VARIABLE_DATA.VariableData フィールドのサイズは 0 になります。

  1. プラットフォームが、UEFI 環境より前に使用される可能性のあるファームウェア デバッガー モードを提供する場合、またはプラットフォームが UEFI 環境のデバッガーを提供する場合、プラットフォームはデバッガーの使用を許可する前に、[TCG06b] で指定されている EV_EFI_ACTION イベントを PCR[7] に拡張するものとします。 イベント文字列は、"UEFI Debug Mode" でなければなりません。 さらに、プラットフォームは次のように TCG イベント ログ エントリを作成する必要があります。

    1. TCG_PCR_EVENT.PCRIndex = 7

    2. TCG_PCR_EVENT.EventType = EV_EFI_ACTION

    3. TCG_PCR_EVENT.Digest = <終端の NULL 文字がない文字列値 "UEFI Debug Mode" の SHA-1 ダイジェスト>

    4. TCG_PCR_EVENT.EventSize = strlen("UEFI Debug Mode")

    5. TCG_PCR_EVENT.Event = "UEFI Debug Mode"

    プラットフォームは、サポートされている他のイベント ログ形式に対して同様のイベント ログ エントリを作成できます。

  2. プラットフォーム製造元が提供するものとして暗号認証されていないコードを実行する前に、プラットフォーム製造元のファームウェアは、EV_EFI_VARIABLE_DRIVER_CONFIG イベント型を使用して示された順序で次の値を測定して PCR[7] に記録する必要があります。

    1. SecureBoot 変数値

    2. PK 変数値

    3. KEK 変数値

    4. EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE 変数値

    5. EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE1 変数値

  3. プラットフォームは、次の UEFI ポリシー変数が PCR[7] で最初に測定された後、プラットフォームを無条件で再起動せずに ExitBootServices ( ) が完了する前に、これらの変数のいずれかを変更することをサポートしている場合、変更直後にその変数を再度測定する必要があります。 さらに、次の UEFI 変数のいずれかを設定するための通常の更新プロセスは、PCR[7] での最初の測定の前、または ExitBootServices() の呼び出しが完了した後に実行する必要があります。

    1. SecureBoot 変数値

    2. PK 変数値

    3. KEK 変数値

    4. EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE 変数値

    5. EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE1 変数値

  4. システムは、PCR[7] で EV_SEPARATOR イベントを測定するものとします (これは、PCR[0] から PCR[7] に対して区切りが測定されるのと同時に発生します)。

  5. EFI ドライバーまたは EFI ブートアプリケーションを起動する前に (その起動が、DriverOrder または BootOrder UEFI 変数からイメージを選択するEFI ブート マネージャーによるものか、UEFI LoadImage() 関数を呼び出す既に起動されたイメージによるものかに関係なく)、UEFI ファームウェアは、EFI イメージの検証に使用された EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE 変数内のエントリを測定して PCR[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 文字を含めてはいけません。

  6. 追加の EFI ドライバーまたは EFI ブート アプリケーションを起動する前に、UEFI ファームウェアは、EFI イメージを検証する EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE 変数内のエントリが、PCR[7] で EV_EFI_VARIABLE_AUTHORITY イベント型を使用して以前に測定されているかどうかを確認するものとします。 これをまだ行ってない場合は、前の手順の説明に従って測定する必要があります。 以前に測定されている場合は、再度測定してはいけません。

Note

PCR[7] 測定の測定例は、Microsoft からの要望に応じて提供されます。