前回の続き:tpm2-toolsのソースコード解析(2)のtpm2_createprimary.c
この記事では、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 つのステップに分割され、check_options、process_inputs、load、process_outputs の 4 つの関数を呼び出します。実際、このプロセスも一般的なプロセスです。
(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 (認証用の作成データを保存するファイル パス) が必要です。 .creation_hash_file (認証用の作成ハッシュを保存するファイル パス)、ctx.creation_ticket_file (認証用の作成チケットを保存するファイル パス)、ctx.context_file (生成されたメイン オブジェクトのオブジェクト コンテキストを保存するファイル パス) は空にする必要があります。
ctx.cp_hash_path と ctx.creation_data_file を含む 5 つのメンバーはすべて、tpm2_tool_onstart 関数内の tpm2_options_new 関数で設定された on_option 関数で割り当てられます (詳細については、以前の記事を参照してください)。実際、コマンド ラインに「 --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 関数の最初の関数 check_options 関数を分析しました。残りの機能については、次の記事で分析します。