From 65f82da673179a8ef6559ace8ac3137b819dd5a3 Mon Sep 17 00:00:00 2001 From: Juergen Repp Date: Tue, 21 Nov 2023 09:50:53 +0100 Subject: [PATCH] FAPI: Fix usage of endorsement handle In several cases the wrong handle TPM2_RH_EK was used instead of TPM2_RH_ENDORSEMENT. This caused a wrong recreation of keys (except the EK) under the endorsement hierarchy. Now the correct hierarchy handle is used and a check whether the recreated public key of the recreated primary corresponds to the keystore. Addresses: #2709 Signed-off-by: Juergen Repp --- src/tss2-fapi/fapi_util.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/tss2-fapi/fapi_util.c b/src/tss2-fapi/fapi_util.c index 11e4c0ec6..b45f496ac 100644 --- a/src/tss2-fapi/fapi_util.c +++ b/src/tss2-fapi/fapi_util.c @@ -944,9 +944,12 @@ ifapi_load_primary_finish(FAPI_CONTEXT *context, ESYS_TR *handle) /* Check whether a persistent key was loaded. In this case the handle has already been set. */ if (pkey_object->public.handle != ESYS_TR_NONE) { - if (pkey->creationTicket.hierarchy == TPM2_RH_EK) { + if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT && + strcmp("/EK", + &pkey_object->rel_path[strlen(pkey_object->rel_path)-3]) == 0) { context->ek_persistent = true; - } else { + } else if (strcmp("/SRK", + &pkey_object->rel_path[strlen(pkey_object->rel_path)-4]) == 0) { context->srk_persistent = true; } /* It has to be checked whether the persistent handle exists. */ @@ -954,7 +957,7 @@ ifapi_load_primary_finish(FAPI_CONTEXT *context, ESYS_TR *handle) return TSS2_FAPI_RC_TRY_AGAIN; } else { - if (pkey->creationTicket.hierarchy == TPM2_RH_EK) { + if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT) { context->ek_persistent = false; } else { context->srk_persistent = false; @@ -964,8 +967,7 @@ ifapi_load_primary_finish(FAPI_CONTEXT *context, ESYS_TR *handle) statecase(context->primary_state, PRIMARY_READ_HIERARCHY); /* The hierarchy object used for auth_session will be loaded from key store. */ - if (pkey->creationTicket.hierarchy == TPM2_RH_EK || - (pkey->ek_profile && pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT)) { + if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT) { r = ifapi_keystore_load_async(&context->keystore, &context->io, "/HE"); return_if_error2(r, "Could not open hierarchy /HE"); } else if (pkey->creationTicket.hierarchy == TPM2_RH_NULL) { @@ -985,7 +987,9 @@ ifapi_load_primary_finish(FAPI_CONTEXT *context, ESYS_TR *handle) r = ifapi_initialize_object(context->esys, hierarchy); goto_if_error_reset_state(r, "Initialize hierarchy object", error_cleanup); - if (pkey->creationTicket.hierarchy == TPM2_RH_EK) { + if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT) { + hierarchy->public.handle = ESYS_TR_RH_ENDORSEMENT; + } else if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT) { hierarchy->public.handle = ESYS_TR_RH_ENDORSEMENT; } else if (pkey->creationTicket.hierarchy == TPM2_RH_ENDORSEMENT && pkey->ek_profile) { @@ -1072,6 +1076,14 @@ ifapi_load_primary_finish(FAPI_CONTEXT *context, ESYS_TR *handle) } *handle = pkey_object->public.handle; context->primary_state = PRIMARY_INIT; + + /* Check whether the public key corresponds to key in key store. */ + if (!ifapi_cmp_public_key(outPublic, &pkey_object->misc.key.public)) { + goto_error(r, TSS2_FAPI_RC_GENERAL_FAILURE, + "Public key for %s was not created correctly.", + error_cleanup, pkey_object->rel_path); + } + break; statecase(context->primary_state, PRIMARY_VERIFY_PERSISTENT);