Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp478493pxb; Wed, 3 Mar 2021 07:55:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJyZmtm4ZJ1Coshosb0zoMACeIFhW9bNfXY0nUwpdNQiCVdy5s9KwlLj6iSKXwU8AQi4QsPR X-Received: by 2002:a05:6402:ce:: with SMTP id i14mr25975568edu.42.1614786902028; Wed, 03 Mar 2021 07:55:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614786902; cv=none; d=google.com; s=arc-20160816; b=MP5ORAhWdAXGEwkhOpKm5HH10QuCz2TgivYwCDnT4YaRDZbTjFn8KoPJBbLtGbkLPC 6fJYo5PM2nglI6Spb0YmLMoGK/mTOr7uDzxVAvdftAl4OqSF85vN7kd2U+/2EcYpDhzb fd2HcfOSXrQJuLhShG16+p3PH7DcqD2PTIFYHN8TXgRbq2p9qy9A3vJc1uJlNVBeHyHX ksSh+T3mSQRkWyOQ/i+oggRgGZ8VqV+CtwtzMfSdEE7Ino1xVa3L30t7FqzJCgBTrL0Z SCrIrQJjGCnj2UtEUFXnz2AfJMC09qt1UuuJwrJxibW6IgDMcFIVJhqWE0uo6ERd2vLw ouRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ZHAjG+eDU3Ywoq1SjO5/O2Gh+Dp3k1kj0A197riYLdQ=; b=zAEf6IWB9lE3Um6OC4IqJJ9SREbGpVZUaXc1Y50jwWaibJbhSFQsfWyM0vdKWmWxBD 1M9ruBenFcX6HKvmB9q+4CXMnueLKl0/5FQXC98axXXC7zKZsdy0o3t8x7JlAsJNuvx7 JCrZKkNOhRpwRLDwHLGoksSRA2Uv9NPV9k2iiRthryo720LLyQJfZeYhTrIhKtbp7D8D rvQs9B26ZEzJTR6fZ5jHdSGXOm1Qb92Mm33vqRZYzN8GCIpF5hHi7W7KE7r/7qZG3Z+x pwIx7SxfovqA/Ewt9zUk+3sZOMLjZx1jSghFNI6vrU7fdD48vYOCEyz5EjLEzDivw6E6 5I7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="QEF+/5Gl"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n1si5460513edo.504.2021.03.03.07.54.04; Wed, 03 Mar 2021 07:55:02 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="QEF+/5Gl"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345318AbhCAXTa (ORCPT + 99 others); Mon, 1 Mar 2021 18:19:30 -0500 Received: from mail.kernel.org ([198.145.29.99]:55008 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234754AbhCASA1 (ORCPT ); Mon, 1 Mar 2021 13:00:27 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id 767BD6525E; Mon, 1 Mar 2021 17:28:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1614619725; bh=1/F/Xo1GRSIJtJr+pRrXtoT/zYqmaonRhTOTFAawYIw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QEF+/5GlTnEfsMUlyo6TkeS7WZmOBJ4tfSrIOVFwK3SAlehHnHLj2tbxH4d1DnCjl Q3usbZZh+mAc2ai/ksTF6ocZF9IhtMNIVR0amp2S0FDmva7L8JaaY8LwxC9yJhqTwq 0mALR2XwyAh0DviUShPIjJxChPV6mg03O+loCwKg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Mimi Zohar , "James E.J. Bottomley" , David Howells , Kent Yoder , Jarkko Sakkinen Subject: [PATCH 5.10 528/663] KEYS: trusted: Fix incorrect handling of tpm_get_random() Date: Mon, 1 Mar 2021 17:12:56 +0100 Message-Id: <20210301161207.969230242@linuxfoundation.org> X-Mailer: git-send-email 2.30.1 In-Reply-To: <20210301161141.760350206@linuxfoundation.org> References: <20210301161141.760350206@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jarkko Sakkinen commit 5df16caada3fba3b21cb09b85cdedf99507f4ec1 upstream. When tpm_get_random() was introduced, it defined the following API for the return value: 1. A positive value tells how many bytes of random data was generated. 2. A negative value on error. However, in the call sites the API was used incorrectly, i.e. as it would only return negative values and otherwise zero. Returning he positive read counts to the user space does not make any possible sense. Fix this by returning -EIO when tpm_get_random() returns a positive value. Fixes: 41ab999c80f1 ("tpm: Move tpm_get_random api into the TPM device driver") Cc: stable@vger.kernel.org Cc: Mimi Zohar Cc: "James E.J. Bottomley" Cc: David Howells Cc: Kent Yoder Signed-off-by: Jarkko Sakkinen Reviewed-by: Mimi Zohar Signed-off-by: Greg Kroah-Hartman --- security/keys/trusted-keys/trusted_tpm1.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -403,9 +403,12 @@ static int osap(struct tpm_buf *tb, stru int ret; ret = tpm_get_random(chip, ononce, TPM_NONCE_SIZE); - if (ret != TPM_NONCE_SIZE) + if (ret < 0) return ret; + if (ret != TPM_NONCE_SIZE) + return -EIO; + tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OSAP); tpm_buf_append_u16(tb, type); tpm_buf_append_u32(tb, handle); @@ -496,8 +499,12 @@ static int tpm_seal(struct tpm_buf *tb, goto out; ret = tpm_get_random(chip, td->nonceodd, TPM_NONCE_SIZE); + if (ret < 0) + return ret; + if (ret != TPM_NONCE_SIZE) - goto out; + return -EIO; + ordinal = htonl(TPM_ORD_SEAL); datsize = htonl(datalen); pcrsize = htonl(pcrinfosize); @@ -601,9 +608,12 @@ static int tpm_unseal(struct tpm_buf *tb ordinal = htonl(TPM_ORD_UNSEAL); ret = tpm_get_random(chip, nonceodd, TPM_NONCE_SIZE); + if (ret < 0) + return ret; + if (ret != TPM_NONCE_SIZE) { pr_info("trusted_key: tpm_get_random failed (%d)\n", ret); - return ret; + return -EIO; } ret = TSS_authhmac(authdata1, keyauth, TPM_NONCE_SIZE, enonce1, nonceodd, cont, sizeof(uint32_t), @@ -1013,8 +1023,12 @@ static int trusted_instantiate(struct ke case Opt_new: key_len = payload->key_len; ret = tpm_get_random(chip, payload->key, key_len); + if (ret < 0) + goto out; + if (ret != key_len) { pr_info("trusted_key: key_create failed (%d)\n", ret); + ret = -EIO; goto out; } if (tpm2)