TPM, по-видимому, не применяет политику авторизации - PullRequest
0 голосов
/ 08 марта 2020

Я пишу программу, которая должна сгенерировать ключ подписи 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?

...