From f08098cfa99623c9f30deb75942d002a0f606f4f Mon Sep 17 00:00:00 2001 From: Johnny Shaw Date: Mon, 21 Oct 2024 13:16:48 -0600 Subject: [PATCH] ExtendedTools TPM incremental read --- plugins/ExtendedTools/tpm.c | 49 +++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/plugins/ExtendedTools/tpm.c b/plugins/ExtendedTools/tpm.c index 17e97ab3c7f1..1349b5fc2d93 100644 --- a/plugins/ExtendedTools/tpm.c +++ b/plugins/ExtendedTools/tpm.c @@ -198,9 +198,10 @@ NTSTATUS EtTpmReadPublic( } _Must_inspect_result_ -NTSTATUS EtTpmRead( +NTSTATUS EtTpmReadOffset( _In_ TBS_HCONTEXT TbsContextHandle, _In_ TPM_NV_INDEX Index, + _In_ USHORT Offset, _Out_writes_bytes_all_(DataSize) PBYTE Data, _In_ USHORT DataSize ) @@ -232,7 +233,7 @@ NTSTATUS EtTpmRead( command->AuthSession.PasswordSize = 0; footer = (TPM_NV_READ_CMD_FOOTER*)&command->AuthSession.Password[0]; - footer->Offset = 0; + footer->Offset = _byteswap_ushort(Offset); footer->Size = _byteswap_ushort(DataSize); size = FIELD_OFFSET(TPM_NV_READ_REPLY, Data); @@ -275,6 +276,50 @@ NTSTATUS EtTpmRead( return status; } +_Must_inspect_result_ +NTSTATUS EtTpmRead( + _In_ TBS_HCONTEXT TbsContextHandle, + _In_ TPM_NV_INDEX Index, + _Out_writes_bytes_all_(DataSize) PBYTE Data, + _In_ USHORT DataSize + ) +{ + NTSTATUS status; + USHORT remaining; + USHORT offset; + + RtlZeroMemory(Data, DataSize); + + remaining = DataSize; + offset = 0; + + while (remaining) + { + USHORT readSize; + + // + // Certain TPMs do not support reads over a certain sizes that is + // smaller than the specification recommends. + // + readSize = min(remaining, 512); + + status = EtTpmReadOffset(TbsContextHandle, + Index, + offset, + PTR_ADD_OFFSET(Data, offset), + readSize); + if (!NT_SUCCESS(status)) + { + return status; + } + + offset += readSize; + remaining -= readSize; + } + + return STATUS_SUCCESS; +} + NTSTATUS TpmOpen( _Out_ PHANDLE FileHandle )