tpm2-tools源码分析之tpm2_verifysignature.c(1)

news/2024/10/17 22:17:59/

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

tpm2_verifysignature的功能是使用TPM验证签名。使用加载的密钥验证带有传递给TPM的消息摘要的消息上的签名。

下边用几篇文章的篇幅对tpm2_verifysignature.c文件结合tpm2_verifysignature命令进行深入的、完全的解析。

先来看第一段代码:
 

// Register this tool with tpm2_tool.c
TPM2_TOOL_REGISTER("verifysignature", tpm2_tool_onstart, tpm2_tool_onrun, NULL, tpm2_tool_onexit)

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_verifysignature.c也可以说tpm2_verifysignature命令中,宏展开后为:

static const tpm2_tool tool = {.name		= "verifysignature",.onstart	= tpm2_tool_onstart,.onrun		= tpm2_tool_onrun,.onstop		= NULL,.onexit		= tpm2_tool_onexit,
};
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;

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_verifysignature.c中,来看具体的几个函数。

(1)tpm2_tool_onstart

tpm2_tool_onstart函数代码如下:

static bool tpm2_tool_onstart(tpm2_options **opts) {const struct option topts[] = {{ "digest",         required_argument, NULL, 'd' },{ "hash-algorithm", required_argument, NULL, 'g' },{ "message",        required_argument, NULL, 'm' },{ "format",         required_argument, NULL,  0  },{ "scheme",         required_argument, NULL, 'f' },{ "signature",      required_argument, NULL, 's' },{ "ticket",         required_argument, NULL, 't' },{ "key-context",    required_argument, NULL, 'c' },};*opts = tpm2_options_new("g:m:d:f:s:t:c:", ARRAY_LEN(topts), topts,on_option, NULL, 0);return *opts != NULL;
}

(2)tpm2_tool_onrun

tpm2_tool_onrun函数代码如下:

static tool_rc tpm2_tool_onrun(ESYS_CONTEXT *context, tpm2_option_flags flags) {UNUSED(flags);/* initialize and process */tool_rc rc = init(context);if (rc != tool_rc_success) {return rc;}rc = verify_signature(context);if (rc != tool_rc_success) {LOG_ERR("Verify signature failed!");return rc;}return tool_rc_success;
}

(3)tpm2_tool_onexit

tpm2_tool_onexit函数代码如下:

static void tpm2_tool_onexit(void) {if (ctx.msg_hash) {free(ctx.msg_hash);}
}

后续文章对这几个函数进行深入解析。


http://www.ppmy.cn/news/69828.html

相关文章

Spring Cloud Alibaba(二)Nacos统一配置管理

目录 一、为什么需要配置中心 二、常用的配置中心 Nacos 的几个概念 三、Nacos配置中心的使用 &#xff08;一&#xff09;properties格式 1、导入依赖 2、在配置中心新建配置 3、修改配置文件名为bootstrap.yml 4、在微服务中添加nacos config服务地址的配置 5、测试…

2013蓝桥杯真题省赛翻硬币 C语言/C++

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

【Python_Pandas】reset_index() 函数解析

【Python_Pandas】reset_index函数解析 文章目录 【Python_Pandas】reset_index函数解析1. 介绍2. 示例2.1 参数drop2.2 参数inplace2.3 参数level2.4 参数col_level2.5 参数col_fill 参考 1. 介绍 pandas.DataFrame.reset_index reset_index(levelNone, dropFalse, inplaceF…

辅助驾驶功能开发-功能规范篇(16)-2-领航辅助系统NAP-自动变道-1

书接上回 2.3.4.自动变道 当车辆处于导航引导模式NOA功能时(即车辆横向控制功能激活),且车速大于40km/h,驾驶员按下转向灯拨杆或系统判断当前有变道需要时,自动变道系统通过对车道线、自车道前方目标距离、邻近车道前后方目标距离等环境条件进行判断,在转向灯亮起3s后控…

Oracle_11g_RAC安装与配置for_Linux(2)

确认软件要求 LINUX发行版要求 Linux Distribution Requirements Asianux Distributions Asianux Server 3, Service Pack 2 (SP2) Oracle Linux Distributions Oracle Linux 4 Update 7, kernel 2.6.9 or laterOracle Linux 5 Update 2, kernel 2.6.18 or later (compatib…

Hugging Face Transformers Agent

&#x1f917;Hugging Face Transformers Agent 就在两天前&#xff0c;&#x1f917;Hugging Face 发布了 Transformers Agent——一种利用自然语言从精选工具集合中选择工具并完成各种任务的代理。听着是不是似曾相识&#xff1f; 没错&#xff0c;Hugging Face Transformer…

数据分析06——Pandas中的数据抽取

1、前言&#xff1a; 在Pandas中进行数据抽取主要有两种方法&#xff0c;一种是loc方法&#xff0c;一种是iloc方法&#xff1b;在获取数据时可以获取的数据有三种形式&#xff0c;一种是Series类型&#xff0c;一种是DataFrame类型&#xff0c;还有一种是直接获取数据值&…

一五一、web+小程序骨架屏整理

骨架屏介绍 请点击查看智能小程序骨架屏 车载小程序骨架屏 车载小程序为方便开发者设置骨架屏&#xff0c;在智能小程序的基础上抽取出骨架屏模板&#xff0c;开发者只需要在 skeleton 文件夹下配置config.json&#xff08;page 和骨架屏的映射关系文件&#xff09;即可生效骨…