Search code examples
c#tpm

How to read and store data to TPM Chip?


I am going through TPM (Trusted Platform Module) and trying to do a task.

How can I store data on the TPM chip? Also, how can I read that data?


Solution

  • This is done using the NV storage commands. Using TSS.MSR, from their samples:

    static void NVReadWrite(Tpm2 tpm)
    {
        //
        // AuthValue encapsulates an authorization value: essentially a byte-array.
        // OwnerAuth is the owner authorization value of the TPM-under-test.  We
        // assume that it (and other) auths are set to the default (null) value.
        // If running on a real TPM, which has been provisioned by Windows, this
        // value will be different. An administrator can retrieve the owner
        // authorization value from the registry.
        //
        var ownerAuth = new AuthValue();
        TpmHandle nvHandle = TpmHandle.NV(3001);
    
        //
        // Clean up any slot that was left over from an earlier run
        // 
        tpm._AllowErrors()
           .NvUndefineSpace(TpmRh.Owner, nvHandle);
        //
        // Scenario 1 - write and read a 32-byte NV-slot
        // 
        AuthValue nvAuth = AuthValue.FromRandom(8);
        tpm.NvDefineSpace(TpmRh.Owner, nvAuth,
                          new NvPublic(nvHandle, TpmAlgId.Sha1,
                                       NvAttr.Authread | NvAttr.Authwrite,
                                       null, 32));
    
        //
        // Write some data
        // 
        var nvData = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
        tpm.NvWrite(nvHandle, nvHandle, nvData, 0);
        //
        // And read it back
        // 
        byte[] nvRead = tpm.NvRead(nvHandle, nvHandle, (ushort)nvData.Length, 0);
    
        //
        // Is it correct?
        // 
        bool correct = nvData.SequenceEqual(nvRead);
        if (!correct)
        {
            throw new Exception("NV data was incorrect.");
        }
    
        Console.WriteLine("NV data written and read.");
    
        //
        // And clean up
        // 
        tpm.NvUndefineSpace(TpmRh.Owner, nvHandle);
    }