Merge tag 'mfd-next-5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
[linux-2.6-microblaze.git] / security / keys / trusted-keys / trusted_tpm2.c
index 08ec7f4..e2a0ed5 100644 (file)
@@ -83,6 +83,12 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
        if (rc)
                return rc;
 
+       rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE);
+       if (rc) {
+               tpm_put_ops(chip);
+               return rc;
+       }
+
        tpm_buf_append_u32(&buf, options->keyhandle);
        tpm2_buf_append_auth(&buf, TPM2_RS_PW,
                             NULL /* nonce */, 0,
@@ -130,7 +136,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
                goto out;
        }
 
-       rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
+       rc = tpm_transmit_cmd(chip, &buf, 4, "sealing data");
        if (rc)
                goto out;
 
@@ -157,6 +163,7 @@ out:
                        rc = -EPERM;
        }
 
+       tpm_put_ops(chip);
        return rc;
 }
 
@@ -211,7 +218,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
                goto out;
        }
 
-       rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
+       rc = tpm_transmit_cmd(chip, &buf, 4, "loading blob");
        if (!rc)
                *blob_handle = be32_to_cpup(
                        (__be32 *) &buf.data[TPM_HEADER_SIZE]);
@@ -260,7 +267,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip,
                             options->blobauth /* hmac */,
                             TPM_DIGEST_SIZE);
 
-       rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
+       rc = tpm_transmit_cmd(chip, &buf, 6, "unsealing");
        if (rc > 0)
                rc = -EPERM;
 
@@ -304,12 +311,19 @@ int tpm2_unseal_trusted(struct tpm_chip *chip,
        u32 blob_handle;
        int rc;
 
-       rc = tpm2_load_cmd(chip, payload, options, &blob_handle);
+       rc = tpm_try_get_ops(chip);
        if (rc)
                return rc;
 
+       rc = tpm2_load_cmd(chip, payload, options, &blob_handle);
+       if (rc)
+               goto out;
+
        rc = tpm2_unseal_cmd(chip, payload, options, blob_handle);
        tpm2_flush_context(chip, blob_handle);
 
+out:
+       tpm_put_ops(chip);
+
        return rc;
 }