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