Read from TPM2 NV Index
Harshvardhan Patel
harshvardhan1621 at gmail.com
Sun Nov 7 17:44:49 CET 2021
Hi All,
I am working with Infineon TPM SLB9670 connected to a Raspberry Pi 4 via
the GPIO Header. I want to perform a simple NV Index read operation from NV
Index 1 in U-Boot. This NV Index was defined and written to in Linux
userspace using tpm2-tools (following the man page here -
https://github.com/tpm2-software/tpm2-tools/blob/master/man/tpm2_nvwrite.1.md
):
$ tpm2_nvdefine -Q 1 -C o -s 32 -a "ownerread|policywrite|ownerwrite"
$ echo "please123abc" > nv.test_w
$ tpm2_nvwrite -Q 1 -C o -i nv.test_w
After the above definition and write operation, I am able to read the data
back from the NV Indices using TPM2 tools. However, it seems I'm unable to
do so in U-Boot. Following is the code snippet I'm using for reading NV
Index 1.
struct udevice *dev = NULL;
void *data = NULL;
get_tpm(&dev);
status = tpm2_nv_read_value(dev, 1, data, 270);
However, the status code in the above case is "329" or "0x149".
Further I did notice that the hierarchy used in the tpm2-tools command is
the Owner Hierarchy. However the lib/tpm-v2.c code by-default sets
TPM2_RH_PLATFORM as the hierarchy. So I made the following changes:
diff --git a/lib/tpm-v2.c b/lib/tpm-v2.c
index 235f8c20d4..a9644c2f8b 100644
--- a/lib/tpm-v2.c
+++ b/lib/tpm-v2.c
@@ -178,12 +178,12 @@ u32 tpm2_nv_read_value(struct udevice *dev, u32
index, void *data, u32 count)
tpm_u32(TPM2_CC_NV_READ), /* Command code */
/* handles 8 bytes */
- tpm_u32(TPM2_RH_PLATFORM), /* Primary platform seed */
+ tpm_u32(TPM2_RH_OWNER), /* Primary platform seed */
tpm_u32(HR_NV_INDEX + index), /* Password authorisation */
/* AUTH_SESSION */
tpm_u32(9), /* Authorization size */
- tpm_u32(TPM2_RS_PW), /* Session handle */
+ tpm_u32(TPM2_RH_OWNER), /* Session handle */
tpm_u16(0), /* Size of <nonce> */
/* <nonce> (if any) */
0, /* Attributes:
Cont/Excl/Rst */
The status code in this case changes to "2436" or "0x984".
Please let me know if I am missing something in the above API call? What
changes do I have to make in order to read the value stored at an NV Index
from U-Boot space?
More information about the U-Boot
mailing list