diff options
author | Andrey Pronin <apronin@chromium.org> | 2017-10-06 20:01:53 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-10-12 16:35:30 -0700 |
commit | 3b805725c15022783f0737a72b4f27962abf48cd (patch) | |
tree | 901659ef5fe07f9799b298f66871ef49301a782b /firmware/lib | |
parent | 5d5b2f16109662dceb55dfbe62772ee41887be82 (diff) | |
download | vboot-3b805725c15022783f0737a72b4f27962abf48cd.tar.gz |
tlcl, tpmc: extend GetVersion to report vendor specific datastabilize-10032.86.Bstabilize-10032.75.Bstabilize-10032.72.Bstabilize-10032.71.Bstabilize-10032.68.Bstabilize-10032.56.Bstabilize-10032.111.Brelease-R63-10032.Bfirmware-scribe-10045.B
1) Extend TlclGetVersion to return vendor specific data, if
requested.
2) Extend 'tpmc getver' to include vendor specific data.
BRANCH=none
BUG=chromium:771561
TEST=unit tests, running 'tpmc getver'
Change-Id: Ic04c242d4e6f33b45a80479be9ab9777b317ebe2
Reviewed-on: https://chromium-review.googlesource.com/706240
Commit-Ready: Andrey Pronin <apronin@chromium.org>
Tested-by: Andrey Pronin <apronin@chromium.org>
Reviewed-by: Andrey Pronin <apronin@chromium.org>
Diffstat (limited to 'firmware/lib')
-rw-r--r-- | firmware/lib/tpm2_lite/tlcl.c | 49 | ||||
-rw-r--r-- | firmware/lib/tpm_lite/mocked_tlcl.c | 7 | ||||
-rw-r--r-- | firmware/lib/tpm_lite/tlcl.c | 32 |
3 files changed, 83 insertions, 5 deletions
diff --git a/firmware/lib/tpm2_lite/tlcl.c b/firmware/lib/tpm2_lite/tlcl.c index bb212d24..89bf25a7 100644 --- a/firmware/lib/tpm2_lite/tlcl.c +++ b/firmware/lib/tpm2_lite/tlcl.c @@ -523,7 +523,25 @@ uint32_t TlclGetRandom(uint8_t *data, uint32_t length, uint32_t *size) return TPM_E_IOERROR; } -uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) +// Converts TPM_PT_VENDOR_STRING_x |value| to an array of bytes in |buf|. +// Returns the number of bytes in the array. +// |buf| should be at least 4 bytes long. +size_t tlcl_vendor_string_parse(uint32_t value, uint8_t* buf) +{ + size_t len = 0; + int shift = 24; + for (; len < 4; shift -= 8) { + uint8_t byte = (value >> shift) & 0xffu; + if (!byte) + break; + buf[len++] = byte; + } + return len; +} + +uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version, + uint8_t* vendor_specific_buf, + size_t* vendor_specific_buf_size) { uint32_t result = tlcl_get_tpm_property(TPM_PT_MANUFACTURER, vendor); if (result != TPM_SUCCESS) @@ -539,6 +557,35 @@ uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) return result; *firmware_version = ((uint64_t) version_1 << 32) | version_2; + + if (!vendor_specific_buf_size) + return TPM_SUCCESS; + + size_t total_size = 0; + uint32_t prop_id; + uint8_t prop_string[16]; + for (prop_id = TPM_PT_VENDOR_STRING_1; + prop_id <= TPM_PT_VENDOR_STRING_4; + ++prop_id) { + uint32_t prop_value; + result = tlcl_get_tpm_property(prop_id, &prop_value); + if (result != TPM_SUCCESS) + break; + + size_t prop_len = tlcl_vendor_string_parse( + prop_value, prop_string + total_size); + VbAssert(prop_len <= 4 && + total_size + prop_len <= sizeof(prop_string)); + total_size += prop_len; + if (prop_len < 4) + break; + } + if (vendor_specific_buf) { + if (total_size > *vendor_specific_buf_size) + total_size = *vendor_specific_buf_size; + memcpy(vendor_specific_buf, prop_string, total_size); + } + *vendor_specific_buf_size = total_size; return TPM_SUCCESS; } diff --git a/firmware/lib/tpm_lite/mocked_tlcl.c b/firmware/lib/tpm_lite/mocked_tlcl.c index def4810b..0abcb7c9 100644 --- a/firmware/lib/tpm_lite/mocked_tlcl.c +++ b/firmware/lib/tpm_lite/mocked_tlcl.c @@ -186,10 +186,15 @@ uint32_t TlclGetRandom(uint8_t* data, uint32_t length, uint32_t *size) return TPM_SUCCESS; } -uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) +uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version, + uint8_t* vendor_specific_buf, + size_t* vendor_specific_buf_size) { *vendor = 0x4e4f4e45; *firmware_version = 0x1; + if (vendor_specific_buf_size) { + *vendor_specific_buf_size = 0; + } return TPM_SUCCESS; } diff --git a/firmware/lib/tpm_lite/tlcl.c b/firmware/lib/tpm_lite/tlcl.c index 59dd1208..6f71f2bc 100644 --- a/firmware/lib/tpm_lite/tlcl.c +++ b/firmware/lib/tpm_lite/tlcl.c @@ -513,7 +513,10 @@ uint32_t TlclGetRandom(uint8_t* data, uint32_t length, uint32_t *size) return result; } -uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) { +uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version, + uint8_t* vendor_specific_buf, + size_t* vendor_specific_buf_size) +{ uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; uint32_t result = TlclSendReceive(tpm_getversionval_cmd.buffer, response, sizeof(response)); @@ -528,7 +531,9 @@ uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) { /* Verify size >= sizeof(TPM_CAP_VERSION_INFO). */ const uint32_t kSizeofCapVersionInfo = 15; - if (size < kSizeofCapVersionInfo) { + if (size < kSizeofCapVersionInfo || + kTpmResponseHeaderLength + sizeof(size) + size > + TPM_LARGE_ENOUGH_COMMAND_SIZE) { return TPM_E_IOERROR; } @@ -546,6 +551,26 @@ uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) { FromTpmUint32(cursor, vendor); cursor += sizeof(*vendor); + if (vendor_specific_buf_size) { + uint16_t vendor_specific_size; + FromTpmUint16(cursor, &vendor_specific_size); + cursor += sizeof(vendor_specific_size); + + if (size < kSizeofCapVersionInfo + vendor_specific_size) { + return TPM_E_IOERROR; + } + if (vendor_specific_buf) { + if (vendor_specific_size > *vendor_specific_buf_size) { + vendor_specific_size = + *vendor_specific_buf_size; + } + memcpy(vendor_specific_buf, cursor, + vendor_specific_size); + cursor += vendor_specific_size; + } + *vendor_specific_buf_size = vendor_specific_size; + } + return TPM_SUCCESS; } @@ -563,7 +588,8 @@ static void ParseIFXFirmwarePackage(uint8_t** cursor, uint32_t TlclIFXFieldUpgradeInfo(TPM_IFX_FIELDUPGRADEINFO* info) { uint32_t vendor; uint64_t firmware_version; - uint32_t result = TlclGetVersion(&vendor, &firmware_version); + uint32_t result = + TlclGetVersion(&vendor, &firmware_version, NULL, NULL); if (result != TPM_SUCCESS) { return result; } |