]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
tpm: fix RC value check in tpm2_seal_trusted
authorJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Wed, 25 Jan 2017 21:00:22 +0000 (23:00 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Tue, 20 Jun 2017 08:45:51 +0000 (10:45 +0200)
BugLink: http://bugs.launchpad.net/bugs/1691369
commit 7d761119a914ec0ac05ec2a5378d1f86e680967d upstream.

The error code handling is broken as any error code that has the same
bits set as TPM_RC_HASH passes. Implemented tpm2_rc_value() helper to
parse the error value from FMT0 and FMT1 error codes so that these types
of mistakes are prevented in the future.

Fixes: 5ca4c20cfd37 ("keys, trusted: select hash algorithm for TPM2 chips")
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Reviewed-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm2-cmd.c

index 1ae976894257f54e525e2f8791e98343b957a053..f9613f55e7bc9291108aceb17239e4d974e5a86f 100644 (file)
@@ -529,6 +529,11 @@ static inline void tpm_add_ppi(struct tpm_chip *chip)
 }
 #endif
 
+static inline inline u32 tpm2_rc_value(u32 rc)
+{
+       return (rc & BIT(7)) ? rc & 0xff : rc;
+}
+
 int tpm2_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf);
 int tpm2_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash);
 int tpm2_get_random(struct tpm_chip *chip, u8 *out, size_t max);
index da5b782a97316e777fdcda2ea46c9681d2340b82..6a397c8bf033c33b6623f7c37e36430044a60273 100644 (file)
@@ -529,7 +529,7 @@ out:
        tpm_buf_destroy(&buf);
 
        if (rc > 0) {
-               if ((rc & TPM2_RC_HASH) == TPM2_RC_HASH)
+               if (tpm2_rc_value(rc) == TPM2_RC_HASH)
                        rc = -EINVAL;
                else
                        rc = -EPERM;