Как сохранить подпись данных с TPM, не получая ответ блокировки? - PullRequest
1 голос
/ 04 июня 2019

Я использую TSS.net для запуска некоторых тестов на симуляторе Microsoft TPM. Я могу успешно создать ключ подписи, но могу подписать его только дважды. На 3-й попытке подписать я получаю ответ Lockout.

Как мне продолжать подписывать данные этим ключом, не получая Lockout ответа?

Репро шаги

После запуска симулятора я запускаю этот метод один раз:

public void ReproStep1()
{
    Tpm2Device tpmDevice = new TcpTpmDevice("127.0.0.1", 2321);

    tpmDevice.Connect();

    var tpm = new Tpm2(tpmDevice);

    tpmDevice.PowerCycle();
    tpm.Startup(Su.Clear);

    var ownerAuth = new AuthValue();

    var keyTemplate = new TpmPublic(TpmAlgId.Sha1, // Name algorithm
        ObjectAttr.UserWithAuth | ObjectAttr.Sign | // Signing key
        ObjectAttr.FixedParent | ObjectAttr.FixedTPM | // Non-migratable 
        ObjectAttr.SensitiveDataOrigin,
        null, // No policy
        new RsaParms(new SymDefObject(),
            new SchemeRsassa(TpmAlgId.Sha256), 2048, 0),
        new Tpm2bPublicKeyRsa());

    var keyAuth = new byte[] {1, 2, 3};

    TpmPublic keyPublic;
    CreationData creationData;
    TkCreation creationTicket;
    byte[] creationHash;

    TpmHandle keyHandle = tpm[ownerAuth].CreatePrimary(
        TpmRh.Owner, // In the owner-hierarchy
        new SensitiveCreate(keyAuth, null), // With this auth-value
        keyTemplate, // Describes key
        null, // Extra data for creation ticket
        new PcrSelection[0], // Non-PCR-bound
        out keyPublic, // PubKey and attributes
        out creationData, out creationHash, out creationTicket); // Not used here

    Console.WriteLine("New public key\n" + keyPublic.ToString());

    TpmHandle persistentHandle = TpmHandle.Persistent(0x5000);

    //Get rid of the stored key (if there is one)
    tpm._AllowErrors().EvictControl(TpmRh.Owner, persistentHandle, persistentHandle);

    //Store the key in NV memory
    tpm.EvictControl(TpmRh.Owner, keyHandle, persistentHandle);
}

Затем я могу запустить следующий метод только дважды, прежде чем получить ответ Lockout от имитатора TPM:

public void ReproStep2()
{
    Tpm2Device tpmDevice = new TcpTpmDevice("127.0.0.1", 2321);

    tpmDevice.Connect();

    var tpm = new Tpm2(tpmDevice);

    var keyAuth = new byte[] {1, 2, 3};

    tpmDevice.PowerCycle();
    tpm.Startup(Su.Clear); //Is this appropriate?

    byte[] message = Encoding.Unicode.GetBytes("ABC");
    TpmHash digestToSign = TpmHash.FromData(TpmAlgId.Sha256, message);

    var persistentHandle = TpmHandle.Persistent(0x5000);

    var signature = tpm[keyAuth].Sign(persistentHandle, // Handle of signing key
        digestToSign, // Data to sign
        null, // Use key's scheme
        TpmHashCheck.Null()) as SignatureRsassa;

    Console.WriteLine("Signature: " + BitConverter.ToString(signature.sig));

    tpm.Dispose();
}

1 Ответ

0 голосов
/ 04 июня 2019

Ааа. Оказывается, что неправильное отключение доверенного платформенного модуля имеет последствия для механизма предотвращения атак по словарю. Добавив это в конце шага 2, я смог позвонить tpm.Sign(...) много раз:

tpm.Shutdown(Su.Clear);
...