Как я могу зашифровать байты с помощью модуля TPM машины?
CryptProtectData
Windows предоставляет (относительно) простой API для шифрования большого двоичного объекта с помощью CryptProtectData
API, который мы можем обернуть простой в использовании функцией:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//...
}
Детали ProtectBytes
менее важны, чем идея о том, что вы можете легко использовать это:
- вот байты, которые я хочу зашифровать секретным ключом, хранящимся в
System
- верните мне зашифрованный blob
Возвращенный блоб недокументированная документация структура , которая содержит все необходимое для расшифровки и вернуть исходные данные (хэш - алгоритм, алгоритм шифрования, соль, HMAC подписи и т.д.).
Для полноты, вот пример реализации псевдокода, ProtectBytes
который использует Crypt API
для защиты байтов:
public Byte[] ProtectBytes(Byte[] plaintext)
{
//Setup our n-byte plaintext blob
DATA_BLOB dataIn;
dataIn.cbData = plaintext.Length;
dataIn.pbData = Addr(plaintext[0]);
DATA_BLOB dataOut;
//dataOut = EncryptedFormOf(dataIn)
BOOL bRes = CryptProtectData(
dataIn,
null, //data description (optional PWideChar)
null, //optional entropy (PDATA_BLOB)
null, //reserved
null, //prompt struct
CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE,
ref dataOut);
if (!bRes) then
{
DWORD le = GetLastError();
throw new Win32Error(le, "Error calling CryptProtectData");
}
//Copy ciphertext from dataOut blob into an actual array
bytes[] result;
SetLength(result, dataOut.cbData);
CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);
//When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}
Как сделать то же самое с TPM?
Приведенный выше код полезен для шифрования данных только на локальном компьютере. Данные зашифрованы с использованием System
учетной записи в качестве генератора ключей ( подробности хоть и интересны, но не важны ). Конечным результатом является то, что я могу зашифровать данные (например, главный ключ шифрования жесткого диска), которые могут быть расшифрованы только на локальной машине.
Пришло время сделать еще один шаг вперед. Я хочу зашифровать некоторые данные (например, главный ключ шифрования жесткого диска), которые могут быть расшифрованы только локальным TPM. Другими словами, я хочу заменить Qualcomm Trusted Execution Environment ( TEE ) на блок-схеме ниже для Android на TPM в Windows:
Примечание . Я понимаю, что TPM не выполняет подписывание данных (или, если это так, он не гарантирует, что подписание одних и тех же данных будет давать одинаковый двоичный вывод каждый раз). Вот почему я хотел бы заменить «подпись RSA» на «шифрование 256-битного BLOB-объекта с помощью аппаратного ключа» .
Так где же код?
Проблема в том, что программирование TPM полностью недокументировано в MSDN . API для выполнения каких-либо операций отсутствует. Вместо этого вам нужно найти себе копию стека программного обеспечения Trusted Computing Group (также известного как TSS) , выяснить, какие команды отправлять в TPM с полезными данными , в каком порядке, и вызвать функцию Window Tbsip_Submit_Command для непосредственной отправки команд:
TBS_RESULT Tbsip_Submit_Command(
_In_ TBS_HCONTEXT hContext,
_In_ TBS_COMMAND_LOCALITY Locality,
_In_ TBS_COMMAND_PRIORITY Priority,
_In_ const PCBYTE *pabCommand,
_In_ UINT32 cbCommand,
_Out_ PBYTE *pabResult,
_Inout_ UINT32 *pcbOutput
);
В Windows нет API более высокого уровня для выполнения действий.
Это моральный эквивалент попытки создать текстовый файл с помощью команд ввода-вывода SATA на ваш жесткий диск .
Почему бы просто не использовать брюки
Группа Trusted Computing Group (TCG) действительно определила свой собственный API: TCB Software Stack (TSS) . Реализация этого API была создана некоторыми людьми и называется TrouSerS . Затем один парень перенес этот проект на Windows .
Проблема с этим кодом в том, что он не переносится в мир Windows. Например, вы не можете использовать его из Delphi, вы не можете использовать его из C #. Это требует:
- OpenSSL
- pThread
Я просто хочу, чтобы код что-то зашифровал с помощью моего TPM.
Вышеупомянутое не CryptProtectData
требует ничего, кроме того, что находится в теле функции.
Каков эквивалентный код для шифрования данных с помощью TPM? Как отмечали другие, вам, вероятно, придется проконсультироваться с тремя руководствами по TPM и самостоятельно построить большие двоичные объекты . Вероятно, это связано с TPM_seal
командой. Хотя я думаю, что не хочу запечатывать данные, я думаю, что хочу их привязать :
Привязка - данные шифруются с использованием ключа привязки TPM, уникального ключа RSA, производного от ключа хранилища. Запечатывание - шифрует данные аналогично привязке, но дополнительно указывает состояние, в котором должен находиться TPM, чтобы данные были расшифрованы (распечатаны).
Я пытаюсь прочитать три необходимых тома, чтобы найти 20 строк кода, которые мне нужны:
Но я понятия не имею, что читаю. Если бы был какой-нибудь учебник или примеры, я мог бы попробовать. Но я совершенно потерялся.
Итак, мы просим Stackoverflow
Таким же образом я смог предоставить:
Byte[] ProtectBytes_Crypt(Byte[] plaintext)
{
//...
CryptProtectData(...);
//...
}
может кто-нибудь предоставить соответствующий эквивалент:
Byte[] ProtectBytes_TPM(Byte[] plaintext)
{
//...
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
Tbsip_Submit_Command(...);
//...snip...
Tbsip_Submit_Command(...);
//...
}
что делает то же самое, за исключением того, что ключ, заблокированный в System
LSA, заблокирован в TPM?
Начало исследования
Я точно не знаю, что означает привязка . Но, глядя на TPM Main - Part 3 Commands - Specification Version 1.2, есть упоминание bind :
10.3 TPM_UnBind
TPM_UnBind берет большой двоичный объект данных, который является результатом команды Tspi_Data_Bind, и расшифровывает его для экспорта пользователю. Вызывающий должен разрешить использование ключа, который будет расшифровывать входящий большой двоичный объект. TPM_UnBind работает на поблочной основе и не имеет представления о какой-либо связи между одним блоком и другим.
Что толку там нет нет Tspi_Data_Bind
команды.
Исследовательские усилия
Ужасно, что никто никогда не удосужился задокументировать TPM или его работу. Как будто они потратили все свое время на то, чтобы поиграть с этой классной вещью , но не хотели иметь дело с болезненным шагом, чтобы сделать ее пригодной для чего-то.
Начиная с (сейчас) бесплатной книги A Practical Guide to TPM 2.0: Using the Trusted Platform Module in the New Age of Security :
Глава 3 - Краткое руководство по TPM 2.0
TPM имеет доступ к собственному закрытому ключу, поэтому он может шифровать ключи с помощью открытого ключа, а затем сохранять полученный большой двоичный объект на жестком диске. Таким образом, TPM может хранить практически неограниченное количество ключей, доступных для использования, но не тратить впустую ценное внутреннее хранилище. Ключи, хранящиеся на жестком диске, можно стереть, но также можно сделать резервную копию, что казалось дизайнерам приемлемым компромиссом.
Как я могу зашифровать ключ с помощью открытого ключа TPM?
Глава 4 - Существующие приложения, использующие TPM
Приложения, которые должны использовать TPM, но не должны
За последние несколько лет количество веб-приложений увеличилось. Среди них - резервное копирование и хранение через Интернет. Многие компании сейчас предлагают такие услуги, но, насколько нам известно, ни один из клиентов этих услуг не позволяет пользователю заблокировать ключ для службы резервного копирования на TPM. Если бы это было сделано, было бы неплохо, если бы для самого ключа TPM была создана резервная копия, дублируя его на нескольких машинах. Кажется, это возможность для разработчиков.
Как разработчик блокирует ключ к TPM?
Глава 9 - Heirarchies
СЛУЧАЙ ИСПОЛЬЗОВАНИЯ: СОХРАНЕНИЕ ПАРОЛЕЙ ВХОДА
Типичный файл паролей хранит соленые хэши паролей. Проверка состоит из посоления и хеширования предоставленного пароля и сравнения его с сохраненным значением. Поскольку в расчет не входит секрет, он может подвергнуться атаке в автономном режиме на файл паролей.
В этом варианте использования используется ключ HMAC, созданный TPM. Файл паролей хранит HMAC солидного пароля. Проверка состоит из обработки и HMAC предоставленного пароля и сравнения его с сохраненным значением. Поскольку у автономного злоумышленника нет ключа HMAC, злоумышленник не может организовать атаку, выполнив расчет.
Это могло сработать. Если доверенный платформенный модуль имеет секретный ключ HMAC, и только мой доверенный платформенный модуль знает этот ключ HMAC, то я могу заменить «Подписать (он же TPM, зашифрованный с его закрытым ключом)» на «HMAC». Но затем в следующей строке он полностью меняет свое мнение:
TPM2_Create, указав ключ HMAC
Если мне нужно указать ключ HMAC, это не секрет TPM. Тот факт, что ключ HMAC не является секретным, имеет смысл, если вы понимаете, что это глава о криптографических утилитах, которые предоставляет TPM. Вместо того, чтобы вам самому писать SHA2, AES, HMAC или RSA, вы можете повторно использовать то, что уже есть в TPM.
Глава 10 - Ключи
В качестве устройства безопасности способность приложения использовать ключи, сохраняя их в безопасности на аппаратном устройстве, является самой сильной стороной TPM. TPM может как генерировать, так и импортировать ключи, созданные извне. Он поддерживает как асимметричные, так и симметричные ключи.
Превосходно! Как ты это делаешь!?
Генератор ключей
Возможно, самая сильная сторона TPM - это его способность генерировать криптографический ключ и защищать свой секрет в пределах аппаратного обеспечения. Генератор ключей основан на собственном генераторе случайных чисел TPM и не зависит от внешних источников случайности. Таким образом устраняются слабые места, основанные на слабом программном обеспечении с недостаточным источником энтропии.
Имеет ли TPM возможность генерировать криптографические ключи и защищать свои секреты в пределах аппаратного обеспечения? Так как?
Глава 12 - Регистры конфигурации платформы
PCR для авторизации
СЛУЧАЙ ИСПОЛЬЗОВАНИЯ: ЗАПЕЧАТАНИЕ КЛЮЧА ДЛЯ ШИФРОВАНИЯ ЖЕСТКОГО ДИСКА ДЛЯ СОСТОЯНИЯ ПЛАТФОРМЫ
Приложения полнодискового шифрования намного безопаснее, если TPM защищает ключ шифрования, чем если он хранится на том же диске и защищен только паролем. Во-первых, оборудование TPM имеет защиту от взлома (см. Главу 8 для подробного описания защиты от атак по словарю TPM), что делает непрактичную атаку методом перебора пароля. Ключ, защищенный только программным обеспечением, гораздо более уязвим для слабого пароля. Во-вторых, программный ключ, хранящийся на диске, гораздо легче украсть. Возьмите диск (или резервную копию диска), и вы получите ключ. Когда TPM хранит ключ, вся платформа или, по крайней мере, диск и материнская плата должны быть украдены.
Запечатывание позволяет защитить ключ не только паролем, но и политикой. Типичная политика блокирует ключ к значениям PCR (состоянию программного обеспечения), текущим на момент запечатывания. Это предполагает, что состояние при первой загрузке не нарушено. Любая предустановленная вредоносная программа, присутствующая при первой загрузке, будет измеряться в PCR, и, таким образом, ключ будет запечатан для состояния скомпрометированного программного обеспечения. У менее доверчивого предприятия может быть стандартный образ диска и печать на PCR, представляющих этот образ. Эти значения PCR будут предварительно рассчитаны на предположительно более надежной платформе. Даже более сложное предприятие могло бы использовать TPM2_PolicyAuthorize и предоставить несколько билетов, авторизующих набор доверенных значений PCR. См. Главу 14 для подробного описания политики авторизации и ее применения для решения проблемы уязвимости PCR.
Хотя пароль также может защитить ключ, есть выигрыш в безопасности даже без пароля ключа TPM. Злоумышленник может загрузить платформу без ввода пароля TPMkey, но не может войти в систему без имени пользователя и пароля ОС. OSsecurity защищает данные. Злоумышленник может загрузить альтернативную ОС, например, с живого DVD или USB-накопителя, а не с жесткого диска, чтобы обойти безопасность входа в ОС. Однако эта другая конфигурация загрузки и программное обеспечение могут изменить значения PCR. Поскольку эти новые PCR не будут соответствовать запечатанным значениям, TPM не выпустит ключ дешифрования, и жесткий диск не сможет быть расшифрован.
Превосходно! Это именно тот вариант использования, который мне и нужен. Также в этом случае Microsoft использует TPM. Как мне это сделать!?
Я прочитал эту книгу полностью, и ничего полезного в ней не было. Что очень впечатляет, потому что это 375 страниц. Вам интересно, что было в книге - и, оглядываясь назад, я понятия не имею.
Поэтому мы отказываемся от исчерпывающего руководства по программированию TPM и вместо этого обращаемся к некоторой документации от Microsoft:
Из набора средств криптографического провайдера платформы TPM Microsoft . В нем точно указано, что я хочу делать:
Ключ подтверждения или EK
EK предназначен для обеспечения надежного криптографического идентификатора для платформы. Предприятие может вести базу данных ключей подтверждения, принадлежащих модулям TPM всех ПК на предприятии, или контроллер фабрики центра обработки данных может иметь базу данных модулей TPM на всех блейд-серверах. В Windows вы можете использовать провайдер NCrypt, описанный в разделе «Поставщик шифрования платформы в Windows 8», чтобы прочитать общедоступную часть EK.
Где-то внутри TPM находится закрытый ключ RSA. Этот ключ заперт там - его никогда не увидит внешний мир. Я хочу, чтобы TPM что-то подписывал своим закрытым ключом (т. Е. Зашифровывал это своим закрытым ключом).
Поэтому мне нужна самая простая операция, которая может существовать:
Зашифруйте что-нибудь своим закрытым ключом. Я даже (пока) не прошу более сложных вещей:
- «запечатывать» его по состоянию ПЦР
- создание ключа и сохранение его в энергозависимой или энергонезависимой памяти
- создание симметричного ключа и попытка загрузить его в TPM
Я прошу выполнить самую простую операцию, которую может выполнять TPM. Почему невозможно получить информацию о том, как это сделать?
Я могу получить случайные данные
Полагаю, я был бойким, когда сказал, что подписание RSA - это самое простое, что может сделать TPM. Самое основное , что доверенный платформенный модуль может быть предложено сделать , это дать мне случайные байты. Это я понял, как это сделать:
public Byte[] GetRandomBytesTPM(int desiredBytes)
{
//The maximum random number size is limited to 4,096 bytes per call
Byte[] result = new Byte[desiredBytes];
BCRYPT_ALG_HANDLE hAlgorithm;
BCryptOpenAlgorithmProvider(
out hAlgorithm,
BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG"
MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" i.e. the TPM
0 //Flags
);
try
{
BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0);
}
finally
{
BCryptCloseAlgorithmProvider(hAlgorithm);
}
return result;
}
Необычная вещь
Я понимаю, что количество людей, использующих TPM, очень мало. Вот почему ни у кого в Stackoverflow нет ответа. Так что я не могу стать слишком жадным в поисках решения моей общей проблемы. Но что бы я действительно хочу сделать , это «уплотнение» некоторые данные:
- представить TPM некоторые данные (например, 32 байта ключевого материала)
- заставить TPM зашифровать данные, возвращая некоторую непрозрачную структуру больших двоичных объектов
- позже попросите TPM расшифровать blob
- дешифрование будет работать только в том случае, если регистры PCR TPM такие же, как и во время шифрования.
Другими словами:
Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr)
{
//...
}
Byte[] UnprotectBytes_TPM(Byte[] protectedBlob)
{
//...
}
Cryptography Next Gen (Cng, aka BCrypt) поддерживает TPM
Первоначальный API криптографии в Windows назывался Crypto API.
Начиная с Windows Vista, Crypto API был заменен на Cryptography API: Next Generation (внутреннее название BestCrypt , сокращенно BCrypt , не путать с алгоритмом хеширования паролей ).
Windows поставляется с двумя поставщиками BCrypt :
- Microsoft Primitive Provider (
MS_PRIMITIVE_PROVIDER
) по умолчанию : программная реализация всех примитивов по умолчанию (хеширование, симметричное шифрование, цифровые подписи и т. Д.) - Поставщик шифрования платформы Microsoft (
MS_PLATFORM_CRYPTO_PROVIDER
): поставщик, предоставляющий доступ к TPM.
Platform Crypto провайдер не документирован на MSDN, но есть документы с сайта 2012 Microsoft Research:
Набор средств криптографического провайдера платформы TPM
Поставщик криптографии платформы TPM и набор инструментов содержит образец кода, служебные программы и документацию для использования функций, связанных с TPM, в Windows 8. Описанные подсистемы включают поставщика криптографии платформы Crypto-Next-Gen (CNG) на основе TPM и способы предоставления услуг аттестации. могут использовать новые функции Windows. Поддерживаются системы на базе TPM1.2 и TPM2.0.
Создается впечатление , что цель Microsoft заключается в поверхность ТРМ функциональность криптографической с Microsoft Platform Crypto Provider в Cryptography NG API.
Шифрование с открытым ключом с использованием Microsoft BCrypt
При условии:
- я хочу выполнить асимметричное шифрование RSA (с использованием TPM)
- Microsoft BestCrypt поддерживает асимметричное шифрование RSA
- Microsoft BestCrypt имеет поставщика TPM
путь вперед может заключаться в том, чтобы выяснить, как выполнять цифровую подпись с помощью Microsoft Cryptography Next Gen API .
Следующим моим шагом будет создание кода для шифрования в BCrypt с открытым ключом RSA с использованием стандартного provider ( MS_PRIMITIVE_PROVIDER
). Например:
modulus
: 0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 4F 40 9F D2 D1 69 FB 995D 85 0C 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 DE 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55publicExponent
: 65537
С этим кодом я могу переключиться на использование TPM Provider ( MS_PLATFORM_CRYPTO_PROVIDER
).
22.02.2016: И поскольку Apple вынуждена помогать в расшифровке пользовательских данных, возобновился интерес к тому, как заставить TPM выполнять самую простую задачу, для которой он был изобретен, - шифрование чего-либо.
Это примерно равносильно тому, что у каждого есть машина, но никто не знает, как ее завести. Он может делать действительно полезные и крутые вещи, если только мы сможем пройти шаг 1 .
Бонусное чтение
источник
Ответы:
Грунтовка
Все, что далее следует, касается TPM 1.2. Имейте в виду, что Microsoft требует TPM 2.0 для всех будущих версий Windows. Поколение 2.0 принципиально отличается от 1.2.
Однострочного решения не существует из-за принципов проектирования TPM. Думайте о TPM как о микроконтроллере с ограниченными ресурсами. Основная цель дизайна заключалась в том, чтобы быть дешевым, но при этом безопасным. Таким образом, TPM был лишен всей логики, которая не была необходима для безопасной работы. Таким образом, TPM работает только тогда, когда у вас есть хотя бы какое-то более или менее жирное программное обеспечение, которое выдает множество команд в правильном порядке. И эти последовательности команд могут быть очень сложными. Вот почему TCG определила TSS с четко определенным API. Если вы хотите пойти по пути Java, существует даже Java API высокого уровня . Мне неизвестен аналогичный проект для C # / .net
Развитие
В вашем случае я предлагаю вам взглянуть на TPM программного обеспечения IBM.
В пакете вы найдете 3 очень полезных компонента:
Вам не обязательно нужен программный эмулятор TPM, вы также можете подключиться к HW TPM машины. Однако вы можете перехватить выданные команды и посмотреть ответы, таким образом узнав, как они собраны и как они соответствуют спецификации команды.
Высокий уровень
Предпосылки:
Чтобы запечатать каплю, вам необходимо сделать следующее:
Для распечатывания необходимо:
Вы можете сохранить ключевой BLOB-объект в своей структуре данных, которую используете для хранения защищенных байтов.
Большинство необходимых команд TPM являются авторизованными. Поэтому вам необходимо установить сеансы авторизации там, где это необходимо. AFAIR это в основном сеансы OSAP.
Команды TPM
В настоящее время я не могу запустить отладочную версию, поэтому не могу предоставить вам точную последовательность. Так что считайте это неупорядоченным списком команд, которые вам придется использовать:
TPM_OSAP
TPM_CreateWrapKey
TPM_LoadKey2
TPM_Seal
Если вы также хотите прочитать текущие значения PCR:
TPM_PCRRead
источник
Надежные и зашифрованные ключи
Надежные и зашифрованные ключи - это два новых типа ключей, добавленных к существующей службе связки ключей ядра. Оба этих новых типа представляют собой симметричные ключи переменной длины, и в обоих случаях все ключи создаются в ядре, а пользовательское пространство видит, хранит и загружает только зашифрованные большие двоичные объекты. Надежные ключи требуют наличия микросхемы доверенного платформенного модуля (TPM) для большей безопасности, в то время как зашифрованные ключи можно использовать в любой системе. Все большие двоичные объекты уровня пользователя отображаются и загружаются в шестнадцатеричном формате ascii для удобства и проверяются на целостность.
Надежные ключи используют TPM как для создания, так и для запечатывания ключей. Ключи запечатаны 2048-битным ключом RSA в TPM и, возможно, запечатаны с указанными значениями PCR (измерения целостности) и распечатываются только TPM, если PCR и проверки целостности blob совпадают. Загруженный доверенный ключ может быть обновлен новыми (будущими) значениями PCR, поэтому ключи легко переносятся на новые значения pcr, например, при обновлении ядра и initramfs. Один и тот же ключ может иметь много сохраненных BLOB-объектов с разными значениями PCR, поэтому легко поддерживается несколько загрузок.
По умолчанию доверенные ключи запечатаны под SRK, который имеет значение авторизации по умолчанию (20 нулей). Это может быть установлено во время takeownership с утилитой штанины в:
tpm_takeownership -u -z
.keyctl print
возвращает шестнадцатеричную копию запечатанного ключа ascii в стандартном формате TPM_STORED_DATA. Длина ключа для новых ключей всегда указывается в байтах. Доверенные ключи могут иметь размер от 32 до 128 байт (256 - 1024 бит), верхний предел должен соответствовать длине ключа SRK (RSA) в 2048 бит со всей необходимой структурой / заполнением.Зашифрованные ключи не зависят от TPM и работают быстрее, поскольку используют AES для шифрования / дешифрования. Новые ключи создаются из случайных чисел, генерируемых ядром, и шифруются / дешифруются с использованием указанного «главного» ключа. «Главный» ключ может иметь тип доверенного или пользовательского ключа. Основным недостатком зашифрованных ключей является то, что, если они не основаны на доверенном ключе, они безопасны только в той степени, в которой они защищены ключом пользователя. Поэтому главный ключ пользователя следует загружать как можно безопаснее, желательно на ранней стадии загрузки.
Расшифрованная часть зашифрованных ключей может содержать либо простой симметричный ключ, либо более сложную структуру. Формат более сложной структуры зависит от приложения, что определяется словом «формат».
Примеры использования доверенных и зашифрованных ключей
Создайте и сохраните доверенный ключ с именем «kmk» длиной 32 байта:
Загрузите доверенный ключ из сохраненного большого двоичного объекта:
Повторно запечатайте доверенный ключ с новыми значениями pcr:
Первоначальным потребителем доверенных ключей является EVM, которому во время загрузки требуется симметричный ключ высокого качества для защиты HMAC метаданных файлов. Использование доверенного ключа обеспечивает надежные гарантии того, что ключ EVM не был скомпрометирован из-за проблемы на уровне пользователя, и, будучи запечатанным с определенными значениями PCR загрузки, защищает от атак загрузки и офлайн. Создайте и сохраните зашифрованный ключ «evm», используя указанный выше доверенный ключ «kmk»:
вариант 1: исключение "формата"
вариант 2: явное определение "формата" как "по умолчанию"
Загрузите зашифрованный ключ «evm» из сохраненного большого двоичного объекта:
Ожидается и другое использование доверенных и зашифрованных ключей, например, для шифрования дисков и файлов. В частности, был определен новый формат ecryptfs для использования зашифрованных ключей для монтирования файловой системы eCryptfs. Более подробную информацию об использовании можно найти в файле «Documentation / security / keys-ecryptfs.txt».
источник
Documentation/security/keys-ecryptfs.tx
Зависит от ваших намерений и обстоятельств:
Каждый из этих вариантов использования (а их больше) или их комбинация представляет разные пути реализации. Думайте о TPM как о швейцарском армейском ноже для криптографических устройств: с ним мало что можно сделать, но простота использования страдает от этой универсальности. Вопрос продолжает колебаться между шифрованием, подписью и блокировкой конфигурации системы, но основная часть этого ответа будет учитывать, что команда Seal покрывает большинство потребностей, описанных в вопросе.
Для этого предназначена команда Bind (заменена командой Create для TPM 2). Вы загружаете ключ, производный от ключа, привязанного к TPM, и шифруете с его помощью (или напрямую с помощью ключа с привязкой к оборудованию). Таким образом, данные могут быть расшифрованы только с доступом к тому же TPM.
Не уверен, что воспроизведение всего этого процесса - хорошая идея. Во-первых, нет необходимости использовать операцию подписи где-либо в процессе. Похоже, что в то время, когда разрабатывалась Android 5, API хранилища ключей был ограничен операциями подписи и проверки. Мое лучшее предположение состоит в том, что команда по шифрованию дисков сделала все возможное, чтобы работать с тем, что у них было, и разработала алгоритм, посредством которого один из промежуточных ключей был получен с помощью операции подписи с использованием сохраненного ключа TEE, тем самым привязав весь процесс к аппаратному обеспечению. связанный ключ доступен только на платформе - в то время единственным способом сделать это было подписание. Однако нет необходимости ограничивать себя подобными способами, если у вас есть доступ к TPM, который дает вам больше возможностей, чем вы предполагали!
Это неверно, обе версии TPM поддерживают подписывание.
Это не имеет никакого смысла. Подписание тех же данных одним и тем же ключом приведет к такой же подписи. Вы можете спутать операцию подписи с операцией цитирования, которая будет смешиваться с одноразовым идентификатором.
На самом деле это должен быть предпочтительный вариант, хотя оба варианта возможны с TPM. См. Выше.
К сожалению, документировать особо нечего. Win API ограничен парой функций TBS, которые удалены из драйвера на один уровень.
На самом деле нет, если бы у вас был TSS, вам бы не пришлось его использовать
Tbsip_submit_Command()
. В этом весь смысл TSS - детали низкого уровня абстрагируются.По-прежнему верно для TPM 1, но для TPM 2 есть TSS.MSR .
Верный.
Непонятно, является ли это непреодолимой задачей. Доступ к TrouSerS через взаимодействие предпочтительнее перезаписи всего кода структурирования данных. Кроме того,
doTSS
на момент написания был вопрос.Вопрос содержит цитату, описывающую разницу между двумя командами, поэтому не должно быть большой путаницы. Запечатывание аналогично связыванию с дополнительным ограничением, заключающимся в том, что состояние системы должно быть таким же, чтобы данные были распечатаны.
Во-первых, стоит отметить, что есть две основные версии TPM, которые полностью несовместимы между собой. Таким образом, практически никакой код, который вы, возможно, написали для TPM 1, не будет работать для TPM 2. TBS API - единственный общий код между ними, и, честно говоря, это могло быть одной из причин, по которой этот API никогда не рос. В основной части ответа будет представлен код TPM 1 по двум причинам:
Во-вторых, уточним вопрос. Я переосмысливаю это следующим образом:
Команда Seal лучше всего подходит для этого, поскольку она выполняет ту же функцию, что и команда Bind, когда размер выбора PCR установлен на ноль, но выбор PCR можно легко изменить, чтобы включить любые PCR, которые вы можете пожелать. Это заставляет задуматься, почему команда Bind вообще была включена в спецификацию, и, как уже отмечалось, она была удалена из спецификации TPM 2, и обе были объединены в одну команду Create.
Вот код C # для использования команды TPM 1.2 Seal для шифрования данных с использованием только функций TBS (примечание: этот код не протестирован и вряд ли будет работать без отладки) :
Анализ кода:
Это некоторые из немногих функций, доступных в Tbs.h, и единственные, которые мы будем здесь использовать. По сути, они позволяют открывать дескриптор устройства и взаимодействовать с ним, отправляя и получая необработанные байты.
TPM - с прямым порядком байтов, Windows - с прямым порядком байтов. Таким образом, порядок байтов должен быть изменен на обратный для любых данных, которые мы отправляем. Здесь нам нужно только позаботиться об инверсии 32-битных и 16-битных беззнаковых целых чисел.
Здесь мы используем Tbsi_Context_Create (), чтобы открыть дескриптор для взаимодействия с TPM.
TBS_CONTEXT_PARAMS
Параметр просто C структура с одним беззнаковым 32-битовым полем INT , который должен быть установлен в 1 , чтобы поговорить с TPM 1.2 , например, и то , что мы устанавливаем его.Это указано как минимальный размер буфера в спецификации клиента TPM PC Client . Для наших нужд здесь будет более чем достаточно.
TPM 1.2 Spec Part 3 говорит следующее:
Нам необходимо выполнить XOR-шифрование этого «секретного» параметра, используя одноразовый номер, сгенерированный во время сеанса OSAP. Один из дескрипторов ввода команды Seal также является дескриптором OSAP:
Итак, нам нужно сначала установить этот сеанс OSAP. Описывается OSAP, в котором данные авторизации объекта смешиваются с одноразовыми номерами, сгенерированными на каждой стороне, для предотвращения ответных атак. Следовательно, «общий секрет» известен только двум сторонам в этом сеансе: стороне, которая инициировала сеанс (пользователь), и стороне, которая его приняла (TPM); кроме того, обе стороны должны иметь одинаковые данные авторизации объекта, чтобы «общий секрет» был одинаковым; кроме того, «общий секрет», используемый в одном сеансе, будет недействителен в другом. Эта диаграмма из спецификации описывает процесс: спецификации TPM 1.2, часть 1 . OSAP, или протокол объектно-ориентированной авторизации, был изобретен для обработки случая использования, когда вы хотите использовать объект TPM, который требует авторизации несколько раз, но не хочет предоставлять авторизацию каждый раз: вместо этого используется сеанс OSAP, который полагается о концепции «общего секрета», которым является HMAC
В этом конкретном случае мы не будем использовать несколько сеансов (фактически, этот параметр игнорируется командой Seal!), И ключ, который мы будем использовать, не требует авторизации, но, к сожалению, мы по-прежнему связаны спецификацией, чтобы установить OSAP. сеанс.
Операнды команды TPM_OSAP:
Каждая команда TPM 1.2 представлена следующим образом:
Тег представляет собой двухбайтовое значение, которое указывает, является ли то, что следует далее, вводом или выводом, и есть ли какие-либо значения данных аутентификации после параметров команды. Для TPM_OSAP тег должен иметь вид TPM_TAG_RQU_COMMAND (0x00C1) согласно спецификации, что означает «команда без авторизации».
Размер - это четырехбайтовое значение, указывающее размер команды в байтах, включая тег и сам размер. Мы установим это значение позже, когда вычислим его.
Код команды - это четырехбайтовое значение, которое передается как идентификатор команды: он сообщает TPM, как интерпретировать остальную часть команды. Код нашей команды здесь - TPM_OSAP (0x0000000B).
Следующие две вещи, которые нужно установить, - это тип сущности и значение сущности. Поскольку мы хотим использовать ключ, который уже существует в TPM, мы будем использовать тип объекта «SRK» (0x0004), и, поскольку мы работаем в предположении, что TPM уже принадлежит, можно с уверенностью предположить, что он SRK, загруженный под постоянным дескриптором 0x40000000 в соответствии со спецификацией, поэтому мы будем использовать это постоянное значение дескриптора для значения нашей сущности. (SRK означает «корневой ключ хранилища» и является корневым ключом, из которого происходит большинство других ключей, принадлежащих TPM)
Наконец, мы вычисляем размер команды, устанавливаем его и отправляем команду.
Данные, которые мы должны получить обратно от TPM на TPM_OSAP:
Итак, возвращаемся:
Мы извлекаем эти значения и сохраняем их в переменных.
Затем мы вычисляем «общий секрет». Согласно спецификации, в расчет входят два одноразовых номера OSAP (один сгенерирован пользователем, а другой - TPM) и значение авторизации для ключа, который мы хотим использовать - SRK. По соглашению, значением авторизации SRK является «хорошо известная авторизация»: обнуленный 20-байтовый буфер. Технически, можно было бы изменить это значение на другое, когда становитесь владельцем TPM, но на практике это не делается, поэтому мы можем с уверенностью предположить, что значение «хорошо известной аутентификации» является хорошим.
Теперь давайте посмотрим, что входит в команду TPM_Seal:
Большинство из этих параметров легко построить, за исключением двух из них:
encAuth
иpubAuth
. Давайте посмотрим на них по очереди.encAuth
это «Зашифрованные данные AuthData для запечатанных данных». Наши AuthData здесь - это «хорошо известный аутентификатор» из прошлого, но да, нам все еще нужно его зашифровать. Поскольку мы используем сеанс OSAP, он зашифрован в соответствии с ADIP или протоколом вставки данных авторизации. Из спецификации: «ADIP позволяет создавать новые объекты и безопасную вставку новых объектов AuthData. Передача новых AuthData использует шифрование с ключом, основанным на общем секрете сеанса OSAP». Дополнительно: «Для обязательного алгоритма шифрования XOR создатель создает ключ шифрования, используя хэш SHA-1 общего секрета OSAP и одноразовый номер сеанса. Создатель XOR шифрует новые AuthData, используя ключ шифрования в качестве одноразового блокнота и отправляет эти зашифрованные данные вместе с запросом на создание в TPM. "Следующая диаграмма объясняет, как работает ADIP:
pubAuth
"Дайджест сеанса авторизации для входов и keyHandle". В части 1 спецификации в разделе «Объявления параметров для примеров OIAP и OSAP» объясняется, как интерпретировать приведенную выше таблицу параметров TPM_Seal: «В столбце HMAC # подробно описаны параметры, используемые в вычислении HMAC. Параметры 1S, 2S и т. Д. Объединены и хешируется в inParamDigest или outParamDigest, неявно вызывается 1H1 и, возможно, 1H2, если существует два сеанса авторизации. Для первого сеанса 1H1, 2H1, 3H1 и 4H1 объединяются и объединяются в HMAC. Для второго сеанса 1H2, 2H2, 3H2, и 4H2 объединены и связаны с HMAC ". Таким образом, нам нужно будет хешировать открытый текст, его размер, размер информации PCRencAuth
сверху и порядковый номер TPM_Seal, а затем HMAC, который с двумя одноразовыми номерами и логическим значением «продолжить сеанс», используя OSAP »Собираем все вместе на диаграмме:
Обратите внимание, как в этом коде мы устанавливаем «Размер информации PCR» равным нулю, поскольку мы просто хотим зашифровать данные, не привязывая их к состоянию системы. Однако при необходимости предоставить структуру «Информация о ПЦР» нетрудно.
Наконец, мы создаем команду и отправляем ее.
Мы используем функцию Tbsip_Context_Close (), чтобы закрыть наш коммуникационный дескриптор.
Мы возвращаем ответ как есть здесь. В идеале вам нужно снова перевернуть байты и проверить его, пересчитав
resAuth
значение, чтобы предотвратить атаки « злоумышленник в середине».Это связано с тем, что Tspi_Data_Bind - это команда TSS, а не команда TPM. Причина в том, что для этого не требуются секреты (используется только открытый ключ), поэтому это можно сделать без использования TPM. Однако это вызвало путаницу, и даже команды, не требующие секретов, теперь включены в спецификацию TPM 2.
Зависит от версии TPM. С помощью команды TPM_CreateWrapKey для TPM 1.2. С помощью команды TPM2_Create для TPM 2.
Либо создайте его в TPM, либо оберните, либо используйте любой другой из доступных методов.
Текст в книге сбивает с толку. Вы не указываете ключ HMAC , вы указываете, что вам нужен ключ HMAC .
Нет, это не имеет смысла. Ключ секретный.
Есть команды для создания ключей или их импорта для обеих версий TPM. Для TPM 1 был только один корневой ключ - SRK - из которого можно было установить иерархию ключей, создав обернутые ключи. С TPM 2 у вас может быть несколько первичных или корневых ключей.
См. Выше.
Наверное, зависит от типа привода. В случае дисков без SED ключ шифрования диска, вероятно, заключен в ключ TPM. В случае дисков SED пароль Admin1 (или такой) запечатан с помощью TPM.
EK - это не ключ подписи - это ключ шифрования. Однако это не универсальный ключ шифрования: его можно использовать только в определенных контекстах .
См. Выше.
источник
Когда это говорит
это НЕ означает предоставить ключ HMAC - это означает «указать на ключ HMAC, который вы хотите использовать» .
TPM могут использовать практически неограниченное количество ключей HMAC, как указано в книге. Вы должны указать TPM, какой из них использовать.
источник