diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2016-07-07 11:04:06 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2016-07-13 23:59:05 +0200 |
commit | ebba4d7c2f3e9162859d5a95c8b9597a218698d7 (patch) | |
tree | 5e226ce3121b13dc1310c7afebb3805804f95ccc | |
parent | d9137d56fd263ec28647025bad5d118a485b821d (diff) | |
download | coreboot-ebba4d7c2f3e9162859d5a95c8b9597a218698d7.tar.xz |
tpm2: refactor session header marshalling
For coreboot TPM2 the use case session header is always the minimal
possible size, the only difference is that some commands require one
and some require two handles.
Refactor common session header marshalling code into a separate
function. This will be useful when more commands marshalling code is
added.
BRANCH=none
BUG=chrome-os-partner:50645
TEST=flashed the TPM and rebooted the device a few times, it
successfully loaded chrome os on every attempt.
Change-Id: I9b1697c44f67aab32b9cd556b559a55d5050be06
Signed-off-by: Martin Roth <martinroth@chromium.org>
Original-Commit-Id: a97a7fa16ceeb484e90e2e1f0573e58a468350b2
Original-Change-Id: I86e6426be5200f28ebb2174b418254018e81da8e
Original-Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/357972
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/15633
Tested-by: build bot (Jenkins)
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@googlemail.com>
-rw-r--r-- | src/lib/tpm2_marshaling.c | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/src/lib/tpm2_marshaling.c b/src/lib/tpm2_marshaling.c index 63f0e4cd1d..5aad276dbb 100644 --- a/src/lib/tpm2_marshaling.c +++ b/src/lib/tpm2_marshaling.c @@ -235,6 +235,28 @@ static void marshal_session_header(void **buffer, marshal_u32(&size_location, base_size - *buffer_space, &base_size); } +/* + * Common session header can include one or two handles and an empty + * session_header structure. + */ +static void marshal_common_session_header(void **buffer, + const uint32_t *handles, + size_t handle_count, + size_t *buffer_space) +{ + int i; + struct tpm2_session_header session_header; + + tpm_tag = TPM_ST_SESSIONS; + + for (i = 0; i < handle_count; i++) + marshal_TPM_HANDLE(buffer, handles[i], buffer_space); + + memset(&session_header, 0, sizeof(session_header)); + session_header.session_handle = TPM_RS_PW; + marshal_session_header(buffer, &session_header, buffer_space); +} + static void marshal_nv_define_space(void **buffer, struct tpm2_nv_define_space_cmd *nvd_in, size_t *buffer_space) @@ -242,14 +264,10 @@ static void marshal_nv_define_space(void **buffer, void *size_location; size_t base_size; size_t sizeof_nv_public_size = sizeof(uint16_t); - struct tpm2_session_header session_header; - - marshal_TPM_HANDLE(buffer, TPM_RH_PLATFORM, buffer_space); - memset(&session_header, 0, sizeof(session_header)); - session_header.session_handle = TPM_RS_PW; - marshal_session_header(buffer, &session_header, buffer_space); - tpm_tag = TPM_ST_SESSIONS; + const uint32_t handle[] = { TPM_RH_PLATFORM }; + marshal_common_session_header(buffer, handle, + ARRAY_SIZE(handle), buffer_space); marshal_TPM2B(buffer, &nvd_in->auth.b, buffer_space); /* This is where the TPMS_NV_PUBLIC size will be stored. */ @@ -277,15 +295,10 @@ static void marshal_nv_write(void **buffer, struct tpm2_nv_write_cmd *command_body, size_t *buffer_space) { - struct tpm2_session_header session_header; - - marshal_TPM_HANDLE(buffer, TPM_RH_PLATFORM, buffer_space); - marshal_TPM_HANDLE(buffer, command_body->nvIndex, buffer_space); - memset(&session_header, 0, sizeof(session_header)); - session_header.session_handle = TPM_RS_PW; - marshal_session_header(buffer, &session_header, buffer_space); - tpm_tag = TPM_ST_SESSIONS; + uint32_t handles[] = { TPM_RH_PLATFORM, command_body->nvIndex }; + marshal_common_session_header(buffer, handles, + ARRAY_SIZE(handles), buffer_space); marshal_TPM2B(buffer, &command_body->data.b, buffer_space); marshal_u16(buffer, command_body->offset, buffer_space); } @@ -294,14 +307,10 @@ static void marshal_nv_read(void **buffer, struct tpm2_nv_read_cmd *command_body, size_t *buffer_space) { - struct tpm2_session_header session_header; + uint32_t handles[] = { TPM_RH_PLATFORM, command_body->nvIndex }; - marshal_TPM_HANDLE(buffer, TPM_RH_PLATFORM, buffer_space); - marshal_TPM_HANDLE(buffer, command_body->nvIndex, buffer_space); - memset(&session_header, 0, sizeof(session_header)); - session_header.session_handle = TPM_RS_PW; - marshal_session_header(buffer, &session_header, buffer_space); - tpm_tag = TPM_ST_SESSIONS; + marshal_common_session_header(buffer, handles, + ARRAY_SIZE(handles), buffer_space); marshal_u16(buffer, command_body->size, buffer_space); marshal_u16(buffer, command_body->offset, buffer_space); } |