diff options
Diffstat (limited to 'security/keys/trusted-keys/trusted_tpm2.c')
| -rw-r--r-- | security/keys/trusted-keys/trusted_tpm2.c | 22 | 
1 files changed, 18 insertions, 4 deletions
diff --git a/security/keys/trusted-keys/trusted_tpm2.c b/security/keys/trusted-keys/trusted_tpm2.c index 08ec7f48f01d..e2a0ed5d02f0 100644 --- a/security/keys/trusted-keys/trusted_tpm2.c +++ b/security/keys/trusted-keys/trusted_tpm2.c @@ -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;  }  |