Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tpm: Probe for connected TPM 1.2 or TPM 2
In the TPM passthrough backend driver, modify the probing code so that we can check whether a TPM 1.2 or TPM 2 is being used and adapt the behavior of the TPM TIS accordingly. Move the code that tested for a TPM 1.2 into tpm_utils.c and extend it with test for probing for TPM 2. Have the function return the version of TPM found. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
- Loading branch information
1 parent
116694c
commit 56a3c24
Showing
5 changed files
with
167 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
common-obj-$(CONFIG_TPM_TIS) += tpm_tis.o | ||
common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o | ||
common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o tpm_util.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* | ||
* TPM utility functions | ||
* | ||
* Copyright (c) 2010 - 2015 IBM Corporation | ||
* Authors: | ||
* Stefan Berger <stefanb@us.ibm.com> | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this library; if not, see <http://www.gnu.org/licenses/> | ||
*/ | ||
|
||
#include "tpm_util.h" | ||
#include "tpm_int.h" | ||
|
||
/* | ||
* A basic test of a TPM device. We expect a well formatted response header | ||
* (error response is fine) within one second. | ||
*/ | ||
static int tpm_util_test(int fd, | ||
unsigned char *request, | ||
size_t requestlen, | ||
uint16_t *return_tag) | ||
{ | ||
struct tpm_resp_hdr *resp; | ||
fd_set readfds; | ||
int n; | ||
struct timeval tv = { | ||
.tv_sec = 1, | ||
.tv_usec = 0, | ||
}; | ||
unsigned char buf[1024]; | ||
|
||
n = write(fd, request, requestlen); | ||
if (n < 0) { | ||
return errno; | ||
} | ||
if (n != requestlen) { | ||
return EFAULT; | ||
} | ||
|
||
FD_ZERO(&readfds); | ||
FD_SET(fd, &readfds); | ||
|
||
/* wait for a second */ | ||
n = select(fd + 1, &readfds, NULL, NULL, &tv); | ||
if (n != 1) { | ||
return errno; | ||
} | ||
|
||
n = read(fd, &buf, sizeof(buf)); | ||
if (n < sizeof(struct tpm_resp_hdr)) { | ||
return EFAULT; | ||
} | ||
|
||
resp = (struct tpm_resp_hdr *)buf; | ||
/* check the header */ | ||
if (be32_to_cpu(resp->len) != n) { | ||
return EBADMSG; | ||
} | ||
|
||
*return_tag = be16_to_cpu(resp->tag); | ||
|
||
return 0; | ||
} | ||
|
||
/* | ||
* Probe for the TPM device in the back | ||
* Returns 0 on success with the version of the probed TPM set, 1 on failure. | ||
*/ | ||
int tpm_util_test_tpmdev(int tpm_fd, TPMVersion *tpm_version) | ||
{ | ||
/* | ||
* Sending a TPM1.2 command to a TPM2 should return a TPM1.2 | ||
* header (tag = 0xc4) and error code (TPM_BADTAG = 0x1e) | ||
* | ||
* Sending a TPM2 command to a TPM 2 will give a TPM 2 tag in the | ||
* header. | ||
* Sending a TPM2 command to a TPM 1.2 will give a TPM 1.2 tag | ||
* in the header and an error code. | ||
*/ | ||
const struct tpm_req_hdr test_req = { | ||
.tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), | ||
.len = cpu_to_be32(sizeof(test_req)), | ||
.ordinal = cpu_to_be32(TPM_ORD_GetTicks), | ||
}; | ||
|
||
const struct tpm_req_hdr test_req_tpm2 = { | ||
.tag = cpu_to_be16(TPM2_ST_NO_SESSIONS), | ||
.len = cpu_to_be32(sizeof(test_req_tpm2)), | ||
.ordinal = cpu_to_be32(TPM2_CC_ReadClock), | ||
}; | ||
uint16_t return_tag; | ||
int ret; | ||
|
||
/* Send TPM 2 command */ | ||
ret = tpm_util_test(tpm_fd, (unsigned char *)&test_req_tpm2, | ||
sizeof(test_req_tpm2), &return_tag); | ||
/* TPM 2 would respond with a tag of TPM2_ST_NO_SESSIONS */ | ||
if (!ret && return_tag == TPM2_ST_NO_SESSIONS) { | ||
*tpm_version = TPM_VERSION_2_0; | ||
return 0; | ||
} | ||
|
||
/* Send TPM 1.2 command */ | ||
ret = tpm_util_test(tpm_fd, (unsigned char *)&test_req, | ||
sizeof(test_req), &return_tag); | ||
if (!ret && return_tag == TPM_TAG_RSP_COMMAND) { | ||
*tpm_version = TPM_VERSION_1_2; | ||
/* this is a TPM 1.2 */ | ||
return 0; | ||
} | ||
|
||
*tpm_version = TPM_VERSION_UNSPEC; | ||
|
||
return 1; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
/* | ||
* TPM utility functions | ||
* | ||
* Copyright (c) 2010 - 2015 IBM Corporation | ||
* Authors: | ||
* Stefan Berger <stefanb@us.ibm.com> | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this library; if not, see <http://www.gnu.org/licenses/> | ||
*/ | ||
#ifndef TPM_TPM_UTILS_H | ||
#define TPM_TPM_UTILS_H | ||
|
||
#include "sysemu/tpm_backend.h" | ||
|
||
int tpm_util_test_tpmdev(int tpm_fd, TPMVersion *tpm_version); | ||
|
||
#endif /* TPM_TPM_UTILS_H */ |