Я пишу программу, которая должна сгенерировать ключ подписи RSA, который можно использовать только тогда, когда определенные PCR находятся в определенном состоянии c. Тем не менее, я не могу заставить TPM вообще применять политику - ключ ведет себя так, как будто политики нет. Я использую библиотеку TPM.MSR от Microsoft.
Я рассчитываю, что политика имеет следующее (на основе примера программы):
var pcrs = new uint[] { 1, 2, 3 };
var sel = new PcrSelection(TpmAlgId.Sha, pcrs);
PcrSelection[] selOut;
Tpm2bDigest[] pcrValues;
tpm.PcrRead(new[] { sel }, out selOut, out pcrValues);
//
// Save the current PCR values in a convenient data structure
//
var expectedPcrVals = new PcrValueCollection(selOut, pcrValues);
//
// TSS.Net encapsulates a set of policy assertions as the PolicyTree class.
//
var policy = new PolicyTree(TpmAlgId.Sha256);
//
// Set the policy: Locality AND PolicyPcr. This form of CreatePOlicy
// only creates a single chain. Note that all well-formed policy chains
// must have leaf identifiers. Leaf identifiers are just strings that
// are unique in a policy so that the framework can be told what
// chain to evaluate.
//
policy.Create(
new PolicyAce[]
{
new TpmPolicyPcr(expectedPcrVals),
"leaf"
}
);
//
// Ask TSS.Net for the expected policy-hash for this policy
//
TpmHash expectedPolicyHash = policy.GetPolicyDigest();
Далее я генерирую ключ подписи, используя шаблон ключа c, в который я положил ожидаемый policy ha sh:
signKeyTemplate = TpmPublic(TpmAlgId.Sha256,
ObjectAttr.UserWithAuth | ObjectAttr.Sign | ObjectAttr.NoDA |
ObjectAttr.FixedParent | ObjectAttr.FixedTPM |
ObjectAttr.SensitiveDataOrigin,
expectedPolicyHash,
new RsaParms(new SymDefObject(),
new SchemeRsassa(TpmAlgId.Sha256), 2048, 0),
new Tpm2bPublicKeyRsa());
И, наконец, я сгенерирую ключ, используя:
TpmPrivate signKeyPrivate = client.tpm[srkKeyAuth].Create(srkKeyHandle,
new SensitiveCreate(skd.signKeyAuth, null),
signKeyTemplate,
null,
new PcrSelection[0],
out signKeyPublic,
out signCreationData, out signCreationHash, out signCreationTicket);
Так что я ожидал бы, что, поскольку я указал политику авторизации в шаблоне выше, тогда было бы возможно использовать ключ вообще (для подписи и т. д. c.) в рамках сеанса политики. Но, похоже, это не так. Я могу использовать ключ сразу после без использования сеанса политики. Кроме того, изменение значений ПЦР (с изменениями, наблюдаемыми в pcrValues выше) не мешает использованию ключа. Я неправильно строю политику или неправильно создаю ключ, поскольку политика, по-видимому, не соблюдается? Или это ошибка TPM?