From: Sean Edmond <seanedm...@microsoft.com>

The TPM 2.0 command reference states that "auth" (type TPM2B_AUTH)
should come before "publicInfo" (type TPM2B_NV_PUBLIC) in the
"TPM2_NV_DefineSpace" command.  Let's add an empty "auth" (size 0), so
that this can work with compliant TPMs.

Make sure that NV index used in tpm2_nv_define_space() can be used
directly in the NV read/write/lock APIs.

Signed-off-by: Sean Edmond <seanedm...@microsoft.com>
---
 lib/tpm-v2.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/lib/tpm-v2.c b/lib/tpm-v2.c
index c3c469eb35..d3ecf556d2 100644
--- a/lib/tpm-v2.c
+++ b/lib/tpm-v2.c
@@ -109,7 +109,7 @@ u32 tpm2_nv_define_space(struct udevice *dev, u32 
space_index,
        const int platform_len = sizeof(u32);
        const int session_hdr_len = 13;
        const int message_len = 14;
-       uint offset = TPM2_HDR_LEN + platform_len + session_hdr_len +
+       uint offset = TPM2_HDR_LEN + platform_len + session_hdr_len + 2 +
                message_len;
        u8 command_v2[COMMAND_BUFFER_SIZE] = {
                /* header 10 bytes */
@@ -127,6 +127,9 @@ u32 tpm2_nv_define_space(struct udevice *dev, u32 
space_index,
                0,                              /* session_attrs */
                tpm_u16(0),                     /* auth_size */
 
+               /* auth value */
+               tpm_u16(0),
+
                /* message 14 bytes + policy */
                tpm_u16(message_len + nv_policy_size),  /* size */
                tpm_u32(space_index),
@@ -206,7 +209,7 @@ u32 tpm2_nv_read_value(struct udevice *dev, u32 index, void 
*data, u32 count)
 
                /* handles 8 bytes */
                tpm_u32(TPM2_RH_PLATFORM),      /* Primary platform seed */
-               tpm_u32(HR_NV_INDEX + index),   /* Password authorisation */
+               tpm_u32(index),                 /* nvIndex */
 
                /* AUTH_SESSION */
                tpm_u32(9),                     /* Authorization size */
@@ -229,9 +232,14 @@ u32 tpm2_nv_read_value(struct udevice *dev, u32 index, 
void *data, u32 count)
        ret = tpm_sendrecv_command(dev, command_v2, response, &response_len);
        if (ret)
                return log_msg_ret("read", ret);
+
+       const size_t tag_offset = 0;
+       const size_t size_offset = 2;
+       const size_t code_offset = 6;
+       const size_t data_offset = 16;
        if (unpack_byte_string(response, response_len, "wdds",
-                              0, &tag, 2, &size, 6, &code,
-                              16, data, count))
+                              tag_offset, &tag, size_offset, &size, 
code_offset, &code,
+                              data_offset, data, count))
                return TPM_LIB_ERROR;
 
        return 0;
@@ -254,7 +262,7 @@ u32 tpm2_nv_write_value(struct udevice *dev, u32 index, 
const void *data,
 
                /* handles 8 bytes */
                tpm_u32(auth),                  /* Primary platform seed */
-               tpm_u32(HR_NV_INDEX + index),   /* Password authorisation */
+               tpm_u32(index),                 /* nvIndex */
 
                /* AUTH_SESSION */
                tpm_u32(9),                     /* Authorization size */
@@ -643,7 +651,7 @@ u32 tpm2_write_lock(struct udevice *dev, u32 index)
 
                /* handles 8 bytes */
                tpm_u32(TPM2_RH_PLATFORM),      /* Primary platform seed */
-               tpm_u32(HR_NV_INDEX + index),   /* Password authorisation */
+               tpm_u32(index),                 /* nvIndex */
 
                /* session header 9 bytes */
                tpm_u32(9),                     /* Header size */
-- 
2.40.0

Reply via email to