Протокол EFI доверенной среды выполнения

Лицензирование. Корпорация Майкрософт соглашается предоставлять вам безвозмездную, безвозмездную лицензию на свои необходимые претензии на разумных и недискриминационных условиях исключительно для создания, использования, продажи, предложения для продажи, импорта или распространения любой реализации этой спецификации. "Необходимые претензии" — это те претензии, которые принадлежат корпорации Майкрософт или контролируемые корпорацией Майкрософт патенты, которые технически необходимы для реализации требуемых частей (которые также включают обязательные элементы необязательных частей) данной спецификации, где функциональные возможности, вызывающие нарушение, подробно описаны, а не просто упоминаются в этой спецификации.

1.0 Введение

В этом документе указан протокол EFI для взаимодействия с доверенной средой выполнения (TrEE), реализующей функциональные возможности TPM 2.0 в подмножестве спецификации библиотеки доверенного платформенного модуля 2.0 группы доверенных вычислений (TCG). В этом документе также указаны требования к измерению встроенного ПО платформы. Протокол 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 Протокол привязки службы EFI TrEE

В этом разделе определяется протокол привязки службы EFI TrEE.

Сводка . Протокол привязки службы EFI TrEE используется для поиска устройств TrEE, поддерживаемых драйвером протокола EFI TrEE, а также для создания и уничтожения экземпляров дочерних драйверов протокола EFI TrEE, которые могут использовать базовое устройство 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 Протокол EFI TrEE

Сводка . Протокол EFI TrEE используется для взаимодействия с TrEE — для отправки команд в TrEE, использования его для доверенных операций выполнения и для предоставления доступа к журналу встроенного ПО измерений, расширенным в TrEE. Протокол ведет журнал событий измерений, записанных в TrEE, в формате, идентичном журналу событий TCG 1.2 TCG (см. [TCG06b]); в этой спецификации называется журналом событий TCG 1.2 формата журнала событий TrEE. Разработчики могут создавать дополнительные журналы событий в других форматах, но эта версия протокола не определяет способ их получения.

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, см. в разделе 6.1 [UEFI12].

3.3 EFI_TREE_PROTOCOL. GetCapability

Вызов функции GetCapability EFI_TREE_PROTOCOL предоставляет сведения о возможности протокола и сведения о состоянии 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-байтовый идентификатор поставщика (см. [TCG07], раздел "Идентификатор поставщика возможностей TPM")

Описание

Вызов функции EFI_TREE_PROTOCOL Get Capability предоставляет сведения о версии и возможностях протокола EFI, а также сведения о состоянии TrEE. Вызывающий объект должен задать поле Размер выделенной структуры TREE_BOOT_SERVICE_CAPABILITY. Ожидается, что будущие версии этого вызова функции могут добавить дополнительные поля в структуру. Переданное значение Size позволит функции заполнять только поля, для которые вызывающей стороны выделена память. Пример:

ProtocolCapability.Size = sizeof(TREE_BOOT_SERVICE_CAPABILITY);

Для этой версии спецификации:

  1. Если параметры This или ProtocolCapability имеют значение NULL, функциональный вызов вернет EFI_INVALID_PARAMETER.

  2. Если входной параметр ProtocolCapability.Size < sizeof(TREE_BOOT_SERVICE_CAPABILITY) функция установит значение ProtocolCapability.Size равным sizeof(TREE_BOOT_SERVICE_CAPABILITY), как определено в этой спецификации, и вернет код ошибки 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. Минимальные значения MaxCommandSize и MaxResponseSize должны быть 0x500 (или больше) для Windows.

Возвращенные коды состояния

EFI_SUCCESS

Operation completed successfully (Операция выполнена успешно).

EFI_DEVICE_ERROR

Команда не удалась. Переменная ProtocolCapability не будет заполнена.

EFI_INVALID_PARAMETER

Один или несколько параметров неверны. Переменная ProtocolCapability не будет заполнена.

EFI_BUFFER_TOO_SMALL

Переменная ProtocolCapability слишком мала для хранения полного ответа. Он будет заполнен частично (будет задано обязательное поле Размер ).

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

Если журнал событий содержит несколько записей, это указатель на адрес начала последней записи в журнале событий в памяти. Сведения о том, какие значения возвращаются в этом параметре в особых случаях пустого журнала событий или журнала событий с одной записью, см. в разделе Описание ниже.

EventLogTruncated

Если в журнале событий отсутствует хотя бы одна запись, так как событие превысило бы область, выделенную для событий, это значение имеет значение 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. содержит ровно одну запись, после чего EventLogLastEntry НЕОБХОДИМО задать то же значение, что и EventLogLocation.

    3. содержит более одного события, после чего EventLogLastEntry НЕОБХОДИМО задать начальный адрес последнего события указанного журнала событий.

  5. Если предыдущий вызов EFI_TREE_PROTOCOL. HashLogExtendEvent возвращается EFI_VOLUME_FULL затем EventLogTruncated должно иметь значение TRUE, в противном случае — значение FALSE.

Возвращенные коды состояния

EFI_SUCCESS

Operation completed successfully (Операция выполнена успешно).

EFI_INVALID_PARAMETER

Один или несколько параметров неверны (например, запрос журнала событий, формат которого не поддерживается).

3.5 EFI_TREE_PROTOCOL. HashLogExtendEvent

Вызов функции HashLogExtendEvent EFI_TREE_PROTOCOL предоставляет вызывающим абонентам возможность расширять и при необходимости регистрировать события без необходимости знать фактические команды доверенного платформенного модуля. Операция расширения будет выполняться, даже если эта функция не может создать запись журнала событий (например, из-за заполнения журнала событий).

Прототип

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

Параметры

Это

Указывает контекст вызова.

Flags

Точечный рисунок, предоставляющий дополнительные сведения (см. ниже).

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.

PCRIndex

Индекс PCR, который должен быть расширен (0–23).

EventType

Тип события, которое должно быть расширено (и при необходимости зарегистрировано).

Значения флагов

Переменная Flags представляет собой растровое изображение, предоставляющее дополнительные данные следующим образом:

#define TREE_EXTEND_ONLY 0x0000000000000001

Этот бит устанавливается, когда событие должно быть расширено, но не зарегистрировано.

#define PE_COFF_IMAGE 0x0000000000000010

Этот бит устанавливается, когда цель заключается в измерении изображения PE/COFF.

Описание

Вызов функции события расширения журнала EFI_TREE_PROTOCOL hash вычисляет измерение буфера данных (возможно, содержащего двоичное изображение 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. Если растровое изображение Флаги содержит PE_COFF_IMAGE бит SET, но изображение PE/COFF повреждено или не распознано, функция ДОЛЖНА возвращать EFI_UNSUPPORTED.

  5. Функция допускает любое значение для параметра Event.Header.EventType.

  6. Функция ДОЛЖНА вычислять хэш (измерение) данных, начиная с DataToHash, с длиной DataToHashLen. Если задан бит PE_COFF_IMAGE, функция ДОЛЖНА вычислять измерение изображения PE/COFF в соответствии с параметром "Измерение изображения PE/COFF" в приложении A ниже.

  7. Функция ДОЛЖНА успешно отправить команду TPM2_PCR_Extend в TrEE для расширения PCR, указанного event.Header.PCRIndex, с помощью дайджеста измерения. Если команда не может быть успешно отправлена, функция должна вернуть EFI_DEVICE_ERROR. Если встроенное ПО поддерживает больше алгоритмов, чем SHA1, оно может вычислять хэши с помощью других алгоритмов и расширять их.

  8. Если предыдущий вызов этой функции возвращал EFI_VOLUME_FULL и бит TREE_EXTEND_ONLY задан в параметре Flags, функция ДОЛЖНА возвращать 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. Дайджест = <хэш измерения 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 не помещается в область, выделенную для журнала событий TCG 1.2 формата журнала событий TrEE, функция ДОЛЖНА возвращать EFI_VOLUME_FULL.

  12. Если встроенное ПО поддерживает дополнительные форматы журнала событий и любое из событий, созданных для этих журналов событий, превысит область, выделенную для журнала событий, функция ДОЛЖНА возвращать EFI_VOLUME_FULL.

  13. Функция ДОЛЖНА добавлять созданные события в соответствующие журналы событий, а служба должна обновить свой внутренний указатель на начало последнего события для каждого журнала событий.

Возвращенные коды состояния.

EFI_SUCCESS

Operation completed successfully (Операция выполнена успешно).

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.

Вызывающий объект отвечает за построение команды byte-stream для отправки в TrEE, а также за интерпретацию результирующего потока байтов, возвращаемого TrEE. Операнды TrEE in и out для каждой команды TrEE определяются в другом месте.

Обратите внимание, что возвращенные коды состояния отражают результат вызова функции, а не успех (или сбой) базовой команды TrEE.

TPM 2.0 не должен возвращать TPM2_RC_RETRY до завершения вызова ExitBootServices(). (Причина этого требования заключается в том, что код возврата блокирует процесс загрузки до тех пор, пока не будет выполнена команда доверенного платформенного модуля.)

TPM 2.0 должен иметь доступ к своему постоянному хранилищу до завершения вызова ExitBootServices. Если реализация TPM 2.0 может не иметь доступа к постоянному хранилищу после вызова ExitBootServices, обратитесь в корпорацию Майкрософт для получения дополнительных требований.

Возвращенные коды состояния

EFI_SUCCESS

Поток байтов команд был успешно отправлен на устройство, и был успешно получен ответ.

EFI_DEVICE_ERROR

Команда не была успешно отправлена на устройство или ответ не был получен от устройства.

EFI_INVALID_PARAMETER

Один или несколько параметров неверны.

EFI_BUFFER_TOO_SMALL

Блок выходных параметров слишком мал.

Ссылки

[MSFT08]

Корпорация Майкрософт, "Windows Authenticode Portable Executable Signature Format", версия 1.0, 21 марта 2008 г.

[RFC2119]

Bradner, S., "Ключевые слова для использования в RFC для указания уровней требований", IETF RFC 2119, март 1997 г.

[TCG06a]

Trusted Computing Group, "TCG EFI Protocol", версия 1.20, редакция 1.00, 9 июня 2006 г.

[TCG06b]

Trusted Computing Group, "TCG EFI Platform Specification", version 1.20 Revision 1.0, 7 июня 2006 г.

[TCG07]

Trusted Computing Group, "TCG Vendor ID Registry", version 1.0, Revision 0.1, 31 августа 2007 г.

[UEFI12]

UEFI, "Unified Extensible Firmware Interface Specification", version 2.3.1 Errata C,

Июнь 2012 г.

Приложение А. Статический корень показателей доверия

Важно!

Приложение. Реализация измерений PCR[7] является обязательной для систем InstantGo.

На высоком уровне встроенное ПО отвечает за измерение следующих компонентов во время загрузки:

  • Встроенное ПО платформы, содержащее или измеряющее службы загрузки 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]:

  1. Содержимое переменной PK

  2. Содержимое переменной KEK

  3. Содержимое переменной EFI_IMAGE_SECURITY_DATABASE

  4. Содержимое переменной EFI_IMAGE_SECURITY_DATABASE1

  5. Записи в EFI_IMAGE_SECURITY_DATABASE, используемые для проверки драйверов EFI или загрузочных приложений EFI в пути загрузки

  6. Содержимое переменной SecureBoot

Из-за указанного выше переменные UEFI PK, KEK, EFI_IMAGE_SECURITY_DATABASE, EFI_IMAGE_SECURITY_DATABASE1 и SecureBoot НЕ ДОЛЖНЫ измеряться в PCR[3].

Кроме того, если платформа предоставляет отладчик встроенного ПО, который может быть запущен до создания среды UEFI, он ДОЛЖЕН записать этот факт в PCR[7]. Аналогичным образом, если платформа предоставляет отладчик для среды UEFI, запуск отладчика должен быть записан в PCR[7].

Примечание о реализации

Функция UEFI LoadImage ДОЛЖНА записывать измерения в PCR[2] или PCR[4] для событий, описанных в [TCG06b], а также PCR[7] для событий, описанных в разделе "Измерение конфигурации UEFI в PCR[7]". Чтобы определить, применяется ли измерение изображения к PCR[2] или PCR[4], LoadImage НЕОБХОДИМО проверить поле Подсистема в образе PE/COFF. Значения 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]. Образы, которые LoadImage не удается загрузить из-за (а) сбоя проверки подписи или (б) из-за того, что образ не соответствует действующей в настоящее время политике безопасной загрузки UEFI 2.3.1, не нужно измерять в 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 должно быть значением структуры EFI_IMAGE_LOAD_EVENT, определенной в [TCG06b].

Служба HashLogExtendEvent должна хэшировать образ PE/COFF в соответствии с процедурой, указанной в разделе "Вычисление хэша образа PE" статьи [MSFT08].

Измерение конфигурации UEFI в PCR[7]

Для всех событий переменных EFI тип EventType должен быть EV_EFI_VARIABLE_DRIVER_CONFIG, определенный выше, а значением Event должно быть значение структуры EFI_VARIABLE_DATA, определенной выше в этой спецификации (эта структура должна считаться выровненной по байтам). Дайджест измерения должен быть хэшем SHA-1 данных события, который является EFI_VARIABLE_DATA структурой. (Примечание. Это другой дайджест, отличный от указанного в [TCG06b].) The EFI_VARIABLE_DATA. Значение UnicodeNameLength — это число символов CHAR16 (не число байтов). The EFI_VARIABLE_DATA. Содержимое Юникода Не должно содержать признак конца null. Если чтение переменной EFI возвращает EFI_NOT_FOUND, EFI_VARIABLE_DATA. Поле VariableDataLength ДОЛЖНО быть равно нулю и EFI_VARIABLE_DATA. Размер поля VariableData будет равен нулю.

  1. Если платформа предоставляет режим отладчика встроенного ПО, который можно использовать до создания среды UEFI, или если платформа предоставляет отладчик для среды UEFI, платформа должна расширить событие EV_EFI_ACTION, как указано в [TCG06b], в PCR[7], прежде чем разрешить использование отладчика. Строка события должна быть "Режим отладки UEFI". Кроме того, платформа ДОЛЖНА создать запись журнала событий TCG следующим образом:

    1. TCG_PCR_EVENT. PCRIndex = 7

    2. TCG_PCR_EVENT. EventType = EV_EFI_ACTION

    3. TCG_PCR_EVENT. Digest = <дайджест SHA-1 строкового значения "Режим отладки UEFI" без завершающего символа NULL>

    4. TCG_PCR_EVENT. EventSize = strlen("режим отладки UEFI")

    5. TCG_PCR_EVENT. Event = "Режим отладки UEFI"

    Платформа МОЖЕТ создавать аналогичные записи журнала событий для других поддерживаемых форматов журналов событий.

  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. Система должна измерять событие EV_SEPARATOR в PCR[7]. (Это происходит в то же время, когда разделитель измеряется с PCR[0] через PCR[7].)

  5. Перед запуском драйвера EFI или загрузочного приложения EFI (независимо от того, происходит ли запуск из-за того, что диспетчер загрузки EFI выбирает образ из переменных UEFI DriverOrder или BootOrder или уже запущенного образа, вызывающего функцию LoadImage() UEFI), встроенное ПО UEFI должно измерить запись в переменной EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE, которая использовалась для проверки образа EFI в PCR[7]. Измерение должно выполняться в сочетании с загрузкой изображения. Для этого события EventType должен быть EV_EFI_VARIABLE_AUTHORITY, а значение Event — значением структуры EFI_VARIABLE_DATA (структура определена выше в этой спецификации с определением, отличным от определения спецификации TCG). The EFI_VARIABLE_DATA. Значение VariableData должно быть EFI_SIGNATURE_DATA значением из EFI_SIGNATURE_LIST, содержащего центр, который использовался для проверки образа и EFI_VARIABLE_DATA. Значение VariableName должно быть EFI_IMAGE_SECURITY_DATABASE_GUID. The EFI_VARIABLE_DATA. Для параметра UnicodeName должно быть задано значение EFI_IMAGE_SECURITY_DATABASE. Значение не должно содержать завершающий символ NULL.

  6. Перед запуском дополнительных драйверов EFI или загрузочных приложений EFI встроенное ПО UEFI должно проверка, если запись в переменной EFI_IMAGE_SECURITY_DATABASE_GUID/EFI_IMAGE_SECURITY_DATABASE, которая проверяет образ EFI, ранее была измерена с типом события EV_EFI_VARIABLE_AUTHORITY в PCR[7]. Если это не так, его НЕОБХОДИМО измерить, как описано на предыдущем шаге. Если он был измерен ранее, его НЕ СЛЕДУЕТ измерять повторно.

Примечание

Пример измерения для измерений PCR[7] доступен по запросу корпорации Майкрософт.