Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp708981imm; Fri, 21 Sep 2018 07:04:55 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYLjV9S2a0isvwc9SGT1sAYByrAq/Xrfw3KyEA7Sjp9l3LmvImt5JTcqO45Btyd5Z2GiwVm X-Received: by 2002:a63:ea0c:: with SMTP id c12-v6mr41406865pgi.158.1537538695114; Fri, 21 Sep 2018 07:04:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537538695; cv=none; d=google.com; s=arc-20160816; b=nP+8NAUhb/YNXvtuCnCvz0LiyPZZAlZbCxVSmq7Ag1ZqUv5+jYTuhQ252QfVB9RUMs p88Bir8gnyiDyXW4z9H/uAILX54rnchL8guFMv1SuXG8yX7A0Nkv/L9i/myUEf1ffyiq IqdNu6ZClEnSIaE6IoDEXK8daeG2aDalAFa9jqe5FwE/n+qRph03Z7WfkYTZoh1Cd/Qg WEcSB1yi1a4ZxOEqmS/WPmN6IuQkqhjUdnVOQ2nKRGATI4VJmfnsMnZQMyD05u8zZBMJ SmKYnvIgEthSm0sLAueslqbZO28MKEIFCjdB5eBuyuydGZEkE2mQyteU1q30stxm2wg5 T1ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=Ng1hIUghp/TRIb3kF8tbqYE9rgUBK/yhsH3stZggWMA=; b=ohiP8IixqwGIw1yNdGY9TJgU0xtKbPKyYXm3X4hyIsb9woQEFDdnicb/yzjOf9CBkV ppQV65aMwSUAbSKLKpihbNGIJfNe1PFZW/BlGV1m5makEi1CIGgGh0dLRruGFIg3gJR6 oU4AJoq+AS/eaIGfagpLgt+E3XcFlTKbBuHVbgbPOCcbbT24qdxvdH6xOmCfoeM61gel 5q3OdEfHkjwGjZIIPpqHt8uqq3lDRPoIAdM/Tgf4EH6WCKC2HF0/ZBUJdQPn2TGhUhYr GuYPOwOJOBoc23ST1wPqoYAJw/KFHKcXoidlF8d16DtaWzayOj+FUnJldaRsRtMyFMBR ie8w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x18-v6si27232824pll.88.2018.09.21.07.04.39; Fri, 21 Sep 2018 07:04:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390057AbeIUTw1 (ORCPT + 99 others); Fri, 21 Sep 2018 15:52:27 -0400 Received: from mga18.intel.com ([134.134.136.126]:4646 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390244AbeIUTvQ (ORCPT ); Fri, 21 Sep 2018 15:51:16 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Sep 2018 07:02:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.54,285,1534834800"; d="scan'208";a="71839086" Received: from twinkler-lnx.jer.intel.com ([10.12.91.48]) by fmsmga007.fm.intel.com with ESMTP; 21 Sep 2018 07:02:07 -0700 From: Tomas Winkler To: Jarkko Sakkinen , Jason Gunthorpe Cc: Alexander Usyskin , Tadeusz Struk , linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, Tomas Winkler Subject: [PATCH v4 08/21] tpm: factor out tpm1_get_random into tpm1-cmd.c Date: Fri, 21 Sep 2018 16:58:07 +0300 Message-Id: <20180921135820.20549-9-tomas.winkler@intel.com> X-Mailer: git-send-email 2.14.4 In-Reply-To: <20180921135820.20549-1-tomas.winkler@intel.com> References: <20180921135820.20549-1-tomas.winkler@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Factor out get random implementation from tpm-interface.c into tpm1_get_random function in tpm1-cmd.c. No functional changes. Signed-off-by: Tomas Winkler Reviewed-by: Jarkko Sakkine --- V2-V3: Rebase V4: Resend drivers/char/tpm/tpm-interface.c | 58 +++++----------------------------------- drivers/char/tpm/tpm.h | 1 + drivers/char/tpm/tpm1-cmd.c | 55 +++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c index 153fee46bec0..4d5742d07e8d 100644 --- a/drivers/char/tpm/tpm-interface.c +++ b/drivers/char/tpm/tpm-interface.c @@ -811,14 +811,6 @@ int tpm_pm_resume(struct device *dev) } EXPORT_SYMBOL_GPL(tpm_pm_resume); -#define TPM_ORD_GET_RANDOM 70 -#define TPM_GETRANDOM_RESULT_SIZE 18 -static const struct tpm_input_header tpm_getrandom_header = { - .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), - .length = cpu_to_be32(14), - .ordinal = cpu_to_be32(TPM_ORD_GET_RANDOM) -}; - /** * tpm_get_random() - get random bytes from the TPM's RNG * @chip: a &struct tpm_chip instance, %NULL for the default chip @@ -829,58 +821,22 @@ static const struct tpm_input_header tpm_getrandom_header = { */ int tpm_get_random(struct tpm_chip *chip, u8 *out, size_t max) { - struct tpm_cmd_t tpm_cmd; - u32 recd, num_bytes = min_t(u32, max, TPM_MAX_RNG_DATA), rlength; - int err, total = 0, retries = 5; - u8 *dest = out; + int rc; - if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) + if (!out || max > TPM_MAX_RNG_DATA) return -EINVAL; chip = tpm_find_get_ops(chip); if (!chip) return -ENODEV; - if (chip->flags & TPM_CHIP_FLAG_TPM2) { - err = tpm2_get_random(chip, out, max); - tpm_put_ops(chip); - return err; - } - - do { - tpm_cmd.header.in = tpm_getrandom_header; - tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes); - - err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, - TPM_GETRANDOM_RESULT_SIZE + num_bytes, - offsetof(struct tpm_getrandom_out, - rng_data), - 0, "attempting get random"); - if (err) - break; - - recd = be32_to_cpu(tpm_cmd.params.getrandom_out.rng_data_len); - if (recd > num_bytes) { - total = -EFAULT; - break; - } - - rlength = be32_to_cpu(tpm_cmd.header.out.length); - if (rlength < TPM_HEADER_SIZE + - offsetof(struct tpm_getrandom_out, rng_data) + - recd) { - total = -EFAULT; - break; - } - memcpy(dest, tpm_cmd.params.getrandom_out.rng_data, recd); - - dest += recd; - total += recd; - num_bytes -= recd; - } while (retries-- && total < max); + if (chip->flags & TPM_CHIP_FLAG_TPM2) + rc = tpm2_get_random(chip, out, max); + else + rc = tpm1_get_random(chip, out, max); tpm_put_ops(chip); - return total ? total : -EIO; + return rc; } EXPORT_SYMBOL_GPL(tpm_get_random); diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 1c1980c79c30..496a56156e77 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -551,6 +551,7 @@ int tpm1_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash, const char *log_msg); ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, const char *desc, size_t min_cap_length); +int tpm1_get_random(struct tpm_chip *chip, u8 *out, size_t max); unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal); int tpm_pm_suspend(struct device *dev); int tpm_pm_resume(struct device *dev); diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c index 7191bc155d2b..49e34168671c 100644 --- a/drivers/char/tpm/tpm1-cmd.c +++ b/drivers/char/tpm/tpm1-cmd.c @@ -470,3 +470,58 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, return rc; } EXPORT_SYMBOL_GPL(tpm1_getcap); + +#define TPM_ORD_GET_RANDOM 70 +#define TPM_GETRANDOM_RESULT_SIZE 18 +static const struct tpm_input_header tpm_getrandom_header = { + .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), + .length = cpu_to_be32(14), + .ordinal = cpu_to_be32(TPM_ORD_GET_RANDOM) +}; + +int tpm1_get_random(struct tpm_chip *chip, u8 *out, size_t max) +{ + struct tpm_cmd_t tpm_cmd; + u32 recd; + u32 num_bytes = min_t(u32, max, TPM_MAX_RNG_DATA); + u32 rlength; + int err, total = 0, retries = 5; + u8 *dest = out; + + if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) + return -EINVAL; + + do { + tpm_cmd.header.in = tpm_getrandom_header; + tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes); + + err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, + TPM_GETRANDOM_RESULT_SIZE + num_bytes, + offsetof(struct tpm_getrandom_out, + rng_data), + 0, "attempting get random"); + if (err) + break; + + recd = be32_to_cpu(tpm_cmd.params.getrandom_out.rng_data_len); + if (recd > num_bytes) { + total = -EFAULT; + break; + } + + rlength = be32_to_cpu(tpm_cmd.header.out.length); + if (rlength < TPM_HEADER_SIZE + + offsetof(struct tpm_getrandom_out, rng_data) + + recd) { + total = -EFAULT; + break; + } + memcpy(dest, tpm_cmd.params.getrandom_out.rng_data, recd); + + dest += recd; + total += recd; + num_bytes -= recd; + } while (retries-- && (size_t)total < max); + + return total ? total : -EIO; +} -- 2.14.4