C# TSS Взаимодействие с TPMC#

Место общения программистов C#
Ответить
Anonymous
 C# TSS Взаимодействие с TPM

Сообщение Anonymous »

Код: Выделить всё

    public static AESTPMKey OpenOrCreateAesRootKey()
{
const uint persistentHandleValue = 0x81000001;
var persistentHandle = new TpmHandle(persistentHandleValue);

// 1️⃣ Connect to TPM
var tpmDevice = new TbsDevice();
tpmDevice.Connect();
var tpm = new Tpm2(tpmDevice);

bool recreateKey = false;

// 2️⃣ Check if persistent key exists
try
{
var existingPub = tpm.ReadPublic(persistentHandle, out _, out _);
if (existingPub.parameters is SymDefObject sym && sym.Algorithm == TpmAlgId.Aes)
{
MessageBox.Show("Persistent AES key exists. Reusing key.", "Info", MessageBoxButton.OK,
MessageBoxImage.Information);
return new AESTPMKey(tpm, persistentHandle);
}
else
{
// Existing key is not AES → evict
tpm._AllowErrors().EvictControl(TpmRh.Owner, persistentHandle, persistentHandle);
recreateKey = true;
}
}
catch (TpmException ex) when (ex.RawResponse == TpmRc.Handle)
{
// Handle does not exist → create new
recreateKey = true;
}

if (recreateKey)
{
var emptyNonce = new byte[0];

// 2) Start Policy session (8-param)
byte[] nonceCaller = RandomNumberGenerator.GetBytes(16);
var policySession = tpm.StartAuthSession(
TpmRh.Null,
TpmRh.Null,
nonceCaller,
new byte[0], // encryptedSalt
TpmSe.Policy, // session type
new SymDefObject(), // symmetric (older build allows this)
TpmAlgId.Sha384, // hash algorithm
out emptyNonce // extra nonce
);

var pcrSelections = new PcrSelection[]
{
new PcrSelection(TpmAlgId.Sha384, new uint[] { 1, 7 })
};

// 5) Flush session
tpm.FlushContext(policySession);

// 2️⃣ AES-256 CTR template for primary key
// 3️⃣ Create primary AES-256 CTR key
var aesTemplate = new TpmPublic(
TpmAlgId.Sha256,
ObjectAttr.FixedTPM | ObjectAttr.SensitiveDataOrigin |
ObjectAttr.UserWithAuth | ObjectAttr.Decrypt,
null,
new SymDefObject(TpmAlgId.Aes, 256, TpmAlgId.Ctr),
null
);

CreationData creationData;
TkCreation creationTicket;
TpmPublic outPublic;

TpmHandle primaryHandle = tpm.CreatePrimary(
TpmRh.Owner,
new SensitiveCreate(),
aesTemplate,
null,
pcrSelections,
out outPublic,
out creationData,
out byte[] creationHash,
out creationTicket
);

// 4️⃣ Persist the primary key
tpm._AllowErrors().EvictControl(TpmRh.Owner, primaryHandle, persistentHandle);

// 5️⃣ Flush volatile handle only
tpm.FlushContext(primaryHandle);

MessageBox.Show($"Persistent AES key created with handle 0x{persistentHandleValue:X}", "Info",
MessageBoxButton.OK, MessageBoxImage.Information);

// 5️⃣ Persist key
tpm._AllowErrors().EvictControl(TpmRh.Owner, persistentHandle, persistentHandle);
}

// 7️⃣ Return wrapper bound to persistent handle
return new AESTPMKey(tpm, persistentHandle);
}
Я пытаюсь создать симметричный ключ, но в tpm.createprimary() он продолжает выдавать ошибку, сообщающую, что для createprimary была возвращена ошибка (размер).
code= tpmrc.size, необработанный код 0x95, 149.
есть идеи? я отлаживал это часами, просматривая документацию Google и работая с chatgpt. я все еще не могу это понять

Подробнее здесь: https://stackoverflow.com/questions/798 ... th-the-tpm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»