From patchwork Mon Aug 21 03:36:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13359016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7405BEE4996 for ; Mon, 21 Aug 2023 03:36:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232653AbjHUDgs (ORCPT ); Sun, 20 Aug 2023 23:36:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33110 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230221AbjHUDgr (ORCPT ); Sun, 20 Aug 2023 23:36:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D44BCA1; Sun, 20 Aug 2023 20:36:45 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 5AE6F61E02; Mon, 21 Aug 2023 03:36:45 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37EB8C433C7; Mon, 21 Aug 2023 03:36:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692589004; bh=rjtncpc93tHE1DYcl0HjFew5WzgT41duth4IOU7U4j0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fM1CWBVRU/Y6LGVWYFMQuxd70EVJ2y7k8l4aHotq67TanxeGS8yKeEmFavXPxi6bd O6ohiH/E7/LIhgK/jeFQ+cLrify5UL0qAt1jxhepIKuEouQ2t4H9UZ8zPcWd9pkd25 Rm3Dqus37MRExy1KdTHFu26UJYYaw2fbDjYqIMPL8y5vU+gYptS/8T+f+1dvdUtURC yS/WO12eMSSNvXN/QYgwvIzEbv41xiChrrWgIb+fTQGUbUSPSpM6EEZAbL6dflRaas G6M/ZZiMYwRSIv9O2DkmGztkbPpN0RxyPdmGTZej/kyJGMRSTKLgOv0Ys7DN7cpacp QpclGMP4mgaRg== From: Jarkko Sakkinen To: linux-integrity@vger.kernel.org Cc: keyrings@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , Peter Huewe , Mario Limonciello , Jerry Snitselaar , Julien Gomes , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 1/5] tpm: Move buffer handling from static inlines to real functions Date: Mon, 21 Aug 2023 03:36:26 +0000 Message-Id: <20230821033630.1039527-2-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821033630.1039527-1-jarkko@kernel.org> References: <20230821033630.1039527-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: From: James Bottomley separate out the tpm_buf_... handling functions from static inlines in tpm.h and move them to their own tpm-buf.c file. This is a precursor to adding new functions for other TPM type handling because the amount of code will grow from the current 70 lines in tpm.h to about 200 lines when the additions are done. 200 lines of inline functions is a bit too much to keep in a header file. Signed-off-by: James Bottomley Signed-off-by: Jarkko Sakkinen --- v3: make tpm_buf_tag static v4: remove space after spdx tag v5: fix checkpatch.pl --strict issues --- drivers/char/tpm/Makefile | 1 + drivers/char/tpm/tpm-buf.c | 87 ++++++++++++++++++++++++++++++++++++++ include/linux/tpm.h | 86 ++++--------------------------------- 3 files changed, 97 insertions(+), 77 deletions(-) create mode 100644 drivers/char/tpm/tpm-buf.c diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile index 0222b1ddb310..ad3594e383e1 100644 --- a/drivers/char/tpm/Makefile +++ b/drivers/char/tpm/Makefile @@ -15,6 +15,7 @@ tpm-y += tpm-sysfs.o tpm-y += eventlog/common.o tpm-y += eventlog/tpm1.o tpm-y += eventlog/tpm2.o +tpm-y += tpm-buf.o tpm-$(CONFIG_ACPI) += tpm_ppi.o eventlog/acpi.o tpm-$(CONFIG_EFI) += eventlog/efi.o diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c new file mode 100644 index 000000000000..88ce1a5402de --- /dev/null +++ b/drivers/char/tpm/tpm-buf.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Handing for tpm_buf structures to facilitate the building of commands + */ + +#include +#include + +int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal) +{ + buf->data = (u8 *)__get_free_page(GFP_KERNEL); + if (!buf->data) + return -ENOMEM; + + buf->flags = 0; + tpm_buf_reset(buf, tag, ordinal); + return 0; +} +EXPORT_SYMBOL_GPL(tpm_buf_init); + +void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) +{ + struct tpm_header *head = (struct tpm_header *)buf->data; + + head->tag = cpu_to_be16(tag); + head->length = cpu_to_be32(sizeof(*head)); + head->ordinal = cpu_to_be32(ordinal); +} +EXPORT_SYMBOL_GPL(tpm_buf_reset); + +void tpm_buf_destroy(struct tpm_buf *buf) +{ + free_page((unsigned long)buf->data); +} +EXPORT_SYMBOL_GPL(tpm_buf_destroy); + +u32 tpm_buf_length(struct tpm_buf *buf) +{ + struct tpm_header *head = (struct tpm_header *)buf->data; + + return be32_to_cpu(head->length); +} +EXPORT_SYMBOL_GPL(tpm_buf_length); + +void tpm_buf_append(struct tpm_buf *buf, + const unsigned char *new_data, + unsigned int new_len) +{ + struct tpm_header *head = (struct tpm_header *)buf->data; + u32 len = tpm_buf_length(buf); + + /* Return silently if overflow has already happened. */ + if (buf->flags & TPM_BUF_OVERFLOW) + return; + + if ((len + new_len) > PAGE_SIZE) { + WARN(1, "tpm_buf: overflow\n"); + buf->flags |= TPM_BUF_OVERFLOW; + return; + } + + memcpy(&buf->data[len], new_data, new_len); + head->length = cpu_to_be32(len + new_len); +} +EXPORT_SYMBOL_GPL(tpm_buf_append); + +void tpm_buf_append_u8(struct tpm_buf *buf, const u8 value) +{ + tpm_buf_append(buf, &value, 1); +} +EXPORT_SYMBOL_GPL(tpm_buf_append_u8); + +void tpm_buf_append_u16(struct tpm_buf *buf, const u16 value) +{ + __be16 value2 = cpu_to_be16(value); + + tpm_buf_append(buf, (u8 *)&value2, 2); +} +EXPORT_SYMBOL_GPL(tpm_buf_append_u16); + +void tpm_buf_append_u32(struct tpm_buf *buf, const u32 value) +{ + __be32 value2 = cpu_to_be32(value); + + tpm_buf_append(buf, (u8 *)&value2, 4); +} +EXPORT_SYMBOL_GPL(tpm_buf_append_u32); diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 4ee9d13749ad..60032c60994b 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -326,84 +326,16 @@ struct tpm2_hash { unsigned int tpm_id; }; -static inline void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) -{ - struct tpm_header *head = (struct tpm_header *)buf->data; - - head->tag = cpu_to_be16(tag); - head->length = cpu_to_be32(sizeof(*head)); - head->ordinal = cpu_to_be32(ordinal); -} - -static inline int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal) -{ - buf->data = (u8 *)__get_free_page(GFP_KERNEL); - if (!buf->data) - return -ENOMEM; - - buf->flags = 0; - tpm_buf_reset(buf, tag, ordinal); - return 0; -} - -static inline void tpm_buf_destroy(struct tpm_buf *buf) -{ - free_page((unsigned long)buf->data); -} - -static inline u32 tpm_buf_length(struct tpm_buf *buf) -{ - struct tpm_header *head = (struct tpm_header *)buf->data; - - return be32_to_cpu(head->length); -} - -static inline u16 tpm_buf_tag(struct tpm_buf *buf) -{ - struct tpm_header *head = (struct tpm_header *)buf->data; - - return be16_to_cpu(head->tag); -} - -static inline void tpm_buf_append(struct tpm_buf *buf, - const unsigned char *new_data, - unsigned int new_len) -{ - struct tpm_header *head = (struct tpm_header *)buf->data; - u32 len = tpm_buf_length(buf); - - /* Return silently if overflow has already happened. */ - if (buf->flags & TPM_BUF_OVERFLOW) - return; - - if ((len + new_len) > PAGE_SIZE) { - WARN(1, "tpm_buf: overflow\n"); - buf->flags |= TPM_BUF_OVERFLOW; - return; - } - memcpy(&buf->data[len], new_data, new_len); - head->length = cpu_to_be32(len + new_len); -} - -static inline void tpm_buf_append_u8(struct tpm_buf *buf, const u8 value) -{ - tpm_buf_append(buf, &value, 1); -} - -static inline void tpm_buf_append_u16(struct tpm_buf *buf, const u16 value) -{ - __be16 value2 = cpu_to_be16(value); - - tpm_buf_append(buf, (u8 *) &value2, 2); -} - -static inline void tpm_buf_append_u32(struct tpm_buf *buf, const u32 value) -{ - __be32 value2 = cpu_to_be32(value); - - tpm_buf_append(buf, (u8 *) &value2, 4); -} +int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal); +void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); +void tpm_buf_destroy(struct tpm_buf *buf); +u32 tpm_buf_length(struct tpm_buf *buf); +void tpm_buf_append(struct tpm_buf *buf, const unsigned char *new_data, + unsigned int new_len); +void tpm_buf_append_u8(struct tpm_buf *buf, const u8 value); +void tpm_buf_append_u16(struct tpm_buf *buf, const u16 value); +void tpm_buf_append_u32(struct tpm_buf *buf, const u32 value); /* * Check if TPM device is in the firmware upgrade mode. From patchwork Mon Aug 21 03:36:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13359017 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E8E5CEE49AA for ; Mon, 21 Aug 2023 03:36:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232663AbjHUDgx (ORCPT ); Sun, 20 Aug 2023 23:36:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230221AbjHUDgx (ORCPT ); Sun, 20 Aug 2023 23:36:53 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AE1AFAC; Sun, 20 Aug 2023 20:36:50 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3D98862353; Mon, 21 Aug 2023 03:36:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 23AD0C433C9; Mon, 21 Aug 2023 03:36:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692589009; bh=Hv2OSi7qojvJHq5rNjLhjxVGjBjVTETYsYf+BneI5lI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ESWTceI3q93NWrLrb1sDoBnO1ki2HSVgfG7trpvCVqgMCB7lgBfdvKNUQhu2wYJVD K0LBlxMMvJ2jGZ6X2Fx1ztv18e+tAV1ZkAcA2+ixLPYJyqPg+tnwFToJCZDOkG4E8Z yW00OAFEtofWV6fXEo5s+Mx7kdxG6XiC61Bohj+QK0hQzClp4llFZVblDTDAE3qDlK +bYGm+3xg7yOg7mJ5QXm4ugbZpgkkItd4VutjwiK/1NeTHvoJ+GLphztQiWb5Luhjd eM7Y6EbHC5YOylNnxLwH6mRDBajFqO+qnYRya80a/Gfdd6YiN2Dt39qISmIgfQE3Tn vxoR7i4jnHnbw== From: Jarkko Sakkinen To: linux-integrity@vger.kernel.org Cc: keyrings@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , Peter Huewe , James Bottomley , Paul Moore , James Morris , "Serge E. Hallyn" , Julien Gomes , Jerry Snitselaar , Mario Limonciello , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 2/5] tpm: Store TPM buffer length Date: Mon, 21 Aug 2023 03:36:27 +0000 Message-Id: <20230821033630.1039527-3-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821033630.1039527-1-jarkko@kernel.org> References: <20230821033630.1039527-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: Both TPM commands and sized buffers (TPM2B) have a fixed size header, which is followed by the body. Store TPM buffer length to a new field in the struct tpm_buf. The invariant here is that the length field must always contain the total length of the buffer, i.e. the sum header and body length. The value must then be mapped to the length representation of the buffer type, and this correspondence must be maintained. Signed-off-by: Jarkko Sakkinen --- drivers/char/tpm/tpm-buf.c | 36 ++++++++++++++++------- drivers/char/tpm/tpm-interface.c | 18 +++++++++--- include/linux/tpm.h | 10 +++---- security/keys/trusted-keys/trusted_tpm1.c | 8 ++--- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 88ce1a5402de..8dc6b9db006b 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -18,6 +18,12 @@ int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal) } EXPORT_SYMBOL_GPL(tpm_buf_init); +/** + * tpm_buf_reset() - Initialize a TPM command + * @buf: A @tpm_buf + * @tag: TPM_TAG_RQU_COMMAND, TPM2_ST_NO_SESSIONS or TPM2_ST_SESSIONS + * @ordinal: A command ordinal + */ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) { struct tpm_header *head = (struct tpm_header *)buf->data; @@ -25,6 +31,8 @@ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) head->tag = cpu_to_be16(tag); head->length = cpu_to_be32(sizeof(*head)); head->ordinal = cpu_to_be32(ordinal); + + buf->length = sizeof(*head); } EXPORT_SYMBOL_GPL(tpm_buf_reset); @@ -34,33 +42,41 @@ void tpm_buf_destroy(struct tpm_buf *buf) } EXPORT_SYMBOL_GPL(tpm_buf_destroy); +/** + * tpm_buf_length() - Return the number of bytes consumed by the buffer + * + * Return: The number of bytes consumed by the buffer + */ u32 tpm_buf_length(struct tpm_buf *buf) { - struct tpm_header *head = (struct tpm_header *)buf->data; - - return be32_to_cpu(head->length); + return buf->length; } EXPORT_SYMBOL_GPL(tpm_buf_length); -void tpm_buf_append(struct tpm_buf *buf, - const unsigned char *new_data, - unsigned int new_len) +/** + * tpm_buf_append() - Append data to an initialized buffer + * @buf: A &tpm_buf + * @new_data: A data blob + * @new_length: Size of the appended data + */ + +void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length) { struct tpm_header *head = (struct tpm_header *)buf->data; - u32 len = tpm_buf_length(buf); /* Return silently if overflow has already happened. */ if (buf->flags & TPM_BUF_OVERFLOW) return; - if ((len + new_len) > PAGE_SIZE) { + if ((buf->length + new_length) > PAGE_SIZE) { WARN(1, "tpm_buf: overflow\n"); buf->flags |= TPM_BUF_OVERFLOW; return; } - memcpy(&buf->data[len], new_data, new_len); - head->length = cpu_to_be32(len + new_len); + memcpy(&buf->data[buf->length], new_data, new_length); + buf->length += new_length; + head->length = cpu_to_be32(buf->length); } EXPORT_SYMBOL_GPL(tpm_buf_append); diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c index 586ca10b0d72..1fe0a5ef49ab 100644 --- a/drivers/char/tpm/tpm-interface.c +++ b/drivers/char/tpm/tpm-interface.c @@ -217,6 +217,9 @@ ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_buf *buf, int err; ssize_t len; + /* The recorded length is expected to match the command length: */ + WARN_ON(buf->length != be32_to_cpu(header->length)); + len = tpm_transmit(chip, buf->data, PAGE_SIZE); if (len < 0) return len; @@ -232,6 +235,11 @@ ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_buf *buf, if (len < min_rsp_body_length + TPM_HEADER_SIZE) return -EFAULT; + buf->length = len; + + /* The recorded length is expected to match the response length: */ + WARN_ON(buf->length != be32_to_cpu(header->length)); + return 0; } EXPORT_SYMBOL_GPL(tpm_transmit_cmd); @@ -345,12 +353,12 @@ EXPORT_SYMBOL_GPL(tpm_pcr_extend); /** * tpm_send - send a TPM command * @chip: a &struct tpm_chip instance, %NULL for the default chip - * @cmd: a TPM command buffer - * @buflen: the length of the TPM command buffer + * @data: command blob + * @cmdlen: length of the command * * Return: same as with tpm_transmit_cmd() */ -int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) +int tpm_send(struct tpm_chip *chip, void *data, size_t length) { struct tpm_buf buf; int rc; @@ -359,7 +367,9 @@ int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) if (!chip) return -ENODEV; - buf.data = cmd; + buf.flags = 0; + buf.length = length; + buf.data = data; rc = tpm_transmit_cmd(chip, &buf, 0, "attempting to a send a command"); tpm_put_ops(chip); diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 60032c60994b..3cfe2aeb1d9a 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -307,7 +307,8 @@ enum tpm_buf_flags { }; struct tpm_buf { - unsigned int flags; + u32 flags; + u16 length; u8 *data; }; @@ -331,8 +332,7 @@ int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal); void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); void tpm_buf_destroy(struct tpm_buf *buf); u32 tpm_buf_length(struct tpm_buf *buf); -void tpm_buf_append(struct tpm_buf *buf, const unsigned char *new_data, - unsigned int new_len); +void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length); void tpm_buf_append_u8(struct tpm_buf *buf, const u8 value); void tpm_buf_append_u16(struct tpm_buf *buf, const u16 value); void tpm_buf_append_u32(struct tpm_buf *buf, const u32 value); @@ -361,7 +361,7 @@ extern int tpm_pcr_read(struct tpm_chip *chip, u32 pcr_idx, struct tpm_digest *digest); extern int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, struct tpm_digest *digests); -extern int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen); +int tpm_send(struct tpm_chip *chip, void *data, size_t length); extern int tpm_get_random(struct tpm_chip *chip, u8 *data, size_t max); extern struct tpm_chip *tpm_default_chip(void); void tpm2_flush_context(struct tpm_chip *chip, u32 handle); @@ -382,7 +382,7 @@ static inline int tpm_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, return -ENODEV; } -static inline int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen) +static inline int tpm_send(struct tpm_chip *chip, void *data, size_t length) { return -ENODEV; } diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c index aa108bea6739..7c1515014a5d 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -407,7 +407,7 @@ static int osap(struct tpm_buf *tb, struct osapsess *s, tpm_buf_append_u32(tb, handle); tpm_buf_append(tb, ononce, TPM_NONCE_SIZE); - ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE); + ret = trusted_tpm_send(tb->data, tb->length); if (ret < 0) return ret; @@ -431,7 +431,7 @@ int oiap(struct tpm_buf *tb, uint32_t *handle, unsigned char *nonce) return -ENODEV; tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OIAP); - ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE); + ret = trusted_tpm_send(tb->data, tb->length); if (ret < 0) return ret; @@ -543,7 +543,7 @@ static int tpm_seal(struct tpm_buf *tb, uint16_t keytype, tpm_buf_append_u8(tb, cont); tpm_buf_append(tb, td->pubauth, SHA1_DIGEST_SIZE); - ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE); + ret = trusted_tpm_send(tb->data, tb->length); if (ret < 0) goto out; @@ -634,7 +634,7 @@ static int tpm_unseal(struct tpm_buf *tb, tpm_buf_append_u8(tb, cont); tpm_buf_append(tb, authdata2, SHA1_DIGEST_SIZE); - ret = trusted_tpm_send(tb->data, MAX_BUF_SIZE); + ret = trusted_tpm_send(tb->data, tb->length); if (ret < 0) { pr_info("authhmac failed (%d)\n", ret); return ret; From patchwork Mon Aug 21 03:36:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13359018 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C03AFEE49A6 for ; Mon, 21 Aug 2023 03:37:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232678AbjHUDhB (ORCPT ); Sun, 20 Aug 2023 23:37:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33736 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232672AbjHUDhA (ORCPT ); Sun, 20 Aug 2023 23:37:00 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A9912B8; Sun, 20 Aug 2023 20:36:55 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 393E062353; Mon, 21 Aug 2023 03:36:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1F228C433CC; Mon, 21 Aug 2023 03:36:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692589014; bh=zuJ2/94LtenthFJwiFNqhl0mmdGYejJg0F7VpNtM9aM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NanCR7rTf+QOPamr49xOv7Cu8pmJZZ4IntMA+ZDYYfszE9D5re+lNp6vQCc5PvONR 5zbMMOVs0FfHaRLz0Gk2DDbBg2CPUmvf/HgGs8KKecTu8J+ZJJ7HsppYjbBdLtw3zI /0mkF3uJDil2fz6kUWMdZs6Eub2m4GZlBChTsDrE8IGz0O3WFt5frevalSKGzlX8Sb xs8w4WtKoy5UfZcE2xWyaZiMXuxn2BMm9gI1KSNu08Ayh41tmYKaEss7uRiVy8j/+q Jl/jMV26qhGooAKFwY/7xvmS5QVt4sUiSPssMC/qdx4nQCk27pLiW88PwcoCJzsXn5 GwIF9xDTMLdWQ== From: Jarkko Sakkinen To: linux-integrity@vger.kernel.org Cc: keyrings@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , Peter Huewe , James Bottomley , Paul Moore , James Morris , "Serge E. Hallyn" , Mario Limonciello , Julien Gomes , Jerry Snitselaar , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 3/5] tpm: Detach tpm_buf_reset() from tpm_buf_init() Date: Mon, 21 Aug 2023 03:36:28 +0000 Message-Id: <20230821033630.1039527-4-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821033630.1039527-1-jarkko@kernel.org> References: <20230821033630.1039527-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: In order to use tpm_buf_init() for other buffer types, detach tpm_buf_reset() from tpm_buf_init(). Signed-off-by: Jarkko Sakkinen --- drivers/char/tpm/tpm-buf.c | 15 ++++++++-- drivers/char/tpm/tpm-sysfs.c | 3 +- drivers/char/tpm/tpm1-cmd.c | 26 +++++++++++----- drivers/char/tpm/tpm2-cmd.c | 36 ++++++++++++++++------- drivers/char/tpm/tpm2-space.c | 7 +++-- drivers/char/tpm/tpm_vtpm_proxy.c | 13 ++++---- include/linux/tpm.h | 2 +- security/keys/trusted-keys/trusted_tpm1.c | 4 +-- security/keys/trusted-keys/trusted_tpm2.c | 9 ++++-- 9 files changed, 80 insertions(+), 35 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 8dc6b9db006b..fa9a4c51157a 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -6,14 +6,25 @@ #include #include -int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal) +/** + * tpm_buf_init() - Initialize from the heap + * @buf: A @tpm_buf + * + * Initialize all structure fields to zero, allocate a page from the heap, and + * zero the bytes that the buffer headers will consume. + * + * Return: 0 or -ENOMEM + */ +int tpm_buf_init(struct tpm_buf *buf) { buf->data = (u8 *)__get_free_page(GFP_KERNEL); if (!buf->data) return -ENOMEM; buf->flags = 0; - tpm_buf_reset(buf, tag, ordinal); + buf->length = TPM_HEADER_SIZE; + memset(buf->data, 0, TPM_HEADER_SIZE); + return 0; } EXPORT_SYMBOL_GPL(tpm_buf_init); diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index 54c71473aa29..557e7f86d98d 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -44,9 +44,10 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, if (tpm_try_get_ops(chip)) return 0; - if (tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK)) + if (tpm_buf_init(&tpm_buf)) goto out_ops; + tpm_buf_reset(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK); tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay)); if (tpm_transmit_cmd(chip, &tpm_buf, READ_PUBEK_RESULT_MIN_BODY_SIZE, diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index cf64c7385105..28fea4e2daaf 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -328,10 +328,11 @@ static int tpm1_startup(struct tpm_chip *chip) dev_info(&chip->dev, "starting up the TPM manually\n"); - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_STARTUP); + rc = tpm_buf_init(&buf); if (rc < 0) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_STARTUP); tpm_buf_append_u16(&buf, TPM_ST_CLEAR); rc = tpm_transmit_cmd(chip, &buf, 0, "attempting to start the TPM"); @@ -466,10 +467,11 @@ int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_EXTEND); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_EXTEND); tpm_buf_append_u32(&buf, pcr_idx); tpm_buf_append(&buf, hash, TPM_DIGEST_SIZE); @@ -485,10 +487,12 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP); + if (subcap_id == TPM_CAP_VERSION_1_1 || subcap_id == TPM_CAP_VERSION_1_2) { tpm_buf_append_u32(&buf, subcap_id); @@ -537,10 +541,12 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) u32 recd; int rc; - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); + do { tpm_buf_append_u32(&buf, num_bytes); @@ -586,10 +592,11 @@ int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCRREAD); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCRREAD); tpm_buf_append_u32(&buf, pcr_idx); rc = tpm_transmit_cmd(chip, &buf, TPM_DIGEST_SIZE, @@ -622,10 +629,12 @@ static int tpm1_continue_selftest(struct tpm_chip *chip) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_CONTINUE_SELFTEST); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_CONTINUE_SELFTEST); + rc = tpm_transmit_cmd(chip, &buf, 0, "continue selftest"); tpm_buf_destroy(&buf); return rc; @@ -752,9 +761,12 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr) rc = tpm1_pcr_extend(chip, tpm_suspend_pcr, dummy_hash, "extending dummy pcr before suspend"); - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); + rc = tpm_buf_init(&buf); if (rc) return rc; + + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); + /* now do the actual savestate */ for (try = 0; try < TPM_RETRY; try++) { rc = tpm_transmit_cmd(chip, &buf, 0, NULL); diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index 93545be190a5..94dacbf74e0d 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c @@ -183,10 +183,12 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, expected_digest_size = chip->allocated_banks[i].digest_size; } - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_PCR_READ); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_PCR_READ); + pcr_select[pcr_idx >> 3] = 1 << (pcr_idx & 0x7); tpm_buf_append_u32(&buf, 1); @@ -240,10 +242,11 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, int rc; int i; - rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_PCR_EXTEND); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_PCR_EXTEND); tpm_buf_append_u32(&buf, pcr_idx); auth_area.handle = cpu_to_be32(TPM2_RS_PW); @@ -299,7 +302,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) if (!num_bytes || max > TPM_MAX_RNG_DATA) return -EINVAL; - err = tpm_buf_init(&buf, 0, 0); + err = tpm_buf_init(&buf); if (err) return err; @@ -350,13 +353,14 @@ void tpm2_flush_context(struct tpm_chip *chip, u32 handle) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_FLUSH_CONTEXT); + rc = tpm_buf_init(&buf); if (rc) { dev_warn(&chip->dev, "0x%08x was not flushed, out of memory\n", handle); return; } + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_FLUSH_CONTEXT); tpm_buf_append_u32(&buf, handle); tpm_transmit_cmd(chip, &buf, 0, "flushing context"); @@ -390,9 +394,11 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id, u32 *value, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); + rc = tpm_buf_init(&buf); if (rc) return rc; + + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES); tpm_buf_append_u32(&buf, property_id); tpm_buf_append_u32(&buf, 1); @@ -431,9 +437,11 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SHUTDOWN); + rc = tpm_buf_init(&buf); if (rc) return; + + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SHUTDOWN); tpm_buf_append_u16(&buf, shutdown_type); tpm_transmit_cmd(chip, &buf, 0, "stopping the TPM"); tpm_buf_destroy(&buf); @@ -459,10 +467,11 @@ static int tpm2_do_selftest(struct tpm_chip *chip) int rc; for (full = 0; full < 2; full++) { - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SELF_TEST); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SELF_TEST); tpm_buf_append_u8(&buf, full); rc = tpm_transmit_cmd(chip, &buf, 0, "attempting the self test"); @@ -495,9 +504,11 @@ int tpm2_probe(struct tpm_chip *chip) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); + rc = tpm_buf_init(&buf); if (rc) return rc; + + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES); tpm_buf_append_u32(&buf, TPM_PT_TOTAL_COMMANDS); tpm_buf_append_u32(&buf, 1); @@ -560,10 +571,11 @@ ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) int rc; int i = 0; - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); tpm_buf_append_u32(&buf, TPM2_CAP_PCRS); tpm_buf_append_u32(&buf, 0); tpm_buf_append_u32(&buf, 1); @@ -649,10 +661,11 @@ int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) goto out; } - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); + rc = tpm_buf_init(&buf); if (rc) goto out; + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); tpm_buf_append_u32(&buf, TPM2_CAP_COMMANDS); tpm_buf_append_u32(&buf, TPM2_CC_FIRST); tpm_buf_append_u32(&buf, nr_commands); @@ -711,10 +724,11 @@ static int tpm2_startup(struct tpm_chip *chip) dev_info(&chip->dev, "starting up the TPM manually\n"); - rc = tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_STARTUP); + rc = tpm_buf_init(&buf); if (rc < 0) return rc; + tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_STARTUP); tpm_buf_append_u16(&buf, TPM2_SU_CLEAR); rc = tpm_transmit_cmd(chip, &buf, 0, "attempting to start the TPM"); tpm_buf_destroy(&buf); diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c index ffb35f0154c1..4538178e398c 100644 --- a/drivers/char/tpm/tpm2-space.c +++ b/drivers/char/tpm/tpm2-space.c @@ -76,10 +76,12 @@ static int tpm2_load_context(struct tpm_chip *chip, u8 *buf, unsigned int body_size; int rc; - rc = tpm_buf_init(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_LOAD); + rc = tpm_buf_init(&tbuf); if (rc) return rc; + tpm_buf_reset(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_LOAD); + ctx = (struct tpm2_context *)&buf[*offset]; body_size = sizeof(*ctx) + be16_to_cpu(ctx->blob_size); tpm_buf_append(&tbuf, &buf[*offset], body_size); @@ -126,10 +128,11 @@ static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf, unsigned int body_size; int rc; - rc = tpm_buf_init(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_SAVE); + rc = tpm_buf_init(&tbuf); if (rc) return rc; + tpm_buf_reset(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_SAVE); tpm_buf_append_u32(&tbuf, handle); rc = tpm_transmit_cmd(chip, &tbuf, 0, NULL); diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c index 30e953988cab..b2b9a15a4a59 100644 --- a/drivers/char/tpm/tpm_vtpm_proxy.c +++ b/drivers/char/tpm/tpm_vtpm_proxy.c @@ -399,14 +399,15 @@ static int vtpm_proxy_request_locality(struct tpm_chip *chip, int locality) const struct tpm_header *header; struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); - if (chip->flags & TPM_CHIP_FLAG_TPM2) - rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, - TPM2_CC_SET_LOCALITY); - else - rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, - TPM_ORD_SET_LOCALITY); + rc = tpm_buf_init(&buf); if (rc) return rc; + + if (chip->flags & TPM_CHIP_FLAG_TPM2) + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_SET_LOCALITY); + else + tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SET_LOCALITY); + tpm_buf_append_u8(&buf, locality); proxy_dev->state |= STATE_DRIVER_COMMAND; diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 3cfe2aeb1d9a..c355597351c6 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -328,7 +328,7 @@ struct tpm2_hash { }; -int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal); +int tpm_buf_init(struct tpm_buf *buf); void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); void tpm_buf_destroy(struct tpm_buf *buf); u32 tpm_buf_length(struct tpm_buf *buf); diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c index 7c1515014a5d..fcf0eef79ba0 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -664,7 +664,7 @@ static int key_seal(struct trusted_key_payload *p, struct tpm_buf tb; int ret; - ret = tpm_buf_init(&tb, 0, 0); + ret = tpm_buf_init(&tb); if (ret) return ret; @@ -690,7 +690,7 @@ static int key_unseal(struct trusted_key_payload *p, struct tpm_buf tb; int ret; - ret = tpm_buf_init(&tb, 0, 0); + ret = tpm_buf_init(&tb); if (ret) return ret; diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trusted-keys/trusted_tpm2.c index bc700f85f80b..c54659d06dcb 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -252,12 +252,13 @@ int tpm2_seal_trusted(struct tpm_chip *chip, if (rc) return rc; - rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE); + rc = tpm_buf_init(&buf); if (rc) { tpm_put_ops(chip); return rc; } + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE); tpm_buf_append_u32(&buf, options->keyhandle); tpm2_buf_append_auth(&buf, TPM2_RS_PW, NULL /* nonce */, 0, @@ -409,10 +410,11 @@ static int tpm2_load_cmd(struct tpm_chip *chip, if (blob_len > payload->blob_len) return -E2BIG; - rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_LOAD); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_LOAD); tpm_buf_append_u32(&buf, options->keyhandle); tpm2_buf_append_auth(&buf, TPM2_RS_PW, NULL /* nonce */, 0, @@ -465,10 +467,11 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, u8 *data; int rc; - rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); + rc = tpm_buf_init(&buf); if (rc) return rc; + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); tpm_buf_append_u32(&buf, blob_handle); tpm2_buf_append_auth(&buf, options->policyhandle ? From patchwork Mon Aug 21 03:36:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13359019 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A2A2EE49AB for ; Mon, 21 Aug 2023 03:37:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232675AbjHUDhK (ORCPT ); Sun, 20 Aug 2023 23:37:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45208 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232683AbjHUDhJ (ORCPT ); Sun, 20 Aug 2023 23:37:09 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CF67A1; Sun, 20 Aug 2023 20:37:00 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id DC527612BF; Mon, 21 Aug 2023 03:36:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E7ABEC433C7; Mon, 21 Aug 2023 03:36:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692589019; bh=QIX6HWfuBu8ysTl9xaEzm8Nky/AQwBgCKGJVjIFJw/k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cskFIhi7fxPTfx8Y04Ium/cCO1m5NcgqM2KOJ5LHPyaDGi7DKqq8bi/4LIVsDF3cA qUj+s/q4BnhAlx9PNqda8z569WAumXsY5WYIwDGv7jd5lG6yibSEOm+exw2gaSLJq9 BTwTmboxNAzImTUcvLMxRHwFJtwXqLf0PldIKJ3Rt+2D6mR5etmy4NFKciOEt5UUjx cUYfjCHq0llbhuTal/XqCfebwufzSep/vCJkotel9aem9otfeITDQJv3Ft79cjmuzL FZ9eOFPAVxdtlR6o5UcJ1CNrozxVU1Te4t+zu3UBes9D6mt/PAphM8GjJ7xz7lMQjU KQNrz/RJRQPUw== From: Jarkko Sakkinen To: linux-integrity@vger.kernel.org Cc: keyrings@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , Peter Huewe , James Bottomley , Paul Moore , James Morris , "Serge E. Hallyn" , Mario Limonciello , Julien Gomes , Jerry Snitselaar , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 4/5] tpm: Support TPM2 sized buffers (TPM2B) Date: Mon, 21 Aug 2023 03:36:29 +0000 Message-Id: <20230821033630.1039527-5-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821033630.1039527-1-jarkko@kernel.org> References: <20230821033630.1039527-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: Add boolean parameters @alloc and @sized to tpm_buf_init(): * If @alloc is set to false, buf->data is assumed to be pre-feeded and owned by the caller. * If @sized is set to true, the buffer represents a sized buffer (TPM2B). Signed-off-by: Jarkko Sakkinen --- drivers/char/tpm/tpm-buf.c | 32 ++++++++++++++++------- drivers/char/tpm/tpm-sysfs.c | 2 +- drivers/char/tpm/tpm1-cmd.c | 14 +++++----- drivers/char/tpm/tpm2-cmd.c | 22 ++++++++-------- drivers/char/tpm/tpm2-space.c | 4 +-- drivers/char/tpm/tpm_vtpm_proxy.c | 2 +- include/linux/tpm.h | 3 ++- security/keys/trusted-keys/trusted_tpm1.c | 4 +-- security/keys/trusted-keys/trusted_tpm2.c | 6 ++--- 9 files changed, 51 insertions(+), 38 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index fa9a4c51157a..f1d92d7e758d 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -7,22 +7,32 @@ #include /** - * tpm_buf_init() - Initialize from the heap + * tpm_buf_init() - Initialize a TPM buffer * @buf: A @tpm_buf + * @sized: Represent a sized buffer (TPM2B) + * @alloc: Allocate from the heap * * Initialize all structure fields to zero, allocate a page from the heap, and * zero the bytes that the buffer headers will consume. * * Return: 0 or -ENOMEM */ -int tpm_buf_init(struct tpm_buf *buf) +int tpm_buf_init(struct tpm_buf *buf, bool alloc, bool sized) { - buf->data = (u8 *)__get_free_page(GFP_KERNEL); - if (!buf->data) - return -ENOMEM; + if (alloc) { + buf->data = (u8 *)__get_free_page(GFP_KERNEL); + if (!buf->data) + return -ENOMEM; + } + + if (sized) { + buf->flags = TPM_BUF_SIZED; + buf->length = 2; + } else { + buf->flags = 0; + buf->length = TPM_HEADER_SIZE; + } - buf->flags = 0; - buf->length = TPM_HEADER_SIZE; memset(buf->data, 0, TPM_HEADER_SIZE); return 0; @@ -73,8 +83,6 @@ EXPORT_SYMBOL_GPL(tpm_buf_length); void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length) { - struct tpm_header *head = (struct tpm_header *)buf->data; - /* Return silently if overflow has already happened. */ if (buf->flags & TPM_BUF_OVERFLOW) return; @@ -87,7 +95,11 @@ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length) memcpy(&buf->data[buf->length], new_data, new_length); buf->length += new_length; - head->length = cpu_to_be32(buf->length); + + if (buf->flags & TPM_BUF_SIZED) + ((__be16 *)buf->data)[0] = cpu_to_be16(buf->length - 2); + else + ((struct tpm_header *)buf->data)->length = cpu_to_be32(buf->length); } EXPORT_SYMBOL_GPL(tpm_buf_append); diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index 557e7f86d98d..047a7064039e 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -44,7 +44,7 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, if (tpm_try_get_ops(chip)) return 0; - if (tpm_buf_init(&tpm_buf)) + if (tpm_buf_init(&tpm_buf, true, false)) goto out_ops; tpm_buf_reset(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK); diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index 28fea4e2daaf..396694018590 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -328,7 +328,7 @@ static int tpm1_startup(struct tpm_chip *chip) dev_info(&chip->dev, "starting up the TPM manually\n"); - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc < 0) return rc; @@ -467,7 +467,7 @@ int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -487,7 +487,7 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -541,7 +541,7 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) u32 recd; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -592,7 +592,7 @@ int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -629,7 +629,7 @@ static int tpm1_continue_selftest(struct tpm_chip *chip) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -761,7 +761,7 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr) rc = tpm1_pcr_extend(chip, tpm_suspend_pcr, dummy_hash, "extending dummy pcr before suspend"); - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index 94dacbf74e0d..1d3e0833641d 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c @@ -183,7 +183,7 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, expected_digest_size = chip->allocated_banks[i].digest_size; } - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -242,7 +242,7 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, int rc; int i; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -302,7 +302,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) if (!num_bytes || max > TPM_MAX_RNG_DATA) return -EINVAL; - err = tpm_buf_init(&buf); + err = tpm_buf_init(&buf, true, false); if (err) return err; @@ -353,7 +353,7 @@ void tpm2_flush_context(struct tpm_chip *chip, u32 handle) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) { dev_warn(&chip->dev, "0x%08x was not flushed, out of memory\n", handle); @@ -394,7 +394,7 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id, u32 *value, struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -437,7 +437,7 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return; @@ -467,7 +467,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip) int rc; for (full = 0; full < 2; full++) { - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -504,7 +504,7 @@ int tpm2_probe(struct tpm_chip *chip) struct tpm_buf buf; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -571,7 +571,7 @@ ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) int rc; int i = 0; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -661,7 +661,7 @@ int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) goto out; } - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) goto out; @@ -724,7 +724,7 @@ static int tpm2_startup(struct tpm_chip *chip) dev_info(&chip->dev, "starting up the TPM manually\n"); - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc < 0) return rc; diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c index 4538178e398c..115feb334c68 100644 --- a/drivers/char/tpm/tpm2-space.c +++ b/drivers/char/tpm/tpm2-space.c @@ -76,7 +76,7 @@ static int tpm2_load_context(struct tpm_chip *chip, u8 *buf, unsigned int body_size; int rc; - rc = tpm_buf_init(&tbuf); + rc = tpm_buf_init(&tbuf, true, false); if (rc) return rc; @@ -128,7 +128,7 @@ static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf, unsigned int body_size; int rc; - rc = tpm_buf_init(&tbuf); + rc = tpm_buf_init(&tbuf, true, false); if (rc) return rc; diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c index b2b9a15a4a59..52325abd395d 100644 --- a/drivers/char/tpm/tpm_vtpm_proxy.c +++ b/drivers/char/tpm/tpm_vtpm_proxy.c @@ -399,7 +399,7 @@ static int vtpm_proxy_request_locality(struct tpm_chip *chip, int locality) const struct tpm_header *header; struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev); - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; diff --git a/include/linux/tpm.h b/include/linux/tpm.h index c355597351c6..687b5173bdab 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -304,6 +304,7 @@ struct tpm_header { enum tpm_buf_flags { TPM_BUF_OVERFLOW = BIT(0), + TPM_BUF_SIZED = BIT(1), }; struct tpm_buf { @@ -328,7 +329,7 @@ struct tpm2_hash { }; -int tpm_buf_init(struct tpm_buf *buf); +int tpm_buf_init(struct tpm_buf *buf, bool alloc, bool sized); void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); void tpm_buf_destroy(struct tpm_buf *buf); u32 tpm_buf_length(struct tpm_buf *buf); diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c index fcf0eef79ba0..ed5dc3b45d52 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -664,7 +664,7 @@ static int key_seal(struct trusted_key_payload *p, struct tpm_buf tb; int ret; - ret = tpm_buf_init(&tb); + ret = tpm_buf_init(&tb, true, false); if (ret) return ret; @@ -690,7 +690,7 @@ static int key_unseal(struct trusted_key_payload *p, struct tpm_buf tb; int ret; - ret = tpm_buf_init(&tb); + ret = tpm_buf_init(&tb, true, false); if (ret) return ret; diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trusted-keys/trusted_tpm2.c index c54659d06dcb..c41f30770138 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -252,7 +252,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip, if (rc) return rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) { tpm_put_ops(chip); return rc; @@ -410,7 +410,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip, if (blob_len > payload->blob_len) return -E2BIG; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; @@ -467,7 +467,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, u8 *data; int rc; - rc = tpm_buf_init(&buf); + rc = tpm_buf_init(&buf, true, false); if (rc) return rc; From patchwork Mon Aug 21 03:36:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13359020 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83EB7EE49AA for ; Mon, 21 Aug 2023 03:37:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232693AbjHUDhQ (ORCPT ); Sun, 20 Aug 2023 23:37:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41076 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232690AbjHUDhQ (ORCPT ); Sun, 20 Aug 2023 23:37:16 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D720C3; Sun, 20 Aug 2023 20:37:03 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3AED262804; Mon, 21 Aug 2023 03:37:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1D7B6C43391; Mon, 21 Aug 2023 03:37:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692589022; bh=AKMF8KXh+pmIVW6h4ohhXyQ9DGyfVE6RymaY/KQPYCQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EubgdrJUSCHZfCrpraRuVYG7rwWw6Koko7iAOP7H5+J+1bztSkD5/WQyfW1ian1pv O0yIXeQBI86iWXDuLFb1aCvQAq57AJ5Vo5PxYRO9G49azuG/nMX1jDMnOWsr7c3H++ oO4d6nC1r+LvWA+BxrdCgYTg4LFDle0kImlwIxMxCfPrgh+sy4oeFxM6NkMAAYsXJE qqNVpI54fLoz2IUvJuBZRXizfC0LDCZmd8HQ99ta9vcF3CSzs/KrBePx80Dkf2yykw NpBbsZQ1b8ypDHODPwCueUBASbyvEGg+69J0W/n6/yntD+5nTTU1k+wxuY5gdxk0wB vWBfaduBPSe3g== From: Jarkko Sakkinen To: linux-integrity@vger.kernel.org Cc: keyrings@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , James Bottomley , Paul Moore , James Morris , "Serge E. Hallyn" , linux-kernel@vger.kernel.org (open list) Subject: [PATCH 5/5] KEYS: trusted: tpm2: Use struct tpm_buf for sized buffers Date: Mon, 21 Aug 2023 03:36:30 +0000 Message-Id: <20230821033630.1039527-6-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230821033630.1039527-1-jarkko@kernel.org> References: <20230821033630.1039527-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: Take advantage of the new sized buffer (TPM2B) mode of struct tpm_buf in tpm2_seal_trusted(). This allows to add robustness to the command construction without requiring to calculate buffer sizes manually. Signed-off-by: Jarkko Sakkinen --- security/keys/trusted-keys/trusted_tpm2.c | 42 ++++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trusted-keys/trusted_tpm2.c index c41f30770138..a976de3c28ae 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -228,8 +228,8 @@ int tpm2_seal_trusted(struct tpm_chip *chip, struct trusted_key_payload *payload, struct trusted_key_options *options) { + struct tpm_buf buf, sized; int blob_len = 0; - struct tpm_buf buf; u32 hash; u32 flags; int i; @@ -258,6 +258,13 @@ int tpm2_seal_trusted(struct tpm_chip *chip, return rc; } + rc = tpm_buf_init(&sized, true, true); + if (rc) { + tpm_buf_destroy(&buf); + tpm_put_ops(chip); + return rc; + } + tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE); tpm_buf_append_u32(&buf, options->keyhandle); tpm2_buf_append_auth(&buf, TPM2_RS_PW, @@ -267,36 +274,36 @@ int tpm2_seal_trusted(struct tpm_chip *chip, TPM_DIGEST_SIZE); /* sensitive */ - tpm_buf_append_u16(&buf, 4 + options->blobauth_len + payload->key_len); + tpm_buf_append_u16(&sized, options->blobauth_len); - tpm_buf_append_u16(&buf, options->blobauth_len); if (options->blobauth_len) - tpm_buf_append(&buf, options->blobauth, options->blobauth_len); + tpm_buf_append(&sized, options->blobauth, options->blobauth_len); - tpm_buf_append_u16(&buf, payload->key_len); - tpm_buf_append(&buf, payload->key, payload->key_len); + tpm_buf_append_u16(&sized, payload->key_len); + tpm_buf_append(&sized, payload->key, payload->key_len); + tpm_buf_append(&buf, sized.data, sized.length); /* public */ - tpm_buf_append_u16(&buf, 14 + options->policydigest_len); - tpm_buf_append_u16(&buf, TPM_ALG_KEYEDHASH); - tpm_buf_append_u16(&buf, hash); + tpm_buf_init(&sized, false, true); + tpm_buf_append_u16(&sized, TPM_ALG_KEYEDHASH); + tpm_buf_append_u16(&sized, hash); /* key properties */ flags = 0; flags |= options->policydigest_len ? 0 : TPM2_OA_USER_WITH_AUTH; - flags |= payload->migratable ? 0 : (TPM2_OA_FIXED_TPM | - TPM2_OA_FIXED_PARENT); - tpm_buf_append_u32(&buf, flags); + flags |= payload->migratable ? 0 : (TPM2_OA_FIXED_TPM | TPM2_OA_FIXED_PARENT); + tpm_buf_append_u32(&sized, flags); /* policy */ - tpm_buf_append_u16(&buf, options->policydigest_len); + tpm_buf_append_u16(&sized, options->policydigest_len); if (options->policydigest_len) - tpm_buf_append(&buf, options->policydigest, - options->policydigest_len); + tpm_buf_append(&sized, options->policydigest, options->policydigest_len); /* public parameters */ - tpm_buf_append_u16(&buf, TPM_ALG_NULL); - tpm_buf_append_u16(&buf, 0); + tpm_buf_append_u16(&sized, TPM_ALG_NULL); + tpm_buf_append_u16(&sized, 0); + + tpm_buf_append(&buf, sized.data, sized.length); /* outside info */ tpm_buf_append_u16(&buf, 0); @@ -328,6 +335,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip, blob_len); out: + tpm_buf_destroy(&sized); tpm_buf_destroy(&buf); if (rc > 0) {