From patchwork Tue Aug 22 17:52:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jarkko Sakkinen X-Patchwork-Id: 13361268 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 89370EE49AE for ; Tue, 22 Aug 2023 17:53:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229623AbjHVRxE (ORCPT ); Tue, 22 Aug 2023 13:53:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46324 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229630AbjHVRxD (ORCPT ); Tue, 22 Aug 2023 13:53:03 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6D3C42D5E; Tue, 22 Aug 2023 10:52:52 -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 0147165D01; Tue, 22 Aug 2023 17:52:52 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 122E1C433C7; Tue, 22 Aug 2023 17:52:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692726771; bh=Dsse2EXPJm7afjD/S0aYe9v2HwReu5s8zAOGObwbpTY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mP40p1L8eBT57/1OVzjRwoYkjURWEYIIxNblts9y/gpvswwmNcJ7xhxPhjjtUzu6G TqwRbvWY9zj5RNUWalAVrIlcKJNbkP7apUWF2kiqaj9/r4hK+rl+Q/NCEhLWD9/6zz YOFqun03acTdvEuoINqJPodASvYatE9LTsBhszl1Mj3Qw26PO62vZksXfRGGDMIuK6 lY5s2EmqpUCxoXy/Hje+7/Zm62V+gBkd82OydCf3W7V1eGs/qhSW++52EGfWjfHV8T p7xfx5LSk/GHoLzRZ17O0p92ad8RaWDxFM6W+ebsxny8s02frtn8QgoX6B5fH1p6Lk CD/WASLtUuUGw== From: Jarkko Sakkinen To: linux-sgx@vger.kernel.org Cc: Jarkko Sakkinen , James Bottomley , William Roberts , Stefan Berger , David Howells , Jason Gunthorpe , Mimi Zohar , Peter Huewe , Jerry Snitselaar , Julien Gomes , Mario Limonciello , linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 5/6] tpm: Add tpm_buf_read_{u8,u16,u32} Date: Tue, 22 Aug 2023 20:52:20 +0300 Message-Id: <20230822175221.2196136-6-jarkko@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230822175221.2196136-1-jarkko@kernel.org> References: <20230822175221.2196136-1-jarkko@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-sgx@vger.kernel.org Add tpm_buf_read_u8(), tpm_buf_read_u16() and tpm_read_u32() for the sake of more convenient parsing of TPM responses. Signed-off-by: Jarkko Sakkinen --- drivers/char/tpm/tpm-buf.c | 69 ++++++++++++++++++++++++++++++++++++++ include/linux/tpm.h | 3 ++ 2 files changed, 72 insertions(+) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index f1d92d7e758d..bcd3cbcd9dd9 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -124,3 +124,72 @@ void tpm_buf_append_u32(struct tpm_buf *buf, const u32 value) tpm_buf_append(buf, (u8 *)&value2, 4); } EXPORT_SYMBOL_GPL(tpm_buf_append_u32); + +/** + * tpm_buf_read() - Read from a TPM buffer + * @buf: &tpm_buf instance + * @offset: offset within the buffer + * @count: the number of bytes to read + * @output: the output buffer + */ +static void tpm_buf_read(const struct tpm_buf *buf, off_t *offset, size_t count, void *output) +{ + if (*(offset + count) >= buf->length) { + WARN(1, "tpm_buf: overflow\n"); + return; + } + + memcpy(output, &buf->data[*offset], count); + *offset += count; +} + +/** + * tpm_buf_read_u8() - Read 8-bit word from a TPM buffer + * @buf: &tpm_buf instance + * @offset: offset within the buffer + * + * Return: next 8-bit word + */ +u8 tpm_buf_read_u8(const struct tpm_buf *buf, off_t *offset) +{ + u8 value; + + tpm_buf_read(buf, offset, sizeof(value), &value); + + return value; +} +EXPORT_SYMBOL_GPL(tpm_buf_read_u8); + +/** + * tpm_buf_read_u16() - Read 16-bit word from a TPM buffer + * @buf: &tpm_buf instance + * @offset: offset within the buffer + * + * Return: next 16-bit word + */ +u16 tpm_buf_read_u16(const struct tpm_buf *buf, off_t *offset) +{ + u16 value; + + tpm_buf_read(buf, offset, sizeof(value), &value); + + return be16_to_cpu(value); +} +EXPORT_SYMBOL_GPL(tpm_buf_read_u16); + +/** + * tpm_buf_read_u32() - Read 32-bit word from a TPM buffer + * @buf: &tpm_buf instance + * @offset: offset within the buffer + * + * Return: next 32-bit word + */ +u32 tpm_buf_read_u32(const struct tpm_buf *buf, off_t *offset) +{ + u32 value; + + tpm_buf_read(buf, offset, sizeof(value), &value); + + return be32_to_cpu(value); +} +EXPORT_SYMBOL_GPL(tpm_buf_read_u32); diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 687b5173bdab..6590bd1f0a0e 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -337,6 +337,9 @@ 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); +u8 tpm_buf_read_u8(const struct tpm_buf *buf, off_t *offset); +u16 tpm_buf_read_u16(const struct tpm_buf *buf, off_t *offset); +u32 tpm_buf_read_u32(const struct tpm_buf *buf, off_t *offset); /* * Check if TPM device is in the firmware upgrade mode.