@@ -2060,15 +2060,32 @@ tool_rc tpm2_create(ESYS_CONTEXT *esys_context, tpm2_loaded_object *parent_obj,
20602060tool_rc tpm2_create_loaded (ESYS_CONTEXT * esys_context ,
20612061 tpm2_loaded_object * parent_obj ,
20622062 const TPM2B_SENSITIVE_CREATE * in_sensitive ,
2063- const TPM2B_TEMPLATE * in_public , ESYS_TR * object_handle ,
2063+ const TPM2B_PUBLIC * in_public , ESYS_TR * object_handle ,
20642064 TPM2B_PRIVATE * * out_private , TPM2B_PUBLIC * * out_public ,
20652065 TPM2B_DIGEST * cp_hash , TPM2B_DIGEST * rp_hash ,
20662066 TPMI_ALG_HASH parameter_hash_algorithm , ESYS_TR shandle2 ,
20672067 ESYS_TR shandle3 ) {
2068-
2068+ TPM2B_TEMPLATE template = { .size = 0 };
2069+
20692070 TSS2_SYS_CONTEXT * sys_context = NULL ;
2071+ bool create_loaded_exists ;
20702072 tool_rc rc = tool_rc_success ;
2071- if (cp_hash -> size || rp_hash -> size ) {
2073+ size_t offset = 0 ;
2074+
2075+ tool_rc tmp_rc = tpm2_mu_tpmt_public_marshal (
2076+ & in_public -> publicArea , & template .buffer [0 ],
2077+ sizeof (TPMT_PUBLIC ), & offset );
2078+ if (tmp_rc != tool_rc_success ) {
2079+ return tmp_rc ;
2080+ }
2081+
2082+ template .size = offset ;
2083+
2084+ rc = tpm2_check_cc (esys_context , TPM2_CC_CreateLoaded , & create_loaded_exists );
2085+ if (rc != tool_rc_success ) {
2086+ return rc ;
2087+ }
2088+ if ((cp_hash -> size || rp_hash -> size ) && create_loaded_exists ) {
20722089 rc = tpm2_getsapicontext (esys_context , & sys_context );
20732090
20742091 if (rc != tool_rc_success ) {
@@ -2077,9 +2094,9 @@ tool_rc tpm2_create_loaded(ESYS_CONTEXT *esys_context,
20772094 }
20782095 }
20792096
2080- if (cp_hash -> size ) {
2097+ if (cp_hash -> size && create_loaded_exists ) {
20812098 TSS2_RC rval = Tss2_Sys_CreateLoaded_Prepare (sys_context ,
2082- parent_obj -> handle , in_sensitive , in_public );
2099+ parent_obj -> handle , in_sensitive , & template );
20832100 if (rval != TPM2_RC_SUCCESS ) {
20842101 LOG_PERR (Tss2_Sys_CreateLoaded_Prepare , rval );
20852102 return tool_rc_general_error ;
@@ -2115,19 +2132,39 @@ tool_rc tpm2_create_loaded(ESYS_CONTEXT *esys_context,
21152132 return rc ;
21162133 }
21172134
2118- TSS2_RC rval = Esys_CreateLoaded (esys_context , parent_obj -> tr_handle ,
2119- shandle1 , shandle2 , shandle3 , in_sensitive , in_public ,
2135+ if (create_loaded_exists ) {
2136+ TSS2_RC rval = Esys_CreateLoaded (esys_context , parent_obj -> tr_handle ,
2137+ shandle1 , shandle2 , shandle3 , in_sensitive , & template ,
21202138 object_handle , out_private , out_public );
2121- if (rval != TSS2_RC_SUCCESS ) {
2122- LOG_PERR (Esys_CreateLoaded , rval );
2123- return tool_rc_from_tpm (rval );
2124- }
2139+ if (rval != TSS2_RC_SUCCESS ) {
2140+ LOG_PERR (Esys_CreateLoaded , rval );
2141+ return tool_rc_from_tpm (rval );
2142+ }
21252143
2126- if (rp_hash -> size ) {
2127- rc = tpm2_sapi_getrphash (sys_context , rval , rp_hash ,
2128- parameter_hash_algorithm );
2144+ if (rp_hash -> size ) {
2145+ rc = tpm2_sapi_getrphash (sys_context , rval , rp_hash ,
2146+ parameter_hash_algorithm );
2147+ }
2148+ } else {
2149+ TPML_PCR_SELECTION creationPCR = {
2150+ .count = 0 ,
2151+ };
2152+
2153+ TSS2_RC rval = Esys_Create (esys_context , parent_obj -> tr_handle ,
2154+ shandle1 , shandle2 , shandle3 , in_sensitive , in_public ,
2155+ NULL , & creationPCR , out_private , out_public , NULL , NULL , NULL );
2156+ if (rval != TSS2_RC_SUCCESS ) {
2157+ LOG_PERR (Esys_CreateLoaded , rval );
2158+ return tool_rc_from_tpm (rval );
2159+ }
2160+ rval = Esys_Load (esys_context , parent_obj -> tr_handle ,
2161+ shandle1 , shandle2 , shandle3 , * out_private ,
2162+ * out_public , object_handle );
2163+ if (rval != TPM2_RC_SUCCESS ) {
2164+ LOG_PERR (Esys_Load , rval );
2165+ return tool_rc_from_tpm (rval );
2166+ }
21292167 }
2130-
21312168tpm2_createloaded_skip_esapi_call :
21322169 return rc ;
21332170}
0 commit comments