tpm2-tools/0004-tpm2_identity_util-move-create_name-into-utility-lib.patch
Štěpán Horáček d8b5733ac7 tpm2-tools: Fix segfault and add support for OpenSSL 3
The segfault was caused by calling tpm2 command on ppc64le without any
additional arguments.

Resolves: rhbz#1989617

Signed-off-by: Štěpán Horáček <shoracek@redhat.com>
2021-10-05 12:20:18 +02:00

144 lines
4.9 KiB
Diff

From 6a3100ad060934228a1bec06ae43b41f5ea8a51b Mon Sep 17 00:00:00 2001
From: Trammell hudson <hudson@trmm.net>
Date: Fri, 26 Mar 2021 17:23:07 +0000
Subject: [PATCH 03/17] tpm2_identity_util: move create_name() into utility
library
Signed-off-by: Trammell Hudson <hudson@trmm.net>
---
lib/tpm2_identity_util.c | 40 ++++++++++++++++++++++++++++++++++++++
lib/tpm2_identity_util.h | 10 ++++++++++
tools/tpm2_import.c | 42 +---------------------------------------
3 files changed, 51 insertions(+), 41 deletions(-)
diff --git a/lib/tpm2_identity_util.c b/lib/tpm2_identity_util.c
index a3b0e387..e11137ab 100644
--- a/lib/tpm2_identity_util.c
+++ b/lib/tpm2_identity_util.c
@@ -423,3 +423,43 @@ void tpm2_identity_util_calculate_outer_integrity(TPMI_ALG_HASH parent_name_alg,
encrypted_duplicate_sensitive->size, pubname->name, pubname->size,
protection_hmac_key->buffer, outer_hmac);
}
+
+bool tpm2_identity_create_name(TPM2B_PUBLIC *public, TPM2B_NAME *pubname) {
+
+ /*
+ * A TPM2B_NAME is the name of the algorithm, followed by the hash.
+ * Calculate the name by:
+ * 1. Marshaling the name algorithm
+ * 2. Marshaling the TPMT_PUBLIC past the name algorithm from step 1.
+ * 3. Hash the TPMT_PUBLIC portion in marshaled data.
+ */
+
+ TPMI_ALG_HASH name_alg = public->publicArea.nameAlg;
+
+ // Step 1 - set beginning of name to hash alg
+ size_t hash_offset = 0;
+ Tss2_MU_UINT16_Marshal(name_alg, pubname->name, pubname->size,
+ &hash_offset);
+
+ // Step 2 - marshal TPMTP
+ TPMT_PUBLIC marshaled_tpmt;
+ size_t tpmt_marshalled_size = 0;
+ Tss2_MU_TPMT_PUBLIC_Marshal(&public->publicArea,
+ (uint8_t *) &marshaled_tpmt, sizeof(public->publicArea),
+ &tpmt_marshalled_size);
+
+ // Step 3 - Hash the data into name just past the alg type.
+ digester d = tpm2_openssl_halg_to_digester(name_alg);
+ if (!d) {
+ return false;
+ }
+
+ d((const unsigned char *) &marshaled_tpmt, tpmt_marshalled_size,
+ pubname->name + hash_offset);
+
+ //Set the name size, UINT16 followed by HASH
+ UINT16 hash_size = tpm2_alg_util_get_hash_size(name_alg);
+ pubname->size = hash_size + hash_offset;
+
+ return true;
+}
diff --git a/lib/tpm2_identity_util.h b/lib/tpm2_identity_util.h
index 0ac55793..61e10376 100644
--- a/lib/tpm2_identity_util.h
+++ b/lib/tpm2_identity_util.h
@@ -102,4 +102,14 @@ void tpm2_identity_util_calculate_outer_integrity(TPMI_ALG_HASH parent_name_alg,
TPM2B_MAX_BUFFER *encrypted_duplicate_sensitive,
TPM2B_DIGEST *outer_hmac);
+/**
+ * Computes the name of a TPM key.
+ *
+ * @param public
+ * Public key structure
+ * @param pubname
+ * The name structure to populate.
+ */
+bool tpm2_identity_create_name(TPM2B_PUBLIC *public, TPM2B_NAME *pubname);
+
#endif /* LIB_TPM2_IDENTITY_UTIL_H_ */
diff --git a/tools/tpm2_import.c b/tools/tpm2_import.c
index eb8dd9a7..a5d1b4e6 100644
--- a/tools/tpm2_import.c
+++ b/tools/tpm2_import.c
@@ -74,46 +74,6 @@ static tool_rc readpublic(ESYS_CONTEXT *ectx, ESYS_TR handle,
return tpm2_readpublic(ectx, handle, public, NULL, NULL);
}
-static bool create_name(TPM2B_PUBLIC *public, TPM2B_NAME *pubname) {
-
- /*
- * A TPM2B_NAME is the name of the algorithm, followed by the hash.
- * Calculate the name by:
- * 1. Marshaling the name algorithm
- * 2. Marshaling the TPMT_PUBLIC past the name algorithm from step 1.
- * 3. Hash the TPMT_PUBLIC portion in marshaled data.
- */
-
- TPMI_ALG_HASH name_alg = public->publicArea.nameAlg;
-
- // Step 1 - set beginning of name to hash alg
- size_t hash_offset = 0;
- Tss2_MU_UINT16_Marshal(name_alg, pubname->name, pubname->size,
- &hash_offset);
-
- // Step 2 - marshal TPMTP
- TPMT_PUBLIC marshaled_tpmt;
- size_t tpmt_marshalled_size = 0;
- Tss2_MU_TPMT_PUBLIC_Marshal(&public->publicArea,
- (uint8_t *) &marshaled_tpmt, sizeof(public->publicArea),
- &tpmt_marshalled_size);
-
- // Step 3 - Hash the data into name just past the alg type.
- digester d = tpm2_openssl_halg_to_digester(name_alg);
- if (!d) {
- return false;
- }
-
- d((const unsigned char *) &marshaled_tpmt, tpmt_marshalled_size,
- pubname->name + 2);
-
- //Set the name size, UINT16 followed by HASH
- UINT16 hash_size = tpm2_alg_util_get_hash_size(name_alg);
- pubname->size = hash_size + 2;
-
- return true;
-}
-
static void create_import_key_private_data(TPM2B_PRIVATE *private,
TPMI_ALG_HASH parent_name_alg,
TPM2B_MAX_BUFFER *encrypted_duplicate_sensitive,
@@ -155,7 +115,7 @@ static tool_rc key_import(ESYS_CONTEXT *ectx, TPM2B_PUBLIC *parent_pub,
* Calculate the object name.
*/
TPM2B_NAME pubname = TPM2B_TYPE_INIT(TPM2B_NAME, name);
- bool res = create_name(pubkey, &pubname);
+ bool res = tpm2_identity_create_name(pubkey, &pubname);
if (!res) {
return false;
}
--
2.31.1