tpm_lite: Introduce cursor read helpers
Add helper functions that read a number in TPM byte order and advance
the buffer pointer in a single operation. Replace instances of this
pattern with call to the helpers. No functional changes.
BRANCH=None
BUG=None
TEST=existing unit tests
Change-Id: I96d866893ec875aafc978cbe2a55ea7f9f27542c
Reviewed-on: https://chromium-review.googlesource.com/985832
Commit-Ready: Mattias Nissler <mnissler@chromium.org>
Tested-by: Mattias Nissler <mnissler@chromium.org>
Reviewed-by: Andrey Pronin <apronin@chromium.org>
diff --git a/firmware/lib/tpm_lite/include/tlcl_internal.h b/firmware/lib/tpm_lite/include/tlcl_internal.h
index 51fe6ef..99932d6 100644
--- a/firmware/lib/tpm_lite/include/tlcl_internal.h
+++ b/firmware/lib/tpm_lite/include/tlcl_internal.h
@@ -20,7 +20,8 @@
/*
* Conversion functions. ToTpmTYPE puts a value of type TYPE into a TPM
* command buffer. FromTpmTYPE gets a value of type TYPE from a TPM command
- * buffer into a variable.
+ * buffer into a variable. ReadTpmTYPE reads a value of type TYPE from a buffer
+ * and advances the buffer pointer to after the field.
*/
__attribute__((unused))
static inline void ToTpmUint32(uint8_t *buffer, uint32_t x) {
@@ -45,6 +46,17 @@
* See comment for above function.
*/
__attribute__((unused))
+static inline uint32_t ReadTpmUint32(const uint8_t **buffer) {
+ uint32_t value;
+ FromTpmUint32(*buffer, &value);
+ *buffer += sizeof(value);
+ return value;
+}
+
+/*
+ * See comment for above function.
+ */
+__attribute__((unused))
static inline void ToTpmUint16(uint8_t *buffer, uint16_t x) {
buffer[0] = (uint8_t)(x >> 8);
buffer[1] = (uint8_t)(x & 0xff);
@@ -58,4 +70,15 @@
*x = (buffer[0] << 8) | buffer[1];
}
+/*
+ * See comment for above function.
+ */
+__attribute__((unused))
+static inline uint16_t ReadTpmUint16(const uint8_t **buffer) {
+ uint16_t value;
+ FromTpmUint16(*buffer, &value);
+ *buffer += sizeof(value);
+ return value;
+}
+
#endif /* TPM_LITE_TLCL_INTERNAL_H_ */
diff --git a/firmware/lib/tpm_lite/tlcl.c b/firmware/lib/tpm_lite/tlcl.c
index 587a172..e87b130 100644
--- a/firmware/lib/tpm_lite/tlcl.c
+++ b/firmware/lib/tpm_lite/tlcl.c
@@ -227,7 +227,6 @@
{
struct s_tpm_nv_read_cmd cmd;
uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE];
- uint32_t result_length;
uint32_t result;
VB2_DEBUG("TPM: TlclRead(0x%x, %d)\n", index, length);
@@ -237,11 +236,11 @@
result = TlclSendReceive(cmd.buffer, response, sizeof(response));
if (result == TPM_SUCCESS && length > 0) {
- uint8_t* nv_read_cursor = response + kTpmResponseHeaderLength;
- FromTpmUint32(nv_read_cursor, &result_length);
+ const uint8_t* nv_read_cursor =
+ response + kTpmResponseHeaderLength;
+ uint32_t result_length = ReadTpmUint32(&nv_read_cursor);
if (result_length > length)
result_length = length; /* Truncate to fit buffer */
- nv_read_cursor += sizeof(uint32_t);
memcpy(data, nv_read_cursor, result_length);
}
@@ -263,7 +262,8 @@
result = TlclSendReceive(cmd.buffer, response, sizeof(response));
if (result == TPM_SUCCESS) {
- uint8_t* pcr_read_cursor = response + kTpmResponseHeaderLength;
+ const uint8_t* pcr_read_cursor =
+ response + kTpmResponseHeaderLength;
memcpy(data, pcr_read_cursor, kPcrDigestLength);
}
@@ -493,15 +493,14 @@
result = TlclSendReceive(cmd.buffer, response, sizeof(response));
if (result == TPM_SUCCESS) {
- uint8_t* get_random_cursor;
- FromTpmUint32(response + kTpmResponseHeaderLength, size);
+ const uint8_t* get_random_cursor =
+ response + kTpmResponseHeaderLength;
+ *size = ReadTpmUint32(&get_random_cursor);
/* There must be room in the target buffer for the bytes. */
if (*size > length) {
return TPM_E_RESPONSE_TOO_LARGE;
}
- get_random_cursor = response + kTpmResponseHeaderLength
- + sizeof(uint32_t);
memcpy(data, get_random_cursor, *size);
}
@@ -518,11 +517,8 @@
if (result != TPM_SUCCESS)
return result;
- uint8_t* cursor = response + kTpmResponseHeaderLength;
-
- uint32_t size;
- FromTpmUint32(cursor, &size);
- cursor += sizeof(size);
+ const uint8_t* cursor = response + kTpmResponseHeaderLength;
+ uint32_t size = ReadTpmUint32(&cursor);
/* Verify size >= sizeof(TPM_CAP_VERSION_INFO). */
const uint32_t kSizeofCapVersionInfo = 15;
@@ -535,21 +531,15 @@
cursor += sizeof(uint16_t); /* tag */
cursor += sizeof(uint16_t); /* spec version */
- uint16_t version;
- FromTpmUint16(cursor, &version);
- cursor += sizeof(version);
- *firmware_version = version;
+ *firmware_version = ReadTpmUint16(&cursor);
cursor += sizeof(uint16_t); /* specLevel */
cursor += sizeof(uint8_t); /* errataRev */
- FromTpmUint32(cursor, vendor);
- cursor += sizeof(*vendor);
+ *vendor = ReadTpmUint32(&cursor);
if (vendor_specific_buf_size) {
- uint16_t vendor_specific_size;
- FromTpmUint16(cursor, &vendor_specific_size);
- cursor += sizeof(vendor_specific_size);
+ uint16_t vendor_specific_size = ReadTpmUint16(&cursor);
if (size < kSizeofCapVersionInfo + vendor_specific_size) {
return TPM_E_IOERROR;
@@ -569,15 +559,12 @@
return TPM_SUCCESS;
}
-static void ParseIFXFirmwarePackage(uint8_t** cursor,
- TPM_IFX_FIRMWAREPACKAGE* firmware_package) {
-
- FromTpmUint32(*cursor, &firmware_package->FwPackageIdentifier);
- *cursor += sizeof(firmware_package->FwPackageIdentifier);
- FromTpmUint32(*cursor, &firmware_package->Version);
- *cursor += sizeof(firmware_package->Version);
- FromTpmUint32(*cursor, &firmware_package->StaleVersion);
- *cursor += sizeof(firmware_package->StaleVersion);
+static void ParseIFXFirmwarePackage(const uint8_t** cursor,
+ TPM_IFX_FIRMWAREPACKAGE* firmware_package)
+{
+ firmware_package->FwPackageIdentifier = ReadTpmUint32(cursor);
+ firmware_package->Version = ReadTpmUint32(cursor);
+ firmware_package->StaleVersion = ReadTpmUint32(cursor);
}
uint32_t TlclIFXFieldUpgradeInfo(TPM_IFX_FIELDUPGRADEINFO* info) {
@@ -599,24 +586,18 @@
return result;
}
- uint8_t* cursor = response + kTpmResponseHeaderLength;
-
- uint16_t size;
- FromTpmUint16(cursor, &size);
- cursor += sizeof(size);
+ const uint8_t* cursor = response + kTpmResponseHeaderLength;
+ uint16_t size = ReadTpmUint16(&cursor);
/* Comments below indicate skipped fields of unknown purpose that are
* marked "internal" in the firmware updater source. */
cursor += sizeof(uint16_t); /* internal1 */
- FromTpmUint16(cursor, &info->wMaxDataSize);
- cursor += sizeof(info->wMaxDataSize);
+ info->wMaxDataSize = ReadTpmUint16(&cursor);
cursor += sizeof(uint16_t); /* sSecurityModuleLogic.internal1 */
cursor += sizeof(uint32_t); /* sSecurityModuleLogic.internal2 */
cursor += sizeof(uint8_t[34]); /* sSecurityModuleLogic.internal3 */
ParseIFXFirmwarePackage(&cursor, &info->sBootloaderFirmwarePackage);
- uint16_t fw_entry_count;
- FromTpmUint16(cursor, &fw_entry_count);
- cursor += sizeof(fw_entry_count);
+ uint16_t fw_entry_count = ReadTpmUint16(&cursor);
if (fw_entry_count > ARRAY_SIZE(info->sFirmwarePackages)) {
return TPM_E_IOERROR;
}
@@ -624,13 +605,11 @@
for (i = 0; i < fw_entry_count; ++i) {
ParseIFXFirmwarePackage(&cursor, &info->sFirmwarePackages[i]);
}
- FromTpmUint16(cursor, &info->wSecurityModuleStatus);
- cursor += sizeof(info->wSecurityModuleStatus);
+ info->wSecurityModuleStatus = ReadTpmUint16(&cursor);
ParseIFXFirmwarePackage(&cursor, &info->sProcessFirmwarePackage);
cursor += sizeof(uint16_t); /* internal6 */
cursor += sizeof(uint8_t[6]); /* internal7 */
- FromTpmUint16(cursor, &info->wFieldUpgradeCounter);
- cursor += sizeof(info->wFieldUpgradeCounter);
+ info->wFieldUpgradeCounter = ReadTpmUint16(&cursor);
uint32_t parsed_bytes = cursor - response;
VbAssert(parsed_bytes <= TPM_LARGE_ENOUGH_COMMAND_SIZE);