tpm2-tools ソースコード解析の tpm2_createprimary.c (3)

前回の続き: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 関数を分析しました。残りの機能については、次の記事で分析します。

おすすめ

転載: blog.csdn.net/phmatthaus/article/details/130085847