diff options
Diffstat (limited to 'firmware/lib/tpm_lite/tlcl.c')
-rw-r--r-- | firmware/lib/tpm_lite/tlcl.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/firmware/lib/tpm_lite/tlcl.c b/firmware/lib/tpm_lite/tlcl.c index 5a99fdc7..14acf966 100644 --- a/firmware/lib/tpm_lite/tlcl.c +++ b/firmware/lib/tpm_lite/tlcl.c @@ -512,3 +512,39 @@ uint32_t TlclGetRandom(uint8_t* data, uint32_t length, uint32_t *size) return result; } + +uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version) { + uint8_t response[TPM_LARGE_ENOUGH_COMMAND_SIZE]; + uint32_t result = TlclSendReceive(tpm_getversionval_cmd.buffer, + response, sizeof(response)); + if (result != TPM_SUCCESS) + return result; + + uint8_t* cursor = response + kTpmResponseHeaderLength; + + uint32_t size; + FromTpmUint32(cursor, &size); + cursor += sizeof(size); + + /* Verify size >= sizeof(TPM_CAP_VERSION_INFO). */ + const uint32_t kSizeofCapVersionInfo = 15; + if (size < kSizeofCapVersionInfo) { + return TPM_E_IOERROR; + } + + cursor += sizeof(uint16_t); /* tag */ + cursor += sizeof(uint16_t); /* spec version */ + + uint16_t version; + FromTpmUint16(cursor, &version); + cursor += sizeof(version); + *firmware_version = version; + + cursor += sizeof(uint16_t); /* specLevel */ + cursor += sizeof(uint8_t); /* errataRev */ + + FromTpmUint32(cursor, vendor); + cursor += sizeof(*vendor); + + return TPM_SUCCESS; +} |