|
@@ -443,12 +443,13 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
|
|
|
TPM_DIGEST_SIZE);
|
|
|
|
|
|
/* sensitive */
|
|
|
- tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len);
|
|
|
+ tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len + 1);
|
|
|
|
|
|
tpm_buf_append_u16(&buf, TPM_DIGEST_SIZE);
|
|
|
tpm_buf_append(&buf, options->blobauth, TPM_DIGEST_SIZE);
|
|
|
- tpm_buf_append_u16(&buf, payload->key_len);
|
|
|
+ tpm_buf_append_u16(&buf, payload->key_len + 1);
|
|
|
tpm_buf_append(&buf, payload->key, payload->key_len);
|
|
|
+ tpm_buf_append_u8(&buf, payload->migratable);
|
|
|
|
|
|
/* public */
|
|
|
tpm_buf_append_u16(&buf, 14);
|
|
@@ -573,6 +574,8 @@ static int tpm2_unseal(struct tpm_chip *chip,
|
|
|
u32 blob_handle)
|
|
|
{
|
|
|
struct tpm_buf buf;
|
|
|
+ u16 data_len;
|
|
|
+ u8 *data;
|
|
|
int rc;
|
|
|
|
|
|
rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL);
|
|
@@ -591,11 +594,13 @@ static int tpm2_unseal(struct tpm_chip *chip,
|
|
|
rc = -EPERM;
|
|
|
|
|
|
if (!rc) {
|
|
|
- payload->key_len = be16_to_cpup(
|
|
|
+ data_len = be16_to_cpup(
|
|
|
(__be16 *) &buf.data[TPM_HEADER_SIZE + 4]);
|
|
|
+ data = &buf.data[TPM_HEADER_SIZE + 6];
|
|
|
|
|
|
- memcpy(payload->key, &buf.data[TPM_HEADER_SIZE + 6],
|
|
|
- payload->key_len);
|
|
|
+ memcpy(payload->key, data, data_len - 1);
|
|
|
+ payload->key_len = data_len - 1;
|
|
|
+ payload->migratable = data[data_len - 1];
|
|
|
}
|
|
|
|
|
|
tpm_buf_destroy(&buf);
|