]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tpm2-util: add helpers for marshalling NV index public areas
authorLennart Poettering <lennart@poettering.net>
Wed, 25 Oct 2023 08:55:51 +0000 (10:55 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 3 Nov 2023 10:21:16 +0000 (11:21 +0100)
src/shared/tpm2-util.c
src/shared/tpm2-util.h

index c3f40be46fea9d2f86400441da6311898df4c162..a62fd3c6c005b6bb79ce2bb4a33d2340f6c3110c 100644 (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
index c6ec8c4b036dd6eb1efe8450b7a87595cfcd867f..7444cef02ebd33f6329ab67874b815c78e332a56 100644 (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);