tpm2: use ref counter for Tpm2Context

This will be used by Tpm2Handle instances, which is added in later patches.

The refcounting allows the context to be retained until all Tpm2Handles have
been cleaned up, and the initial ref is released, before cleaning the context.
This commit is contained in:
Dan Streetman
2023-02-01 12:51:17 -05:00
parent bd860983a6
commit 68d084cee5
5 changed files with 68 additions and 64 deletions
+7 -7
View File
@@ -726,7 +726,6 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
_cleanup_(json_variant_unrefp) JsonVariant *v = NULL;
_cleanup_(pcr_state_free_all) PcrState *pcr_states = NULL;
_cleanup_(EVP_PKEY_freep) EVP_PKEY *privkey = NULL, *pubkey = NULL;
_cleanup_(tpm2_context_destroy) Tpm2Context c = {};
_cleanup_fclose_ FILE *privkeyf = NULL;
ESYS_TR session_handle = ESYS_TR_NONE;
TSS2_RC rc;
@@ -811,7 +810,8 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
if (r < 0)
return r;
r = tpm2_context_init(arg_tpm2_device, &c);
_cleanup_tpm2_context_ Tpm2Context *c = NULL;
r = tpm2_context_new(arg_tpm2_device, &c);
if (r < 0)
return r;
@@ -830,7 +830,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
PcrState *p = pcr_states + i;
rc = sym_Esys_StartAuthSession(
c.esys_context,
c->esys_context,
ESYS_TR_NONE,
ESYS_TR_NONE,
ESYS_TR_NONE,
@@ -865,7 +865,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
tpm2_pcr_mask_to_selection(1 << TPM_PCR_INDEX_KERNEL_IMAGE, tpmalg, &pcr_selection);
rc = sym_Esys_PolicyPCR(
c.esys_context,
c->esys_context,
session_handle,
ESYS_TR_NONE,
ESYS_TR_NONE,
@@ -880,7 +880,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
_cleanup_(Esys_Freep) TPM2B_DIGEST *pcr_policy_digest = NULL;
rc = sym_Esys_PolicyGetDigest(
c.esys_context,
c->esys_context,
session_handle,
ESYS_TR_NONE,
ESYS_TR_NONE,
@@ -892,7 +892,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
goto finish;
}
session_handle = tpm2_flush_context_verbose(c.esys_context, session_handle);
session_handle = tpm2_flush_context_verbose(c->esys_context, session_handle);
_cleanup_(EVP_MD_CTX_freep) EVP_MD_CTX* mdctx = NULL;
mdctx = EVP_MD_CTX_new();
@@ -983,7 +983,7 @@ static int verb_sign(int argc, char *argv[], void *userdata) {
r = 0;
finish:
session_handle = tpm2_flush_context_verbose(c.esys_context, session_handle);
session_handle = tpm2_flush_context_verbose(c->esys_context, session_handle);
return r;
}
+4 -4
View File
@@ -240,7 +240,6 @@ static int get_file_system_word(
}
static int run(int argc, char *argv[]) {
_cleanup_(tpm2_context_destroy) Tpm2Context c = {};
_cleanup_free_ char *joined = NULL, *word = NULL;
unsigned target_pcr_nr;
size_t length;
@@ -346,11 +345,12 @@ static int run(int argc, char *argv[]) {
if (r < 0)
return log_error_errno(r, "Failed to load TPM2 libraries: %m");
r = tpm2_context_init(arg_tpm2_device, &c);
_cleanup_tpm2_context_ Tpm2Context *c = NULL;
r = tpm2_context_new(arg_tpm2_device, &c);
if (r < 0)
return r;
r = determine_banks(&c, target_pcr_nr);
r = determine_banks(c, target_pcr_nr);
if (r < 0)
return r;
if (strv_isempty(arg_banks)) /* Still none? */
@@ -362,7 +362,7 @@ static int run(int argc, char *argv[]) {
log_debug("Measuring '%s' into PCR index %u, banks %s.", word, target_pcr_nr, joined);
r = tpm2_extend_bytes(c.esys_context, arg_banks, target_pcr_nr, word, length, NULL, 0);
r = tpm2_extend_bytes(c->esys_context, arg_banks, target_pcr_nr, word, length, NULL, 0);
if (r < 0)
return r;