tpm2-util: add helpers for marshalling NV index public areas

This commit is contained in:
Lennart Poettering
2023-11-03 11:21:16 +01:00
parent 9fe3b63672
commit 360062095d
2 changed files with 45 additions and 0 deletions
+43
View File
@@ -2431,6 +2431,49 @@ int tpm2_unmarshal_public(const void *data, size_t size, TPM2B_PUBLIC *ret_publi
return 0;
}
int tpm2_marshal_nv_public(const TPM2B_NV_PUBLIC *nv_public, void **ret, size_t *ret_size) {
size_t max_size = sizeof(*nv_public), blob_size = 0;
_cleanup_free_ void *blob = NULL;
TSS2_RC rc;
assert(nv_public);
assert(ret);
assert(ret_size);
blob = malloc0(max_size);
if (!blob)
return log_oom_debug();
rc = sym_Tss2_MU_TPM2B_NV_PUBLIC_Marshal(nv_public, blob, max_size, &blob_size);
if (rc != TSS2_RC_SUCCESS)
return log_debug_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),
"Failed to marshal NV public structure: %s", sym_Tss2_RC_Decode(rc));
*ret = TAKE_PTR(blob);
*ret_size = blob_size;
return 0;
}
int tpm2_unmarshal_nv_public(const void *data, size_t size, TPM2B_NV_PUBLIC *ret_nv_public) {
TPM2B_NV_PUBLIC nv_public = {};
size_t offset = 0;
TSS2_RC rc;
assert(data || size == 0);
assert(ret_nv_public);
rc = sym_Tss2_MU_TPM2B_NV_PUBLIC_Unmarshal(data, size, &offset, &nv_public);
if (rc != TSS2_RC_SUCCESS)
return log_debug_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),
"Failed to unmarshal NV public structure: %s", sym_Tss2_RC_Decode(rc));
if (offset != size)
return log_error_errno(SYNTHETIC_ERRNO(ENOTRECOVERABLE),
"Garbage at end of NV public structure marshal data.");
*ret_nv_public = nv_public;
return 0;
}
/* Read hash values from the specified PCR selection. Provides a Tpm2PCRValue array that contains all
* requested PCR values, in the order provided by the TPM. Normally, the provided pcr values will match
* exactly what is in the provided selection, but the TPM may ignore some selected PCRs (for example, if an
+2
View File
@@ -121,6 +121,8 @@ int tpm2_marshal_private(const TPM2B_PRIVATE *private, void **ret, size_t *ret_s
int tpm2_unmarshal_private(const void *data, size_t size, TPM2B_PRIVATE *ret_private);
int tpm2_marshal_public(const TPM2B_PUBLIC *public, void **ret, size_t *ret_size);
int tpm2_unmarshal_public(const void *data, size_t size, TPM2B_PUBLIC *ret_public);
int tpm2_marshal_nv_public(const TPM2B_NV_PUBLIC *nv_public, void **ret, size_t *ret_size);
int tpm2_unmarshal_nv_public(const void *data, size_t size, TPM2B_NV_PUBLIC *ret_nv_public);
bool tpm2_supports_alg(Tpm2Context *c, TPM2_ALG_ID alg);
bool tpm2_supports_command(Tpm2Context *c, TPM2_CC command);