> 文章列表 > tpm2-tools源码分析之tpm2_createprimary.c(3)

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

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函数就分析完了。下一篇文章起分析余下的函数。