From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pj1-f47.google.com (mail-pj1-f47.google.com [209.85.216.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F05CF3C7DF0 for ; Sat, 11 Jul 2026 16:01:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785678; cv=none; b=AxlaE/eJMhym8VutT4MoCbIiBnd81q43TkcPpus9T7QD3fsJ4xSh/fdngm/nxsxQJAU+jlQli3DKxTwz6aBdR3PapdYLnw9uLXBygWvIeYPZapcx8HlJZgFN+EfT8JD+e9tDPkkkO614iL6a3UeQNJTrAAPo4hBmKaXzKERrOv8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785678; c=relaxed/simple; bh=EoUUqjZYbOtXIHZLtFz07ku884IQ3g6CHyUbrcA60Bc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oYrDGhi07oKUtTwHN7dwnJggS7C2h91opEEU+EYf5QI0w2O6FVWCw4P2RrgN/F8bJthz43Cooa8XRhFvsMOZto+j592IjzhzpFJUicuH9+JNYPPMYElp4AGZRsWy9XCh+VVRsGrvTHhM9KlPHTdhNIUE/YaTwLwBnopiAs9Ma7Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=E3I3cJgm; arc=none smtp.client-ip=209.85.216.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="E3I3cJgm" Received: by mail-pj1-f47.google.com with SMTP id 98e67ed59e1d1-3811f512167so2381875a91.3 for ; Sat, 11 Jul 2026 09:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785676; x=1784390476; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ZjmfOUOJML2D2cy2d1JFAGzOl9Dis6s/LeoJt74YybY=; b=E3I3cJgmGCJCvODzN0XZFToodG6Pea2HPYmVs/QzXdjYZDCll/9BGXUzhXSm7bTHu1 yAnXn5gsVybI+1DerBypM6FSlrkSBlxhrfPu4Thp2LqGR97qlJvr5cKbJHfMDGJ0V5RY Kw6n2wF7N1xc6m0DR+IBiU0ReVKl94t1mt+j5UAfmsRfoHURWNOiV6nUkdk5CD7K2cz8 KPodvg+gSKiQanMaUlpR6IV0KZr9jh5B5RQzVRtYXj3bBBQ99dE2QG2mTs6w11KCRRf2 IT6/mA+psoI+4OuAsDsB3x9Gny/3047Hg1OjI2WdnS8Gn7620G4bntNd1lPxcx8Hq53I TToA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785676; x=1784390476; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ZjmfOUOJML2D2cy2d1JFAGzOl9Dis6s/LeoJt74YybY=; b=AuD/3cwx2GCfiEF4gtvCiYTDCUe0+UiauJ+80JS/zYuuV8OPS+bh5ht5Qn9EX/w2Bq x/zDEoZWZTxB0FgyJflWsgoC8I3PZiCavDSaBxpe8R6m/2OjOl08T5laNyUwE0z192ty Cen4x4q53H/EPHmkBWIocfjf6yQMx7bxLGfCBOVhry2ei+01MvpoZEna1K8hZWOw7UV/ JUmV3Qs+EPhe6mcGGrSOpPm6WhV07BECKepfJkMx9MlAebgeDbkTF9hsikwPQi2udWX3 4A1RSG5gT7klbuWp3wDsWx82X2pwtVZgcqtzFVy5g6s+ySSrF8dK4Axz6KV6RrJr7dCq 97Ww== X-Gm-Message-State: AOJu0Yxh3odUvCuWCenASezv/ttgnuoR1BcRl5MsfHF8GULxIg+ZtcMR IBNpYNpmoE4aYpU+Y9G5eP3PWuhdPCoKQw5uJ2mdmK8GB5YxNXXsd/bSlHgqgPFR X-Gm-Gg: AfdE7cnmdRmB50Bgp8SNgInN8d9p5bBCl1ofNt68DCI1EmQZhyt5tQ5QUDze7mp8HLr QyBWK9OA8D7nOctkmoSAAAAkdoMXhKwMWbKkty4OYcPnFjVKnhRNuyvL+l7oxMOFz+GTZ/f2Nhs H+Mce6ZRrInxZETYuL9iBtDIDBJjOcFFG7yl3JyOiIEqDZwyxy5PRiUXCb/oMeZXl4g7eUdVpen G1rNWHt6mObUiAv3DnWPYOucsG5nlshKXc5vwN7Y6LwY5Z9SleqK3aWtx151PBambiGt3GZ/Wo+ OpSHabHNfgeDHQpwzkTGRRvKbooxhWuZskhdTXd73qLT4blKGsfFJH1KGbN94ZCXhKGf4kCvJQJ F+V1dNcJRndECLp/lS+8M8ItqxRaVK6LB9och/+FkYasnT+uDpqHZ1fUeK4Som8GjadIkOiCvDf Rq8Qk2Qy0V4nsUpYSfmS1k X-Received: by 2002:a17:90b:530d:b0:387:e0cb:c8da with SMTP id 98e67ed59e1d1-38dc777c380mr3618351a91.35.1783785676250; Sat, 11 Jul 2026 09:01:16 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-31174ac14f2sm55943287eec.27.2026.07.11.09.01.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:15 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 01/10] tpm: Initial step to reorganize TPM public headers Date: Sat, 11 Jul 2026 09:01:01 -0700 Message-ID: <20260711160110.267780-2-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Consolidate TPM1 constants in tpm_command.h and remove duplicate constants from tpm1-cmd.c. Co-developed-by: Daniel P. Smith Signed-off-by: Daniel P. Smith Co-developed-by: Alec Brown Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm-buf.c | 1 - drivers/char/tpm/tpm1-cmd.c | 14 +------- include/keys/trusted_tpm.h | 1 - include/linux/tpm.h | 2 ++ include/linux/tpm_command.h | 41 ++++++++++++++++------- security/keys/trusted-keys/trusted_tpm1.c | 1 - security/keys/trusted-keys/trusted_tpm2.c | 1 - 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index dc882fc9fa9e..4c4f450630df 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -3,7 +3,6 @@ * Handling of TPM command and other buffers. */ =20 -#include #include #include =20 diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index b49a790f1bd5..664ca1fff2e8 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -22,8 +22,6 @@ =20 #include "tpm.h" =20 -#define TPM_MAX_ORDINAL 243 - /* * Array with one entry per ordinal defining the maximum amount * of time the chip could take to return the result. The ordinal @@ -308,9 +306,6 @@ unsigned long tpm1_calc_ordinal_duration(struct tpm_chi= p *chip, u32 ordinal) return duration; } =20 -#define TPM_ORD_STARTUP 153 -#define TPM_ST_CLEAR 1 - /** * tpm1_startup() - turn on the TPM * @chip: TPM chip to use @@ -459,7 +454,6 @@ int tpm1_get_timeouts(struct tpm_chip *chip) return 0; } =20 -#define TPM_ORD_PCR_EXTEND 20 int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash, const char *log_msg) { @@ -478,7 +472,6 @@ int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,= const u8 *hash, return rc; } =20 -#define TPM_ORD_GET_CAP 101 ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, const char *desc, size_t min_cap_length) { @@ -511,7 +504,6 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_i= d, cap_t *cap, } EXPORT_SYMBOL_GPL(tpm1_getcap); =20 -#define TPM_ORD_GET_RANDOM 70 struct tpm1_get_random_out { __be32 rng_data_len; u8 rng_data[TPM_MAX_RNG_DATA]; @@ -580,13 +572,12 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, = size_t max) return rc; } =20 -#define TPM_ORD_PCRREAD 21 int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf) { struct tpm_buf buf; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCRREAD); + rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_READ); if (rc) return rc; =20 @@ -609,7 +600,6 @@ int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u= 8 *res_buf) return rc; } =20 -#define TPM_ORD_CONTINUE_SELFTEST 83 /** * tpm1_continue_selftest() - run TPM's selftest * @chip: TPM chip to use @@ -726,8 +716,6 @@ int tpm1_auto_startup(struct tpm_chip *chip) return rc; } =20 -#define TPM_ORD_SAVESTATE 152 - /** * tpm1_pm_suspend() - pm suspend handler * @chip: TPM chip to use. diff --git a/include/keys/trusted_tpm.h b/include/keys/trusted_tpm.h index 0fadc6a4f166..3a0fa3bc8454 100644 --- a/include/keys/trusted_tpm.h +++ b/include/keys/trusted_tpm.h @@ -3,7 +3,6 @@ #define __TRUSTED_TPM_H =20 #include -#include =20 extern struct trusted_key_ops trusted_key_tpm_ops; =20 diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 202da079d500..1846d5485a2c 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -25,6 +25,8 @@ #include #include =20 +#include + #define TPM_DIGEST_SIZE 20 /* Max TPM v1.2 PCR size */ =20 #define TPM2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE diff --git a/include/linux/tpm_command.h b/include/linux/tpm_command.h index f5c03e9c3913..174b043d8bbc 100644 --- a/include/linux/tpm_command.h +++ b/include/linux/tpm_command.h @@ -3,27 +3,42 @@ #define __LINUX_TPM_COMMAND_H__ =20 /* - * TPM Command constants from specifications at - * http://www.trustedcomputinggroup.org + * =3D=3D TPM 1 Family Chips =3D=3D + * + * TPM 1.2 Main Specification: + * https://trustedcomputinggroup.org/resource/tpm-main-specification/ */ =20 +#define TPM_MAX_ORDINAL 243 + /* Command TAGS */ -#define TPM_TAG_RQU_COMMAND 193 -#define TPM_TAG_RQU_AUTH1_COMMAND 194 -#define TPM_TAG_RQU_AUTH2_COMMAND 195 -#define TPM_TAG_RSP_COMMAND 196 -#define TPM_TAG_RSP_AUTH1_COMMAND 197 -#define TPM_TAG_RSP_AUTH2_COMMAND 198 +enum tpm_command_tags { + TPM_TAG_RQU_COMMAND =3D 193, + TPM_TAG_RQU_AUTH1_COMMAND =3D 194, + TPM_TAG_RQU_AUTH2_COMMAND =3D 195, + TPM_TAG_RSP_COMMAND =3D 196, + TPM_TAG_RSP_AUTH1_COMMAND =3D 197, + TPM_TAG_RSP_AUTH2_COMMAND =3D 198, +}; =20 /* Command Ordinals */ -#define TPM_ORD_GETRANDOM 70 -#define TPM_ORD_OSAP 11 -#define TPM_ORD_OIAP 10 -#define TPM_ORD_SEAL 23 -#define TPM_ORD_UNSEAL 24 +enum tpm_command_ordinals { + TPM_ORD_CONTINUE_SELFTEST =3D 83, + TPM_ORD_GET_CAP =3D 101, + TPM_ORD_GET_RANDOM =3D 70, + TPM_ORD_PCR_EXTEND =3D 20, + TPM_ORD_PCR_READ =3D 21, + TPM_ORD_OSAP =3D 11, + TPM_ORD_OIAP =3D 10, + TPM_ORD_SAVESTATE =3D 152, + TPM_ORD_SEAL =3D 23, + TPM_ORD_STARTUP =3D 153, + TPM_ORD_UNSEAL =3D 24, +}; =20 /* Other constants */ #define SRKHANDLE 0x40000000 #define TPM_NONCE_SIZE 20 +#define TPM_ST_CLEAR 1 =20 #endif diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trus= ted-keys/trusted_tpm1.c index 13513819991e..331b1bad6581 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -18,7 +18,6 @@ #include #include #include -#include =20 #include =20 diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trus= ted-keys/trusted_tpm2.c index 6340823f8b53..29d79c05ed6b 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -9,7 +9,6 @@ #include #include #include -#include =20 #include #include --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A179F3C661A for ; Sat, 11 Jul 2026 16:01:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785682; cv=none; b=KLR0Hx4LsqqPZn4GtRG3hz4pfcs4knpRI/Mp4rkXRQy6daVc6rrRjlRa7MfqaYMbP5iH2v/kRak+4UWQljaGcGtzc5tJVvdU1RM0D0HhQS3WQKkog8v+V0/h4uWmPJe8zX8xPMiYsCVe2mzZhUR3ZWQntoHi88xndUB/e9UZjVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785682; c=relaxed/simple; bh=J+MrCWSPV4ZCMimU6UsgunNV7ZySwc54ShRN1XmqoDE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LM9hKdqMrX/60Z3BrblytiDbF+LP+B4Slft3kJOudycfT/f7Mtje1azSTgYurPMUw+M2y5ZLy/QB6OniTi6Hu6pVCpVpxoabwEhNSvrAvNyRElCj6UkV3t/D7SuUhbNPTR2/QEHT2bynMb+OpsvXEGvzyadboMPldnC5UXuG6rY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=o40VIej+; arc=none smtp.client-ip=209.85.216.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="o40VIej+" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-384930ca5e2so2161360a91.3 for ; Sat, 11 Jul 2026 09:01:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785680; x=1784390480; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=opJhpuuk9zMrojs3AlImH5S6+0xC78C9deSZHIirR/U=; b=o40VIej+Ncu9MwTWcaY0oIn+pb5b/jjY040EiW3R0dQoC2M5zuOSJXXopRHi7rXm0Y wsLYZrYiN+nSxdiwzhszgsI/wAKIDzdLwX61xGWsFRW4g3Qsl2/qbv8mFL0NpYpEOvvm gHfbw/9zqc5k77FqIBcd1DhnCxJOGucVhaiK/LAgOMN26UR8RcFuEz1GskH/iF//GvO3 CKF1JhCPnaU2URpfsQrBL9aEADM3yuXwlkJBnI5yVwcww6WNEOomraxCWMR5+uLg6Wqj 3bgPsetHII39NyT+TjwyiGwWu0A8PVThzFeM290MyMO9Gz1r2NnWqlEZ4SRuUPFKv3LR fieg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785680; x=1784390480; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=opJhpuuk9zMrojs3AlImH5S6+0xC78C9deSZHIirR/U=; b=FaJkIskq62Jq9GbLNVRWK8bILlxkfBN5f8f3k9sAvUdeu6f/5ljB6I5N0cyN1V57A+ zMKVk0tKteRDslmHzwm4Jp/TBzR1FD/0FlOsu6xdBMHdwXaZ3O4Z7NZ1FrYVuaux8YNw YXroV639TvELxhhQFeWa2Ad1MjI27R8Y2OAkIv5QM9k7sggPNuj8uM91q+hu2N+vMAVn EAgr5sk1Hl2150fbZu2GzINjbR72o3uvDgJdgahUjREvuvbKS8w2b9XWfzv/0uEHuID1 txSKt4DUhLsGOFqXtzecgPjxRnWPMJhw3sOEK4Z8VyFxdOpF72SXHF9RHw1w3Xz9hJRl 03qw== X-Gm-Message-State: AOJu0YxOI5/Pw5kDvUWmjVbl8S97vSx+T7gdiZ6/Bx5wCpCV3Z5Mm1JL ApGKjgvOvYzjxx3nEykOh2R+9k7xY9Mp038SfX29X+ICJDGj6LahrJv+LsYD5/cg X-Gm-Gg: AfdE7ckE7/StD2Tgw9Kww3ez0OmniVDDpOuQx+P7rb5UrJyCgPj8a8eQOMDuvzeDkch bCqllDGVSFEBVk3IQTBDWlP3XVE3UtTWvWPY2az6FV+F7tA4cVh4fGCUY0R2FWPt/VvOESbaY7f GF4FNiPIqb4lHiV2FZazbJshXLxgdO5XoMw9sH2s07ma3hP89eCVq8oEJcOnS5Gj1cWuhyF9nCi GO5A66q/1np9WAm9i3/ocoJ6ydMya2aLuNFNvAvWv9qKYCFhJBwwtB3EeqZ0oI+XdTXkiyt/vcq 2/uf2N9cueeiz3ZvelZjnutiyxeYM5n4/IYE0TgkoC2OwDoCtA5n3z6qOa+AZqhuDF7Gkc+hExE swXKbOnVU14JsrXzOI5KhRSD/dss84quer0cEPrZEqNRwkuGSgvrEGdrxZwhFSE53HbqQzdmX54 ieJdHgRwzfhDEaz4Emiy1z X-Received: by 2002:a17:90b:2242:b0:381:85c0:1d9d with SMTP id 98e67ed59e1d1-38dc777b8b5mr3314540a91.27.1783785679745; Sat, 11 Jul 2026 09:01:19 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3118ee6080dsm36313014eec.17.2026.07.11.09.01.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:19 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 02/10] tpm: Move TPM1 specific definitions to the command header Date: Sat, 11 Jul 2026 09:01:02 -0700 Message-ID: <20260711160110.267780-3-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Gather all the TPM1 definitions and structures from the internal header file drivers/char/tpm/tpm.h into the command header. In addition, bring in the single RNG structure from tpm1-cmd.c. The definitions moved to these files correspond to the TCG specification for TPM 1 family: TPM 1.2 Main Specification - https://trustedcomputinggroup.org/resource/tpm-main-specification/ Co-developed-by: Daniel P. Smith Signed-off-by: Daniel P. Smith Co-developed-by: Alec Brown Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm.h | 102 -------------------------------- drivers/char/tpm/tpm1-cmd.c | 5 -- include/linux/tpm_command.h | 115 ++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+), 107 deletions(-) diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 87d68ddf270a..043d78a9617a 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -52,105 +52,9 @@ enum tpm_addr { TPM_ADDR =3D 0x4E, }; =20 -#define TPM_WARN_RETRY 0x800 -#define TPM_WARN_DOING_SELFTEST 0x802 -#define TPM_ERR_DEACTIVATED 0x6 -#define TPM_ERR_DISABLED 0x7 -#define TPM_ERR_FAILEDSELFTEST 0x1C -#define TPM_ERR_INVALID_POSTINIT 38 - -#define TPM_TAG_RQU_COMMAND 193 - /* TPM2 specific constants. */ #define TPM2_SPACE_BUFFER_SIZE 16384 /* 16 kB */ =20 -struct stclear_flags_t { - __be16 tag; - u8 deactivated; - u8 disableForceClear; - u8 physicalPresence; - u8 physicalPresenceLock; - u8 bGlobalLock; -} __packed; - -struct tpm1_version { - u8 major; - u8 minor; - u8 rev_major; - u8 rev_minor; -} __packed; - -struct tpm1_version2 { - __be16 tag; - struct tpm1_version version; -} __packed; - -struct timeout_t { - __be32 a; - __be32 b; - __be32 c; - __be32 d; -} __packed; - -struct duration_t { - __be32 tpm_short; - __be32 tpm_medium; - __be32 tpm_long; -} __packed; - -struct permanent_flags_t { - __be16 tag; - u8 disable; - u8 ownership; - u8 deactivated; - u8 readPubek; - u8 disableOwnerClear; - u8 allowMaintenance; - u8 physicalPresenceLifetimeLock; - u8 physicalPresenceHWEnable; - u8 physicalPresenceCMDEnable; - u8 CEKPUsed; - u8 TPMpost; - u8 TPMpostLock; - u8 FIPS; - u8 operator; - u8 enableRevokeEK; - u8 nvLocked; - u8 readSRKPub; - u8 tpmEstablished; - u8 maintenanceDone; - u8 disableFullDALogicInfo; -} __packed; - -typedef union { - struct permanent_flags_t perm_flags; - struct stclear_flags_t stclear_flags; - __u8 owned; - __be32 num_pcrs; - struct tpm1_version version1; - struct tpm1_version2 version2; - __be32 manufacturer_id; - struct timeout_t timeout; - struct duration_t duration; -} cap_t; - -enum tpm_capabilities { - TPM_CAP_FLAG =3D 4, - TPM_CAP_PROP =3D 5, - TPM_CAP_VERSION_1_1 =3D 0x06, - TPM_CAP_VERSION_1_2 =3D 0x1A, -}; - -enum tpm_sub_capabilities { - TPM_CAP_PROP_PCR =3D 0x101, - TPM_CAP_PROP_MANUFACTURER =3D 0x103, - TPM_CAP_FLAG_PERM =3D 0x108, - TPM_CAP_FLAG_VOL =3D 0x109, - TPM_CAP_PROP_OWNER =3D 0x111, - TPM_CAP_PROP_TIS_TIMEOUT =3D 0x115, - TPM_CAP_PROP_TIS_DURATION =3D 0x120, -}; - enum tpm2_pt_props { TPM2_PT_NONE =3D 0x00000000, TPM2_PT_GROUP =3D 0x00000100, @@ -225,12 +129,6 @@ enum tpm2_pt_props { TPM2_PT_AUDIT_COUNTER_1 =3D TPM2_PT_VAR + 20, }; =20 -/* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - = 18 - * bytes, but 128 is still a relatively large number of random bytes and - * anything much bigger causes users of struct tpm_cmd_t to start getting - * compiler warnings about stack frame size. */ -#define TPM_MAX_RNG_DATA 128 - extern const struct class tpm_class; extern const struct class tpmrm_class; extern dev_t tpm_devt; diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index 664ca1fff2e8..96f189b5fd6f 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -504,11 +504,6 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_= id, cap_t *cap, } EXPORT_SYMBOL_GPL(tpm1_getcap); =20 -struct tpm1_get_random_out { - __be32 rng_data_len; - u8 rng_data[TPM_MAX_RNG_DATA]; -} __packed; - /** * tpm1_get_random() - get random bytes from the TPM's RNG * @chip: a &struct tpm_chip instance diff --git a/include/linux/tpm_command.h b/include/linux/tpm_command.h index 174b043d8bbc..30d01953a6f8 100644 --- a/include/linux/tpm_command.h +++ b/include/linux/tpm_command.h @@ -36,6 +36,121 @@ enum tpm_command_ordinals { TPM_ORD_UNSEAL =3D 24, }; =20 +enum tpm_capabilities { + TPM_CAP_FLAG =3D 4, + TPM_CAP_PROP =3D 5, + TPM_CAP_VERSION_1_1 =3D 0x06, + TPM_CAP_VERSION_1_2 =3D 0x1A, +}; + +enum tpm_sub_capabilities { + TPM_CAP_PROP_PCR =3D 0x101, + TPM_CAP_PROP_MANUFACTURER =3D 0x103, + TPM_CAP_FLAG_PERM =3D 0x108, + TPM_CAP_FLAG_VOL =3D 0x109, + TPM_CAP_PROP_OWNER =3D 0x111, + TPM_CAP_PROP_TIS_TIMEOUT =3D 0x115, + TPM_CAP_PROP_TIS_DURATION =3D 0x120, +}; + +/* Return Codes */ +enum tpm_return_codes { + TPM_BASE_MASK =3D 0, + TPM_NON_FATAL_MASK =3D 0x00000800, + TPM_SUCCESS =3D TPM_BASE_MASK + 0, + TPM_ERR_DEACTIVATED =3D TPM_BASE_MASK + 6, + TPM_ERR_DISABLED =3D TPM_BASE_MASK + 7, + TPM_ERR_FAIL =3D TPM_BASE_MASK + 9, + TPM_ERR_FAILEDSELFTEST =3D TPM_BASE_MASK + 28, + TPM_ERR_INVALID_POSTINIT =3D TPM_BASE_MASK + 38, + TPM_ERR_INVALID_FAMILY =3D TPM_BASE_MASK + 55, + TPM_WARN_RETRY =3D TPM_BASE_MASK + TPM_NON_FATAL_MASK + 0, + TPM_WARN_DOING_SELFTEST =3D TPM_BASE_MASK + TPM_NON_FATAL_MASK + 2, +}; + +struct stclear_flags_t { + __be16 tag; + u8 deactivated; + u8 disableForceClear; + u8 physicalPresence; + u8 physicalPresenceLock; + u8 bGlobalLock; +} __packed; + +struct tpm1_version { + u8 major; + u8 minor; + u8 rev_major; + u8 rev_minor; +} __packed; + +struct tpm1_version2 { + __be16 tag; + struct tpm1_version version; +} __packed; + +struct timeout_t { + __be32 a; + __be32 b; + __be32 c; + __be32 d; +} __packed; + +struct duration_t { + __be32 tpm_short; + __be32 tpm_medium; + __be32 tpm_long; +} __packed; + +struct permanent_flags_t { + __be16 tag; + u8 disable; + u8 ownership; + u8 deactivated; + u8 readPubek; + u8 disableOwnerClear; + u8 allowMaintenance; + u8 physicalPresenceLifetimeLock; + u8 physicalPresenceHWEnable; + u8 physicalPresenceCMDEnable; + u8 CEKPUsed; + u8 TPMpost; + u8 TPMpostLock; + u8 FIPS; + u8 operator; + u8 enableRevokeEK; + u8 nvLocked; + u8 readSRKPub; + u8 tpmEstablished; + u8 maintenanceDone; + u8 disableFullDALogicInfo; +} __packed; + +typedef union { + struct permanent_flags_t perm_flags; + struct stclear_flags_t stclear_flags; + __u8 owned; + __be32 num_pcrs; + struct tpm1_version version1; + struct tpm1_version2 version2; + __be32 manufacturer_id; + struct timeout_t timeout; + struct duration_t duration; +} cap_t; + +/* + * 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - = 18 + * bytes, but 128 is still a relatively large number of random bytes and + * anything much bigger causes users of struct tpm_cmd_t to start getting + * compiler warnings about stack frame size. + */ +#define TPM_MAX_RNG_DATA 128 + +struct tpm1_get_random_out { + __be32 rng_data_len; + u8 rng_data[TPM_MAX_RNG_DATA]; +} __packed; + /* Other constants */ #define SRKHANDLE 0x40000000 #define TPM_NONCE_SIZE 20 --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B9A313CA4AF for ; Sat, 11 Jul 2026 16:01:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785685; cv=none; b=bmFMYn5SyGwLkzuHjSwQ7ovAVfBYLoHK2smn1uQ30MWqujJpbKbeqU70SIKx2UBlRQCZbxkppCDgA53qyoIWP5RfIQzYRYB/GPGvTWdoBcbrUhCwToczu4OZCpz61cqeJxlu3fXhFA8K1aKx7gujibLYMo+pZ4aHw50ZZ5VKyxw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785685; c=relaxed/simple; bh=MW5vwa/xxN279qXJ/ncdVlQ+CMbXD49NpEFaBeZ7WCU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cJxIYItUK3RSA3uvnVIFfnXvOj4wU12FTsuL5t9NKh5NRwAZdvd1svaVTDhXGF2GE91EdQmeD/rbl/vxEJNh6ybgfLnRxV/OJl/AiLyTejMyxgMoKyBZbMwzeCfK9wFsdaklsl0uT311edODFEft5xH51BoPAZKCT/BdMhL5THc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ECHZ14e4; arc=none smtp.client-ip=209.85.216.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ECHZ14e4" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-37df72c9984so3231022a91.3 for ; Sat, 11 Jul 2026 09:01:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785683; x=1784390483; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=+wXH+VZFISmrEli7nt1s186UA+OwPFAZ3gli8Wbbz+8=; b=ECHZ14e4JGukXwcJm0zHXTxhnZBEpZ19F8IVvVYCJ83zNLVHxpQ3qqzjCC9hBmrYoT 3cOKRLfCxnSfyY5qj7f7LJeBAan32DNriuppqHSsPHRzOlmEQBnvNZCBcIPAu5SYXWX3 b6L/UXrXIVvI8+spBOwmElElET1GagDzGy06vcu3DVh/b92Arx3mxQukG6H0Y6PzMJAD Txu6I1R3OQFBQk9vClsa8oG6i8Uil90pJcoaCnJe2ijwq1nB/NIVcNE9yBimGF69tV4u TjsUGDO1QDLmZXZ/Pi0twuVkmegMwIFHE7LwfLV3MiKlpquzrzMhPpVKHz+bXN97TjRJ Mt9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785683; x=1784390483; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=+wXH+VZFISmrEli7nt1s186UA+OwPFAZ3gli8Wbbz+8=; b=qhFHeoHuMkbRtG3wTQhvhwyVsuLYiyaRSLph1bn4wVEkWDkp3T5+fSx14g6Cv+BLvL lX2ab/Lk1jKOVWS/yNt0i7aESZZNZviLQYf/M3rLO8RgmkZF/GsHO4Y2ACC5GDtZ6nYx qIUb4cUz1NBIcrYtBhZDLnZDmUjmf/axeAm0OcSNyBBytL+utpvlsWHUN2XYFAN5MCOn TQMjtJPXAqbEukBN2JeIn2WeAPRMiOTnaCJtwcsryMCSmF+gCnGBq60IM0CqeMdwi0lB H0m5AjF8JyvEpAUlOeax+g5YX66hf62MspnoQ/4ZhjpSXr8SjMqyU6Otwat91iOq1JwS KorA== X-Gm-Message-State: AOJu0Yy2M8M0flBD0dXZ3lKapJOS6FSAbwxXDAca2RJRWGcGqIZuIIb1 0F+1iClTxvn0UeBKZGaRwsd8Zv4JcozfHHPvTkDoIYOBAQDSSX3/mpCYjESpTSBM X-Gm-Gg: AfdE7ckqBSRgFzqGGFJpFaVzJoymqKDsvo+tuZB8NoTSLbiVnzW+0+9zteORXunOVAk cIL50sGVQUThjtYgCGVnHhMGGZrKJeXBvfBiLCf+HgLsqtlpJFzC1sEodVJJCRiR6EtXB1eYq/K 9MfQFbJA7YrY2a3ASPl2IFw/6cSCDGeLnXbdERG9PsC1bL2UOUsd3D2NU+6kyp51jtGhFOiQ/28 4B0wRGBMASaGkkSNvUS3YFL9y8ikAunWEXRYJDTHRAGFypTlqcE9A+E44pbO8C+CUlhc/egH823 8mXEKxsAxWdtJf0UywX9mBIpN0ZBJvP4J+PjqVRhNT90QwynfD3DC0CVJ+M5HFU6Slh5FqR962r bXuKZ7LxxvxIPsFtV78aOf0JgY5ipY8ZNkzwgMJg3m2/kZ+1cOoEtVp9zn3zEx+qL1TbQzOJZ6T O0iSaw/ill7t1i74sOB2TT X-Received: by 2002:a17:90a:c884:b0:387:e0cb:7f6 with SMTP id 98e67ed59e1d1-38dc78443a4mr3138556a91.42.1783785683016; Sat, 11 Jul 2026 09:01:23 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-313af819732sm20391907eec.16.2026.07.11.09.01.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:22 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 03/10] tpm: Move TPM2 specific definitions to the command header Date: Sat, 11 Jul 2026 09:01:03 -0700 Message-ID: <20260711160110.267780-4-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Gather all the TPM2 definitions and structures in the internal header file drivers/char/tpm/tpm.h into the command header, including: - Command codes, return codes and definitions from the public and internal tpm.h files. - Structures defined in numerous TPM driver C modules. The definitions moved to these files correspond to the TCG specification for TPM 2 family: TPM 2.0 Library - https://trustedcomputinggroup.org/resource/tpm-library-specification/ Co-developed-by: Daniel P. Smith Signed-off-by: Daniel P. Smith Co-developed-by: Alec Brown Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm.h | 77 ---------- drivers/char/tpm/tpm2-cmd.c | 30 ---- drivers/char/tpm/tpm2-space.c | 13 -- include/linux/tpm.h | 145 ------------------ include/linux/tpm_command.h | 271 ++++++++++++++++++++++++++++++++++ 5 files changed, 271 insertions(+), 265 deletions(-) diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 043d78a9617a..680f89d9c9f9 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -52,83 +52,6 @@ enum tpm_addr { TPM_ADDR =3D 0x4E, }; =20 -/* TPM2 specific constants. */ -#define TPM2_SPACE_BUFFER_SIZE 16384 /* 16 kB */ - -enum tpm2_pt_props { - TPM2_PT_NONE =3D 0x00000000, - TPM2_PT_GROUP =3D 0x00000100, - TPM2_PT_FIXED =3D TPM2_PT_GROUP * 1, - TPM2_PT_FAMILY_INDICATOR =3D TPM2_PT_FIXED + 0, - TPM2_PT_LEVEL =3D TPM2_PT_FIXED + 1, - TPM2_PT_REVISION =3D TPM2_PT_FIXED + 2, - TPM2_PT_DAY_OF_YEAR =3D TPM2_PT_FIXED + 3, - TPM2_PT_YEAR =3D TPM2_PT_FIXED + 4, - TPM2_PT_MANUFACTURER =3D TPM2_PT_FIXED + 5, - TPM2_PT_VENDOR_STRING_1 =3D TPM2_PT_FIXED + 6, - TPM2_PT_VENDOR_STRING_2 =3D TPM2_PT_FIXED + 7, - TPM2_PT_VENDOR_STRING_3 =3D TPM2_PT_FIXED + 8, - TPM2_PT_VENDOR_STRING_4 =3D TPM2_PT_FIXED + 9, - TPM2_PT_VENDOR_TPM_TYPE =3D TPM2_PT_FIXED + 10, - TPM2_PT_FIRMWARE_VERSION_1 =3D TPM2_PT_FIXED + 11, - TPM2_PT_FIRMWARE_VERSION_2 =3D TPM2_PT_FIXED + 12, - TPM2_PT_INPUT_BUFFER =3D TPM2_PT_FIXED + 13, - TPM2_PT_HR_TRANSIENT_MIN =3D TPM2_PT_FIXED + 14, - TPM2_PT_HR_PERSISTENT_MIN =3D TPM2_PT_FIXED + 15, - TPM2_PT_HR_LOADED_MIN =3D TPM2_PT_FIXED + 16, - TPM2_PT_ACTIVE_SESSIONS_MAX =3D TPM2_PT_FIXED + 17, - TPM2_PT_PCR_COUNT =3D TPM2_PT_FIXED + 18, - TPM2_PT_PCR_SELECT_MIN =3D TPM2_PT_FIXED + 19, - TPM2_PT_CONTEXT_GAP_MAX =3D TPM2_PT_FIXED + 20, - TPM2_PT_NV_COUNTERS_MAX =3D TPM2_PT_FIXED + 22, - TPM2_PT_NV_INDEX_MAX =3D TPM2_PT_FIXED + 23, - TPM2_PT_MEMORY =3D TPM2_PT_FIXED + 24, - TPM2_PT_CLOCK_UPDATE =3D TPM2_PT_FIXED + 25, - TPM2_PT_CONTEXT_HASH =3D TPM2_PT_FIXED + 26, - TPM2_PT_CONTEXT_SYM =3D TPM2_PT_FIXED + 27, - TPM2_PT_CONTEXT_SYM_SIZE =3D TPM2_PT_FIXED + 28, - TPM2_PT_ORDERLY_COUNT =3D TPM2_PT_FIXED + 29, - TPM2_PT_MAX_COMMAND_SIZE =3D TPM2_PT_FIXED + 30, - TPM2_PT_MAX_RESPONSE_SIZE =3D TPM2_PT_FIXED + 31, - TPM2_PT_MAX_DIGEST =3D TPM2_PT_FIXED + 32, - TPM2_PT_MAX_OBJECT_CONTEXT =3D TPM2_PT_FIXED + 33, - TPM2_PT_MAX_SESSION_CONTEXT =3D TPM2_PT_FIXED + 34, - TPM2_PT_PS_FAMILY_INDICATOR =3D TPM2_PT_FIXED + 35, - TPM2_PT_PS_LEVEL =3D TPM2_PT_FIXED + 36, - TPM2_PT_PS_REVISION =3D TPM2_PT_FIXED + 37, - TPM2_PT_PS_DAY_OF_YEAR =3D TPM2_PT_FIXED + 38, - TPM2_PT_PS_YEAR =3D TPM2_PT_FIXED + 39, - TPM2_PT_SPLIT_MAX =3D TPM2_PT_FIXED + 40, - TPM2_PT_TOTAL_COMMANDS =3D TPM2_PT_FIXED + 41, - TPM2_PT_LIBRARY_COMMANDS =3D TPM2_PT_FIXED + 42, - TPM2_PT_VENDOR_COMMANDS =3D TPM2_PT_FIXED + 43, - TPM2_PT_NV_BUFFER_MAX =3D TPM2_PT_FIXED + 44, - TPM2_PT_MODES =3D TPM2_PT_FIXED + 45, - TPM2_PT_MAX_CAP_BUFFER =3D TPM2_PT_FIXED + 46, - TPM2_PT_VAR =3D TPM2_PT_GROUP * 2, - TPM2_PT_PERMANENT =3D TPM2_PT_VAR + 0, - TPM2_PT_STARTUP_CLEAR =3D TPM2_PT_VAR + 1, - TPM2_PT_HR_NV_INDEX =3D TPM2_PT_VAR + 2, - TPM2_PT_HR_LOADED =3D TPM2_PT_VAR + 3, - TPM2_PT_HR_LOADED_AVAIL =3D TPM2_PT_VAR + 4, - TPM2_PT_HR_ACTIVE =3D TPM2_PT_VAR + 5, - TPM2_PT_HR_ACTIVE_AVAIL =3D TPM2_PT_VAR + 6, - TPM2_PT_HR_TRANSIENT_AVAIL =3D TPM2_PT_VAR + 7, - TPM2_PT_HR_PERSISTENT =3D TPM2_PT_VAR + 8, - TPM2_PT_HR_PERSISTENT_AVAIL =3D TPM2_PT_VAR + 9, - TPM2_PT_NV_COUNTERS =3D TPM2_PT_VAR + 10, - TPM2_PT_NV_COUNTERS_AVAIL =3D TPM2_PT_VAR + 11, - TPM2_PT_ALGORITHM_SET =3D TPM2_PT_VAR + 12, - TPM2_PT_LOADED_CURVES =3D TPM2_PT_VAR + 13, - TPM2_PT_LOCKOUT_COUNTER =3D TPM2_PT_VAR + 14, - TPM2_PT_MAX_AUTH_FAIL =3D TPM2_PT_VAR + 15, - TPM2_PT_LOCKOUT_INTERVAL =3D TPM2_PT_VAR + 16, - TPM2_PT_LOCKOUT_RECOVERY =3D TPM2_PT_VAR + 17, - TPM2_PT_NV_WRITE_RECOVERY =3D TPM2_PT_VAR + 18, - TPM2_PT_AUDIT_COUNTER_0 =3D TPM2_PT_VAR + 19, - TPM2_PT_AUDIT_COUNTER_1 =3D TPM2_PT_VAR + 20, -}; - extern const struct class tpm_class; extern const struct class tpmrm_class; extern dev_t tpm_devt; diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index 52ee350da867..280f870e6517 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c @@ -94,17 +94,6 @@ unsigned long tpm2_calc_ordinal_duration(u32 ordinal) return msecs_to_jiffies(TPM2_DURATION_DEFAULT); } =20 -struct tpm2_pcr_read_out { - __be32 update_cnt; - __be32 pcr_selects_cnt; - __be16 hash_alg; - u8 pcr_select_size; - u8 pcr_select[TPM2_PCR_SELECT_MIN]; - __be32 digests_cnt; - __be16 digest_size; - u8 digest[]; -} __packed; - /** * tpm2_pcr_read() - read a PCR value * @chip: TPM chip to use. @@ -238,11 +227,6 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, return rc; } =20 -struct tpm2_get_random_out { - __be16 size; - u8 buffer[TPM_MAX_RNG_DATA]; -} __packed; - /** * tpm2_get_random() - get random bytes from the TPM RNG * @@ -364,14 +348,6 @@ void tpm2_flush_context(struct tpm_chip *chip, u32 han= dle) } EXPORT_SYMBOL_GPL(tpm2_flush_context); =20 -struct tpm2_get_cap_out { - u8 more_data; - __be32 subcap_id; - __be32 property_cnt; - __be32 property_id; - __be32 value; -} __packed; - /** * tpm2_get_tpm_pt() - get value of a TPM_CAP_TPM_PROPERTIES type property * @chip: a &tpm_chip instance @@ -539,12 +515,6 @@ static int tpm2_init_bank_info(struct tpm_chip *chip, = u32 bank_index) return tpm2_pcr_read(chip, 0, &digest, &bank->digest_size); } =20 -struct tpm2_pcr_selection { - __be16 hash_alg; - u8 size_of_select; - u8 pcr_select[3]; -} __packed; - ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) { struct tpm2_pcr_selection pcr_selection; diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c index 60354cd53b5c..7c1c0a174a2b 100644 --- a/drivers/char/tpm/tpm2-space.c +++ b/drivers/char/tpm/tpm2-space.c @@ -15,19 +15,6 @@ #include #include "tpm.h" =20 -enum tpm2_handle_types { - TPM2_HT_HMAC_SESSION =3D 0x02000000, - TPM2_HT_POLICY_SESSION =3D 0x03000000, - TPM2_HT_TRANSIENT =3D 0x80000000, -}; - -struct tpm2_context { - __be64 sequence; - __be32 saved_handle; - __be32 hierarchy; - __be16 blob_size; -} __packed; - static void tpm2_flush_sessions(struct tpm_chip *chip, struct tpm_space *s= pace) { int i; diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 1846d5485a2c..8551b24c2bff 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -38,12 +38,6 @@ struct trusted_key_options; /* opaque structure, holds auth session parameters like the session key */ struct tpm2_auth; =20 -enum tpm2_session_types { - TPM2_SE_HMAC =3D 0x00, - TPM2_SE_POLICY =3D 0x01, - TPM2_SE_TRIAL =3D 0x02, -}; - /* if you add a new hash to this, increment TPM_MAX_HASHES below */ enum tpm_algorithms { TPM_ALG_ERROR =3D 0x0000, @@ -65,11 +59,6 @@ enum tpm_algorithms { */ #define TPM_MAX_HASHES 5 =20 -enum tpm2_curves { - TPM2_ECC_NONE =3D 0x0000, - TPM2_ECC_NIST_P256 =3D 0x0003, -}; - struct tpm_digest { u16 alg_id; u8 digest[TPM2_MAX_DIGEST_SIZE]; @@ -222,122 +211,11 @@ struct tpm_chip { =20 #define TPM_HEADER_SIZE 10 =20 -enum tpm2_const { - TPM2_PLATFORM_PCR =3D 24, - TPM2_PCR_SELECT_MIN =3D ((TPM2_PLATFORM_PCR + 7) / 8), -}; - -enum tpm2_timeouts { - TPM2_TIMEOUT_A =3D 750, - TPM2_TIMEOUT_B =3D 4000, - TPM2_TIMEOUT_C =3D 200, - TPM2_TIMEOUT_D =3D 30, -}; - -enum tpm2_durations { - TPM2_DURATION_SHORT =3D 20, - TPM2_DURATION_LONG =3D 2000, - TPM2_DURATION_DEFAULT =3D 120000, -}; - -enum tpm2_structures { - TPM2_ST_NO_SESSIONS =3D 0x8001, - TPM2_ST_SESSIONS =3D 0x8002, - TPM2_ST_CREATION =3D 0x8021, -}; - -/* Indicates from what layer of the software stack the error comes from */ -#define TSS2_RC_LAYER_SHIFT 16 -#define TSS2_RESMGR_TPM_RC_LAYER (11 << TSS2_RC_LAYER_SHIFT) - -enum tpm2_return_codes { - TPM2_RC_SUCCESS =3D 0x0000, - TPM2_RC_HASH =3D 0x0083, /* RC_FMT1 */ - TPM2_RC_HANDLE =3D 0x008B, - TPM2_RC_INTEGRITY =3D 0x009F, - TPM2_RC_INITIALIZE =3D 0x0100, /* RC_VER1 */ - TPM2_RC_FAILURE =3D 0x0101, - TPM2_RC_DISABLED =3D 0x0120, - TPM2_RC_UPGRADE =3D 0x012D, - TPM2_RC_COMMAND_CODE =3D 0x0143, - TPM2_RC_TESTING =3D 0x090A, /* RC_WARN */ - TPM2_RC_REFERENCE_H0 =3D 0x0910, - TPM2_RC_RETRY =3D 0x0922, - TPM2_RC_SESSION_MEMORY =3D 0x0903, -}; - -enum tpm2_command_codes { - TPM2_CC_FIRST =3D 0x011F, - TPM2_CC_HIERARCHY_CONTROL =3D 0x0121, - TPM2_CC_HIERARCHY_CHANGE_AUTH =3D 0x0129, - TPM2_CC_CREATE_PRIMARY =3D 0x0131, - TPM2_CC_SEQUENCE_COMPLETE =3D 0x013E, - TPM2_CC_SELF_TEST =3D 0x0143, - TPM2_CC_STARTUP =3D 0x0144, - TPM2_CC_SHUTDOWN =3D 0x0145, - TPM2_CC_NV_READ =3D 0x014E, - TPM2_CC_CREATE =3D 0x0153, - TPM2_CC_LOAD =3D 0x0157, - TPM2_CC_SEQUENCE_UPDATE =3D 0x015C, - TPM2_CC_UNSEAL =3D 0x015E, - TPM2_CC_CONTEXT_LOAD =3D 0x0161, - TPM2_CC_CONTEXT_SAVE =3D 0x0162, - TPM2_CC_FLUSH_CONTEXT =3D 0x0165, - TPM2_CC_READ_PUBLIC =3D 0x0173, - TPM2_CC_START_AUTH_SESS =3D 0x0176, - TPM2_CC_VERIFY_SIGNATURE =3D 0x0177, - TPM2_CC_GET_CAPABILITY =3D 0x017A, - TPM2_CC_GET_RANDOM =3D 0x017B, - TPM2_CC_PCR_READ =3D 0x017E, - TPM2_CC_PCR_EXTEND =3D 0x0182, - TPM2_CC_EVENT_SEQUENCE_COMPLETE =3D 0x0185, - TPM2_CC_HASH_SEQUENCE_START =3D 0x0186, - TPM2_CC_CREATE_LOADED =3D 0x0191, - TPM2_CC_LAST =3D 0x0193, /* Spec 1.36 */ -}; - -enum tpm2_permanent_handles { - TPM2_RH_NULL =3D 0x40000007, - TPM2_RS_PW =3D 0x40000009, -}; - -/* Most Significant Octet for key types */ -enum tpm2_mso_type { - TPM2_MSO_NVRAM =3D 0x01, - TPM2_MSO_SESSION =3D 0x02, - TPM2_MSO_POLICY =3D 0x03, - TPM2_MSO_PERMANENT =3D 0x40, - TPM2_MSO_VOLATILE =3D 0x80, - TPM2_MSO_PERSISTENT =3D 0x81, -}; - static inline enum tpm2_mso_type tpm2_handle_mso(u32 handle) { return handle >> 24; } =20 -enum tpm2_capabilities { - TPM2_CAP_HANDLES =3D 1, - TPM2_CAP_COMMANDS =3D 2, - TPM2_CAP_PCRS =3D 5, - TPM2_CAP_TPM_PROPERTIES =3D 6, -}; - -enum tpm2_properties { - TPM_PT_TOTAL_COMMANDS =3D 0x0129, -}; - -enum tpm2_startup_types { - TPM2_SU_CLEAR =3D 0x0000, - TPM2_SU_STATE =3D 0x0001, -}; - -enum tpm2_cc_attrs { - TPM2_CC_ATTR_CHANDLES =3D 25, - TPM2_CC_ATTR_RHANDLE =3D 28, - TPM2_CC_ATTR_VENDOR =3D 29, -}; - #define TPM_VID_INTEL 0x8086 #define TPM_VID_WINBOND 0x1050 #define TPM_VID_STM 0x104A @@ -389,29 +267,6 @@ struct tpm_buf { u8 handles; }; =20 -enum tpm2_object_attributes { - TPM2_OA_FIXED_TPM =3D BIT(1), - TPM2_OA_ST_CLEAR =3D BIT(2), - TPM2_OA_FIXED_PARENT =3D BIT(4), - TPM2_OA_SENSITIVE_DATA_ORIGIN =3D BIT(5), - TPM2_OA_USER_WITH_AUTH =3D BIT(6), - TPM2_OA_ADMIN_WITH_POLICY =3D BIT(7), - TPM2_OA_NO_DA =3D BIT(10), - TPM2_OA_ENCRYPTED_DUPLICATION =3D BIT(11), - TPM2_OA_RESTRICTED =3D BIT(16), - TPM2_OA_DECRYPT =3D BIT(17), - TPM2_OA_SIGN =3D BIT(18), -}; - -enum tpm2_session_attributes { - TPM2_SA_CONTINUE_SESSION =3D BIT(0), - TPM2_SA_AUDIT_EXCLUSIVE =3D BIT(1), - TPM2_SA_AUDIT_RESET =3D BIT(3), - TPM2_SA_DECRYPT =3D BIT(5), - TPM2_SA_ENCRYPT =3D BIT(6), - TPM2_SA_AUDIT =3D BIT(7), -}; - struct tpm2_hash { unsigned int crypto_id; unsigned int tpm_id; diff --git a/include/linux/tpm_command.h b/include/linux/tpm_command.h index 30d01953a6f8..9dd903dd6b5c 100644 --- a/include/linux/tpm_command.h +++ b/include/linux/tpm_command.h @@ -156,4 +156,275 @@ struct tpm1_get_random_out { #define TPM_NONCE_SIZE 20 #define TPM_ST_CLEAR 1 =20 +/* + * =3D=3D TPM 2 Family Chips =3D=3D + * + * TPM 2.0 Library + * https://trustedcomputinggroup.org/resource/tpm-library-specification/ + */ + +/* TPM2 specific constants. */ +#define TPM2_SPACE_BUFFER_SIZE 16384 /* 16 kB */ + +enum tpm2_session_types { + TPM2_SE_HMAC =3D 0x00, + TPM2_SE_POLICY =3D 0x01, + TPM2_SE_TRIAL =3D 0x02, +}; + +enum tpm2_timeouts { + TPM2_TIMEOUT_A =3D 750, + TPM2_TIMEOUT_B =3D 4000, + TPM2_TIMEOUT_C =3D 200, + TPM2_TIMEOUT_D =3D 30, + TPM2_DURATION_SHORT =3D 20, + TPM2_DURATION_MEDIUM =3D 750, + TPM2_DURATION_LONG =3D 2000, + TPM2_DURATION_LONG_LONG =3D 300000, + TPM2_DURATION_DEFAULT =3D 120000, +}; + +enum tpm2_structures { + TPM2_ST_NO_SESSIONS =3D 0x8001, + TPM2_ST_SESSIONS =3D 0x8002, + TPM2_ST_CREATION =3D 0x8021, +}; + +/* Indicates from what layer of the software stack the error comes from */ +#define TSS2_RC_LAYER_SHIFT 16 +#define TSS2_RESMGR_TPM_RC_LAYER (11 << TSS2_RC_LAYER_SHIFT) + +enum tpm2_return_codes { + TPM2_RC_SUCCESS =3D 0x0000, + TPM2_RC_HASH =3D 0x0083, /* RC_FMT1 */ + TPM2_RC_HANDLE =3D 0x008B, + TPM2_RC_INTEGRITY =3D 0x009F, + TPM2_RC_INITIALIZE =3D 0x0100, /* RC_VER1 */ + TPM2_RC_FAILURE =3D 0x0101, + TPM2_RC_DISABLED =3D 0x0120, + TPM2_RC_UPGRADE =3D 0x012D, + TPM2_RC_COMMAND_CODE =3D 0x0143, + TPM2_RC_TESTING =3D 0x090A, /* RC_WARN */ + TPM2_RC_REFERENCE_H0 =3D 0x0910, + TPM2_RC_RETRY =3D 0x0922, + TPM2_RC_SESSION_MEMORY =3D 0x0903, +}; + +enum tpm2_command_codes { + TPM2_CC_FIRST =3D 0x011F, + TPM2_CC_HIERARCHY_CONTROL =3D 0x0121, + TPM2_CC_HIERARCHY_CHANGE_AUTH =3D 0x0129, + TPM2_CC_CREATE_PRIMARY =3D 0x0131, + TPM2_CC_SEQUENCE_COMPLETE =3D 0x013E, + TPM2_CC_SELF_TEST =3D 0x0143, + TPM2_CC_STARTUP =3D 0x0144, + TPM2_CC_SHUTDOWN =3D 0x0145, + TPM2_CC_NV_READ =3D 0x014E, + TPM2_CC_CREATE =3D 0x0153, + TPM2_CC_LOAD =3D 0x0157, + TPM2_CC_SEQUENCE_UPDATE =3D 0x015C, + TPM2_CC_UNSEAL =3D 0x015E, + TPM2_CC_CONTEXT_LOAD =3D 0x0161, + TPM2_CC_CONTEXT_SAVE =3D 0x0162, + TPM2_CC_FLUSH_CONTEXT =3D 0x0165, + TPM2_CC_READ_PUBLIC =3D 0x0173, + TPM2_CC_START_AUTH_SESS =3D 0x0176, + TPM2_CC_VERIFY_SIGNATURE =3D 0x0177, + TPM2_CC_GET_CAPABILITY =3D 0x017A, + TPM2_CC_GET_RANDOM =3D 0x017B, + TPM2_CC_PCR_READ =3D 0x017E, + TPM2_CC_PCR_EXTEND =3D 0x0182, + TPM2_CC_EVENT_SEQUENCE_COMPLETE =3D 0x0185, + TPM2_CC_HASH_SEQUENCE_START =3D 0x0186, + TPM2_CC_CREATE_LOADED =3D 0x0191, + TPM2_CC_LAST =3D 0x0193, /* Spec 1.36 */ +}; + +enum tpm2_capabilities { + TPM2_CAP_HANDLES =3D 1, + TPM2_CAP_COMMANDS =3D 2, + TPM2_CAP_PCRS =3D 5, + TPM2_CAP_TPM_PROPERTIES =3D 6, +}; + +enum tpm2_properties { + TPM_PT_TOTAL_COMMANDS =3D 0x0129, +}; + +enum tpm2_startup_types { + TPM2_SU_CLEAR =3D 0x0000, + TPM2_SU_STATE =3D 0x0001, +}; + +enum tpm2_cc_attrs { + TPM2_CC_ATTR_CHANDLES =3D 25, + TPM2_CC_ATTR_RHANDLE =3D 28, + TPM2_CC_ATTR_VENDOR =3D 29, +}; + +enum tpm2_permanent_handles { + TPM2_RH_NULL =3D 0x40000007, + TPM2_RS_PW =3D 0x40000009, +}; + +/* Most Significant Octet for key types */ +enum tpm2_mso_type { + TPM2_MSO_NVRAM =3D 0x01, + TPM2_MSO_SESSION =3D 0x02, + TPM2_MSO_POLICY =3D 0x03, + TPM2_MSO_PERMANENT =3D 0x40, + TPM2_MSO_VOLATILE =3D 0x80, + TPM2_MSO_PERSISTENT =3D 0x81, +}; + +enum tpm2_curves { + TPM2_ECC_NONE =3D 0x0000, + TPM2_ECC_NIST_P256 =3D 0x0003, +}; + +enum tpm2_object_attributes { + TPM2_OA_FIXED_TPM =3D BIT(1), + TPM2_OA_ST_CLEAR =3D BIT(2), + TPM2_OA_FIXED_PARENT =3D BIT(4), + TPM2_OA_SENSITIVE_DATA_ORIGIN =3D BIT(5), + TPM2_OA_USER_WITH_AUTH =3D BIT(6), + TPM2_OA_ADMIN_WITH_POLICY =3D BIT(7), + TPM2_OA_NO_DA =3D BIT(10), + TPM2_OA_ENCRYPTED_DUPLICATION =3D BIT(11), + TPM2_OA_RESTRICTED =3D BIT(16), + TPM2_OA_DECRYPT =3D BIT(17), + TPM2_OA_SIGN =3D BIT(18), +}; + +enum tpm2_session_attributes { + TPM2_SA_CONTINUE_SESSION =3D BIT(0), + TPM2_SA_AUDIT_EXCLUSIVE =3D BIT(1), + TPM2_SA_AUDIT_RESET =3D BIT(3), + TPM2_SA_DECRYPT =3D BIT(5), + TPM2_SA_ENCRYPT =3D BIT(6), + TPM2_SA_AUDIT =3D BIT(7), +}; + +enum tpm2_pcr_select { + TPM2_PLATFORM_PCR =3D 24, + TPM2_PCR_SELECT_MIN =3D ((TPM2_PLATFORM_PCR + 7) / 8), +}; + +enum tpm2_handle_types { + TPM2_HT_HMAC_SESSION =3D 0x02000000, + TPM2_HT_POLICY_SESSION =3D 0x03000000, + TPM2_HT_TRANSIENT =3D 0x80000000, +}; + +enum tpm2_pt_props { + TPM2_PT_NONE =3D 0x00000000, + TPM2_PT_GROUP =3D 0x00000100, + TPM2_PT_FIXED =3D TPM2_PT_GROUP * 1, + TPM2_PT_FAMILY_INDICATOR =3D TPM2_PT_FIXED + 0, + TPM2_PT_LEVEL =3D TPM2_PT_FIXED + 1, + TPM2_PT_REVISION =3D TPM2_PT_FIXED + 2, + TPM2_PT_DAY_OF_YEAR =3D TPM2_PT_FIXED + 3, + TPM2_PT_YEAR =3D TPM2_PT_FIXED + 4, + TPM2_PT_MANUFACTURER =3D TPM2_PT_FIXED + 5, + TPM2_PT_VENDOR_STRING_1 =3D TPM2_PT_FIXED + 6, + TPM2_PT_VENDOR_STRING_2 =3D TPM2_PT_FIXED + 7, + TPM2_PT_VENDOR_STRING_3 =3D TPM2_PT_FIXED + 8, + TPM2_PT_VENDOR_STRING_4 =3D TPM2_PT_FIXED + 9, + TPM2_PT_VENDOR_TPM_TYPE =3D TPM2_PT_FIXED + 10, + TPM2_PT_FIRMWARE_VERSION_1 =3D TPM2_PT_FIXED + 11, + TPM2_PT_FIRMWARE_VERSION_2 =3D TPM2_PT_FIXED + 12, + TPM2_PT_INPUT_BUFFER =3D TPM2_PT_FIXED + 13, + TPM2_PT_HR_TRANSIENT_MIN =3D TPM2_PT_FIXED + 14, + TPM2_PT_HR_PERSISTENT_MIN =3D TPM2_PT_FIXED + 15, + TPM2_PT_HR_LOADED_MIN =3D TPM2_PT_FIXED + 16, + TPM2_PT_ACTIVE_SESSIONS_MAX =3D TPM2_PT_FIXED + 17, + TPM2_PT_PCR_COUNT =3D TPM2_PT_FIXED + 18, + TPM2_PT_PCR_SELECT_MIN =3D TPM2_PT_FIXED + 19, + TPM2_PT_CONTEXT_GAP_MAX =3D TPM2_PT_FIXED + 20, + TPM2_PT_NV_COUNTERS_MAX =3D TPM2_PT_FIXED + 22, + TPM2_PT_NV_INDEX_MAX =3D TPM2_PT_FIXED + 23, + TPM2_PT_MEMORY =3D TPM2_PT_FIXED + 24, + TPM2_PT_CLOCK_UPDATE =3D TPM2_PT_FIXED + 25, + TPM2_PT_CONTEXT_HASH =3D TPM2_PT_FIXED + 26, + TPM2_PT_CONTEXT_SYM =3D TPM2_PT_FIXED + 27, + TPM2_PT_CONTEXT_SYM_SIZE =3D TPM2_PT_FIXED + 28, + TPM2_PT_ORDERLY_COUNT =3D TPM2_PT_FIXED + 29, + TPM2_PT_MAX_COMMAND_SIZE =3D TPM2_PT_FIXED + 30, + TPM2_PT_MAX_RESPONSE_SIZE =3D TPM2_PT_FIXED + 31, + TPM2_PT_MAX_DIGEST =3D TPM2_PT_FIXED + 32, + TPM2_PT_MAX_OBJECT_CONTEXT =3D TPM2_PT_FIXED + 33, + TPM2_PT_MAX_SESSION_CONTEXT =3D TPM2_PT_FIXED + 34, + TPM2_PT_PS_FAMILY_INDICATOR =3D TPM2_PT_FIXED + 35, + TPM2_PT_PS_LEVEL =3D TPM2_PT_FIXED + 36, + TPM2_PT_PS_REVISION =3D TPM2_PT_FIXED + 37, + TPM2_PT_PS_DAY_OF_YEAR =3D TPM2_PT_FIXED + 38, + TPM2_PT_PS_YEAR =3D TPM2_PT_FIXED + 39, + TPM2_PT_SPLIT_MAX =3D TPM2_PT_FIXED + 40, + TPM2_PT_TOTAL_COMMANDS =3D TPM2_PT_FIXED + 41, + TPM2_PT_LIBRARY_COMMANDS =3D TPM2_PT_FIXED + 42, + TPM2_PT_VENDOR_COMMANDS =3D TPM2_PT_FIXED + 43, + TPM2_PT_NV_BUFFER_MAX =3D TPM2_PT_FIXED + 44, + TPM2_PT_MODES =3D TPM2_PT_FIXED + 45, + TPM2_PT_MAX_CAP_BUFFER =3D TPM2_PT_FIXED + 46, + TPM2_PT_VAR =3D TPM2_PT_GROUP * 2, + TPM2_PT_PERMANENT =3D TPM2_PT_VAR + 0, + TPM2_PT_STARTUP_CLEAR =3D TPM2_PT_VAR + 1, + TPM2_PT_HR_NV_INDEX =3D TPM2_PT_VAR + 2, + TPM2_PT_HR_LOADED =3D TPM2_PT_VAR + 3, + TPM2_PT_HR_LOADED_AVAIL =3D TPM2_PT_VAR + 4, + TPM2_PT_HR_ACTIVE =3D TPM2_PT_VAR + 5, + TPM2_PT_HR_ACTIVE_AVAIL =3D TPM2_PT_VAR + 6, + TPM2_PT_HR_TRANSIENT_AVAIL =3D TPM2_PT_VAR + 7, + TPM2_PT_HR_PERSISTENT =3D TPM2_PT_VAR + 8, + TPM2_PT_HR_PERSISTENT_AVAIL =3D TPM2_PT_VAR + 9, + TPM2_PT_NV_COUNTERS =3D TPM2_PT_VAR + 10, + TPM2_PT_NV_COUNTERS_AVAIL =3D TPM2_PT_VAR + 11, + TPM2_PT_ALGORITHM_SET =3D TPM2_PT_VAR + 12, + TPM2_PT_LOADED_CURVES =3D TPM2_PT_VAR + 13, + TPM2_PT_LOCKOUT_COUNTER =3D TPM2_PT_VAR + 14, + TPM2_PT_MAX_AUTH_FAIL =3D TPM2_PT_VAR + 15, + TPM2_PT_LOCKOUT_INTERVAL =3D TPM2_PT_VAR + 16, + TPM2_PT_LOCKOUT_RECOVERY =3D TPM2_PT_VAR + 17, + TPM2_PT_NV_WRITE_RECOVERY =3D TPM2_PT_VAR + 18, + TPM2_PT_AUDIT_COUNTER_0 =3D TPM2_PT_VAR + 19, + TPM2_PT_AUDIT_COUNTER_1 =3D TPM2_PT_VAR + 20, +}; + +struct tpm2_pcr_read_out { + __be32 update_cnt; + __be32 pcr_selects_cnt; + __be16 hash_alg; + u8 pcr_select_size; + u8 pcr_select[TPM2_PCR_SELECT_MIN]; + __be32 digests_cnt; + __be16 digest_size; + u8 digest[]; +} __packed; + +struct tpm2_get_random_out { + __be16 size; + u8 buffer[TPM_MAX_RNG_DATA]; +} __packed; + +struct tpm2_get_cap_out { + u8 more_data; + __be32 subcap_id; + __be32 property_cnt; + __be32 property_id; + __be32 value; +} __packed; + +struct tpm2_pcr_selection { + __be16 hash_alg; + u8 size_of_select; + u8 pcr_select[3]; +} __packed; + +struct tpm2_context { + __be64 sequence; + __be32 saved_handle; + __be32 hierarchy; + __be16 blob_size; +} __packed; + #endif --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CE3E3CAE74 for ; Sat, 11 Jul 2026 16:01:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785690; cv=none; b=iSHJl+55+FsReamhLhUWcupthIAcgmii9P3xBQYUbjl2XwrsolGR9RNNc9tiWMTS5bB8J21TMnKKxJqJIlLxKx7639gFvAD/Fh/tymtBVItwTNyAhWs/5OWRc9UupzQGDjyTr5sEQa6CR9l7JJUIlPjdYdG1bm54QfOUU32kU8c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785690; c=relaxed/simple; bh=WAHXIWt/28rU2ug/gCEyKlRd6r6MFxAWKp1tyCUWz6w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VoY5QmqKi5TAqaM+RBY5ZxCVsFCGfN8SUUE5WJlc72YnGMb1zFvGbbdiQ22S2C9Td5A6i7w5CGHDCqi2eUKdeGWvIBXZI6mNoRu+UNwIF9a7QmCAfzjq34/TrjpBvb3UZBjcGNsbBUblEY4TlZhIz2hQ2UighFmx4OT5f8QAe1c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=f8jtevj0; arc=none smtp.client-ip=209.85.216.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="f8jtevj0" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-381891a9525so2230683a91.3 for ; Sat, 11 Jul 2026 09:01:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785687; x=1784390487; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=EatEz12Vd+2xKsXS+ldmzV7vhTKPvC5kQIMvkNXC19w=; b=f8jtevj0J9ZaC1hzkGbg8CdL5PhA45UKMQ3DNyfQ43S6ls1Gh1Og+3nbhx7zRj2mNi u9RM82lZv9n0GkAoNJmGzm4DFv8P1aavxiEeuFBLwNBL0gctmZs/FCFkzhE9UzH9HrPE jMoinfycvDFpC4xndf2sqSghl7GOnddVdQrYLHv1d8JgQWo7iA1U+hyu75+w773siWEk 8QgNwoJSn1hXYoQSbGRZ46mYetGs+N1TV/GCt4r7ENznCCfFNF5AwPofiwj/vWMx2RlY 6eZcnlWkvUa7LnmQ3hcicCQVhq5FyKeNDsH7/tq4rchSFSMSlfqpDZWwsbjVsb0l4RJo EljQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785687; x=1784390487; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=EatEz12Vd+2xKsXS+ldmzV7vhTKPvC5kQIMvkNXC19w=; b=JhmBvQpSnTVqOstvMymn5Lk/U30Ie0Ly+B0JsWojuKPIm7gVl1w4KpljsgXE/OxWJ2 YswPHrOpwTUiefIq9JLdH5+13+Dva+AGITY0BlrhQt3Fv9JdGBCeXwZKEyGk2ux8WVRK KXyS2bvV5gPRcuvPbUvVqSYhCPsJSnSFB/67X0Z1XSnWmpRxW0SFWhTpoWjsC+zgDDpL QvJL6ZF83wpifKlgJioOSEwwXzd4teRvoY6sJBaAYoRkomJnsZ57ed08AODkC4upPVAT RVz5QbsY6Oh3r/3TQ2Nt0f5bJm/M3+DYWF9Rztf8F/68890CLogy32ZzQmkk/IuxC5AU a9iw== X-Gm-Message-State: AOJu0YwhoXuvq/ULgW2bMlsEyY7uAug8aV+l0VF24wUpK7GyQByNCxAi W5PKWZKbP7JyQ/JUTY9pD6yNomsnOWfIz1/6wEmhvk/g+FHEmyVlJQW/ZE2Nsu6z X-Gm-Gg: AfdE7clwSHBDTg0GBZ5srqRr9B9gXjLF1eUuxqWYvTPV4wdCOOSjyZtEWPJCRxwUXTv 8Kv15P/5+JqQA1qdSoU96j/u2xv4VCgAFzZ4KPFEKmK4aQ4XrXpLJZwfX5KxA+VifvKDyF7fvsH x2OoiWpdRp3EfaFwlm1jRa6Uy5C8UMRrynmd0D6aMeRL0AskvFDADSXeRETMNQBz0pUqZb2QTTY BdokMvxeKOB3QZlPw56f6goSRe6HvRyK8tBoSP/euiqWy3/7dNNmAbNK45lncTAHUDOfUCa6Mjg ozcdqXYXHHA7NwgjF2KyxehvMp25/aA1NH9/kLhbpjdeLsb7oEi1k4vTRCM+kt6SV2BvGg7aaZJ QRlGMXlTqxv56fEIUUupzwoF9UHw+px7xlcmRzbhdCgWG4QSqBP7QW/wcXD693y4KKfvssXpFzK 6TVxatwBEZDVsp+1yaDU8L X-Received: by 2002:a17:90a:d408:b0:381:50ab:1594 with SMTP id 98e67ed59e1d1-38dc774d1fcmr3402700a91.27.1783785686817; Sat, 11 Jul 2026 09:01:26 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3118ee6091dsm54496968eec.14.2026.07.11.09.01.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:25 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 04/10] tpm: Move TPM common base definitions to the command header Date: Sat, 11 Jul 2026 09:01:04 -0700 Message-ID: <20260711160110.267780-5-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" These are top level definitions shared by both TPM 1 and 2 family chips. This includes core definitions like TPM localities, common crypto algorithm IDs, and the base TPM command header. Co-developed-by: Daniel P. Smith Signed-off-by: Daniel P. Smith Co-developed-by: Alec Brown Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm.h | 1 - include/linux/tpm.h | 50 +------------------- include/linux/tpm_command.h | 91 +++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 50 deletions(-) diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 680f89d9c9f9..fa554c5ad80b 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -33,7 +33,6 @@ #endif =20 #define TPM_MINOR 224 /* officially assigned */ -#define TPM_BUFSIZE 4096 #define TPM_NUM_DEVICES 65536 #define TPM_RETRY 50 =20 diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 8551b24c2bff..3630b2ea6aef 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -27,49 +27,12 @@ =20 #include =20 -#define TPM_DIGEST_SIZE 20 /* Max TPM v1.2 PCR size */ - -#define TPM2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE -#define TPM2_MAX_PCR_BANKS 8 - struct tpm_chip; struct trusted_key_payload; struct trusted_key_options; /* opaque structure, holds auth session parameters like the session key */ struct tpm2_auth; =20 -/* if you add a new hash to this, increment TPM_MAX_HASHES below */ -enum tpm_algorithms { - TPM_ALG_ERROR =3D 0x0000, - TPM_ALG_SHA1 =3D 0x0004, - TPM_ALG_AES =3D 0x0006, - TPM_ALG_KEYEDHASH =3D 0x0008, - TPM_ALG_SHA256 =3D 0x000B, - TPM_ALG_SHA384 =3D 0x000C, - TPM_ALG_SHA512 =3D 0x000D, - TPM_ALG_NULL =3D 0x0010, - TPM_ALG_SM3_256 =3D 0x0012, - TPM_ALG_ECC =3D 0x0023, - TPM_ALG_CFB =3D 0x0043, -}; - -/* - * maximum number of hashing algorithms a TPM can have. This is - * basically a count of every hash in tpm_algorithms above - */ -#define TPM_MAX_HASHES 5 - -struct tpm_digest { - u16 alg_id; - u8 digest[TPM2_MAX_DIGEST_SIZE]; -} __packed; - -struct tpm_bank_info { - u16 alg_id; - u16 digest_size; - u16 crypto_id; -}; - enum TPM_OPS_FLAGS { TPM_OPS_AUTO_STARTUP =3D BIT(0), }; @@ -127,7 +90,7 @@ struct tpm_chip_seqops { const struct seq_operations *seqops; }; =20 -/* fixed define for the curve we use which is NIST_P256 */ +/* Fixed define for the curve we use which is NIST_P256 */ #define EC_PT_SZ 32 =20 /* @@ -209,8 +172,6 @@ struct tpm_chip { #endif }; =20 -#define TPM_HEADER_SIZE 10 - static inline enum tpm2_mso_type tpm2_handle_mso(u32 handle) { return handle >> 24; @@ -239,15 +200,6 @@ enum tpm_chip_flags { =20 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev) =20 -struct tpm_header { - __be16 tag; - __be32 length; - union { - __be32 ordinal; - __be32 return_code; - }; -} __packed; - enum tpm_buf_flags { /* the capacity exceeded: */ TPM_BUF_OVERFLOW =3D BIT(0), diff --git a/include/linux/tpm_command.h b/include/linux/tpm_command.h index 9dd903dd6b5c..fc446a1282e2 100644 --- a/include/linux/tpm_command.h +++ b/include/linux/tpm_command.h @@ -2,6 +2,8 @@ #ifndef __LINUX_TPM_COMMAND_H__ #define __LINUX_TPM_COMMAND_H__ =20 +#include + /* * =3D=3D TPM 1 Family Chips =3D=3D * @@ -427,4 +429,93 @@ struct tpm2_context { __be16 blob_size; } __packed; =20 +/* + * =3D=3D TPM Common Defs =3D=3D + */ + +#define TPM_DIGEST_SIZE 20 /* Max TPM v1.2 PCR size */ +#define TPM_BUFSIZE 4096 + +/* + * SHA-512 is, as of today, the largest digest in the TCG algorithm reposi= tory. + */ +#define TPM2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE + +/* + * A TPM name digest i.e., TPMT_HA, is a concatenation of TPM_ALG_ID of the + * name algorithm and hash of TPMT_PUBLIC. + */ +#define TPM2_MAX_NAME_SIZE (TPM2_MAX_DIGEST_SIZE + 2) + +/* + * Fixed define for the size of a name. This is actually HASHALG size + * plus 2, so 32 for SHA256 + */ +#define TPM2_NULL_NAME_SIZE 34 + +/* + * The maximum number of PCR banks. + */ +#define TPM2_MAX_PCR_BANKS 8 + +/* If you add a new hash to this, increment TPM_MAX_HASHES below */ +enum tpm_algorithms { + TPM_ALG_ERROR =3D 0x0000, + TPM_ALG_SHA1 =3D 0x0004, + TPM_ALG_AES =3D 0x0006, + TPM_ALG_KEYEDHASH =3D 0x0008, + TPM_ALG_SHA256 =3D 0x000B, + TPM_ALG_SHA384 =3D 0x000C, + TPM_ALG_SHA512 =3D 0x000D, + TPM_ALG_NULL =3D 0x0010, + TPM_ALG_SM3_256 =3D 0x0012, + TPM_ALG_ECC =3D 0x0023, + TPM_ALG_CFB =3D 0x0043, +}; + +/* + * The locality (0 - 4) for a TPM, as defined in section 3.2 of the + * Client Platform Profile Specification. + */ +enum tpm_localities { + TPM_LOCALITY_0 =3D 0, /* Static RTM */ + TPM_LOCALITY_1 =3D 1, /* Dynamic OS */ + TPM_LOCALITY_2 =3D 2, /* DRTM Environment */ + TPM_LOCALITY_3 =3D 3, /* Aux Components */ + TPM_LOCALITY_4 =3D 4, /* CPU DRTM Establishment */ + TPM_MAX_LOCALITY =3D TPM_LOCALITY_4 +}; + +/* + * Structure to represent active PCR algorithm banks usable by the + * TPM chip. + */ +struct tpm_bank_info { + u16 alg_id; + u16 digest_size; + u16 crypto_id; +}; + +/* + * Maximum number of hashing algorithms a TPM can have. This is + * basically a count of every hash in tpm_algorithms above + */ +#define TPM_MAX_HASHES 5 + +struct tpm_digest { + u16 alg_id; + u8 digest[TPM2_MAX_DIGEST_SIZE]; +} __packed; + +#define TPM_HEADER_SIZE 10 + +struct tpm_header { + __be16 tag; + __be32 length; + union { + __be32 ordinal; + __be32 return_code; + }; +} __packed; + #endif --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5DDBF3CAA31 for ; Sat, 11 Jul 2026 16:01:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785693; cv=none; b=PaTP+h4KEpLP8e82M2zgpYh/aYcZUNkIEC6ROjAcZg7FdcnW4f4TDHRzas5Ob+X8gR/KkzFVn/BPNPLzV93NqO/X30j8mWoazQcS1+8kIUK27BePpJGZUhyFwtYTFjmjUHwYieJXuLF4hvy9V9A7YAH3Og6tPidkpHrl2VkAuQg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785693; c=relaxed/simple; bh=IKmtT9Cq3h0iSyz5OU+oULBN9QjQwnAFo0SgsEd/FNw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fAM07vSFxcRkuiuutDei2VBaC1iI75YEsvIrrJm1gLzojPlKrsayUVpPilrnmBltoktUKiGz0Ju5wKgScbr9VcV5YhicBBRzaV6fNLqtRfBqznUTrjsgI1uPxuG8zKaUiJ+YrvGWnQK8bMpMz3zCyifbN+x3PplOrmQm7pvq+jU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=sU7lOGiY; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sU7lOGiY" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-8485bd28dd0so1934090b3a.2 for ; Sat, 11 Jul 2026 09:01:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785691; x=1784390491; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=cQmIuXUkp3rrMVH26ZTOPg/E2zd6zUa3wMeq4GmUl8U=; b=sU7lOGiYCEn+vZz+m7AlLz/9PaJBqIaw39uDkYdKHj91RkHMneXRw59+r5iRGlFsPC l3o1PkfuudH2Otilf3PzKW51gb7P+lrfpAVTYPqr9IcUC55rN+Gp/eWLX+X7JXosdGek rHV77NuW0lCseauKaQGnniivSHYbemtpz2c+QiknMlmY4i7iIm7pFatbCl9a35tACEm+ rFwpxlOQ4i9qMUPDLQazWMkS+gqXwik40joCFUeP6DDxy2xgp/UzGe8mU0HqlGvzBpsv e43IS2IQhcSYskhHsRDBxoOZdoNF1y2dTBcnW9V3jSSbdv2meXc7wmoxa1+ILOpXZ3Cw cqqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785691; x=1784390491; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=cQmIuXUkp3rrMVH26ZTOPg/E2zd6zUa3wMeq4GmUl8U=; b=pwBmnZsuVPGhf8NiJtCJ338hYEa+dDVDup6SfI7bhaSxUQUh7hdyLQ+rc7vm7iic9a c6lH9O3Zny1zHpWkQ1vhppUepY3tEO7kbCUIyiJ+3sGsYZSMWTcDszXCzi3BSGVZIOdR bNq/bSRULh5A5uP0+Lxt2yOGZneyy4+BSJxhpbkTQUS9Vkt5RRGrjIWG0h7/c9r1ok7q 65Y2LssYhtxm8yAJSNo40vWTYQqBN0CpNJaK/BUjGBkkJbq21NK9FL0EIm9yUiH84HFc dIi/qiS2l0JUrTsvGvTYZscRXjQ8LTNi/kn7+crUBKk1yvnNvPoRiQBg+I6I/tvwYf9b WO+A== X-Gm-Message-State: AOJu0Yx+VYfSftF731hn45bCYyeJtWalaVXeA84EoBZ5mDlo3ibs4PB/ ApDd1dUiEvMS3O0CNR9DRv1rMiqHrz8gQ55aOs9YiCexhCw2YXJSpoahfzhSshB3 X-Gm-Gg: AfdE7clLF82TjZOaYLMFfBS5E9fVSzN+5Ws9SycOgETimlqoA4m+wiUQIoSUFR2g9IA xwspAtD4hI/TrSD7krXVajf/ToplWgdi/74V/ClTYAsOSo4NUXdB49Fs8LbpfmWG90SIc89e005 Q9Lr/Mx30QThOS1t4cbcsuoBkgtTOeKos8VcDROT37RibqXZskCDroQo3hMtRzZnD07163vGZn0 R6ywNb2p9qU8nmef9l0M0U2Re/JlRI8IKrF+R78wuxcW+LCGSJ4UaFpOiC6tK7qPIystR7r53xO Gb15oCdSELMjh8/LIp6AxUHrxeoXNyQRjyDQ1RSYhgnhhVlr/e8j2roEZbnobxW3tB9dHEeBD4B BAkfocI3yOKASjUbuQ2YTQfrb6bKbARfqafK3KHTi6Ytxvoj08UadNNywQlYMI5KXUXoCPHyNgC SlEYU1M0nHjxCIf2eeLDHe X-Received: by 2002:a05:6a20:1f28:b0:3bf:b182:94e with SMTP id adf61e73a8af0-3c110a12782mr3463511637.5.1783785690620; Sat, 11 Jul 2026 09:01:30 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b8deb2a21sm7919739c88.3.2026.07.11.09.01.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:29 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 05/10] tpm: Move platform specific definitions to the new PTP header Date: Sat, 11 Jul 2026 09:01:05 -0700 Message-ID: <20260711160110.267780-6-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" These are definitions for TPM 2.0 interface and interactions with the platform as defined in the TCG specification: These definitions are located here in a separate file to avoid conflicts with vendor specific TIS/FIFO definition (e.g. STMicroelectronics, Infineon Technologies, etc). This allows the TCG defined TIS/FIFO interface to be in a public header while the former chip specific implementations contain their own definitions. TPM 1.x family chips that adhere to the TCG specifications use the TIS/FIFO interface as defined here. TCG PC Client Platform TPM Profile (PTP) Specification - https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profil= e-ptp-specification/ Co-developed-by: Daniel P. Smith Signed-off-by: Daniel P. Smith Co-developed-by: Alec Brown Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm_tis_core.h | 64 +-------------- include/linux/tpm_ptp.h | 133 ++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 63 deletions(-) create mode 100644 include/linux/tpm_ptp.h diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_cor= e.h index aa6d78898ef3..d737b3d67411 100644 --- a/drivers/char/tpm/tpm_tis_core.h +++ b/drivers/char/tpm/tpm_tis_core.h @@ -19,71 +19,9 @@ #ifndef __TPM_TIS_CORE_H__ #define __TPM_TIS_CORE_H__ =20 +#include #include "tpm.h" =20 -enum tis_access { - TPM_ACCESS_VALID =3D 0x80, - TPM_ACCESS_ACTIVE_LOCALITY =3D 0x20, - TPM_ACCESS_REQUEST_PENDING =3D 0x04, - TPM_ACCESS_REQUEST_USE =3D 0x02, -}; - -enum tis_status { - TPM_STS_VALID =3D 0x80, - TPM_STS_COMMAND_READY =3D 0x40, - TPM_STS_GO =3D 0x20, - TPM_STS_DATA_AVAIL =3D 0x10, - TPM_STS_DATA_EXPECT =3D 0x08, - TPM_STS_RESPONSE_RETRY =3D 0x02, - TPM_STS_READ_ZERO =3D 0x23, /* bits that must be zero on read */ -}; - -enum tis_int_flags { - TPM_GLOBAL_INT_ENABLE =3D 0x80000000, - TPM_INTF_BURST_COUNT_STATIC =3D 0x100, - TPM_INTF_CMD_READY_INT =3D 0x080, - TPM_INTF_INT_EDGE_FALLING =3D 0x040, - TPM_INTF_INT_EDGE_RISING =3D 0x020, - TPM_INTF_INT_LEVEL_LOW =3D 0x010, - TPM_INTF_INT_LEVEL_HIGH =3D 0x008, - TPM_INTF_LOCALITY_CHANGE_INT =3D 0x004, - TPM_INTF_STS_VALID_INT =3D 0x002, - TPM_INTF_DATA_AVAIL_INT =3D 0x001, -}; - -enum tis_defaults { - TIS_MEM_LEN =3D 0x5000, - TIS_SHORT_TIMEOUT =3D 750, /* ms */ - TIS_LONG_TIMEOUT =3D 4000, /* 4 secs */ - TIS_TIMEOUT_MIN_ATML =3D 14700, /* usecs */ - TIS_TIMEOUT_MAX_ATML =3D 15000, /* usecs */ -}; - -/* Some timeout values are needed before it is known whether the chip is - * TPM 1.0 or TPM 2.0. - */ -#define TIS_TIMEOUT_A_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_A) -#define TIS_TIMEOUT_B_MAX max_t(int, TIS_LONG_TIMEOUT, TPM2_TIMEOUT_B) -#define TIS_TIMEOUT_C_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_C) -#define TIS_TIMEOUT_D_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_D) - -#define TPM_ACCESS(l) (0x0000 | ((l) << 12)) -#define TPM_INT_ENABLE(l) (0x0008 | ((l) << 12)) -#define TPM_INT_VECTOR(l) (0x000C | ((l) << 12)) -#define TPM_INT_STATUS(l) (0x0010 | ((l) << 12)) -#define TPM_INTF_CAPS(l) (0x0014 | ((l) << 12)) -#define TPM_STS(l) (0x0018 | ((l) << 12)) -#define TPM_STS3(l) (0x001b | ((l) << 12)) -#define TPM_DATA_FIFO(l) (0x0024 | ((l) << 12)) - -#define TPM_DID_VID(l) (0x0F00 | ((l) << 12)) -#define TPM_RID(l) (0x0F04 | ((l) << 12)) - -#define LPC_CNTRL_OFFSET 0x84 -#define LPC_CLKRUN_EN (1 << 2) -#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000 -#define ILB_REMAP_SIZE 0x100 - enum tpm_tis_flags { TPM_TIS_ITPM_WORKAROUND =3D 0, TPM_TIS_INVALID_STATUS =3D 1, diff --git a/include/linux/tpm_ptp.h b/include/linux/tpm_ptp.h new file mode 100644 index 000000000000..e80ed810a269 --- /dev/null +++ b/include/linux/tpm_ptp.h @@ -0,0 +1,133 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Following copyright information was take from the original file + * where the definitions were moved + * from: + * + * Copyright (C) 2005, 2006 IBM Corporation + * Copyright (C) 2014, 2015 Intel Corporation + * + * Authors: + * Leendert van Doorn + * Kylene Hall + * + * Maintained by: + * + * Device driver for TCG/TCPA TPM (trusted platform module). + * Specifications at www.trustedcomputinggroup.org + * + * This device driver implements the TPM interface as defined in + * the TCG TPM Interface Spec version 1.2, revision 1.0. + */ + +#ifndef __LINUX_TPM_PTP_H__ +#define __LINUX_TPM_PTP_H__ + +/* + * TCG PC Client Platform TPM Profile (PTP) Specification + * https://trustedcomputinggroup.org/resource/pc-client-platform-tpm-profi= le-ptp-specification/ + */ + +/* TIS/FIFO macros and definitions */ + +enum tis_access { + TPM_ACCESS_VALID =3D 0x80, + TPM_ACCESS_ACTIVE_LOCALITY =3D 0x20, /* (R) */ + TPM_ACCESS_RELINQUISH_LOCALITY =3D 0x20, /* (W) */ + TPM_ACCESS_REQUEST_PENDING =3D 0x04, /* (W) */ + TPM_ACCESS_REQUEST_USE =3D 0x02, /* (W) */ +}; + +enum tis_status { + TPM_STS_VALID =3D 0x80, /* (R) */ + TPM_STS_COMMAND_READY =3D 0x40, /* (R) */ + TPM_STS_DATA_AVAIL =3D 0x10, /* (R) */ + TPM_STS_DATA_EXPECT =3D 0x08, /* (R) */ + TPM_STS_GO =3D 0x20, /* (W) */ + TPM_STS_RESPONSE_RETRY =3D 0x02, /* (R) */ + TPM_STS_READ_ZERO =3D 0x23, /* bits that must be zero on read */ +}; + +enum tis_int_flags { + TPM_GLOBAL_INT_ENABLE =3D 0x80000000, + TPM_INTF_BURST_COUNT_STATIC =3D 0x100, + TPM_INTF_CMD_READY_INT =3D 0x080, + TPM_INTF_INT_EDGE_FALLING =3D 0x040, + TPM_INTF_INT_EDGE_RISING =3D 0x020, + TPM_INTF_INT_LEVEL_LOW =3D 0x010, + TPM_INTF_INT_LEVEL_HIGH =3D 0x008, + TPM_INTF_LOCALITY_CHANGE_INT =3D 0x004, + TPM_INTF_STS_VALID_INT =3D 0x002, + TPM_INTF_DATA_AVAIL_INT =3D 0x001, +}; + +enum tis_defaults { + TIS_MEM_LEN =3D 0x5000, + TIS_SHORT_TIMEOUT =3D 750, /* ms */ + TIS_LONG_TIMEOUT =3D 4000, /* 4 secs */ + TIS_TIMEOUT_MIN_ATML =3D 14700, /* usecs */ + TIS_TIMEOUT_MAX_ATML =3D 15000, /* usecs */ +}; + +#define TIS_MEM_X86_LPC_BASE 0xFED40000 +#define INTEL_LEGACY_BLK_BASE_ADDR 0xFED08000 + +enum tis_x86_defaults { + TIS_MEM_X86_LEN =3D 0x5000, + ILB_REMAP_SIZE =3D 0x100, + LPC_CNTRL_OFFSET =3D 0x84, + LPC_CLKRUN_EN =3D (1 << 2), +}; + +/* + * Some timeout values are needed before it is known whether the chip is + * TPM 1.0 or TPM 2.0. + */ +#define TIS_TIMEOUT_A_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_A) +#define TIS_TIMEOUT_B_MAX max_t(int, TIS_LONG_TIMEOUT, TPM2_TIMEOUT_B) +#define TIS_TIMEOUT_C_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_C) +#define TIS_TIMEOUT_D_MAX max_t(int, TIS_SHORT_TIMEOUT, TPM2_TIMEOUT_D) + +#define TPM_ACCESS(l) (0x0000 | ((l) << 12)) +#define TPM_INT_ENABLE(l) (0x0008 | ((l) << 12)) +#define TPM_INT_VECTOR(l) (0x000C | ((l) << 12)) +#define TPM_INT_STATUS(l) (0x0010 | ((l) << 12)) +#define TPM_INTF_CAPS(l) (0x0014 | ((l) << 12)) +#define TPM_STS(l) (0x0018 | ((l) << 12)) +#define TPM_STS3(l) (0x001b | ((l) << 12)) +#define TPM_DATA_FIFO(l) (0x0024 | ((l) << 12)) +#define TPM_INTF_ID(l) (0x0030 | ((l) << 12)) + +#define TPM_DID_VID(l) (0x0F00 | ((l) << 12)) +#define TPM_RID(l) (0x0F04 | ((l) << 12)) + +/* TPM HW Interface and Capabilities */ +#define TPM_TIS_INTF_ACTIVE 0x00 +#define TPM_CRB_INTF_ACTIVE 0x01 + +#define TPM_INTID_INTERFACE_TYPE GENMASK(3, 0) +#define TPM_INTID_INTERFACE_VERSION GENMASK(7, 4) +#define TPM_INTID_CAP_LOCALITY BIT(8) +#define TPM_INTID_CAP_TIS BIT(13) +#define TPM_INTID_CAP_CRB BIT(14) +#define TPM_INTID_CAP_IF_RES GENMASK(16, 15) +#define TPM_INTID_INTERFACE_SELECTOR GENMASK(18, 17) +#define TPM_INTID_INTF_SEL_LOCK BIT(19) + +#define TPM_TIS_INTF_12 0x00 +#define TPM_TIS_INTF_13 0x02 +#define TPM2_TIS_INTF_13 0x03 + +#define TPM_INTF_DATA_AVAIL_INT_SUPPORT BIT(0) +#define TPM_INTF_STS_VALID_INT_SUPPORT BIT(1) +#define TPM_INTF_LOCALITY_CHANGE_INT_SUPPORT BIT(2) +#define TPM_INTF_INTERRUPT_LEVEL_HIGH BIT(3) +#define TPM_INTF_INTERRUPT_LEVEL_LOW BIT(4) +#define TPM_INTF_INTERRUPT_EDGE_RISING BIT(5) +#define TPM_INTF_INTERRUPT_EDGE_FALLING BIT(6) +#define TPM_INTF_COMMAND_READY_INT_SUPPORT BIT(7) +#define TPM_INTF_BURST_COUNT_STATIC BIT(8) +#define TPM_INTF_DATA_TRANSFER_SIZE_SUPPORT GENMASK(10, 9) +#define TPM_INTF_INTERFACE_VERSION GENMASK(30, 28) + +#endif --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9F7D83CBE6D for ; Sat, 11 Jul 2026 16:01:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785695; cv=none; b=fKTuOaDsVK9HIPIWBDWPELCZk3DtRdZvn/+9en8ORddlC8qZc3Z6blrKjs5fBrvH6sy4rSKAH9rpmiR8JhVHSGT0FWGmI3ZDiGpq/11CbyzP68JXSJ0QH5sQzroFmYdGiVLKE50CE6kaO3zLgAdB+8gtD2dFqJdGaZLfwoEisqo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785695; c=relaxed/simple; bh=SWTmQxbm+O3CiuFQm/Zj3X9aRzkg0EYTJlhP8g+50ZE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fcVaRm4OilFRaUNpW163GbRit61oOXflH7DfXTCfT16AFs4c3BySXRsSTjVOZseyu0oVXN1+QnNL+hE0OrF4Wht3HpIFXLY5TT/EOlSKyU3WIljW33MEhYHBqFDaFGgt9HAAakbHSA4FgWOHJ1ocGqZuIhdOdS7UkYXLW9CWN08= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=g8t864WG; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="g8t864WG" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2cac59f8b64so20931895ad.0 for ; Sat, 11 Jul 2026 09:01:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785694; x=1784390494; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=h8PdlfVA45gq99DCqpKxVhIV4ifAok/KN5VEGME0LcA=; b=g8t864WGg/9SeihPvThSlxO6aPm1JKP+lZV5uqf4SxOGm5cSaLmszjo+qTr6W6Mk4i i14kRKNOH832Rpk8M5BB5PtKC7VLJXcSEJRneJywRQLIH7R+XR6FXOCnazpwyzxwdZ/T gnRXjR2omx7pImL8ZekUjMxErBXvDvNakGBHgedgE8h3Z7I6OZjO083vHKk4ULtAcUt5 kCG5ZtX94y7CNTHg+Rdj6YLPfn0RFSmlQ7bbXidPQJxboDwLUtlaijiOD12HagX4tLKe njOr4SDL/GGhi9XkSB3VneKsmO+ngrX2jI9elAcoD6bzhp4TAGfNTFDyTAjci6Myf+dn byUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785694; x=1784390494; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=h8PdlfVA45gq99DCqpKxVhIV4ifAok/KN5VEGME0LcA=; b=GD2oeK12VpsKxdLY0QPmntLSh6CLYOaxRENSDDxunqvFRW7gT/gKx+WNi6kBdnbIci ohsjKrkzxsvGI5DebX5eR3GHTowPtS7u4/uhYH6Qj80NcoJhqH9pQ3R7b2hlO3hxO/dP 2+VWLmRwlhrsETZblOrbPJIluzc4oXmpBFTHsqrYq9hcoJv/i6RsGsl4O0OA+AZNbTrF gPyHlidU7PO7hihyVrHlcr9HU/7OIQiRvXLzqf5wntmLl3L8jsbudJpdY3G8pE+EYHPs ippwwaahDwpGqmwPxJSZsWz7t+NSsKIO7m0tzX8exdFTH7Kb03u4xTARPvaU626jCC+b p+Lw== X-Gm-Message-State: AOJu0YyS+2mn5+WVq7Fz/GYq3uJSsgCNnuuDRKqQmJ7f/9mlNjr2VAId /MSN+ZHhO+5cH4c7oWh1GLrTQI66DqEf5Tf/DWFbW2OGDycqWUkJ32J9B+mDIUsU X-Gm-Gg: AfdE7ck94CijLonuty2DkuOfQoCYY6/Ru7xoxUzndPRKuPSmLicbrGMQJ4befi41Om7 SFl+RrHwMLfcxV3yQ2SmPP2f4F3/SbZnqkYqPneklEWKSqlvnLHDI9pNQxKsm0biJ505ppqvHv7 yz1p38KEAoYNbRegu3LEyjHrui+qTnqRZ1nEPVZo5xuP0yFpH8zSO+db61tUE01UZaODMTtoMIa HnnWgmJuiupBEt0detMQG+xv6JSNNThbC5qnNe/XGL1idp+0yqxYhqvoFxFHQ3wo58Ks11Da+lT cjjjPmq6iaPYFhw54tYg8cQKr4nZHq5IiWDW8WaKO4v8ZanEFGMA/Kd75M6oEVe9/Beesqn4vyX 8HOcnWli28ln4745SK7bdSq+ANygzUcYy5YtYYCTeDFpI8vGHVD/+KrzoVcVnVT2ecerI9UYoGD 0INuYRQYmunz+QvU7VKIF3 X-Received: by 2002:a17:90a:da83:b0:384:d509:7274 with SMTP id 98e67ed59e1d1-38dc75f63bemr3176054a91.15.1783785694020; Sat, 11 Jul 2026 09:01:34 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3118ee6091dsm54498068eec.14.2026.07.11.09.01.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:32 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 06/10] tpm: Remove main TPM header from TPM event log header Date: Sat, 11 Jul 2026 09:01:06 -0700 Message-ID: <20260711160110.267780-7-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Alec Brown Allow the TPM event log functionality to be used without including the main TPM driver definitions. Signed-off-by: Alec Brown Signed-off-by: Ross Philipson --- include/linux/tpm_eventlog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/tpm_eventlog.h b/include/linux/tpm_eventlog.h index aff8ea2fa98e..40fe92eb7deb 100644 --- a/include/linux/tpm_eventlog.h +++ b/include/linux/tpm_eventlog.h @@ -3,7 +3,7 @@ #ifndef __LINUX_TPM_EVENTLOG_H__ #define __LINUX_TPM_EVENTLOG_H__ =20 -#include +#include =20 #define TCG_EVENT_NAME_LEN_MAX 255 #define MAX_TEXT_EVENT 1000 /* Max event string length */ --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CAECA3CEB98 for ; Sat, 11 Jul 2026 16:01:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785699; cv=none; b=H6J57CGVqLqUL39Bhcmy6Z5ECUzroUzJ+wdHT7WLxQkYfmLTucAqqjWQDPk/vtp3SZ4etU00954k0TZAeoT3FQreOxMivyVExHfhKjs5CKdhkXQLOjHNoJf8peTisHY2ODCsOddd7x0PP6RVCNabifosmlQmFAMxJuCyOqe4Wak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785699; c=relaxed/simple; bh=1PD25Skogk+2yRj9Uzijb04l6UX9XacubnQOr/KgGiQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CxqM/p4rRgMew2JbFsyJpdFqnGNTsXgnttUU+fy/IedU4LXmgFAiWcaToiN5qU+nSm0xhtCjX3EgkYGAbGfWYUnAaLFREnGyqXPDXLf0N8UmnZtzgdYVup+jLpRi80S2wzY8MmWnkRf6a/rHhYMOkEQI5MhpodXYFUB8wV+BXXM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bb3GS/A3; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bb3GS/A3" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2cc6dd436c6so21492945ad.2 for ; Sat, 11 Jul 2026 09:01:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785697; x=1784390497; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=6itu2RYS2dJ1iEvAxavewh2t/11TJ7k1bnRtobjHT0c=; b=bb3GS/A3GnSbGCXN/qyC40OpAChEnckcB+Lud+A/ZDBdHUKfvy9/+Z1NWmZMBLtg5B aUOwPN9MU5tZyqRYPdjZG4z8Qa3GX8gEKhM4S73y7Pgrw+XWn0G5B4mI48JcY+rXAI4t 18x9QcgFKUdXcyaMtGSJfj9sc165iDqBjv41mB/Wl3otqOgZ/wYo2h60oecP60OO5Op1 aV82e8iUENIJNDeesrxrtqLfs0OudXiWncIUn1Bav5F32kMO6mvL323vA5MdZe6FGijY yQBBRPXIMdCOFbTjmDp2hZTDLqA1Tjgm4tysswDkJ6s4eoBdDxmCB+R9HEdZbIm3YSat Xfyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785697; x=1784390497; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=6itu2RYS2dJ1iEvAxavewh2t/11TJ7k1bnRtobjHT0c=; b=OA1I+oTDr1AiMRph6rGLA4eOXhRjiy35F+KZgFKSFzWgTqk0pHH327qxWQZzkayaP1 JsZ2l8ERLAn1zWchgj0b0FBHo21uolFa0iuO8ehjZ/p5/0Ds1bGtKPMsPoQVsrZ1Zuz+ ChzAr7daxgJ078BXCtvVJ6tF1I/mwnH/A3h0kslL8PJS1ucLzxa7FOkYxLhvVERusyyt +JZ45Ok2xH/gMy7BXO9kp+nw5Ny2jw7Kx0uGOducN/oFbBM1M0g+RhfgBBUk24U5OxHz 5Q+oX25zGob84ablcMWOQJA9hsq9g69FANVWpMqlgWskkAnDaUa1J1kW9r/unpQ5p1ly m7+A== X-Gm-Message-State: AOJu0YyjtISAF6fhqpZJIaBMSl6pbr4UoXnshau2xr0qDPHRnrxipZQ1 i/2JwatWWM7p11WZqKLQVfBLrobqDvBXMbAeo7pDtREfHpXVgzODN47Z2TjQpV/t X-Gm-Gg: AfdE7cmcQUoffMP4bZTi4lenGHZa7E2QtZl8o49exl8hlOzRJ2PuNhUqwJSbHRVcH7b RA/fSSf5tjKy5QAur6BoqSZyY8tjaQTZVmLFEiQ6X87Ah8LpXZm0M/IeIBhrSfPbZi2dLCygIx0 wUjUpLHnlVbgkYjl5PNX721T7BoVq7hdqBdz9zzLUor/Ath63Ihsh/Pc9Ipaurf97HY7Ncg2AV8 +qflqRjHw9mVl15JjeP/nmb/dz6YBL/cN4cjyU2yK5dDfxVKrz3gtk7Gqmy963Jgsq+0DkKxyY4 Grd4z5KodRbv9gMm9/fLxflBbJS4ZYpd3rIm4AcIZHYdUiGRNNz+aDjkRT++I9Xv+As0Cy3RqeE 7CBnAVHYAJ5dtOOxIm2Hd8aSfJ8fSBjVfJYSUPDjwnfKBqoBHCaQh9sfez+Zcq46v8CrriD2xr4 NYgoBYeWyr/IdSI3MohYQq X-Received: by 2002:a05:6a21:398d:b0:3c0:b3f7:e5dd with SMTP id adf61e73a8af0-3c110a74439mr3515794637.42.1783785697121; Sat, 11 Jul 2026 09:01:37 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b659d8da9sm92579946c88.14.2026.07.11.09.01.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:36 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 07/10] tpm-buf: Merge TPM_BUF_BOUNDARY_ERROR and TPM_BUF_OVERFLOW Date: Sat, 11 Jul 2026 09:01:07 -0700 Message-ID: <20260711160110.267780-8-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jarkko Sakkinen Merge TPM_BUF_BOUNDARY_ERROR and TPM_BUF_OVERFLOW flags into the TPM_BUF_INVALID flag, as their behavior is identical (the only difference being the associated log messages). Message-ID: <20260125192526.782202-11-jarkko@kernel.org> Signed-off-by: Jarkko Sakkinen Reviewed-by: Jonathan McDowell Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm-buf.c | 10 ++++------ include/linux/tpm.h | 8 +++----- security/keys/trusted-keys/trusted_tpm2.c | 6 +++--- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 4c4f450630df..61833b4d81f0 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -103,13 +103,12 @@ EXPORT_SYMBOL_GPL(tpm_buf_length); */ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_lengt= h) { - /* Return silently if overflow has already happened. */ - if (buf->flags & TPM_BUF_OVERFLOW) + if (buf->flags & TPM_BUF_INVALID) return; =20 if ((buf->length + new_length) > PAGE_SIZE) { WARN(1, "tpm_buf: write overflow\n"); - buf->flags |=3D TPM_BUF_OVERFLOW; + buf->flags |=3D TPM_BUF_INVALID; return; } =20 @@ -176,14 +175,13 @@ static void tpm_buf_read(struct tpm_buf *buf, off_t *= offset, size_t count, void { off_t next_offset; =20 - /* Return silently if overflow has already happened. */ - if (buf->flags & TPM_BUF_BOUNDARY_ERROR) + if (buf->flags & TPM_BUF_INVALID) return; =20 next_offset =3D *offset + count; if (next_offset > buf->length) { WARN(1, "tpm_buf: read out of boundary\n"); - buf->flags |=3D TPM_BUF_BOUNDARY_ERROR; + buf->flags |=3D TPM_BUF_INVALID; return; } =20 diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 3630b2ea6aef..3c6a5bcc138a 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -201,12 +201,10 @@ enum tpm_chip_flags { #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev) =20 enum tpm_buf_flags { - /* the capacity exceeded: */ - TPM_BUF_OVERFLOW =3D BIT(0), /* TPM2B format: */ - TPM_BUF_TPM2B =3D BIT(1), - /* read out of boundary: */ - TPM_BUF_BOUNDARY_ERROR =3D BIT(2), + TPM_BUF_TPM2B =3D BIT(0), + /* The buffer is in invalid and unusable state: */ + TPM_BUF_INVALID =3D BIT(1), }; =20 /* diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trus= ted-keys/trusted_tpm2.c index 29d79c05ed6b..779a2e66ac20 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -312,7 +312,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip, /* creation PCR */ tpm_buf_append_u32(&buf, 0); =20 - if (buf.flags & TPM_BUF_OVERFLOW) { + if (buf.flags & TPM_BUF_INVALID) { rc =3D -E2BIG; tpm2_end_auth_session(chip); goto out; @@ -328,7 +328,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip, goto out; =20 blob_len =3D tpm_buf_read_u32(&buf, &offset); - if (blob_len > MAX_BLOB_SIZE || buf.flags & TPM_BUF_BOUNDARY_ERROR) { + if (blob_len > MAX_BLOB_SIZE || buf.flags & TPM_BUF_INVALID) { rc =3D -E2BIG; goto out; } @@ -441,7 +441,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip, =20 tpm_buf_append(&buf, blob, blob_len); =20 - if (buf.flags & TPM_BUF_OVERFLOW) { + if (buf.flags & TPM_BUF_INVALID) { rc =3D -E2BIG; tpm2_end_auth_session(chip); goto out; --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4AD213C872B for ; Sat, 11 Jul 2026 16:01:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785702; cv=none; b=qYEvA2Qtip2ZhDhTpi+jhCknXgI6noac8yFfUZWqbBnHqXzFJ1Wwt9JTCj3vdMpXMDEgszezw+9kYXZ4jvTzlnVkDbMOG4vO9Jl4HRtyH1NdmhBhmegrYqlSsX2iLgkJ9OmRqOjn7KS/Zo9dgYKz6oW4Oa+qBdS5gDlX74EjUT0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785702; c=relaxed/simple; bh=OhR3jksgiJE0o7foAJ3ocqiSNmyJW9mbxX+rNOXqb98=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IqXDIT+qrgsUKRP8CDC0IZY+yIu1xuka4CpdAKhbyWhvM9oFOwYW8KGiEuKYKZ0MeI7xPDIZEOreIIKvdRQmAs/BjlsGCra8xbnXPxTs7BKXnS3LWTDJP/kDLZjTAKrsUjsW4sfcPm6+uYah6sYy7lnw4xnw8IqFXxWlD2oLX/M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=c9cXs2Tp; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="c9cXs2Tp" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-381216921aaso2101144a91.1 for ; Sat, 11 Jul 2026 09:01:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785700; x=1784390500; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=5tpVMPDTFvUicz2+KLP8Hde8q3QB+Jxc+FUe7rT1AhQ=; b=c9cXs2TpEjXm1a4uDiNX96FO7aegjxbngYacQH1eKdK3vtFtIYb42DaRy0EmNWa7cR 3U5j4lUU8MkGX3rFOJw01ZH5wecRSS1dxB6kybij/bR413DgR8TbFmO09Vc1SUM1areP G7bszIDezITBC9Ql6csioBDePNHncBvcKQk+rNE0WkTbOT4YshQfoMCa8XkEplMx70bT 8zmUPJaitIRj9iE8UDOI93BQnKDOeiC8FHsIoAHipnUPkS6VT3C9GUmLGtrYRVevLFUi fm2+ZTzu4WuZRJeuWJJqVJlaO9OuAmDAjJOLEKhHP8ezuVGaKeLDj4mpqBHjbRoKPtS3 8wVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785700; x=1784390500; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=5tpVMPDTFvUicz2+KLP8Hde8q3QB+Jxc+FUe7rT1AhQ=; b=n6YIKKrWSjOkjZp4TsCWH32eUteOD45gE7IOhk7UuWn7Xyvi9IR2Xmm6uJX4pIiX56 Vx0f3OBnkpV2lq6sKNxLjZ+V/n4P6fRINJ/KcVC8Q71kZWd9u5RBLO3yL/4RmTNyQ0Yb kieWNDO1Meb/58lO3IyqnOQd5JeBp47izk0Lv/kdBJM55Y93ezqw4Dc3ENYSwNpnKNs8 LTmVxQFJxoHYCQJwMQ86IQj2I6A8YZajNJieJHkSjbT+Mbmh8BrsiVQvH8U3T5tJzJ91 xrieji8TFqT4X4JBq/320qlTeU4IzHnefcIvLdMe4BCh5iGu49z95Yh2WJTMHZtFCx+x JVSw== X-Gm-Message-State: AOJu0YziL1yIwizdMWhONylpZSCPmveaM/hegI1YvkhL0XBVjNPFKEYe L/3cz41RxrZnPV+lGzNlV38OccX7xdsJZ4giPKNVxVKJEcZv/Ams+2EGszbhW2yP X-Gm-Gg: AfdE7clffJX2y6TKyJSziGZ+g+JjzXiW4/Ud9zaXZKwsv8C9ryJZpIfP4s7aO1IU1OF BAQEG6lmoSxzOTcIM7LgMtpXtYRQgVUwR5Aq9C5g9TgsLDkSMZhC1MEzeag9xR91//h6Y1O4Tpa OBoyItgKraq8mr6lhouipGP33T2+Un5nFlmd7Y4QiK7GYTdVDik8kscCBXBuczXW4oYbuI0L/oW Fq79UlshoieMe+n2toB0Qkh6K2q23Rz32KaYYfpAg73IsHiTCGJKTFVaQXYUi7v9qC7l+0fXOqw dA8ijfgJCp/88VkUq+3hENAIeGQT4Q5TNF5tbKwUBMZTPYlBI2SkG3aCdeec65q3+Gi90D6+r30 hnHAyyNEGg+EWc+I+liQ5qaukRNL14o4tI9aBPpKybPW1uvaKCYSyiuclNYE+7m40dQwN6/WmLA B8OOQ8qBFOhGYYY5rPboHC X-Received: by 2002:a17:90b:5343:b0:37f:ad36:8fc5 with SMTP id 98e67ed59e1d1-38dc7759428mr3420382a91.23.1783785700259; Sat, 11 Jul 2026 09:01:40 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-313b9ca880fsm12560829eec.23.2026.07.11.09.01.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:39 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 08/10] tpm-buf: Remove chip parameter from tpm_buf_append_handle() Date: Sat, 11 Jul 2026 09:01:08 -0700 Message-ID: <20260711160110.267780-9-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jarkko Sakkinen Remove the TPM driver chip parameter from the function tpm_buf_append_handle(). The chip parameter is only for error logging which can be done with other facilities like WARN(). Message-ID: <20260125192526.782202-11-jarkko@kernel.org> Signed-off-by: Jarkko Sakkinen Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm-buf.c | 9 ++++++--- drivers/char/tpm/tpm2-cmd.c | 2 +- drivers/char/tpm/tpm2-sessions.c | 2 +- include/linux/tpm.h | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 61833b4d81f0..99811809a72a 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -146,17 +146,20 @@ EXPORT_SYMBOL_GPL(tpm_buf_append_u32); =20 /** * tpm_buf_append_handle() - Add a handle - * @chip: &tpm_chip instance * @buf: &tpm_buf instance * @handle: a TPM object handle * * Add a handle to the buffer, and increase the count tracking the number = of * handles in the command buffer. Works only for command buffers. */ -void tpm_buf_append_handle(struct tpm_chip *chip, struct tpm_buf *buf, u32= handle) +void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle) { + if (buf->flags & TPM_BUF_INVALID) + return; + if (buf->flags & TPM_BUF_TPM2B) { - dev_err(&chip->dev, "Invalid buffer type (TPM2B)\n"); + WARN(1, "tpm-buf: invalid type: TPM2B\n"); + buf->flags |=3D TPM_BUF_INVALID; return; } =20 diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index 280f870e6517..c7952319384e 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c @@ -198,7 +198,7 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, } tpm_buf_append_hmac_session(chip, &buf, 0, NULL, 0); } else { - tpm_buf_append_handle(chip, &buf, pcr_idx); + tpm_buf_append_handle(&buf, pcr_idx); tpm_buf_append_auth(chip, &buf, NULL, 0); } =20 diff --git a/drivers/char/tpm/tpm2-sessions.c b/drivers/char/tpm/tpm2-sessi= ons.c index a1ae5e1829cb..0d89643e6880 100644 --- a/drivers/char/tpm/tpm2-sessions.c +++ b/drivers/char/tpm/tpm2-sessions.c @@ -260,7 +260,7 @@ int tpm_buf_append_name(struct tpm_chip *chip, struct t= pm_buf *buf, #endif =20 if (!tpm2_chip_auth(chip)) { - tpm_buf_append_handle(chip, buf, handle); + tpm_buf_append_handle(buf, handle); return 0; } =20 diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 3c6a5bcc138a..b357f8971d03 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -235,7 +235,7 @@ void tpm_buf_append_u32(struct tpm_buf *buf, const u32 = value); u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset); u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset); u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset); -void tpm_buf_append_handle(struct tpm_chip *chip, struct tpm_buf *buf, u32= handle); +void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle); =20 /* * Check if TPM device is in the firmware upgrade mode. --=20 2.55.0 From nobody Sat Jul 25 23:03:44 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7B9F3CFF44 for ; Sat, 11 Jul 2026 16:01:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785708; cv=none; b=RdTo5ShhSg42mmxIgZh4vSHMxP7w4UBwMoLBXmUDYtEUjIE6/83g8qdoWpSRZ0Y6ozbeWlkHpiZFt429eQg7MCECG0qlF2eJuLErcPUFQYPniTsJ6P+kApyv07qRE+/Jra4k0QkEU3ldlx06Ghvd11DC2D3S/uudjVKbjxdbY3Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785708; c=relaxed/simple; bh=hR3W3XUXmHlIQXm/Fx+LazP8M9dPc0eY7qSYOqSM8uw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p6HELLdd9KHrqjRq4JnbkzhSzsqRtz7sLRgEV2svnqmPQn7WIKAaXnf4X+Teyt+sUrUzZgFnYx+Wa1DXnsJM48DzO68mWa8aOMYMef98ofUJ3//S+AtN8Mk3/yZiiJsjhfJZtt4fGXT86teL0tha2VjhNFSoqdVJkzQKEsF2Ekk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=A6luRKxc; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="A6luRKxc" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2cce6a0c9c3so17312385ad.1 for ; Sat, 11 Jul 2026 09:01:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785704; x=1784390504; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lcERcAad2EB7RUwMrrOKSFpRAlJOZ7/5GHEalJf1b5g=; b=A6luRKxcJav0BYYto42dCaQr9hyYb6ZZLglk99ayNQ+6ok43+1O4ZHuyvH+kfGErpC bMcHtZ+I9lraM0eOvZVorod/SyGboAPgj9baZ+wNuF06N4gEWX14fR5rUfX/yrHE/W6w w0BBL/w0wTaHP+eLxMiLnH743DGmo/ip4OPUuYqowexD2PsphDOnMJc3mA9OMdnOxho9 kvJozRHXuQqJYOBs+qoy6PLD2a8OmsBmkrLcpDmhHjGUUukRIXM5/3MFWgqpbzb8Mzp1 Us7kmO7kobD833oVFgw/bV931evSUKfCg0+fW7uyxn0VXek+N+rInRpSZ54IKiXurdw3 W0iA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785704; x=1784390504; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=lcERcAad2EB7RUwMrrOKSFpRAlJOZ7/5GHEalJf1b5g=; b=PjnPoFgp+mwcbd2PD6UOqib4yuieOfN8u4wJmUneSegR+6f1/A9F35Xx135jGtGRmP A+sZJ7VdiZ1rCl2Qzv38JbHlwNZCD47d72C21BZkyCrG0ar2oTEN6AXiW19HdXEcTBlx iJFHtATlLSNjdHu4CctLWZ6efHYy+dbN/L/wYNSNn+6TWkk9o2QHdcZP5TZtppjAR1r4 yoqEyHMoQiglbOhgDmexNc/qcCP5aKwzc1vo5u6xrq07QBX7bgMp8eB+puNZjrzIX6ef qoUWrLCPwY0c8ltIUemkYrIbIrAy0j+0DGrYvfLsJ4egoRUc5z9CeSQn+UqApZFHKSJD GwQA== X-Gm-Message-State: AOJu0Yy9K+lXaTV7gZxGC4v9qNGZZj5427jUUxfLSNQpyfmvE96RLa25 fdwg/Nv/1EBMtL/m05uS5cnNCxKNAwgfpLTL4vOIgGKNM8RgKzV0svVgWFkBKn2g X-Gm-Gg: AfdE7cl+RyMHQ/E3Y/2c8Ocmk+oc9hZ1O8LUXnQAtaCszAegLwQ8pEa8eF32M5AM8jZ dsk5x1AIaUaRNq1Sq5THjRXX3aZW8VKdUJFfoN+d0HpBJwohAu6fn5+1GXeUP0BpWN8FrNh2w2O sxHTjqUOTfN9MAPiP2kNR5yJxV9R7cNstOKDbUruDRe4j+cB2vnYPi5S6bMLpkvXJ1ltpLzEC3o gYutQwosfNxUoOSyqG7XfPcuR2T64jv2bD7ljCFAanBirEKbZRiL4ACcb1B96ZNJoVISy2lOz22 vSU0oW+qv7BEMJh0h7hoeZnbE8dljLGjMhNr5UhyCiBPDW+PyIvBNTjptIgiSESxDWy1ee9BYeP y/Pudp5gwkHGgfpJOy5PpWro5bEW4xM/BfBuQwiOu3/TwK/LHtZo5TugEui1elszVkjUzY72tOa yrzBk/eB1F65j5jb6RCRUA X-Received: by 2002:a17:90b:164f:b0:387:e0cb:c8dc with SMTP id 98e67ed59e1d1-38dc779d132mr3210385a91.37.1783785703592; Sat, 11 Jul 2026 09:01:43 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-31174ac14f2sm55946248eec.27.2026.07.11.09.01.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:42 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 09/10] tpm-buf: Memory-safe allocations Date: Sat, 11 Jul 2026 09:01:09 -0700 Message-ID: <20260711160110.267780-10-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jarkko Sakkinen Decouple kzalloc from buffer creation, so that a managed allocation can be used: struct tpm_buf *buf __free(kfree) buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); if (!buf) return -ENOMEM; tpm_buf_init(buf, TPM_BUFSIZE); Alternatively, other allocations are also possible (static data, stack, etc) for example: u8 buf_data[512]; struct tpm_buf *buf =3D (struct tpm_buf *)buf_data; tpm_buf_init(buf, sizeof(buf_data)); This is achieved by embedding buffer's header inside the allocated blob, instead of having an outer wrapper. Cc: Arun Menon Cc: Daniel P. Smith Cc: Alec Brown Cc: Ross Philipson Reviewed-by: Stefan Berger Signed-off-by: Jarkko Sakkinen Tested-by: Srish Srinivasan Message-ID: <20260522013555.1063716-1-jarkko@kernel.org> Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm-buf.c | 122 +++++---- drivers/char/tpm/tpm-sysfs.c | 26 +- drivers/char/tpm/tpm1-cmd.c | 163 ++++++------ drivers/char/tpm/tpm2-cmd.c | 291 +++++++++++----------- drivers/char/tpm/tpm2-sessions.c | 162 ++++++------ drivers/char/tpm/tpm2-space.c | 44 ++-- drivers/char/tpm/tpm_vtpm_proxy.c | 30 +-- include/linux/tpm.h | 17 +- security/keys/trusted-keys/trusted_tpm1.c | 44 ++-- security/keys/trusted-keys/trusted_tpm2.c | 165 ++++++------ 10 files changed, 530 insertions(+), 534 deletions(-) diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 99811809a72a..1e5c11c312a8 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -6,82 +6,110 @@ #include #include =20 -/** - * tpm_buf_init() - Allocate and 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 - * - * Return: 0 or -ENOMEM - */ -int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal) +static void __tpm_buf_size_invariant(struct tpm_buf *buf, u16 buf_size) { - buf->data =3D (u8 *)__get_free_page(GFP_KERNEL); - if (!buf->data) - return -ENOMEM; - - tpm_buf_reset(buf, tag, ordinal); - return 0; + u32 buf_size_2 =3D (u32)buf->capacity + (u32)sizeof(*buf); + + if (!buf->capacity) { + if (buf_size > TPM_BUFSIZE) { + WARN(1, "%s: size overflow: %u\n", __func__, buf_size); + buf->flags |=3D TPM_BUF_INVALID; + } + } else { + if (buf_size !=3D buf_size_2) { + WARN(1, "%s: size mismatch: %u !=3D %u\n", __func__, + buf_size, buf_size_2); + buf->flags |=3D TPM_BUF_INVALID; + } + } } -EXPORT_SYMBOL_GPL(tpm_buf_init); =20 -/** - * 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) +static void __tpm_buf_reset(struct tpm_buf *buf, u16 buf_size, u16 tag, + u32 ordinal) { struct tpm_header *head =3D (struct tpm_header *)buf->data; =20 + __tpm_buf_size_invariant(buf, buf_size); + + if (buf->flags & TPM_BUF_INVALID) + return; + WARN_ON(tag !=3D TPM_TAG_RQU_COMMAND && tag !=3D TPM2_ST_NO_SESSIONS && tag !=3D TPM2_ST_SESSIONS && tag !=3D 0); =20 buf->flags =3D 0; buf->length =3D sizeof(*head); + buf->capacity =3D buf_size - sizeof(*buf); + buf->handles =3D 0; head->tag =3D cpu_to_be16(tag); head->length =3D cpu_to_be32(sizeof(*head)); head->ordinal =3D cpu_to_be32(ordinal); +} + +static void __tpm_buf_reset_sized(struct tpm_buf *buf, u16 buf_size) +{ + __tpm_buf_size_invariant(buf, buf_size); + + if (buf->flags & TPM_BUF_INVALID) + return; + + buf->flags =3D TPM_BUF_TPM2B; + buf->length =3D 2; + buf->capacity =3D buf_size - sizeof(*buf); buf->handles =3D 0; + buf->data[0] =3D 0; + buf->data[1] =3D 0; } -EXPORT_SYMBOL_GPL(tpm_buf_reset); =20 /** - * tpm_buf_init_sized() - Allocate and initialize a sized (TPM2B) buffer - * @buf: A @tpm_buf - * - * Return: 0 or -ENOMEM + * tpm_buf_init() - Initialize a TPM command + * @buf: A &tpm_buf + * @buf_size: Size of the buffer. */ -int tpm_buf_init_sized(struct tpm_buf *buf) +void tpm_buf_init(struct tpm_buf *buf, u16 buf_size) { - buf->data =3D (u8 *)__get_free_page(GFP_KERNEL); - if (!buf->data) - return -ENOMEM; + memset(buf, 0, buf_size); + __tpm_buf_reset(buf, buf_size, TPM_TAG_RQU_COMMAND, 0); +} +EXPORT_SYMBOL_GPL(tpm_buf_init); =20 - tpm_buf_reset_sized(buf); - return 0; +/** + * tpm_buf_init_sized() - Initialize a sized buffer + * @buf: A &tpm_buf + * @buf_size: Size of the buffer. + */ +void tpm_buf_init_sized(struct tpm_buf *buf, u16 buf_size) +{ + memset(buf, 0, buf_size); + __tpm_buf_reset_sized(buf, buf_size); } EXPORT_SYMBOL_GPL(tpm_buf_init_sized); =20 /** - * tpm_buf_reset_sized() - Initialize a sized buffer + * tpm_buf_reset() - Re-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_sized(struct tpm_buf *buf) +void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) { - buf->flags =3D TPM_BUF_TPM2B; - buf->length =3D 2; - buf->data[0] =3D 0; - buf->data[1] =3D 0; + u16 buf_size =3D buf->capacity + sizeof(*buf); + + __tpm_buf_reset(buf, buf_size, tag, ordinal); } -EXPORT_SYMBOL_GPL(tpm_buf_reset_sized); +EXPORT_SYMBOL_GPL(tpm_buf_reset); =20 -void tpm_buf_destroy(struct tpm_buf *buf) +/** + * tpm_buf_reset_sized() - Re-initialize a sized buffer + * @buf: A &tpm_buf + */ +void tpm_buf_reset_sized(struct tpm_buf *buf) { - free_page((unsigned long)buf->data); + u16 buf_size =3D buf->capacity + sizeof(*buf); + + __tpm_buf_reset_sized(buf, buf_size); } -EXPORT_SYMBOL_GPL(tpm_buf_destroy); +EXPORT_SYMBOL_GPL(tpm_buf_reset_sized); =20 /** * tpm_buf_length() - Return the number of bytes consumed by the data @@ -89,7 +117,7 @@ EXPORT_SYMBOL_GPL(tpm_buf_destroy); * * Return: The number of bytes consumed by the buffer */ -u32 tpm_buf_length(struct tpm_buf *buf) +u16 tpm_buf_length(struct tpm_buf *buf) { return buf->length; } @@ -103,10 +131,12 @@ EXPORT_SYMBOL_GPL(tpm_buf_length); */ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_lengt= h) { + u32 total_length =3D (u32)buf->length + (u32)new_length; + if (buf->flags & TPM_BUF_INVALID) return; =20 - if ((buf->length + new_length) > PAGE_SIZE) { + if (total_length > (u32)buf->capacity) { WARN(1, "tpm_buf: write overflow\n"); buf->flags |=3D TPM_BUF_INVALID; return; diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index 94231f052ea7..d915307ae833 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -32,28 +32,35 @@ struct tpm_readpubek_out { static ssize_t pubek_show(struct device *dev, struct device_attribute *att= r, char *buf) { - struct tpm_buf tpm_buf; struct tpm_readpubek_out *out; int i; char *str =3D buf; struct tpm_chip *chip =3D to_tpm_chip(dev); char anti_replay[20]; + struct tpm_buf *tpm_buf __free(kfree) =3D NULL; =20 memset(&anti_replay, 0, sizeof(anti_replay)); =20 if (tpm_try_get_ops(chip)) return 0; =20 - if (tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK)) - goto out_ops; + tpm_buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!tpm_buf) { + tpm_put_ops(chip); + return 0; + } =20 - tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay)); + tpm_buf_init(tpm_buf, TPM_BUFSIZE); + tpm_buf_reset(tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK); + tpm_buf_append(tpm_buf, anti_replay, sizeof(anti_replay)); =20 - if (tpm_transmit_cmd(chip, &tpm_buf, READ_PUBEK_RESULT_MIN_BODY_SIZE, - "attempting to read the PUBEK")) - goto out_buf; + if (tpm_transmit_cmd(chip, tpm_buf, READ_PUBEK_RESULT_MIN_BODY_SIZE, + "attempting to read the PUBEK")) { + tpm_put_ops(chip); + return 0; + } =20 - out =3D (struct tpm_readpubek_out *)&tpm_buf.data[10]; + out =3D (struct tpm_readpubek_out *)&tpm_buf->data[10]; str +=3D sprintf(str, "Algorithm: %4ph\n" @@ -71,9 +78,6 @@ static ssize_t pubek_show(struct device *dev, struct devi= ce_attribute *attr, for (i =3D 0; i < 256; i +=3D 16) str +=3D sprintf(str, "%16ph\n", &out->modulus[i]); =20 -out_buf: - tpm_buf_destroy(&tpm_buf); -out_ops: tpm_put_ops(chip); return str - buf; } diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index 96f189b5fd6f..7a8606e8c711 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -318,20 +318,18 @@ unsigned long tpm1_calc_ordinal_duration(struct tpm_c= hip *chip, u32 ordinal) */ static int tpm1_startup(struct tpm_chip *chip) { - struct tpm_buf buf; - int rc; + struct tpm_buf *buf __free(kfree) =3D NULL; =20 dev_info(&chip->dev, "starting up the TPM manually\n"); =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_STARTUP); - if (rc < 0) - return rc; - - tpm_buf_append_u16(&buf, TPM_ST_CLEAR); + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, "attempting to start the TPM"); - tpm_buf_destroy(&buf); - return rc; + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_STARTUP); + tpm_buf_append_u16(buf, TPM_ST_CLEAR); + return tpm_transmit_cmd(chip, buf, 0, "attempting to start the TPM"); } =20 int tpm1_get_timeouts(struct tpm_chip *chip) @@ -457,49 +455,49 @@ int tpm1_get_timeouts(struct tpm_chip *chip) int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash, const char *log_msg) { - struct tpm_buf buf; - int rc; + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_EXTEND); - if (rc) - return rc; - - tpm_buf_append_u32(&buf, pcr_idx); - tpm_buf_append(&buf, hash, TPM_DIGEST_SIZE); + tpm_buf_init(buf, TPM_BUFSIZE); + 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); =20 - rc =3D tpm_transmit_cmd(chip, &buf, TPM_DIGEST_SIZE, log_msg); - tpm_buf_destroy(&buf); - return rc; + return tpm_transmit_cmd(chip, buf, TPM_DIGEST_SIZE, log_msg); } =20 ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, const char *desc, size_t min_cap_length) { - struct tpm_buf buf; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP); - if (rc) - return rc; + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP); =20 if (subcap_id =3D=3D TPM_CAP_VERSION_1_1 || subcap_id =3D=3D TPM_CAP_VERSION_1_2) { - tpm_buf_append_u32(&buf, subcap_id); - tpm_buf_append_u32(&buf, 0); + tpm_buf_append_u32(buf, subcap_id); + tpm_buf_append_u32(buf, 0); } else { if (subcap_id =3D=3D TPM_CAP_FLAG_PERM || subcap_id =3D=3D TPM_CAP_FLAG_VOL) - tpm_buf_append_u32(&buf, TPM_CAP_FLAG); + tpm_buf_append_u32(buf, TPM_CAP_FLAG); else - tpm_buf_append_u32(&buf, TPM_CAP_PROP); + tpm_buf_append_u32(buf, TPM_CAP_PROP); =20 - tpm_buf_append_u32(&buf, 4); - tpm_buf_append_u32(&buf, subcap_id); + tpm_buf_append_u32(buf, 4); + tpm_buf_append_u32(buf, subcap_id); } - rc =3D tpm_transmit_cmd(chip, &buf, min_cap_length, desc); + + rc =3D tpm_transmit_cmd(chip, buf, min_cap_length, desc); if (!rc) - *cap =3D *(cap_t *)&buf.data[TPM_HEADER_SIZE + 4]; - tpm_buf_destroy(&buf); + *cap =3D *(cap_t *)&buf->data[TPM_HEADER_SIZE + 4]; + return rc; } EXPORT_SYMBOL_GPL(tpm1_getcap); @@ -517,81 +515,77 @@ EXPORT_SYMBOL_GPL(tpm1_getcap); int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) { struct tpm1_get_random_out *out; + struct tpm_buf *buf __free(kfree) =3D NULL; u32 num_bytes =3D min_t(u32, max, TPM_MAX_RNG_DATA); - struct tpm_buf buf; u32 total =3D 0; int retries =3D 5; u32 recd; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); - if (rc) - return rc; + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); =20 do { - tpm_buf_append_u32(&buf, num_bytes); + tpm_buf_append_u32(buf, num_bytes); =20 - rc =3D tpm_transmit_cmd(chip, &buf, sizeof(out->rng_data_len), + rc =3D tpm_transmit_cmd(chip, buf, sizeof(out->rng_data_len), "attempting get random"); if (rc) { if (rc > 0) rc =3D -EIO; - goto out; + return rc; } =20 - out =3D (struct tpm1_get_random_out *)&buf.data[TPM_HEADER_SIZE]; + out =3D (struct tpm1_get_random_out *)&buf->data[TPM_HEADER_SIZE]; =20 recd =3D be32_to_cpu(out->rng_data_len); - if (recd > num_bytes) { - rc =3D -EFAULT; - goto out; - } + if (recd > num_bytes) + return -EFAULT; + + if (tpm_buf_length(buf) < TPM_HEADER_SIZE + + sizeof(out->rng_data_len) + recd) + return -EFAULT; =20 - if (tpm_buf_length(&buf) < TPM_HEADER_SIZE + - sizeof(out->rng_data_len) + recd) { - rc =3D -EFAULT; - goto out; - } memcpy(dest, out->rng_data, recd); =20 dest +=3D recd; total +=3D recd; num_bytes -=3D recd; =20 - tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_RANDOM); } while (retries-- && total < max); =20 rc =3D total ? (int)total : -EIO; -out: - tpm_buf_destroy(&buf); + return rc; } =20 int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf) { - struct tpm_buf buf; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_READ); - if (rc) - return rc; + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - tpm_buf_append_u32(&buf, pcr_idx); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCR_READ); + tpm_buf_append_u32(buf, pcr_idx); =20 - rc =3D tpm_transmit_cmd(chip, &buf, TPM_DIGEST_SIZE, + rc =3D tpm_transmit_cmd(chip, buf, TPM_DIGEST_SIZE, "attempting to read a pcr value"); if (rc) - goto out; + return rc; =20 - if (tpm_buf_length(&buf) < TPM_DIGEST_SIZE) { - rc =3D -EFAULT; - goto out; - } + if (tpm_buf_length(buf) < TPM_DIGEST_SIZE) + return -EFAULT; =20 - memcpy(res_buf, &buf.data[TPM_HEADER_SIZE], TPM_DIGEST_SIZE); + memcpy(res_buf, &buf->data[TPM_HEADER_SIZE], TPM_DIGEST_SIZE); =20 -out: - tpm_buf_destroy(&buf); return rc; } =20 @@ -604,16 +598,13 @@ int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx,= u8 *res_buf) */ static int tpm1_continue_selftest(struct tpm_chip *chip) { - struct tpm_buf buf; - int rc; + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_CONTINUE_SELFTEST); - if (rc) - return rc; - - rc =3D tpm_transmit_cmd(chip, &buf, 0, "continue selftest"); - tpm_buf_destroy(&buf); - return rc; + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_CONTINUE_SELFTEST); + return tpm_transmit_cmd(chip, buf, 0, "continue selftest"); } =20 /** @@ -725,22 +716,24 @@ int tpm1_auto_startup(struct tpm_chip *chip) int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr) { u8 dummy_hash[TPM_DIGEST_SIZE] =3D { 0 }; - struct tpm_buf buf; unsigned int try; + struct tpm_buf *buf __free(kfree) =3D NULL; int rc; =20 - /* for buggy tpm, flush pcrs with extend to selected dummy */ if (tpm_suspend_pcr) rc =3D tpm1_pcr_extend(chip, tpm_suspend_pcr, dummy_hash, "extending dummy pcr before suspend"); + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); =20 - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); - if (rc) - return rc; /* now do the actual savestate */ for (try =3D 0; try < TPM_RETRY; try++) { - rc =3D tpm_transmit_cmd(chip, &buf, 0, NULL); + rc =3D tpm_transmit_cmd(chip, buf, 0, NULL); /* * If the TPM indicates that it is too busy to respond to * this command then retry before giving up. It can take @@ -755,7 +748,7 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_susp= end_pcr) break; tpm_msleep(TPM_TIMEOUT_RETRY); =20 - tpm_buf_reset(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SAVESTATE); } =20 if (rc) @@ -765,8 +758,6 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_susp= end_pcr) dev_warn(&chip->dev, "TPM savestate took %dms\n", try * TPM_TIMEOUT_RETRY); =20 - tpm_buf_destroy(&buf); - return rc; } =20 diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c index c7952319384e..48cec39995fe 100644 --- a/drivers/char/tpm/tpm2-cmd.c +++ b/drivers/char/tpm/tpm2-cmd.c @@ -108,12 +108,13 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, { int i; int rc; - struct tpm_buf buf; struct tpm2_pcr_read_out *out; u8 pcr_select[TPM2_PCR_SELECT_MIN] =3D {0}; u16 digest_size; u16 expected_digest_size =3D 0; =20 + struct tpm_buf *buf __free(kfree) =3D NULL; + if (pcr_idx >=3D TPM2_PLATFORM_PCR) return -EINVAL; =20 @@ -128,36 +129,35 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, expected_digest_size =3D chip->allocated_banks[i].digest_size; } =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_PCR_READ); - if (rc) - return rc; + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_PCR_READ); =20 pcr_select[pcr_idx >> 3] =3D 1 << (pcr_idx & 0x7); =20 - tpm_buf_append_u32(&buf, 1); - tpm_buf_append_u16(&buf, digest->alg_id); - tpm_buf_append_u8(&buf, TPM2_PCR_SELECT_MIN); - tpm_buf_append(&buf, (const unsigned char *)pcr_select, + tpm_buf_append_u32(buf, 1); + tpm_buf_append_u16(buf, digest->alg_id); + tpm_buf_append_u8(buf, TPM2_PCR_SELECT_MIN); + tpm_buf_append(buf, (const unsigned char *)pcr_select, sizeof(pcr_select)); =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, "attempting to read a pcr value"); + rc =3D tpm_transmit_cmd(chip, buf, 0, "attempting to read a pcr value"); if (rc) - goto out; + return rc; =20 - out =3D (struct tpm2_pcr_read_out *)&buf.data[TPM_HEADER_SIZE]; + out =3D (struct tpm2_pcr_read_out *)&buf->data[TPM_HEADER_SIZE]; digest_size =3D be16_to_cpu(out->digest_size); if (digest_size > sizeof(digest->digest) || - (!digest_size_ptr && digest_size !=3D expected_digest_size)) { - rc =3D -EINVAL; - goto out; - } + (!digest_size_ptr && digest_size !=3D expected_digest_size)) + return -EINVAL; =20 if (digest_size_ptr) *digest_size_ptr =3D digest_size; =20 memcpy(digest->digest, out->digest, digest_size); -out: - tpm_buf_destroy(&buf); return rc; } =20 @@ -173,7 +173,7 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, struct tpm_digest *digests) { - struct tpm_buf buf; + struct tpm_buf *buf __free(kfree) =3D NULL; int rc; int i; =20 @@ -183,46 +183,45 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_id= x, return rc; } =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_PCR_EXTEND); - if (rc) { + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { if (!disable_pcr_integrity) tpm2_end_auth_session(chip); - return rc; + return -ENOMEM; } =20 + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_PCR_EXTEND); + if (!disable_pcr_integrity) { - rc =3D tpm_buf_append_name(chip, &buf, pcr_idx, NULL); + rc =3D tpm_buf_append_name(chip, buf, pcr_idx, NULL); if (rc) { - tpm_buf_destroy(&buf); + tpm2_end_auth_session(chip); return rc; } - tpm_buf_append_hmac_session(chip, &buf, 0, NULL, 0); + tpm_buf_append_hmac_session(chip, buf, 0, NULL, 0); } else { - tpm_buf_append_handle(&buf, pcr_idx); - tpm_buf_append_auth(chip, &buf, NULL, 0); + tpm_buf_append_handle(buf, pcr_idx); + tpm_buf_append_auth(chip, buf, NULL, 0); } =20 - tpm_buf_append_u32(&buf, chip->nr_allocated_banks); + tpm_buf_append_u32(buf, chip->nr_allocated_banks); =20 for (i =3D 0; i < chip->nr_allocated_banks; i++) { - tpm_buf_append_u16(&buf, digests[i].alg_id); - tpm_buf_append(&buf, (const unsigned char *)&digests[i].digest, + tpm_buf_append_u16(buf, digests[i].alg_id); + tpm_buf_append(buf, (const unsigned char *)&digests[i].digest, chip->allocated_banks[i].digest_size); } =20 if (!disable_pcr_integrity) { - rc =3D tpm_buf_fill_hmac_session(chip, &buf); - if (rc) { - tpm_buf_destroy(&buf); + rc =3D tpm_buf_fill_hmac_session(chip, buf); + if (rc) return rc; - } } =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, "attempting extend a PCR value"); + rc =3D tpm_transmit_cmd(chip, buf, 0, "attempting extend a PCR value"); if (!disable_pcr_integrity) - rc =3D tpm_buf_check_hmac_response(chip, &buf, rc); - - tpm_buf_destroy(&buf); + rc =3D tpm_buf_check_hmac_response(chip, buf, rc); =20 return rc; } @@ -242,7 +241,6 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, si= ze_t max) { struct tpm2_get_random_out *out; struct tpm_header *head; - struct tpm_buf buf; u32 recd; u32 num_bytes =3D max; int err; @@ -251,6 +249,8 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, si= ze_t max) u8 *dest_ptr =3D dest; off_t offset; =20 + struct tpm_buf *buf __free(kfree) =3D NULL; + if (!num_bytes || max > TPM_MAX_RNG_DATA) return -EINVAL; =20 @@ -258,55 +258,58 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, = size_t max) if (err) return err; =20 - err =3D tpm_buf_init(&buf, 0, 0); - if (err) { + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { tpm2_end_auth_session(chip); - return err; + return -ENOMEM; } =20 + tpm_buf_init(buf, TPM_BUFSIZE); + do { - tpm_buf_reset(&buf, TPM2_ST_SESSIONS, TPM2_CC_GET_RANDOM); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_GET_RANDOM); if (tpm2_chip_auth(chip)) { - tpm_buf_append_hmac_session(chip, &buf, + tpm_buf_append_hmac_session(chip, buf, TPM2_SA_ENCRYPT | TPM2_SA_CONTINUE_SESSION, NULL, 0); } else { - offset =3D buf.handles * 4 + TPM_HEADER_SIZE; - head =3D (struct tpm_header *)buf.data; - if (tpm_buf_length(&buf) =3D=3D offset) + offset =3D buf->handles * 4 + TPM_HEADER_SIZE; + head =3D (struct tpm_header *)buf->data; + if (tpm_buf_length(buf) =3D=3D offset) head->tag =3D cpu_to_be16(TPM2_ST_NO_SESSIONS); } - tpm_buf_append_u16(&buf, num_bytes); - err =3D tpm_buf_fill_hmac_session(chip, &buf); + tpm_buf_append_u16(buf, num_bytes); + err =3D tpm_buf_fill_hmac_session(chip, buf); if (err) - goto out; + return err; =20 - err =3D tpm_transmit_cmd(chip, &buf, + err =3D tpm_transmit_cmd(chip, buf, offsetof(struct tpm2_get_random_out, buffer), "attempting get random"); - err =3D tpm_buf_check_hmac_response(chip, &buf, err); + err =3D tpm_buf_check_hmac_response(chip, buf, err); if (err) { if (err > 0) err =3D -EIO; - goto out; + tpm2_end_auth_session(chip); + return err; } =20 - head =3D (struct tpm_header *)buf.data; + head =3D (struct tpm_header *)buf->data; offset =3D TPM_HEADER_SIZE; /* Skip the parameter size field: */ if (be16_to_cpu(head->tag) =3D=3D TPM2_ST_SESSIONS) offset +=3D 4; =20 - out =3D (struct tpm2_get_random_out *)&buf.data[offset]; + out =3D (struct tpm2_get_random_out *)&buf->data[offset]; recd =3D min_t(u32, be16_to_cpu(out->size), num_bytes); - if (tpm_buf_length(&buf) < + if (tpm_buf_length(buf) < TPM_HEADER_SIZE + offsetof(struct tpm2_get_random_out, buffer) + recd) { - err =3D -EFAULT; - goto out; + tpm2_end_auth_session(chip); + return -EFAULT; } memcpy(dest_ptr, out->buffer, recd); =20 @@ -315,13 +318,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, s= ize_t max) num_bytes -=3D recd; } while (retries-- && total < max); =20 - tpm_buf_destroy(&buf); - return total ? total : -EIO; -out: - tpm_buf_destroy(&buf); - tpm2_end_auth_session(chip); - return err; } =20 /** @@ -331,20 +328,18 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, = size_t max) */ void tpm2_flush_context(struct tpm_chip *chip, u32 handle) { - struct tpm_buf buf; - int rc; - - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_FLUSH_CONTEXT); - if (rc) { + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { dev_warn(&chip->dev, "0x%08x was not flushed, out of memory\n", handle); return; } =20 - tpm_buf_append_u32(&buf, handle); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_FLUSH_CONTEXT); + tpm_buf_append_u32(buf, handle); =20 - tpm_transmit_cmd(chip, &buf, 0, "flushing context"); - tpm_buf_destroy(&buf); + tpm_transmit_cmd(chip, buf, 0, "flushing context"); } EXPORT_SYMBOL_GPL(tpm2_flush_context); =20 @@ -363,19 +358,21 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 pr= operty_id, u32 *value, const char *desc) { struct tpm2_get_cap_out *out; - struct tpm_buf buf; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); - if (rc) - return rc; - tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES); - tpm_buf_append_u32(&buf, property_id); - tpm_buf_append_u32(&buf, 1); - rc =3D tpm_transmit_cmd(chip, &buf, 0, NULL); + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + 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); + rc =3D tpm_transmit_cmd(chip, buf, 0, NULL); if (!rc) { out =3D (struct tpm2_get_cap_out *) - &buf.data[TPM_HEADER_SIZE]; + &buf->data[TPM_HEADER_SIZE]; /* * To prevent failing boot up of some systems, Infineon TPM2.0 * returns SUCCESS on TPM2_Startup in field upgrade mode. Also @@ -387,7 +384,6 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 prop= erty_id, u32 *value, else rc =3D -ENODATA; } - tpm_buf_destroy(&buf); return rc; } EXPORT_SYMBOL_GPL(tpm2_get_tpm_pt); @@ -404,15 +400,14 @@ EXPORT_SYMBOL_GPL(tpm2_get_tpm_pt); */ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type) { - struct tpm_buf buf; - int rc; - - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SHUTDOWN); - if (rc) + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) return; - tpm_buf_append_u16(&buf, shutdown_type); - tpm_transmit_cmd(chip, &buf, 0, "stopping the TPM"); - tpm_buf_destroy(&buf); + + tpm_buf_init(buf, TPM_BUFSIZE); + 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"); } =20 /** @@ -430,20 +425,21 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdow= n_type) */ static int tpm2_do_selftest(struct tpm_chip *chip) { - struct tpm_buf buf; int full; int rc; =20 for (full =3D 0; full < 2; full++) { - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SELF_TEST); - if (rc) - return rc; + struct tpm_buf *buf __free(kfree) =3D NULL; =20 - tpm_buf_append_u8(&buf, full); - rc =3D tpm_transmit_cmd(chip, &buf, 0, - "attempting the self test"); - tpm_buf_destroy(&buf); + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_SELF_TEST); + tpm_buf_append_u8(buf, full); + rc =3D tpm_transmit_cmd(chip, buf, 0, + "attempting the self test"); if (rc =3D=3D TPM2_RC_TESTING) rc =3D TPM2_RC_SUCCESS; if (rc =3D=3D TPM2_RC_INITIALIZE || rc =3D=3D TPM2_RC_SUCCESS) @@ -468,23 +464,24 @@ static int tpm2_do_selftest(struct tpm_chip *chip) int tpm2_probe(struct tpm_chip *chip) { struct tpm_header *out; - struct tpm_buf buf; int rc; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); - if (rc) - return rc; - tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES); - tpm_buf_append_u32(&buf, TPM_PT_TOTAL_COMMANDS); - tpm_buf_append_u32(&buf, 1); - rc =3D tpm_transmit_cmd(chip, &buf, 0, NULL); + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + 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); + rc =3D tpm_transmit_cmd(chip, buf, 0, NULL); /* We ignore TPM return codes on purpose. */ if (rc >=3D 0) { - out =3D (struct tpm_header *)buf.data; + out =3D (struct tpm_header *)buf->data; if (be16_to_cpu(out->tag) =3D=3D TPM2_ST_NO_SESSIONS) chip->flags |=3D TPM_CHIP_FLAG_TPM2; } - tpm_buf_destroy(&buf); return 0; } EXPORT_SYMBOL_GPL(tpm2_probe); @@ -518,7 +515,6 @@ static int tpm2_init_bank_info(struct tpm_chip *chip, u= 32 bank_index) ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) { struct tpm2_pcr_selection pcr_selection; - struct tpm_buf buf; void *marker; void *end; void *pcr_select_offset; @@ -530,31 +526,32 @@ ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) int rc; int i =3D 0; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); - if (rc) - return rc; + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - tpm_buf_append_u32(&buf, TPM2_CAP_PCRS); - tpm_buf_append_u32(&buf, 0); - tpm_buf_append_u32(&buf, 1); + tpm_buf_init(buf, TPM_BUFSIZE); + 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); =20 - rc =3D tpm_transmit_cmd(chip, &buf, 9, "get tpm pcr allocation"); + rc =3D tpm_transmit_cmd(chip, buf, 9, "get tpm pcr allocation"); if (rc) - goto out; + return rc; =20 nr_possible_banks =3D be32_to_cpup( - (__be32 *)&buf.data[TPM_HEADER_SIZE + 5]); + (__be32 *)&buf->data[TPM_HEADER_SIZE + 5]); if (nr_possible_banks > TPM2_MAX_PCR_BANKS) { pr_err("tpm: out of bank capacity: %u > %u\n", nr_possible_banks, TPM2_MAX_PCR_BANKS); - rc =3D -ENOMEM; - goto out; + return -ENOMEM; } =20 - marker =3D &buf.data[TPM_HEADER_SIZE + 9]; + marker =3D &buf->data[TPM_HEADER_SIZE + 9]; =20 - rsp_len =3D be32_to_cpup((__be32 *)&buf.data[2]); - end =3D &buf.data[rsp_len]; + rsp_len =3D be32_to_cpup((__be32 *)&buf->data[2]); + end =3D &buf->data[rsp_len]; =20 for (i =3D 0; i < nr_possible_banks; i++) { pcr_select_offset =3D marker + @@ -586,21 +583,20 @@ ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip) } =20 chip->nr_allocated_banks =3D nr_alloc_banks; -out: - tpm_buf_destroy(&buf); =20 return rc; } =20 int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) { - struct tpm_buf buf; u32 nr_commands; __be32 *attrs; u32 cc; int i; int rc; =20 + struct tpm_buf *buf __free(kfree) =3D NULL; + rc =3D tpm2_get_tpm_pt(chip, TPM_PT_TOTAL_COMMANDS, &nr_commands, NULL); if (rc) goto out; @@ -617,30 +613,31 @@ int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) goto out; } =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_CAPABILITY); - if (rc) + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { + rc =3D -ENOMEM; goto out; + } =20 - tpm_buf_append_u32(&buf, TPM2_CAP_COMMANDS); - tpm_buf_append_u32(&buf, TPM2_CC_FIRST); - tpm_buf_append_u32(&buf, nr_commands); + tpm_buf_init(buf, TPM_BUFSIZE); + 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); =20 - rc =3D tpm_transmit_cmd(chip, &buf, 9 + 4 * nr_commands, NULL); - if (rc) { - tpm_buf_destroy(&buf); + rc =3D tpm_transmit_cmd(chip, buf, 9 + 4 * nr_commands, NULL); + if (rc) goto out; - } =20 if (nr_commands !=3D - be32_to_cpup((__be32 *)&buf.data[TPM_HEADER_SIZE + 5])) { + be32_to_cpup((__be32 *)&buf->data[TPM_HEADER_SIZE + 5])) { rc =3D -EFAULT; - tpm_buf_destroy(&buf); goto out; } =20 chip->nr_commands =3D nr_commands; =20 - attrs =3D (__be32 *)&buf.data[TPM_HEADER_SIZE + 9]; + attrs =3D (__be32 *)&buf->data[TPM_HEADER_SIZE + 9]; for (i =3D 0; i < nr_commands; i++, attrs++) { chip->cc_attrs_tbl[i] =3D be32_to_cpup(attrs); cc =3D chip->cc_attrs_tbl[i] & 0xFFFF; @@ -652,8 +649,6 @@ int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip) } } =20 - tpm_buf_destroy(&buf); - out: if (rc > 0) rc =3D -ENODEV; @@ -674,20 +669,18 @@ EXPORT_SYMBOL_GPL(tpm2_get_cc_attrs_tbl); =20 static int tpm2_startup(struct tpm_chip *chip) { - struct tpm_buf buf; - int rc; + struct tpm_buf *buf __free(kfree) =3D NULL; =20 dev_info(&chip->dev, "starting up the TPM manually\n"); =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_STARTUP); - if (rc < 0) - return rc; - - tpm_buf_append_u16(&buf, TPM2_SU_CLEAR); - rc =3D tpm_transmit_cmd(chip, &buf, 0, "attempting to start the TPM"); - tpm_buf_destroy(&buf); + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - return rc; + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_STARTUP); + tpm_buf_append_u16(buf, TPM2_SU_CLEAR); + return tpm_transmit_cmd(chip, buf, 0, "attempting to start the TPM"); } =20 /** diff --git a/drivers/char/tpm/tpm2-sessions.c b/drivers/char/tpm/tpm2-sessi= ons.c index 0d89643e6880..cf8f1fd6790b 100644 --- a/drivers/char/tpm/tpm2-sessions.c +++ b/drivers/char/tpm/tpm2-sessions.c @@ -167,8 +167,8 @@ static int tpm2_read_public(struct tpm_chip *chip, u32 = handle, void *name) { u32 mso =3D tpm2_handle_mso(handle); off_t offset =3D TPM_HEADER_SIZE; + struct tpm_buf *buf __free(kfree) =3D NULL; int rc, name_size_alg; - struct tpm_buf buf; =20 if (mso !=3D TPM2_MSO_PERSISTENT && mso !=3D TPM2_MSO_VOLATILE && mso !=3D TPM2_MSO_NVRAM) { @@ -176,50 +176,40 @@ static int tpm2_read_public(struct tpm_chip *chip, u3= 2 handle, void *name) return sizeof(u32); } =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_READ_PUBLIC); - if (rc) - return rc; + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - tpm_buf_append_u32(&buf, handle); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_READ_PUBLIC); + tpm_buf_append_u32(buf, handle); =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, "TPM2_ReadPublic"); - if (rc) { - tpm_buf_destroy(&buf); + rc =3D tpm_transmit_cmd(chip, buf, 0, "TPM2_ReadPublic"); + if (rc) return tpm_ret_to_err(rc); - } =20 /* Skip TPMT_PUBLIC: */ - offset +=3D tpm_buf_read_u16(&buf, &offset); + offset +=3D tpm_buf_read_u16(buf, &offset); =20 /* * Ensure space for the length field of TPM2B_NAME and hashAlg field of * TPMT_HA (the extra four bytes). */ - if (offset + 4 > tpm_buf_length(&buf)) { - tpm_buf_destroy(&buf); + if (offset + 4 > tpm_buf_length(buf)) return -EIO; - } =20 - rc =3D tpm_buf_read_u16(&buf, &offset); - name_size_alg =3D name_size(&buf.data[offset]); - - if (name_size_alg < 0) { - tpm_buf_destroy(&buf); + rc =3D tpm_buf_read_u16(buf, &offset); + name_size_alg =3D name_size(&buf->data[offset]); + if (name_size_alg < 0) return name_size_alg; - } =20 - if (rc !=3D name_size_alg) { - tpm_buf_destroy(&buf); + if (rc !=3D name_size_alg) return -EIO; - } =20 - if (offset + rc > tpm_buf_length(&buf)) { - tpm_buf_destroy(&buf); + if (offset + rc > tpm_buf_length(buf)) return -EIO; - } =20 - memcpy(name, &buf.data[offset], rc); - tpm_buf_destroy(&buf); + memcpy(name, &buf->data[offset], rc); return name_size_alg; } #endif /* CONFIG_TCG_TPM2_HMAC */ @@ -1005,8 +995,8 @@ static int tpm2_load_null(struct tpm_chip *chip, u32 *= null_key) */ int tpm2_start_auth_session(struct tpm_chip *chip) { + struct tpm_buf *buf __free(kfree) =3D NULL; struct tpm2_auth *auth; - struct tpm_buf buf; u32 null_key; int rc; =20 @@ -1020,58 +1010,61 @@ int tpm2_start_auth_session(struct tpm_chip *chip) return -ENOMEM; =20 rc =3D tpm2_load_null(chip, &null_key); - if (rc) - goto out; + if (rc) { + kfree_sensitive(auth); + return rc; + } =20 auth->session =3D TPM_HEADER_SIZE; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_START_AUTH_SESS); - if (rc) - goto out; + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { + kfree_sensitive(auth); + return -ENOMEM; + } =20 + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_NO_SESSIONS, TPM2_CC_START_AUTH_SESS); /* salt key handle */ - tpm_buf_append_u32(&buf, null_key); + tpm_buf_append_u32(buf, null_key); /* bind key handle */ - tpm_buf_append_u32(&buf, TPM2_RH_NULL); + tpm_buf_append_u32(buf, TPM2_RH_NULL); /* nonce caller */ get_random_bytes(auth->our_nonce, sizeof(auth->our_nonce)); - tpm_buf_append_u16(&buf, sizeof(auth->our_nonce)); - tpm_buf_append(&buf, auth->our_nonce, sizeof(auth->our_nonce)); + tpm_buf_append_u16(buf, sizeof(auth->our_nonce)); + tpm_buf_append(buf, auth->our_nonce, sizeof(auth->our_nonce)); =20 /* append encrypted salt and squirrel away unencrypted in auth */ - rc =3D tpm_buf_append_salt(&buf, chip, auth); + rc =3D tpm_buf_append_salt(buf, chip, auth); if (rc) { tpm2_flush_context(chip, null_key); - tpm_buf_destroy(&buf); - goto out; + kfree_sensitive(auth); + return rc; } /* session type (HMAC, audit or policy) */ - tpm_buf_append_u8(&buf, TPM2_SE_HMAC); + tpm_buf_append_u8(buf, TPM2_SE_HMAC); =20 /* symmetric encryption parameters */ /* symmetric algorithm */ - tpm_buf_append_u16(&buf, TPM_ALG_AES); + tpm_buf_append_u16(buf, TPM_ALG_AES); /* bits for symmetric algorithm */ - tpm_buf_append_u16(&buf, AES_KEY_BITS); + tpm_buf_append_u16(buf, AES_KEY_BITS); /* symmetric algorithm mode (must be CFB) */ - tpm_buf_append_u16(&buf, TPM_ALG_CFB); + tpm_buf_append_u16(buf, TPM_ALG_CFB); /* hash algorithm for session */ - tpm_buf_append_u16(&buf, TPM_ALG_SHA256); + tpm_buf_append_u16(buf, TPM_ALG_SHA256); =20 - rc =3D tpm_ret_to_err(tpm_transmit_cmd(chip, &buf, 0, "StartAuthSession")= ); + rc =3D tpm_ret_to_err(tpm_transmit_cmd(chip, buf, 0, "StartAuthSession")); tpm2_flush_context(chip, null_key); =20 if (rc =3D=3D TPM2_RC_SUCCESS) - rc =3D tpm2_parse_start_auth_session(auth, &buf); - - tpm_buf_destroy(&buf); + rc =3D tpm2_parse_start_auth_session(auth, buf); =20 if (rc =3D=3D TPM2_RC_SUCCESS) { chip->auth =3D auth; return 0; } =20 -out: kfree_sensitive(auth); return rc; } @@ -1285,19 +1278,21 @@ static int tpm2_parse_create_primary(struct tpm_chi= p *chip, struct tpm_buf *buf, static int tpm2_create_primary(struct tpm_chip *chip, u32 hierarchy, u32 *handle, u8 *name) { + struct tpm_buf *template __free(kfree) =3D NULL; + struct tpm_buf *buf __free(kfree) =3D NULL; int rc; - struct tpm_buf buf; - struct tpm_buf template; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE_PRIMARY); - if (rc) - return rc; + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; =20 - rc =3D tpm_buf_init_sized(&template); - if (rc) { - tpm_buf_destroy(&buf); - return rc; - } + template =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!template) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE_PRIMARY); + tpm_buf_init_sized(template, TPM_BUFSIZE); =20 /* * create the template. Note: in order for userspace to @@ -1309,75 +1304,72 @@ static int tpm2_create_primary(struct tpm_chip *chi= p, u32 hierarchy, */ =20 /* key type */ - tpm_buf_append_u16(&template, TPM_ALG_ECC); + tpm_buf_append_u16(template, TPM_ALG_ECC); =20 /* name algorithm */ - tpm_buf_append_u16(&template, TPM_ALG_SHA256); + tpm_buf_append_u16(template, TPM_ALG_SHA256); =20 /* object properties */ - tpm_buf_append_u32(&template, TPM2_OA_NULL_KEY); + tpm_buf_append_u32(template, TPM2_OA_NULL_KEY); =20 /* sauth policy (empty) */ - tpm_buf_append_u16(&template, 0); + tpm_buf_append_u16(template, 0); =20 /* BEGIN parameters: key specific; for ECC*/ =20 /* symmetric algorithm */ - tpm_buf_append_u16(&template, TPM_ALG_AES); + tpm_buf_append_u16(template, TPM_ALG_AES); =20 /* bits for symmetric algorithm */ - tpm_buf_append_u16(&template, AES_KEY_BITS); + tpm_buf_append_u16(template, AES_KEY_BITS); =20 /* algorithm mode (must be CFB) */ - tpm_buf_append_u16(&template, TPM_ALG_CFB); + tpm_buf_append_u16(template, TPM_ALG_CFB); =20 /* scheme (NULL means any scheme) */ - tpm_buf_append_u16(&template, TPM_ALG_NULL); + tpm_buf_append_u16(template, TPM_ALG_NULL); =20 /* ECC Curve ID */ - tpm_buf_append_u16(&template, TPM2_ECC_NIST_P256); + tpm_buf_append_u16(template, TPM2_ECC_NIST_P256); =20 /* KDF Scheme */ - tpm_buf_append_u16(&template, TPM_ALG_NULL); + tpm_buf_append_u16(template, TPM_ALG_NULL); =20 /* unique: key specific; for ECC it is two zero size points */ - tpm_buf_append_u16(&template, 0); - tpm_buf_append_u16(&template, 0); + tpm_buf_append_u16(template, 0); + tpm_buf_append_u16(template, 0); =20 /* END parameters */ =20 /* primary handle */ - tpm_buf_append_u32(&buf, hierarchy); - tpm_buf_append_empty_auth(&buf, TPM2_RS_PW); + tpm_buf_append_u32(buf, hierarchy); + tpm_buf_append_empty_auth(buf, TPM2_RS_PW); =20 /* sensitive create size is 4 for two empty buffers */ - tpm_buf_append_u16(&buf, 4); + tpm_buf_append_u16(buf, 4); =20 /* sensitive create auth data (empty) */ - tpm_buf_append_u16(&buf, 0); + tpm_buf_append_u16(buf, 0); =20 /* sensitive create sensitive data (empty) */ - tpm_buf_append_u16(&buf, 0); + tpm_buf_append_u16(buf, 0); =20 /* the public template */ - tpm_buf_append(&buf, template.data, template.length); - tpm_buf_destroy(&template); + tpm_buf_append(buf, template->data, template->length); =20 /* outside info (empty) */ - tpm_buf_append_u16(&buf, 0); + tpm_buf_append_u16(buf, 0); =20 /* creation PCR (none) */ - tpm_buf_append_u32(&buf, 0); + tpm_buf_append_u32(buf, 0); =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, + rc =3D tpm_transmit_cmd(chip, buf, 0, "attempting to create NULL primary"); =20 if (rc =3D=3D TPM2_RC_SUCCESS) - rc =3D tpm2_parse_create_primary(chip, &buf, handle, hierarchy, + rc =3D tpm2_parse_create_primary(chip, buf, handle, hierarchy, name); =20 - tpm_buf_destroy(&buf); - return rc; } =20 diff --git a/drivers/char/tpm/tpm2-space.c b/drivers/char/tpm/tpm2-space.c index 7c1c0a174a2b..5b0f233db898 100644 --- a/drivers/char/tpm/tpm2-space.c +++ b/drivers/char/tpm/tpm2-space.c @@ -58,24 +58,25 @@ void tpm2_del_space(struct tpm_chip *chip, struct tpm_s= pace *space) int tpm2_load_context(struct tpm_chip *chip, u8 *buf, unsigned int *offset, u32 *handle) { - struct tpm_buf tbuf; struct tpm2_context *ctx; unsigned int body_size; int rc; =20 - rc =3D tpm_buf_init(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_LOAD); - if (rc) - return rc; + struct tpm_buf *tbuf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!tbuf) + return -ENOMEM; + + tpm_buf_init(tbuf, TPM_BUFSIZE); + tpm_buf_reset(tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_LOAD); =20 ctx =3D (struct tpm2_context *)&buf[*offset]; body_size =3D sizeof(*ctx) + be16_to_cpu(ctx->blob_size); - tpm_buf_append(&tbuf, &buf[*offset], body_size); + tpm_buf_append(tbuf, &buf[*offset], body_size); =20 - rc =3D tpm_transmit_cmd(chip, &tbuf, 4, NULL); + rc =3D tpm_transmit_cmd(chip, tbuf, 4, NULL); if (rc < 0) { dev_warn(&chip->dev, "%s: failed with a system error %d\n", __func__, rc); - tpm_buf_destroy(&tbuf); return -EFAULT; } else if (tpm2_rc_value(rc) =3D=3D TPM2_RC_HANDLE || rc =3D=3D TPM2_RC_REFERENCE_H0) { @@ -90,64 +91,55 @@ int tpm2_load_context(struct tpm_chip *chip, u8 *buf, * flushed outside the space */ *handle =3D 0; - tpm_buf_destroy(&tbuf); return -ENOENT; } else if (tpm2_rc_value(rc) =3D=3D TPM2_RC_INTEGRITY) { - tpm_buf_destroy(&tbuf); return -EINVAL; } else if (rc > 0) { dev_warn(&chip->dev, "%s: failed with a TPM error 0x%04X\n", __func__, rc); - tpm_buf_destroy(&tbuf); return -EFAULT; } =20 - *handle =3D be32_to_cpup((__be32 *)&tbuf.data[TPM_HEADER_SIZE]); + *handle =3D be32_to_cpup((__be32 *)&tbuf->data[TPM_HEADER_SIZE]); *offset +=3D body_size; - - tpm_buf_destroy(&tbuf); return 0; } =20 int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf, unsigned int buf_size, unsigned int *offset) { - struct tpm_buf tbuf; unsigned int body_size; int rc; =20 - rc =3D tpm_buf_init(&tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_SAVE); - if (rc) - return rc; + struct tpm_buf *tbuf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!tbuf) + return -ENOMEM; =20 - tpm_buf_append_u32(&tbuf, handle); + tpm_buf_init(tbuf, TPM_BUFSIZE); + tpm_buf_reset(tbuf, TPM2_ST_NO_SESSIONS, TPM2_CC_CONTEXT_SAVE); + tpm_buf_append_u32(tbuf, handle); =20 - rc =3D tpm_transmit_cmd(chip, &tbuf, 0, NULL); + rc =3D tpm_transmit_cmd(chip, tbuf, 0, NULL); if (rc < 0) { dev_warn(&chip->dev, "%s: failed with a system error %d\n", __func__, rc); - tpm_buf_destroy(&tbuf); return -EFAULT; } else if (tpm2_rc_value(rc) =3D=3D TPM2_RC_REFERENCE_H0) { - tpm_buf_destroy(&tbuf); return -ENOENT; } else if (rc) { dev_warn(&chip->dev, "%s: failed with a TPM error 0x%04X\n", __func__, rc); - tpm_buf_destroy(&tbuf); return -EFAULT; } =20 - body_size =3D tpm_buf_length(&tbuf) - TPM_HEADER_SIZE; + body_size =3D tpm_buf_length(tbuf) - TPM_HEADER_SIZE; if ((*offset + body_size) > buf_size) { dev_warn(&chip->dev, "%s: out of backing storage\n", __func__); - tpm_buf_destroy(&tbuf); return -ENOMEM; } =20 - memcpy(&buf[*offset], &tbuf.data[TPM_HEADER_SIZE], body_size); + memcpy(&buf[*offset], &tbuf->data[TPM_HEADER_SIZE], body_size); *offset +=3D body_size; - tpm_buf_destroy(&tbuf); return 0; } =20 diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_= proxy.c index 7bb0f4d4a2ed..b81fd2a537df 100644 --- a/drivers/char/tpm/tpm_vtpm_proxy.c +++ b/drivers/char/tpm/tpm_vtpm_proxy.c @@ -395,40 +395,36 @@ static bool vtpm_proxy_tpm_req_canceled(struct tpm_ch= ip *chip, u8 status) =20 static int vtpm_proxy_request_locality(struct tpm_chip *chip, int locality) { - struct tpm_buf buf; int rc; const struct tpm_header *header; struct proxy_dev *proxy_dev =3D dev_get_drvdata(&chip->dev); =20 + struct tpm_buf *buf __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + tpm_buf_init(buf, TPM_BUFSIZE); if (chip->flags & TPM_CHIP_FLAG_TPM2) - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, - TPM2_CC_SET_LOCALITY); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_SET_LOCALITY); else - rc =3D tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, - TPM_ORD_SET_LOCALITY); - if (rc) - return rc; - tpm_buf_append_u8(&buf, locality); + tpm_buf_reset(buf, TPM_TAG_RQU_COMMAND, TPM_ORD_SET_LOCALITY); + + tpm_buf_append_u8(buf, locality); =20 proxy_dev->state |=3D STATE_DRIVER_COMMAND; =20 - rc =3D tpm_transmit_cmd(chip, &buf, 0, "attempting to set locality"); + rc =3D tpm_transmit_cmd(chip, buf, 0, "attempting to set locality"); =20 proxy_dev->state &=3D ~STATE_DRIVER_COMMAND; =20 - if (rc < 0) { - locality =3D rc; - goto out; - } + if (rc < 0) + return rc; =20 - header =3D (const struct tpm_header *)buf.data; + header =3D (const struct tpm_header *)buf->data; rc =3D be32_to_cpu(header->return_code); if (rc) locality =3D -1; =20 -out: - tpm_buf_destroy(&buf); - return locality; } =20 diff --git a/include/linux/tpm.h b/include/linux/tpm.h index b357f8971d03..598dd53a10d8 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -208,13 +208,15 @@ enum tpm_buf_flags { }; =20 /* - * A string buffer type for constructing TPM commands. + * A buffer for constructing and parsing TPM commands, responses and sized + * (TPM2B) buffers. */ struct tpm_buf { - u32 flags; - u32 length; - u8 *data; + u8 flags; + u16 length; + u16 capacity; u8 handles; + u8 data[]; }; =20 struct tpm2_hash { @@ -222,12 +224,11 @@ struct tpm2_hash { unsigned int tpm_id; }; =20 -int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal); +void tpm_buf_init(struct tpm_buf *buf, u16 buf_size); +void tpm_buf_init_sized(struct tpm_buf *buf, u16 buf_size); void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); -int tpm_buf_init_sized(struct tpm_buf *buf); void tpm_buf_reset_sized(struct tpm_buf *buf); -void tpm_buf_destroy(struct tpm_buf *buf); -u32 tpm_buf_length(struct tpm_buf *buf); +u16 tpm_buf_length(struct tpm_buf *buf); void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_lengt= h); void tpm_buf_append_u8(struct tpm_buf *buf, const u8 value); void tpm_buf_append_u16(struct tpm_buf *buf, const u16 value); diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trus= ted-keys/trusted_tpm1.c index 331b1bad6581..d27c846bb90a 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -316,9 +316,8 @@ static int TSS_checkhmac2(unsigned char *buffer, * For key specific tpm requests, we will generate and send our * own TPM command packets using the drivers send function. */ -static int trusted_tpm_send(unsigned char *cmd, size_t buflen) +static int trusted_tpm_send(struct tpm_buf *buf) { - struct tpm_buf buf; int rc; =20 if (!chip) @@ -328,12 +327,9 @@ static int trusted_tpm_send(unsigned char *cmd, size_t= buflen) if (rc) return rc; =20 - buf.flags =3D 0; - buf.length =3D buflen; - buf.data =3D cmd; - dump_tpm_buf(cmd); - rc =3D tpm_transmit_cmd(chip, &buf, 4, "sending data"); - dump_tpm_buf(cmd); + dump_tpm_buf(buf->data); + rc =3D tpm_transmit_cmd(chip, buf, 4, "sending data"); + dump_tpm_buf(buf->data); =20 if (rc > 0) /* TPM error */ @@ -379,7 +375,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); =20 - ret =3D trusted_tpm_send(tb->data, tb->length); + ret =3D trusted_tpm_send(tb); if (ret < 0) return ret; =20 @@ -403,7 +399,7 @@ static int oiap(struct tpm_buf *tb, uint32_t *handle, u= nsigned char *nonce) return -ENODEV; =20 tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OIAP); - ret =3D trusted_tpm_send(tb->data, tb->length); + ret =3D trusted_tpm_send(tb); if (ret < 0) return ret; =20 @@ -512,7 +508,7 @@ static int tpm_seal(struct tpm_buf *tb, uint16_t keytyp= e, tpm_buf_append_u8(tb, cont); tpm_buf_append(tb, td->pubauth, SHA1_DIGEST_SIZE); =20 - ret =3D trusted_tpm_send(tb->data, tb->length); + ret =3D trusted_tpm_send(tb); if (ret < 0) goto out; =20 @@ -603,7 +599,7 @@ static int tpm_unseal(struct tpm_buf *tb, tpm_buf_append_u8(tb, cont); tpm_buf_append(tb, authdata2, SHA1_DIGEST_SIZE); =20 - ret =3D trusted_tpm_send(tb->data, tb->length); + ret =3D trusted_tpm_send(tb); if (ret < 0) { pr_info("authhmac failed (%d)\n", ret); return ret; @@ -630,23 +626,23 @@ static int tpm_unseal(struct tpm_buf *tb, static int key_seal(struct trusted_key_payload *p, struct trusted_key_options *o) { - struct tpm_buf tb; int ret; =20 - ret =3D tpm_buf_init(&tb, 0, 0); - if (ret) - return ret; + struct tpm_buf *tb __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!tb) + return -ENOMEM; + + tpm_buf_init(tb, TPM_BUFSIZE); =20 /* include migratable flag at end of sealed key */ p->key[p->key_len] =3D p->migratable; =20 - ret =3D tpm_seal(&tb, o->keytype, o->keyhandle, o->keyauth, + ret =3D tpm_seal(tb, o->keytype, o->keyhandle, o->keyauth, p->key, p->key_len + 1, p->blob, &p->blob_len, o->blobauth, o->pcrinfo, o->pcrinfo_len); if (ret < 0) pr_info("srkseal failed (%d)\n", ret); =20 - tpm_buf_destroy(&tb); return ret; } =20 @@ -656,14 +652,15 @@ static int key_seal(struct trusted_key_payload *p, static int key_unseal(struct trusted_key_payload *p, struct trusted_key_options *o) { - struct tpm_buf tb; int ret; =20 - ret =3D tpm_buf_init(&tb, 0, 0); - if (ret) - return ret; + struct tpm_buf *tb __free(kfree) =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!tb) + return -ENOMEM; + + tpm_buf_init(tb, TPM_BUFSIZE); =20 - ret =3D tpm_unseal(&tb, o->keyhandle, o->keyauth, p->blob, p->blob_len, + ret =3D tpm_unseal(tb, o->keyhandle, o->keyauth, p->blob, p->blob_len, o->blobauth, p->key, &p->key_len); if (ret < 0) pr_info("srkunseal failed (%d)\n", ret); @@ -671,7 +668,6 @@ static int key_unseal(struct trusted_key_payload *p, /* pull migratable flag out of sealed key */ p->migratable =3D p->key[--p->key_len]; =20 - tpm_buf_destroy(&tb); return ret; } =20 diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trus= ted-keys/trusted_tpm2.c index 779a2e66ac20..67225dd562a9 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -233,7 +233,8 @@ int tpm2_seal_trusted(struct tpm_chip *chip, struct trusted_key_options *options) { off_t offset =3D TPM_HEADER_SIZE; - struct tpm_buf buf, sized; + struct tpm_buf *buf __free(kfree) =3D NULL; + struct tpm_buf *sized __free(kfree) =3D NULL; int blob_len =3D 0; int hash; u32 flags; @@ -254,97 +255,100 @@ int tpm2_seal_trusted(struct tpm_chip *chip, if (rc) goto out_put; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE); - if (rc) { + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { + rc =3D -ENOMEM; tpm2_end_auth_session(chip); goto out_put; } =20 - rc =3D tpm_buf_init_sized(&sized); - if (rc) { - tpm_buf_destroy(&buf); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE); + + sized =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!sized) { + rc =3D -ENOMEM; tpm2_end_auth_session(chip); goto out_put; } =20 - rc =3D tpm_buf_append_name(chip, &buf, options->keyhandle, NULL); + tpm_buf_init_sized(sized, TPM_BUFSIZE); + + rc =3D tpm_buf_append_name(chip, buf, options->keyhandle, NULL); if (rc) goto out; =20 - tpm_buf_append_hmac_session(chip, &buf, TPM2_SA_DECRYPT, + tpm_buf_append_hmac_session(chip, buf, TPM2_SA_DECRYPT, options->keyauth, TPM_DIGEST_SIZE); =20 /* sensitive */ - tpm_buf_append_u16(&sized, options->blobauth_len); + tpm_buf_append_u16(sized, options->blobauth_len); =20 if (options->blobauth_len) - tpm_buf_append(&sized, options->blobauth, options->blobauth_len); + tpm_buf_append(sized, options->blobauth, options->blobauth_len); =20 - 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); + 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); =20 /* public */ - tpm_buf_reset_sized(&sized); - tpm_buf_append_u16(&sized, TPM_ALG_KEYEDHASH); - tpm_buf_append_u16(&sized, hash); + tpm_buf_reset_sized(sized); + tpm_buf_append_u16(sized, TPM_ALG_KEYEDHASH); + tpm_buf_append_u16(sized, hash); =20 /* key properties */ flags =3D 0; flags |=3D options->policydigest_len ? 0 : TPM2_OA_USER_WITH_AUTH; flags |=3D payload->migratable ? 0 : (TPM2_OA_FIXED_TPM | TPM2_OA_FIXED_P= ARENT); - tpm_buf_append_u32(&sized, flags); + tpm_buf_append_u32(sized, flags); =20 /* policy */ - tpm_buf_append_u16(&sized, options->policydigest_len); + tpm_buf_append_u16(sized, options->policydigest_len); if (options->policydigest_len) - tpm_buf_append(&sized, options->policydigest, options->policydigest_len); + tpm_buf_append(sized, options->policydigest, options->policydigest_len); =20 /* public parameters */ - tpm_buf_append_u16(&sized, TPM_ALG_NULL); - tpm_buf_append_u16(&sized, 0); + tpm_buf_append_u16(sized, TPM_ALG_NULL); + tpm_buf_append_u16(sized, 0); =20 - tpm_buf_append(&buf, sized.data, sized.length); + tpm_buf_append(buf, sized->data, sized->length); =20 /* outside info */ - tpm_buf_append_u16(&buf, 0); + tpm_buf_append_u16(buf, 0); =20 /* creation PCR */ - tpm_buf_append_u32(&buf, 0); + tpm_buf_append_u32(buf, 0); =20 - if (buf.flags & TPM_BUF_INVALID) { + if (buf->flags & TPM_BUF_INVALID) { rc =3D -E2BIG; tpm2_end_auth_session(chip); goto out; } =20 - rc =3D tpm_buf_fill_hmac_session(chip, &buf); + rc =3D tpm_buf_fill_hmac_session(chip, buf); if (rc) goto out; =20 - rc =3D tpm_transmit_cmd(chip, &buf, 4, "sealing data"); - rc =3D tpm_buf_check_hmac_response(chip, &buf, rc); + rc =3D tpm_transmit_cmd(chip, buf, 4, "sealing data"); + rc =3D tpm_buf_check_hmac_response(chip, buf, rc); if (rc) goto out; =20 - blob_len =3D tpm_buf_read_u32(&buf, &offset); - if (blob_len > MAX_BLOB_SIZE || buf.flags & TPM_BUF_INVALID) { + blob_len =3D tpm_buf_read_u32(buf, &offset); + if (blob_len > MAX_BLOB_SIZE || buf->flags & TPM_BUF_INVALID) { rc =3D -E2BIG; goto out; } - if (buf.length - offset < blob_len) { + if (buf->length - offset < blob_len) { rc =3D -EFAULT; goto out; } =20 - blob_len =3D tpm2_key_encode(payload, options, &buf.data[offset], blob_le= n); + blob_len =3D tpm2_key_encode(payload, options, &buf->data[offset], blob_l= en); if (blob_len < 0) rc =3D blob_len; =20 out: - tpm_buf_destroy(&sized); - tpm_buf_destroy(&buf); - if (!rc) payload->blob_len =3D blob_len; =20 @@ -372,7 +376,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip, u32 *blob_handle) { u8 *blob_ref __free(kfree) =3D NULL; - struct tpm_buf buf; + struct tpm_buf *buf __free(kfree) =3D NULL; unsigned int private_len; unsigned int public_len; unsigned int blob_len; @@ -426,39 +430,38 @@ static int tpm2_load_cmd(struct tpm_chip *chip, if (rc) return rc; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_LOAD); - if (rc) { + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { tpm2_end_auth_session(chip); - return rc; + return -ENOMEM; } =20 - rc =3D tpm_buf_append_name(chip, &buf, options->keyhandle, NULL); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_LOAD); + + rc =3D tpm_buf_append_name(chip, buf, options->keyhandle, NULL); if (rc) - goto out; + return rc; =20 - tpm_buf_append_hmac_session(chip, &buf, 0, options->keyauth, + tpm_buf_append_hmac_session(chip, buf, 0, options->keyauth, TPM_DIGEST_SIZE); =20 - tpm_buf_append(&buf, blob, blob_len); + tpm_buf_append(buf, blob, blob_len); =20 - if (buf.flags & TPM_BUF_INVALID) { - rc =3D -E2BIG; + if (buf->flags & TPM_BUF_INVALID) { tpm2_end_auth_session(chip); - goto out; + return -E2BIG; } =20 - rc =3D tpm_buf_fill_hmac_session(chip, &buf); + rc =3D tpm_buf_fill_hmac_session(chip, buf); if (rc) - goto out; + return rc; =20 - rc =3D tpm_transmit_cmd(chip, &buf, 4, "loading blob"); - rc =3D tpm_buf_check_hmac_response(chip, &buf, rc); + rc =3D tpm_transmit_cmd(chip, buf, 4, "loading blob"); + rc =3D tpm_buf_check_hmac_response(chip, buf, rc); if (!rc) *blob_handle =3D be32_to_cpup( - (__be32 *) &buf.data[TPM_HEADER_SIZE]); - -out: - tpm_buf_destroy(&buf); + (__be32 *)&buf->data[TPM_HEADER_SIZE]); =20 return tpm_ret_to_err(rc); } @@ -481,7 +484,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, u32 blob_handle) { struct tpm_header *head; - struct tpm_buf buf; + struct tpm_buf *buf __free(kfree) =3D NULL; u16 data_len; int offset; u8 *data; @@ -491,18 +494,21 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, if (rc) return rc; =20 - rc =3D tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); - if (rc) { + buf =3D kzalloc(TPM_BUFSIZE, GFP_KERNEL); + if (!buf) { tpm2_end_auth_session(chip); - return rc; + return -ENOMEM; } =20 - rc =3D tpm_buf_append_name(chip, &buf, blob_handle, NULL); + tpm_buf_init(buf, TPM_BUFSIZE); + tpm_buf_reset(buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL); + + rc =3D tpm_buf_append_name(chip, buf, blob_handle, NULL); if (rc) - goto out; + return rc; =20 if (!options->policyhandle) { - tpm_buf_append_hmac_session(chip, &buf, TPM2_SA_ENCRYPT, + tpm_buf_append_hmac_session(chip, buf, TPM2_SA_ENCRYPT, options->blobauth, options->blobauth_len); } else { @@ -517,39 +523,36 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, * could repeat our actions with the exfiltrated * password. */ - tpm2_buf_append_auth(&buf, options->policyhandle, + tpm2_buf_append_auth(buf, options->policyhandle, NULL /* nonce */, 0, 0, options->blobauth, options->blobauth_len); if (tpm2_chip_auth(chip)) { - tpm_buf_append_hmac_session(chip, &buf, TPM2_SA_ENCRYPT, NULL, 0); + tpm_buf_append_hmac_session(chip, buf, TPM2_SA_ENCRYPT, + NULL, 0); } else { - offset =3D buf.handles * 4 + TPM_HEADER_SIZE; - head =3D (struct tpm_header *)buf.data; - if (tpm_buf_length(&buf) =3D=3D offset) + offset =3D buf->handles * 4 + TPM_HEADER_SIZE; + head =3D (struct tpm_header *)buf->data; + if (tpm_buf_length(buf) =3D=3D offset) head->tag =3D cpu_to_be16(TPM2_ST_NO_SESSIONS); } } =20 - rc =3D tpm_buf_fill_hmac_session(chip, &buf); + rc =3D tpm_buf_fill_hmac_session(chip, buf); if (rc) - goto out; + return rc; =20 - rc =3D tpm_transmit_cmd(chip, &buf, 6, "unsealing"); - rc =3D tpm_buf_check_hmac_response(chip, &buf, rc); + rc =3D tpm_transmit_cmd(chip, buf, 6, "unsealing"); + rc =3D tpm_buf_check_hmac_response(chip, buf, rc); =20 if (!rc) { data_len =3D be16_to_cpup( - (__be16 *) &buf.data[TPM_HEADER_SIZE + 4]); - if (data_len < MIN_KEY_SIZE || data_len > MAX_KEY_SIZE) { - rc =3D -EFAULT; - goto out; - } + (__be16 *)&buf->data[TPM_HEADER_SIZE + 4]); + if (data_len < MIN_KEY_SIZE || data_len > MAX_KEY_SIZE) + return -EFAULT; =20 - if (tpm_buf_length(&buf) < TPM_HEADER_SIZE + 6 + data_len) { - rc =3D -EFAULT; - goto out; - } - data =3D &buf.data[TPM_HEADER_SIZE + 6]; + if (tpm_buf_length(buf) < TPM_HEADER_SIZE + 6 + data_len) + return -EFAULT; + data =3D &buf->data[TPM_HEADER_SIZE + 6]; =20 if (payload->old_format) { /* migratable flag is at the end of the key */ @@ -566,8 +569,6 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip, } } =20 -out: - tpm_buf_destroy(&buf); return tpm_ret_to_err(rc); } =20 --=20 2.55.0 From nobody Sat Jul 25 23:03:45 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A20653CAE93 for ; Sat, 11 Jul 2026 16:01:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785709; cv=none; b=jsKCe13PqpHm/w5tMGThCiUrkokrlVclAoL6CcjuKxEYjj4hRGv/+KK4xP5EarLQKCFNf5nBPZ3gaZ7VaAInuvFMWSZZ7OJAhX+7YqYJjNzYHomzdmlXib9Nl/04iILGlhzG06Tvb9pBgCHI417yV16QjNWRFWkYKnIIQpU5tic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783785709; c=relaxed/simple; bh=mmmPhL/ghHf8mTlJKqyHo4h/T0ggIZB9mghCUZZIJHk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YZ07GHKty17mGvIFko/DZ2pQBqz0qIXoz1kOT37hv2ic8mk3zStbmSmYAgar+7NRo4lDB4xery0I+ORk26C1zVOHsKMZvcSFwPBQUHTjTKSM/wxKRWmtHNC8XNW/J2CnAx5GufiNNFu0dWypgbTStacte6wtMEMwKlTaJU4sb08= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iT6fCAG2; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iT6fCAG2" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2ce7d2adef4so24483385ad.3 for ; Sat, 11 Jul 2026 09:01:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783785707; x=1784390507; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=O3xupweIjZun88NywNw0fLBjpCQuWDRT98MUrOXcsbg=; b=iT6fCAG2Jd3dSOYBchOLSK/BQ9vx9aWtc1KVgu4SOG/c2Gb7VKJdJ4vTizFIO91aoS IRAIyhoZzYx6BVN1A0kEQBL2/8XVEfZtiZfDPGfE1zssb/XDBpB5Eya2J4rQAfU23xox 8X1aA/FF30m6mUiWrTmUtMrt1ZuyCgOzunjMy5Xs+pm5jxT0X+wNS6PpnuNdl3mDXZBP Yp7RN24Y049nVyWV1PY9rUOmwmwWuFQ9rn9AtKN3t84jG4L2AgIktsLeErpmyG3prNmd +4hlPR5w3dPVCwPHX9+Hl+FDM9nQWUEXc+5WB9xWcXgKPTt8laSU5PrpQIOPVTmkiGUI gQEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783785707; x=1784390507; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=O3xupweIjZun88NywNw0fLBjpCQuWDRT98MUrOXcsbg=; b=WLtNzdMd9YCJDTxSGaRa9wfASo7/BgVHRm5RvGqiXiW0OgbKeA39pf1nJnc9Z6l4+K UK4K7svBjDVPrStqa8H0VcqA2NNSAeayYqpixoKmYP6vZRLa/5aTVgOwveQv588x2Ibj lJ1TtNaEWcX7u0Ip9uiHWk2wkbzLx9T7+uNLmpgV1IpuZU5Xfxe8aSVFj8sQ50wpMw5V aBKl5pbeyPc+G5rIfCmH4TunjOJb8V9mw4sF+MxftJbCEZtrtxjMFATYqID9xTCmp/pS srscuzw4riL2LiWjvSxTfzEXD/9z3rMAX4bznNYrndc+zkEqH2W+JSQ6YG2I1ZvcnLMv BPTw== X-Gm-Message-State: AOJu0Yz73cDr5hkVL+PWY9b6v2NvqL0mvhl6lyLT9D/NwrpaiYrO5ru0 SJwO804IwUwEMqfhr4BDWGjzMlbedMk6mXnpo8tGNnJsRjgT7knDAJ1DsTqC3UeY X-Gm-Gg: AfdE7cnmm491pmDmoGM1iBu/KsPhs2MInCptjhG/4vQBAnqKtyliUHpDpaPwcbBJ9by EeBMQNzC38OdgwhSbjUhUqFvRXEVAGgGU20AlQ3bbK0vKQDMDHr+PMMfTG1HiMJnrhps80Nlxt1 Wh21jQwuweXsuEtjqBrDlnKaU2G/DfgmsG8zgEoH8fHXNrwnQXAXSks7uQJMswMVTbEIJLApHBh +aobWYgRs+xiVApGZekLAgoF7G9yHkZeqYo5ii0baWxS8mcNWH8u03WAf+HGvSbbAuQlUE3nSpr vOi6WPPZJJ9VigHRr+/V+JykLU7xsbgm+iLVEpYEte347bb08hNpCLMVLxL0lOgqA9j9p+1CRM0 9/CA51DVgJygxjMnna1Gf9HKvHdgSbCloGvU+BJp5+t9OaXlfYCq8uBypZflFNzU0Y9ZA+XIyaf bXkLoSbJ2wX81yA50FScwp X-Received: by 2002:a17:90a:c106:b0:381:20b:a9ee with SMTP id 98e67ed59e1d1-38dc74cf96amr3305712a91.14.1783785706827; Sat, 11 Jul 2026 09:01:46 -0700 (PDT) Received: from titan.lan ([2603:8000:df01:38f7:255c:dd03:30a6:e57b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3120c8e41fcsm20955490eec.15.2026.07.11.09.01.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 11 Jul 2026 09:01:46 -0700 (PDT) From: Ross Philipson To: linux-kernel@vger.kernel.org, x86@kernel.org, linux-integrity@vger.kernel.org, linux-crypto@vger.kernel.org, linux-efi@vger.kernel.org Cc: ross.philipson@gmail.com, dpsmith@apertussolutions.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, ardb@kernel.org, mjg59@srcf.ucam.org, James.Bottomley@hansenpartnership.com, peterhuewe@gmx.de, jarkko@kernel.org, luto@amacapital.net, herbert@gondor.apana.org.au, davem@davemloft.net, corbet@lwn.net, kanth.ghatraju@oracle.com, daniel.kiper@oracle.com, andrew.cooper3@citrix.com, trenchboot-devel@googlegroups.com Subject: [PATCH v2 10/10] tpm-buf: Add TPM buffer support header for standalone reuse Date: Sat, 11 Jul 2026 09:01:10 -0700 Message-ID: <20260711160110.267780-11-ross.philipson@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260711160110.267780-1-ross.philipson@gmail.com> References: <20260711160110.267780-1-ross.philipson@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extract all the functions and definitions for TPM buffer handling and separate them into their own header. Signed-off-by: Ross Philipson --- drivers/char/tpm/tpm-buf.c | 3 +- include/linux/tpm.h | 34 +-------------------- include/linux/tpm_buf.h | 60 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 include/linux/tpm_buf.h diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index 1e5c11c312a8..233e81d3f149 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -4,7 +4,8 @@ */ =20 #include -#include +#include +#include =20 static void __tpm_buf_size_invariant(struct tpm_buf *buf, u16 buf_size) { diff --git a/include/linux/tpm.h b/include/linux/tpm.h index 598dd53a10d8..0db277af45c3 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -26,6 +26,7 @@ #include =20 #include +#include =20 struct tpm_chip; struct trusted_key_payload; @@ -200,44 +201,11 @@ enum tpm_chip_flags { =20 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev) =20 -enum tpm_buf_flags { - /* TPM2B format: */ - TPM_BUF_TPM2B =3D BIT(0), - /* The buffer is in invalid and unusable state: */ - TPM_BUF_INVALID =3D BIT(1), -}; - -/* - * A buffer for constructing and parsing TPM commands, responses and sized - * (TPM2B) buffers. - */ -struct tpm_buf { - u8 flags; - u16 length; - u16 capacity; - u8 handles; - u8 data[]; -}; - struct tpm2_hash { unsigned int crypto_id; unsigned int tpm_id; }; =20 -void tpm_buf_init(struct tpm_buf *buf, u16 buf_size); -void tpm_buf_init_sized(struct tpm_buf *buf, u16 buf_size); -void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); -void tpm_buf_reset_sized(struct tpm_buf *buf); -u16 tpm_buf_length(struct tpm_buf *buf); -void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_lengt= h); -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(struct tpm_buf *buf, off_t *offset); -u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset); -u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset); -void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle); - /* * Check if TPM device is in the firmware upgrade mode. */ diff --git a/include/linux/tpm_buf.h b/include/linux/tpm_buf.h new file mode 100644 index 000000000000..f8c105d8b8bf --- /dev/null +++ b/include/linux/tpm_buf.h @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Following copyright information was take from the original file + * where the definitions were moved from: + * + * Copyright (C) 2004,2007,2008 IBM Corporation + * + * Authors: + * Leendert van Doorn + * Dave Safford + * Reiner Sailer + * Kylene Hall + * Debora Velarde + * + * Maintained by: + * + * Device driver for TCG/TCPA TPM (trusted platform module). + * Specifications at www.trustedcomputinggroup.org + */ + +#ifndef __LINUX_TPM_BUF_H__ +#define __LINUX_TPM_BUF_H__ + +#include +#include + +enum tpm_buf_flags { + /* TPM2B format: */ + TPM_BUF_TPM2B =3D BIT(0), + /* The buffer is in invalid and unusable state: */ + TPM_BUF_INVALID =3D BIT(1), +}; + +/* + * A buffer for constructing and parsing TPM commands, responses and sized + * (TPM2B) buffers. + */ +struct tpm_buf { + u8 flags; + u8 handles; + u16 length; + u16 capacity; + u8 data[]; +}; + +void tpm_buf_init(struct tpm_buf *buf, u16 buf_size); +void tpm_buf_init_sized(struct tpm_buf *buf, u16 buf_size); +void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal); +void tpm_buf_reset_sized(struct tpm_buf *buf); +u16 tpm_buf_length(struct tpm_buf *buf); +void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_lengt= h); +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(struct tpm_buf *buf, off_t *offset); +u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset); +u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset); +void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle); + +#endif --=20 2.55.0