summaryrefslogtreecommitdiff
path: root/firmware/lib/tpm_lite/tlcl.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib/tpm_lite/tlcl.c')
-rw-r--r--firmware/lib/tpm_lite/tlcl.c36
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;
+}