From: Lennart Poettering Date: Wed, 25 Oct 2023 08:55:51 +0000 (+0200) Subject: tpm2-util: add helpers for marshalling NV index public areas X-Git-Tag: v255-rc1~27^2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=360062095d414c8d62f56cb78fe4dd0697e7aed9;p=thirdparty%2Fsystemd.git tpm2-util: add helpers for marshalling NV index public areas --- diff --git a/src/shared/tpm2-util.c b/src/shared/tpm2-util.c index c3f40be46fe..a62fd3c6c00 100644 --- a/src/shared/tpm2-util.c +++ b/src/shared/tpm2-util.c @@ -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 diff --git a/src/shared/tpm2-util.h b/src/shared/tpm2-util.h index c6ec8c4b036..7444cef02eb 100644 --- a/src/shared/tpm2-util.h +++ b/src/shared/tpm2-util.h @@ -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);