Если устройство настроено вами, вы можете воспользоваться следующей схемой:
A.Перед отправкой:
- Стать владельцем - также создает корневой ключ хранилища (SRK)
- Создать немигрируемый ключ подписи
- Хранить завернутый ключ в надежном хранилище ключейна платформе
- Сохраните открытый ключ созданного ключа где-нибудь в вашей БД / файловой системе / что-нибудь еще
B.Подготовка приложения:
- Вы должны отправить открытый ключ вместе с двоичным файлом приложения
- Я бы не стал компилировать открытый ключ в двоичный файл, вместо этого я бы предпочел использоватьчто-то вроде системы CA, где компилируется только открытый ключ корневого CA.Открытая часть ключа подписи доверенного платформенного модуля может быть отправлена в виде файла сертификата.Это предотвращает компиляцию двоичного файла для каждого устройства в отдельности.
C.При запуске приложения:
- Создать NONCE
- Позвольте TPM подписать NONCE
- Прочитать сертификат и проверить его
- Извлечь общедоступныйключ из проверенного сертификата
- Проверка подписи, возвращенной модулем TPM, с использованием полученного открытого ключа (и, конечно, проверка, равны ли подписанные данные NONCE)
- Если подпись действительна => вы счастливы
Примечание 1: С теоретической точки зрения это решение небезопасно, так как двоичный файл может быть исправлен.Вы знаете, что это должно работать.
Примечание 2: Если устройство не настроено вами самостоятельно, вы не можете доверять открытому ключу, который клиент может дать вам.
Редактировать 1: объяснить некоторые моменты более точно
@A.2: Поскольку я использую jtt & jTSS вместоTrouSerS Я не знаю, есть ли инструмент командной строки, включенный в пакет TrouSerS для создания ключей.Но я точно знаю, что он предоставляет соответствующий API для этого.Во всяком случае, jtt, например, имеет команду create_key
, которая делает это.Когда вы используете этот инструмент, у вас будет проблема с тем, что хранилище ключей jTSS и TrouSerS несовместимо с AFAIK.
@A.3: Нет, внутри TPM не хранятся ключи, кроме ключа хранилища(SRk) и Ключ подтверждения (EK).Но доверенный платформенный модуль гарантирует, что ни одна закрытая часть ключей, принадлежащих доверенному платформенному модулю, никогда не будет находиться за пределами доверенного платформенного модуля в незашифрованном формате.Таким образом, у вас есть хранилище ключей, которое каким-то образом управляется доверенным программным стеком (TSS -> jTSS, TrouSerS), который содержит материал ключей зашифрованный .TSS также отвечает за загрузку правильных ключей в TPM перед их использованием, например, для операции подписания.
@ C *: криптографическая часть на стороне приложения является вполне стандартной.Я не знаю, как ваши знания в этой области.Для части TPM снова TSS предоставляют высокоуровневые API.Я не знаю, существуют ли существующие инструменты командной строки для подписи с TPM.