TPM_HANDLE TSS_CreatePersistentKey()

in src/tpm_codec.c [201:244]


TPM_HANDLE TSS_CreatePersistentKey(TSS_DEVICE* tpm_device, TPM_HANDLE request_handle, TSS_SESSION* sess, TPMI_DH_OBJECT hierarchy, TPM2B_PUBLIC* inPub, TPM2B_PUBLIC* outPub)
{
    TPM_HANDLE result;
    TPM_RC tpm_result;
    TPM2B_NAME name;
    TPM2B_NAME qName;

    tpm_result = TPM2_ReadPublic(tpm_device, request_handle, outPub, &name, &qName);
    if (tpm_result == TPM_RC_SUCCESS)
    {
        result = request_handle;
    }
    else if (tpm_result != TPM_RC_HANDLE)
    {
        LogError("Failed calling TPM2_ReadPublic 0x%x", tpm_result);
        result = 0;
    }
    else
    {
        if ((tpm_result = TSS_CreatePrimary(tpm_device, sess, hierarchy, inPub, &result, outPub)) != TPM_RC_SUCCESS)
        {
            LogError("Failed calling TSS_CreatePrimary 0x%x", tpm_result);
            result = 0;
        }
        else
        {
            if ((tpm_result = TPM2_EvictControl(tpm_device, sess, TPM_RH_OWNER, result, request_handle)) != TPM_RC_SUCCESS)
            {
                LogError("Failed calling TPM2_EvictControl 0x%x", tpm_result);
                result = 0;
            }
            else if ((tpm_result = TPM2_FlushContext(tpm_device, result)) != TPM_RC_SUCCESS)
            {
                LogError("Failed calling TPM2_FlushContext 0x%x", tpm_result);
                result = 0;
            }
            else
            {
                result = request_handle;
            }
        }
    }
    return result;
}