[SeaBIOS] [PATCH 6/8] tpm: Don't implement scatter-gather in transmit()
Kevin O'Connor
kevin at koconnor.net
Mon Nov 23 02:02:36 CET 2015
There are no longer any callers to transmit() that use multiple
buffers. Simplify transmit() so that it takes a single request
buffer.
The pass_through_to_tpm() wrapper around transmit() is no longer
needed. Remove the function and have all callers use transmit()
directly.
Now that tpm_extend() function calls transmit directly, it can use
TPM_DURATION_TYPE_SHORT duration.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/std/tcg.h | 4 ---
src/tcgbios.c | 81 +++++++++++++++--------------------------------------------
src/tcgbios.h | 8 ------
3 files changed, 20 insertions(+), 73 deletions(-)
diff --git a/src/std/tcg.h b/src/std/tcg.h
index 5f9cad9..f6a47c7 100644
--- a/src/std/tcg.h
+++ b/src/std/tcg.h
@@ -232,15 +232,11 @@ struct pcctes_romex
u32 totlen; \
u32 ordinal;
-#define TPM_REQ_HEADER_SIZE (sizeof(u16) + sizeof(u32) + sizeof(u32))
-
#define TPM_RSP_HEADER \
u16 tag; \
u32 totlen; \
u32 errcode;
-#define TPM_RSP_HEADER_SIZE (sizeof(u16) + sizeof(u32) + sizeof(u32))
-
struct tpm_req_header {
TPM_REQ_HEADER;
} PACKED;
diff --git a/src/tcgbios.c b/src/tcgbios.c
index d4f6288..13393a2 100644
--- a/src/tcgbios.c
+++ b/src/tcgbios.c
@@ -137,32 +137,24 @@ has_working_tpm(void)
}
static u32
-transmit(u8 locty, const struct iovec iovec[],
- u8 *respbuffer, u32 *respbufferlen,
+transmit(u8 locty, struct tpm_req_header *req,
+ void *respbuffer, u32 *respbufferlen,
enum tpmDurationType to_t)
{
- u32 rc = 0;
- u32 irc;
- struct tpm_driver *td;
- unsigned int i;
-
if (tpm_state.tpm_driver_to_use == TPM_INVALID_DRIVER)
return TCG_FATAL_COM_ERROR;
- td = &tpm_drivers[tpm_state.tpm_driver_to_use];
+ struct tpm_driver *td = &tpm_drivers[tpm_state.tpm_driver_to_use];
- irc = td->activate(locty);
+ u32 irc = td->activate(locty);
if (irc != 0) {
/* tpm could not be activated */
return TCG_FATAL_COM_ERROR;
}
- for (i = 0; iovec[i].length; i++) {
- irc = td->senddata(iovec[i].data,
- iovec[i].length);
- if (irc != 0)
- return TCG_FATAL_COM_ERROR;
- }
+ irc = td->senddata((void*)req, be32_to_cpu(req->totlen));
+ if (irc != 0)
+ return TCG_FATAL_COM_ERROR;
irc = td->waitdatavalid();
if (irc != 0)
@@ -172,14 +164,13 @@ transmit(u8 locty, const struct iovec iovec[],
if (irc != 0)
return TCG_FATAL_COM_ERROR;
- irc = td->readresp(respbuffer,
- respbufferlen);
+ irc = td->readresp(respbuffer, respbufferlen);
if (irc != 0)
return TCG_FATAL_COM_ERROR;
td->ready();
- return rc;
+ return 0;
}
@@ -336,7 +327,7 @@ build_and_send_cmd(u8 locty, u32 ordinal, const u8 *append, u32 append_size,
u8 cmd[64];
} PACKED req = {
.trqh.tag = cpu_to_be16(TPM_TAG_RQU_CMD),
- .trqh.totlen = cpu_to_be32(TPM_REQ_HEADER_SIZE + append_size),
+ .trqh.totlen = cpu_to_be32(sizeof(req.trqh) + append_size),
.trqh.ordinal = cpu_to_be32(ordinal),
};
u8 obuffer[64];
@@ -351,10 +342,7 @@ build_and_send_cmd(u8 locty, u32 ordinal, const u8 *append, u32 append_size,
if (append_size)
memcpy(req.cmd, append, append_size);
- struct iovec iovec[2] = {{ 0 }};
- iovec[0].data = &req;
- iovec[0].length = TPM_REQ_HEADER_SIZE + append_size;
- u32 rc = transmit(locty, iovec, obuffer, &obuffer_len, to_t);
+ u32 rc = transmit(locty, &req.trqh, obuffer, &obuffer_len, to_t);
if (rc)
return rc;
@@ -457,31 +445,8 @@ err_exit:
}
static u32
-pass_through_to_tpm(u8 locty, const u8 *cmd, u32 cmd_length,
- u8 *resp, u32 *resp_length)
-{
- struct iovec iovec[2] = {{ 0 }};
- const u32 *tmp;
-
- if (cmd_length < TPM_REQ_HEADER_SIZE)
- return TCG_INVALID_INPUT_PARA;
-
- iovec[0].data = cmd;
- tmp = (const u32 *)&((u8 *)iovec[0].data)[2];
- iovec[0].length = cpu_to_be32(*tmp);
-
- if (cmd_length != iovec[0].length)
- return TCG_INVALID_INPUT_PARA;
-
- return transmit(locty, iovec, resp, resp_length,
- TPM_DURATION_TYPE_LONG /* worst case */);
-
-}
-
-static u32
tpm_extend(u8 *hash, u32 pcrindex)
{
- u32 rc;
struct tpm_req_extend tre = {
.tag = cpu_to_be16(TPM_TAG_RQU_CMD),
.totlen = cpu_to_be32(sizeof(tre)),
@@ -493,9 +458,8 @@ tpm_extend(u8 *hash, u32 pcrindex)
memcpy(tre.digest, hash, sizeof(tre.digest));
- rc = pass_through_to_tpm(0, (u8 *)&tre, sizeof(tre),
- (u8 *)&rsp, &resp_length);
-
+ u32 rc = transmit(0, (void*)&tre, &rsp, &resp_length,
+ TPM_DURATION_TYPE_SHORT);
if (rc || resp_length != sizeof(rsp))
tpm_set_failure();
@@ -1002,29 +966,24 @@ static u32
pass_through_to_tpm_int(struct pttti *pttti, struct pttto *pttto)
{
u32 rc = 0;
- u32 resbuflen = 0;
- struct tpm_req_header *trh;
if (is_preboot_if_shutdown()) {
rc = TCG_INTERFACE_SHUTDOWN;
goto err_exit;
}
- trh = (struct tpm_req_header *)pttti->tpmopin;
+ struct tpm_req_header *trh = (void*)pttti->tpmopin;
- if (pttti->ipblength < sizeof(struct pttti) + TPM_REQ_HEADER_SIZE ||
- pttti->opblength < sizeof(struct pttto) ||
- be32_to_cpu(trh->totlen) + sizeof(struct pttti) > pttti->ipblength ) {
+ if (pttti->ipblength < sizeof(struct pttti) + sizeof(trh)
+ || pttti->ipblength != sizeof(struct pttti) + be32_to_cpu(trh->totlen)
+ || pttti->opblength < sizeof(struct pttto)) {
rc = TCG_INVALID_INPUT_PARA;
goto err_exit;
}
- resbuflen = pttti->opblength - offsetof(struct pttto, tpmopout);
-
- rc = pass_through_to_tpm(0, pttti->tpmopin,
- pttti->ipblength - offsetof(struct pttti, tpmopin),
- pttto->tpmopout, &resbuflen);
-
+ u32 resbuflen = pttti->opblength - offsetof(struct pttto, tpmopout);
+ rc = transmit(0, trh, pttto->tpmopout, &resbuflen,
+ TPM_DURATION_TYPE_LONG /* worst case */);
if (rc)
goto err_exit;
diff --git a/src/tcgbios.h b/src/tcgbios.h
index 0f9d5c3..4d69b1e 100644
--- a/src/tcgbios.h
+++ b/src/tcgbios.h
@@ -3,14 +3,6 @@
#include "types.h"
-#define STATUS_FLAG_SHUTDOWN (1 << 0)
-
-struct iovec
-{
- size_t length;
- const void *data;
-};
-
struct bregs;
void tpm_interrupt_handler32(struct bregs *regs);
--
2.5.0
More information about the SeaBIOS
mailing list