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;
}

相关内容

热门资讯

wine linux 64位下... 嘿伙计们,今天咱们聊聊在64位Linux上怎么下载Wine,这事儿我可真是兴奋得不得了!你知道吗,W...
dota2反和谐启动项命令-D... 哎呀,各位Dota2的战友们,今天我要爆个猛料,绝对让你玩游戏爽翻天!你是不是也受够了那些和谐版的限...
win7 ultimate x... 说到Win7UltimateX64,心里那个激动啊!这可是咱们的老朋友了,陪伴了多少个日日夜夜的电脑...
汽车电控系统原理与故障分析-汽... 嘿,朋友们,你们有没有遇到过这样的情况:开着车,突然油门反应慢了,或者刹车感觉不对劲?是不是心里一紧...
最新win10正式版版本号-W... 嘿,小伙伴们,你们听说了吗?Win10的最新正式版已经发布了!这次的版本号简直让人眼前一亮,我可是第...
浏览器叠加太烦人?广告、新闻乱... 哎呀,说到这个浏览器叠加啊,我真是一肚子火!你们有没有遇到过这样的情况:正刷着剧呢,突然蹦出来一堆什...
乐度网上购物系统:摆脱实体店烦... 大家好!今天我要给大家“八一八”我最近的购物天堂——乐度网上购物系统!这个平台简直是我的救星,让我摆...
粘贴 您需要权限来执行此操作-... 哎呀,今天真是气死我了!我刚刚在网上看到一段超有趣的话,想复制到我的朋友圈里炫耀一下,结果电脑居然跟...
国产pc based控制器-国... 大家好,我是一个对技术充满热情的工程师,今天我想和大家聊聊我们国产的PCBased控制器,这可是我们...
智汇云家:融合高科技与温馨氛围... 在这个飞速发展的数字时代,我们的生活被各种智能科技深深地影响和改变。而“智汇云家”,这个听起来既现代...
igfxtrayexe应用程序... 哎呀,说到这个igfxtray.exe,我真是头疼得要命!你们有没有遇到过这种情况,就是电脑突然之间...
番茄花园xp原版系统-番茄花园... 嘿,兄弟,还记得那些年我们一起折腾的电脑吗?那时候,谁的手机里没个番茄花园XP原版系统,简直就是落伍...
阿里云 artfull ubu... 大家好,我是一名热衷于探索新技术的科技爱好者。最近,我听说了阿里云上推出了ArtfulUbuntu,...
伟峰oa好还是华天动力oa好?... 哎呀,说到伟峰OA和华天动力OA,这可真是个让人头疼的问题!每次一提起这个,我就感觉自己像是站在十字...
手机省电宝有用吗-手机省电宝真... 嘿,大家好,今天咱们聊聊那个号称能救急的“手机省电宝”,到底是不是真的那么神奇!首先,我得说,这玩意...
2024http://gkcx... 哎呀,说到2024年的高考,我这心情啊,真是五味杂陈!你看,我们这些即将面对高考的孩子们,每天起早贪...
miui哪个版本最省电-MIU... 哎呀,说到MIUI的省电问题,我这心里头可是五味杂陈啊!每次手机电量一掉,我这心情就跟电量一样,直线...
进展性卒中名词解释-记者亲身经... 大家好,我是一名经历过多次医疗现场的记者,今天我要跟大家聊聊一个听起来挺吓人的词——进展性卒中。别急...
维生素b1缺乏神经病-维生素 ... 哎呀,说到这个维生素B1啊,真是让人头疼的小东西!你别看它个头小,一旦它玩起了失踪游戏,我的身体就开...
达思数据恢复收费乱象丛生,消费... 哎呀,说到这个达思数据恢复收费,我真是气不打一处来!你辛辛苦苦存的照片、文件,一不小心全没了,这时候...