tpm2-tools源码分析之tpm2_createprimary.c(3)

接前一篇文章:tpm2-tools源码分析之tpm2_createprimary.c(2)

本文对tpm2_createprimary.c中的tpm2_tool_onrun函数进行详细解析。

先再次贴出该函数源码:

static tool_rc tpm2_tool_onrun(ESYS_CONTEXT *ectx, tpm2_option_flags flags) {

    UNUSED(flags);

    /*
     * 1. Process options
     */
    tool_rc rc = check_options(ectx);
    if (rc != tool_rc_success) {
        return rc;
    }

    /*
     * 2. Process inputs
     */
    rc = process_inputs(ectx);
    if (rc != tool_rc_success) {
        return rc;
    }

    /*
     * 3. TPM2_CC_<command> call
     */
    rc = createprimary(ectx);
    if (rc != tool_rc_success) {
        return rc;
    }

    /*
     * 4. Process outputs
     */
    return process_output(ectx);
}

根据tpm2_tool_onrun函数中的注释,此函数分为4个步骤即调用了4个函数:check_options、process_inputs、load、process_outputs。实际上这个流程也是一个通用流程。

(1)check_options函数

check_option函数的作用是选项检查与处理。它在同文件(tpm2_createprimary.c)中,代码如下:

static tool_rc check_options(ESYS_CONTEXT *ectx) {

    UNUSED(ectx);

    if (ctx.cp_hash_path && (ctx.creation_data_file || ctx.creation_hash_file ||
    ctx.creation_ticket_file || ctx.context_file)) {
        LOG_ERR("Cannot generate outputs when calculating cpHash");
        return tool_rc_option_error;
    }

    if (ctx.format_set && !ctx.output_path) {
        LOG_ERR("Cannot specify --format/-f without specifying --output/-o");
        return tool_rc_option_error;
    }

    return tool_rc_success;
}

重点说一下ctx。ctx在同文件(tools/tpm2_createprimary.c)中定义并初始化,代码如下:

#define DEFAULT_PRIMARY_KEY_ALG "rsa2048:null:aes128cfb"
static tpm_createprimary_ctx ctx = {
    .alg = DEFAULT_PRIMARY_KEY_ALG,
    .objdata = {
        .in = {
            .sensitive = TPM2B_SENSITIVE_CREATE_EMPTY_INIT,
            .hierarchy = TPM2_RH_OWNER
        },
    },
    .format = pubkey_format_tss,
    .auth_hierarchy.ctx_path = "owner",
    .parameter_hash_algorithm = TPM2_ALG_ERROR,
};

ctx是tpm_createprimary_ctx结构的成员,该结构也在同文件中定义,代码如下:

typedef struct tpm_createprimary_ctx tpm_createprimary_ctx;
struct tpm_createprimary_ctx {
    /*
     * Inputs
     */
    struct {
        const char *ctx_path;
        const char *auth_str;
        tpm2_loaded_object object;
    } auth_hierarchy;

    tpm2_hierarchy_pdata objdata;
    char *alg;
    char *halg;
    char *attrs;
    char *policy;
    char *key_auth_str;
    char *unique_file;
    char *outside_info_data;

    /*
     * Outputs
     */
    char *creation_data_file;
    char *creation_ticket_file;
    char *creation_hash_file;
    char *template_data_path;
    char *context_file;
    char *output_path;
    bool format_set;
    tpm2_convert_pubkey_fmt format;

    /*
     * Parameter hashes
     */
    const char *cp_hash_path;
    TPM2B_DIGEST cp_hash;
    bool is_command_dispatch;
    TPMI_ALG_HASH parameter_hash_algorithm;
};

回到check_options函数中,一上来先做检查,当ctx.cp_hash_path(记录命令参数哈希的文件路径)不为空时,要求ctx.creation_data_file(保存创建数据以供认证的文件路径)、ctx.creation_hash_file(保存创建哈希以供认证的文件路径)、ctx.creation_ticket_file(保存创建ticket以供认证的文件路径)、ctx.context_file(保存生成的主对象的对象上下文的文件路径)都必须为空。

ctx.cp_hash_path、ctx.creation_data_file等5个成员均在tpm2_tool_onstart函数中的tpm2_options_new函数中设置的on_option函数中赋值(详见前一篇文章)。实际上是要求命令行在带有“--cphash=FILE”时必须不能带有“--creation-data=FILE”、“--creation-hash=FILE(-d FILE)”、“--creation-ticket=FILE(-t FILE)”、“--key-context=FILE(-c FILE)”。

接下来继续进行参数检查。要求当ctx.format_set(公钥输出文件的格式选择)不为空时ctx.output_path(记录对象的公共部分的文件路径)必须也不为空。ctx.format_set、ctx.output_path也是在tpm2_tool_onstart函数中的tpm2_options_new函数中设置的on_option函数中赋值(详见前一篇文章)。实际上是要求命令行在带有“--format=FILE(-f FILE)”时必须带有“---output=FILE(-o FILE)”。

至此,tpm2_tool_onrun函数的第1个函数check_options函数就分析完了。下一篇文章起分析余下的函数。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/130085847
今日推荐