tpm2-tools源码分析之tpm2_load.c(1)
创始人
2024-06-02 18:24:01
0

TPM 2.0中的tpm2_load命令对应的源文件就是tpm2_load.c,该文件位于tpm2-tools/tools/下,一共有364行(版本5.5)。

下边对该文件结合tpm2_load进行深入的、完全的解析。

tpm2-tools代码链接:GitHub - tpm2-software/tpm2-tools: The source repository for the Trusted Platform Module (TPM2.0) tools

先来看第一段代码:

// Register this tool with tpm2_tool.c
TPM2_TOOL_REGISTER("load", tpm2_tool_onstart, tpm2_tool_onrun,tpm2_tool_onstop, 0)

TPM2_TOOL_REGISTER是一个宏定义,在tpm2-tools/tools/tpm2_tool.h中,代码如下:

#define TPM2_TOOL_REGISTER(tool_name,tool_onstart,tool_onrun,tool_onstop,tool_onexit) \static const tpm2_tool tool = { \.name		= tool_name, \.onstart	= tool_onstart, \.onrun		= tool_onrun, \.onstop		= tool_onstop, \.onexit		= tool_onexit, \}; \static void \__attribute__((__constructor__)) \__attribute__((__used__)) \_tpm2_tool_init(void) \{ \tpm2_tool_register(&tool); \}

TPM2_TOOLS_REGISTER宏定义是整个tpm2-tools中的命令所共用的,是一个框架性质的代码。

在本文件tpm2_load.c也可以说tpm2_load命令中,宏展开后为:

static const tpm2_tool tool = { .name		= load, .onstart	= tpm2_tool_onstart, .onrun		= tpm2_tool_onrun, .onstop		= tpm2_tool_onstop, .onexit		= 0, }; 
static void 
__attribute__((__constructor__)) 
__attribute__((__used__)) 
_tpm2_tool_init(void) 
{ tpm2_tool_register(&tool); 
}

tpm2_tool结构的定义也在tpm2-tools/tools/tpm2_tool.h中,代码如下:

typedef struct {const char * name;tpm2_tool_onstart_t onstart;tpm2_tool_onrun_t onrun;tpm2_tool_onstop_t onstop;tpm2_tool_onexit_t onexit;
} tpm2_tool;

其中包含的相关函数指针如下(同文件中,就在上边):

/*** An optional interface for tools to specify what options they support.* They are concatenated with main's options and passed to getopt_long.* @param opts*  The callee can choose to set *opts to a tpm_options pointer allocated*  via tpm2_options_new(). Setting *opts to NULL is not an error, and*  Indicates that no options are specified by the tool.** @return*  True on success, false on error.*/
typedef bool (*tpm2_tool_onstart_t)(tpm2_options **opts);/*** This is the main interface for tools, after tcti and sapi/esapi initialization* are performed.* @param ectx*  The system/esapi api context.* @param flags*  Flags that tools may wish to respect.* @return*  A tool_rc indicating status.*/
typedef tool_rc (*tpm2_tool_onrun_t)(ESYS_CONTEXT *ectx, tpm2_option_flags flags);/*** Called after tpm2_tool_onrun() is invoked. ESAPI context is still valid during this call.* @param ectx*  The system/esapi api context.* @return*  A tool_rc indicating status.*/
typedef tool_rc (*tpm2_tool_onstop_t)(ESYS_CONTEXT *ectx);/*** Called when the tool is exiting, useful for cleanup.*/
typedef void (*tpm2_tool_onexit_t)(void);

tpm2_tool_register函数在tpm2-tools/tools/tpm2_tools.c中实现,代码如下:

/** Build a list of the TPM2 tools linked into this executable*/
#ifndef TPM2_TOOLS_MAX
#define TPM2_TOOLS_MAX 1024
#endif
static const tpm2_tool *tools[TPM2_TOOLS_MAX];
static unsigned tool_count;void tpm2_tool_register(const tpm2_tool *tool) {if (tool_count < TPM2_TOOLS_MAX) {tools[tool_count++] = tool;} else {LOG_ERR("Over tool count");abort();}
}

回到tpm2_load.c,来看具体的几个函数。

(1)tpm2_tool_onstart

tpm2_tool_onstart函数代码如下:

static bool tpm2_tool_onstart(tpm2_options **opts) {const struct option topts[] = {{ "auth",           required_argument, 0, 'P' },{ "public",         required_argument, 0, 'u' },{ "private",        required_argument, 0, 'r' },{ "name",           required_argument, 0, 'n' },{ "key-context",    required_argument, 0, 'c' },{ "parent-context", required_argument, 0, 'C' },{ "cphash",         required_argument, 0,  0  },};*opts = tpm2_options_new("P:u:r:n:C:c:", ARRAY_LEN(topts), topts, on_option,0, 0);return *opts != 0;
}

(2)tpm2_tool_onrun

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_ call*/rc = load(ectx);if (rc != tool_rc_success) {return rc;}/** 4. Process outputs*/return process_output(ectx);
}

(3)tpm2_tool_onstop

tpm2_tool_onstop函数代码如下:

static tool_rc tpm2_tool_onstop(ESYS_CONTEXT *ectx) {UNUSED(ectx);/** 1. Free objects*//** 2. Close authorization sessions*/tool_rc rc = tpm2_session_close(&ctx.parent.object.session);/** 3. Close auxiliary sessions*/return rc;
}

相关内容

热门资讯

安卓机的散热系统,打造高效散热... 你有没有发现,现在的安卓手机越来越厉害了?从性能到拍照,从续航到外观,简直让人挑花眼。但你知道吗?在...
平板双系统 留安卓,开启平板新... 你有没有想过,一台平板电脑,竟然能同时拥有Windows和安卓两个系统?听起来是不是有点神奇?没错,...
各品牌安卓系统特点,性能与创新... 你有没有发现,现在手机市场上的安卓系统就像是一群各具特色的“小精灵”,各有各的魔法,让人眼花缭乱。今...
安卓系统平板当中控,安卓平板中... 你有没有想过,家里的安卓系统平板电脑竟然能变成超级中控,把家里的各种智能设备都玩转得风生水起?没错,...
安卓系统铃声精选设置,打造专属... 手机铃声可是咱们日常生活中的小确幸呢!想象当你的专属铃声响起,是不是瞬间感觉整个世界都为你而动容?今...
安卓系统平板型号区别,深度对比... 你有没有想过,为什么市面上那么多平板电脑,而你却总是纠结于该选择哪个型号呢?别急,今天我就来给你好好...
安卓如何取消苹果系统,安卓系统... 亲爱的安卓用户们,你是否曾经幻想过,把你的安卓手机变成一个酷炫的苹果手机呢?想象那光滑的界面,那流畅...
安卓导航触控系统,安卓触控系统... 你有没有想过,开车的时候,导航仪也能像手机一样,轻轻一点,就能找到你想去的地方?没错,这就是安卓导航...
工匠365安卓系统下载,解锁高... 你有没有想过,工作也能变得像玩游戏一样轻松有趣?没错,就是那种随时随地都能打卡、工资透明看得见的神奇...
模拟旧版安卓系统app,揭秘模... 你有没有想过,那些曾经陪伴我们度过无数时光的旧版安卓系统app,现在还能不能在新的手机上继续使用呢?...
淘宝软件安卓系统卡,淘宝安卓系... 哎呀呀,亲爱的手机控们,你们有没有遇到过这种情况:手机里装了淘宝,一打开就卡得跟什么似的,简直让人抓...
安卓系统屏幕不够亮,轻松提升视... 亲爱的手机控们,你们有没有遇到过这样的烦恼:在阳光明媚的午后,或者在昏暗的夜晚,你的安卓手机屏幕怎么...
unity调用安卓系统闹钟,U... 你有没有想过,你的手机里那个小小的闹钟,其实是个超级英雄呢?它默默无闻地守护着你的作息,每天准时响起...
安卓系统隐藏办公功能,Andr... 你知道吗?安卓系统里藏着不少小秘密,这些隐藏的办公功能简直就像宝藏一样,等你去一一发掘呢!今天,就让...
dx200芒果系统 安卓系统,... 你有没有听说过那个小小的音乐播放器,它不仅有着大大的音质,还拥有一个超级酷的安卓系统?没错,我说的就...
苹果系统传安卓照片,简单易行的... 你有没有遇到过这样的情况:手机里存满了珍贵的照片,突然想分享给安卓手机的朋友,却发现苹果系统和安卓系...
安卓系统音乐在哪里,安卓音乐文... 手机里的音乐去哪儿了?别急,让我带你一探究竟,揭开安卓系统音乐藏匿的秘密! 音乐藏宝图:安卓系统音乐...
安卓系统如何开启gps,畅享导... 亲爱的手机控们,你们有没有想过,为什么你的手机有时候能精准地告诉你“前方200米左转”,有时候却像个...
重装ktv音响安卓系统,焕新娱... 你有没有想过,家里的KTV音响系统突然变得卡顿,播放效果大打折扣?别急,今天就来给你支个招——重装安...
安卓手机模拟诺基亚系统,体验诺... 哎呀呀,你有没有想过,那些陪伴我们走过青春岁月的诺基亚手机,现在还能在安卓手机上重现吗?没错,就是那...