All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nayna <nayna@linux.vnet.ibm.com>
To: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>,
	tpmdd-devel@lists.sourceforge.net
Cc: open list <linux-kernel@vger.kernel.org>,
	linux-security-module@vger.kernel.org
Subject: Re: [tpmdd-devel] [PATCH] tpm: fix type issues in tpm_getcap()
Date: Fri, 3 Feb 2017 19:18:53 +0530	[thread overview]
Message-ID: <58948A45.5020105@linux.vnet.ibm.com> (raw)
In-Reply-To: <20170201175347.2035-1-jarkko.sakkinen@linux.intel.com>



On 02/01/2017 11:23 PM, Jarkko Sakkinen wrote:
> There are two type issues associated with tpm_getcap().
>
> You must not do arithmetic with __be32 or __le32 types because sometimes
> it results incorrect results. Calculations must be done only with data
> that is in CPU byte order. This commit migrates tpm_getcap() to struct
> tpm_buf in order to sort out these issues.
>
> The second issue is with struct cap_t as the size of the type bool is
> assumed to be one byte. This commit sorts out the issue by changing the
> type to u8.
>
> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> ---
> v2:
> - Use struct tpm_buf.
> - Merge the type change of 'owned' to this patch.
>   drivers/char/tpm/tpm-interface.c | 33 ++++++++++++++++++---------------
>   drivers/char/tpm/tpm.h           | 15 +--------------
>   2 files changed, 19 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
> index 423938e..7af1e8c 100644
> --- a/drivers/char/tpm/tpm-interface.c
> +++ b/drivers/char/tpm/tpm-interface.c
> @@ -480,31 +480,34 @@ static const struct tpm_input_header tpm_getcap_header = {
>   ssize_t tpm_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
>   		   const char *desc, size_t min_cap_length)
>   {
> -	struct tpm_cmd_t tpm_cmd;
> +	struct tpm_buf buf;
>   	int rc;
>
> -	tpm_cmd.header.in = tpm_getcap_header;
> +	rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP);

I think there is a problem here of twice converting to be32 for both tag 
and ordinal.

Both TPM_ORD_GET_CAP and TPM_TAG_RQU_COMMAND are already defined as:
#define TPM_ORD_GET_CAP cpu_to_be32(101)
#define TPM_TAG_RQU_COMMAND  cpu_to_be16(193)

and again converted to BE in tpm_buf_init().

Thanks & Regards,
    - Nayna

> +	if (rc)
> +		return rc;
> +
>   	if (subcap_id == TPM_CAP_VERSION_1_1 ||
>   	    subcap_id == TPM_CAP_VERSION_1_2) {
> -		tpm_cmd.params.getcap_in.cap = cpu_to_be32(subcap_id);
> -		/*subcap field not necessary */
> -		tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(0);
> -		tpm_cmd.header.in.length -= cpu_to_be32(sizeof(__be32));
> +		tpm_buf_append_u32(&buf, subcap_id);
> +		tpm_buf_append_u32(&buf, 0);
>   	} else {
>   		if (subcap_id == TPM_CAP_FLAG_PERM ||
>   		    subcap_id == TPM_CAP_FLAG_VOL)
> -			tpm_cmd.params.getcap_in.cap =
> -				cpu_to_be32(TPM_CAP_FLAG);
> +			tpm_buf_append_u32(&buf, TPM_CAP_FLAG);
>   		else
> -			tpm_cmd.params.getcap_in.cap =
> -				cpu_to_be32(TPM_CAP_PROP);
> -		tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4);
> -		tpm_cmd.params.getcap_in.subcap = cpu_to_be32(subcap_id);
> +			tpm_buf_append_u32(&buf, TPM_CAP_PROP);
> +
> +		tpm_buf_append_u32(&buf, 4);
> +		tpm_buf_append_u32(&buf, subcap_id);
>   	}
> -	rc = tpm_transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE,
> -			      min_cap_length, 0, desc);
> +
> +	rc = tpm_transmit_cmd(chip, buf.data, PAGE_SIZE, min_cap_length, 0,
> +			      desc);
>   	if (!rc)
> -		*cap = tpm_cmd.params.getcap_out.cap;
> +		*cap = *(cap_t *)&buf.data[TPM_HEADER_SIZE + 4];
> +
> +	tpm_buf_destroy(&buf);
>   	return rc;
>   }
>   EXPORT_SYMBOL_GPL(tpm_getcap);
> diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
> index bff37be..709e7d4 100644
> --- a/drivers/char/tpm/tpm.h
> +++ b/drivers/char/tpm/tpm.h
> @@ -281,7 +281,7 @@ struct permanent_flags_t {
>   typedef union {
>   	struct	permanent_flags_t perm_flags;
>   	struct	stclear_flags_t	stclear_flags;
> -	bool	owned;
> +	u8	owned;
>   	__be32	num_pcrs;
>   	struct	tpm_version_t	tpm_version;
>   	struct	tpm_version_1_2_t tpm_version_1_2;
> @@ -307,17 +307,6 @@ enum tpm_sub_capabilities {
>   	TPM_CAP_PROP_TIS_DURATION = 0x120,
>   };
>
> -struct	tpm_getcap_params_in {
> -	__be32	cap;
> -	__be32	subcap_size;
> -	__be32	subcap;
> -} __packed;
> -
> -struct	tpm_getcap_params_out {
> -	__be32	cap_size;
> -	cap_t	cap;
> -} __packed;
> -
>   struct	tpm_readpubek_params_out {
>   	u8	algorithm[4];
>   	u8	encscheme[2];
> @@ -367,10 +356,8 @@ struct tpm_startup_in {
>   } __packed;
>
>   typedef union {
> -	struct	tpm_getcap_params_out getcap_out;
>   	struct	tpm_readpubek_params_out readpubek_out;
>   	u8	readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
> -	struct	tpm_getcap_params_in getcap_in;
>   	struct	tpm_pcrread_in	pcrread_in;
>   	struct	tpm_pcrread_out	pcrread_out;
>   	struct	tpm_pcrextend_in pcrextend_in;
>

      parent reply	other threads:[~2017-02-03 13:48 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-01 17:53 [PATCH] tpm: fix type issues in tpm_getcap() Jarkko Sakkinen
2017-02-01 17:53 ` Jarkko Sakkinen
2017-02-01 18:18 ` Jarkko Sakkinen
2017-02-01 18:30   ` Jarkko Sakkinen
     [not found] ` <20170201175347.2035-1-jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-02-01 18:40   ` Jarkko Sakkinen
2017-02-01 18:40     ` Jarkko Sakkinen
2017-02-02 13:50 ` Jarkko Sakkinen
2017-02-03 12:54 ` [tpmdd-devel] " Nayna
     [not found]   ` <58947D8E.20000-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>
2017-02-03 18:15     ` Jarkko Sakkinen
2017-02-03 18:15       ` [tpmdd-devel] " Jarkko Sakkinen
2017-02-03 18:46       ` Nayna
2017-02-03 19:06         ` Jarkko Sakkinen
2017-02-03 13:48 ` Nayna [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=58948A45.5020105@linux.vnet.ibm.com \
    --to=nayna@linux.vnet.ibm.com \
    --cc=jarkko.sakkinen@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=tpmdd-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.