tpm2-tools源码分析之tpm2_unseal.c(2)

news/2024/10/30 19:27:50/

接前一篇文章:tpm2-tools源码分析之tpm2_unseal.c(1)

本文对tpm2_unseal.c中的tpm2_tool_onstart函数进行详细解析。

先再次贴出该函数源码:

static bool tpm2_tool_onstart(tpm2_options **opts) {static const struct option topts[] = {{ "auth",             required_argument, NULL, 'p' },{ "output",           required_argument, NULL, 'o' },{ "object-context",   required_argument, NULL, 'c' },{ "cphash",           required_argument, NULL,  0  },{ "rphash",           required_argument, NULL,  1  },{ "session",          required_argument, NULL, 'S' },};*opts = tpm2_options_new("S:p:o:c:", ARRAY_LEN(topts), topts, on_option,NULL, 0);return *opts != NULL;
}

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

struct tpm2_options {struct {tpm2_option_handler on_opt;tpm2_arg_handler on_arg;} callbacks;char *short_opts;size_t len;uint32_t flags;struct option long_opts[];
};typedef struct tpm2_options tpm2_options;

struct option的定义在/usr/include/bits/getopt_ext.h中,代码如下:

struct option
{const char *name;/* has_arg can't be an enum because some compilers complain abouttype mismatches in all the code that assumes it is an int.  */int has_arg;int *flag;int val;
};

on_option函数的实现在同文件(tools/tpm2_unseal.c)中,如下:

static bool on_option(char key, char *value) {switch (key) {case 'c':ctx.sealkey.ctx_path = value;break;case 'p': {ctx.sealkey.auth_str = value;}break;case 'o':ctx.output_file_path = value;break;case 0:ctx.cp_hash_path = value;break;case 1:ctx.rp_hash_path = value;break;case 'S':ctx.aux_session_path[ctx.aux_session_cnt] = value;if (ctx.aux_session_cnt < MAX_AUX_SESSIONS) {ctx.aux_session_cnt++;} else {return false;}break;}return true;
}

要更好地理解这些选项乃至tpm2_tool_onstart函数的功能,需要与tpm2_unseal命令的说明相结合来看。tpm2_unseal命令的详细说明参见:

tpm2-tools/tpm2_unseal.1.md at master · tpm2-software/tpm2-tools · GitHub

下载了源码后,在tpm2-tools/man/tpm2_unseal.1.md中。

其中的参数说明如下:

OPTIONS

  • -c--object-context=OBJECT:

    Object context for the loaded object. —— 已加载对象的对象上下文。

  • -p--auth=AUTH:

    Optional auth value to use for the key specified by -c. —— 用于-c指定的密钥的可选授权值。

  • -o--output=FILE:

    Output file name containing the unsealed data. Defaults to STDOUT if not specified. —— 包含未密封数据的输出文件名。如未指定,默认为STDOUT(标准输出)。

  • --cphash=FILE

    File path to record the hash of the command parameters. This is commonly termed as cpHash. NOTE: When this option is selected, The tool will not actually execute the command, it simply returns a cpHash, it simply returns a cpHash, unless rphash is also required. —— 记录命令参数哈希的文件路径。其通常被称为cpHash。注意:当此选项被选择,工具将不会实际执行命令,它只是简单地返回一个cpHash,除非也提供rphash。

  • --rphash=FILE

    File path to record the hash of the response parameters. This is commonly termed as rpHash. —— 记录响应参数哈希的文件路径。其通常被称为rpHash。

  • -S--session=FILE:

    The session created using tpm2_startauthsession. Multiple of these can be specified. For example, you can have one session for auditing and another for encryption/decryption of the parameters. —— 使用tpm2_startauthsession创建的会话。可以指定多个。例如,您可以有一个用于审计的会话和另一个用于参数的加密/解密的会话。

tpm2_options_new函数属于公共代码,在tpm2-tools/lib/tpm2_options.c中,代码如下:

tpm2_options *tpm2_options_new(const char *short_opts, size_t len,const struct option *long_opts, tpm2_option_handler on_opt,tpm2_arg_handler on_arg, uint32_t flags) {tpm2_options *opts = calloc(1, sizeof(*opts) + (sizeof(*long_opts) * len));if (!opts) {LOG_ERR("oom");return NULL;}/** On NULL, just make it a zero length string so we don't have to keep* checking it for NULL.*/if (!short_opts) {short_opts = "";}opts->short_opts = strdup(short_opts);if (!opts->short_opts) {LOG_ERR("oom");free(opts);return NULL;}opts->callbacks.on_opt = on_opt;opts->callbacks.on_arg = on_arg;opts->len = len;opts->flags = flags;memcpy(opts->long_opts, long_opts, len * sizeof(*long_opts));return opts;
}

tpm2_new_options函数很容易理解,其功能是基于tpm2_tool_onstart函数中的struct option topts构建tpm2_options实例(*opts)。

至此,tpm2_unseal.c中的tpm2_tool_onstart函数就基本分析完了。


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

相关文章

算法修炼之练气篇——练气十六层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

《花雕学AI》新版必应 Bing 登场:轻松注册,一站式搜索、聊天与绘画应有尽有

引言&#xff1a; 你是否曾经在网上搜索信息时感到困惑或沮丧&#xff1f;你是否曾经想要在网上创造一些有趣或有用的内容&#xff0c;却不知道从何开始&#xff1f;你是否曾经想要用文字描述一个图像&#xff0c;却无法找到合适的图片&#xff1f;如果你的答案是肯定的&#x…

【JS】1680- 重学 JavaScript API - Beacon API

❝ 前期回顾&#xff1a;1.Page Visibility API 2.Broadcast Channel API ❞ 1. 什么是 Beacon API 1.1 概念介绍 Beacon API 是 HTML5 提供的一种新的浏览器 API&#xff0c;可以用于在浏览器后台异步地发送数据&#xff0c;而不影响当前页面的加载和性能。通过 Beacon API&am…

安全访问服务边缘 (SASE) 技术的优缺点及工作原理

随着企业向云迁移&#xff0c;移动性成为常态&#xff0c;网络和安全解决方案必须相应地发展。安全访问服务边缘 &#xff08;SASE&#xff09; 在此处进入图片。SASE 是一个新兴的技术类别&#xff0c;旨在提供特定的网络安全功能。 安全访问服务边缘 &#xff08;SASE&#…

qemu-基础篇——ARM 链接过程分析(六)

文章目录 ARM 链接过程分析源文件global_bss_file.cglobal_data_fle.cglobal_function_file.cglobal_rodata_file.cmain.c 链接文件 link.lds编译命令及反汇编命令解析 .o 文件global_bss_file.oglobal_data_fle.oglobal_function_file.oglobal_rodata_file.omain.o 链接观察链…

网络基础学习:osi网络七层模型

osi网络七层模型 什么是OSI&#xff0c;什么是ISO?为什么ISO要提出OSI网络七层模型&#xff1f;OSI七层的划分以及具体内容第七层 应用层第六层 表示层第五层 会话层第四层 传输层第三层 网络层第二层 数据链路层第一层 物理层 每一层与设备的对应关系 什么是OSI&#xff0c;什…

情感分析讲解

情感分析简述 情感分析(Sentiment Analysis)又称倾向性分析&#xff0c;或意见挖掘&#xff0c;它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程。利用情感分析能力&#xff0c;可以针对带有主观描述的自然语言文本&#xff0c;自动判断该文本的情感正负倾向…

6. 神经网络

6.1 非线性假设 假设有一个监督学习分类问题&#xff0c;训练集如图 如果利用logistic回归来解决这个问题&#xff0c;我们可以构造一个包含很多非线性项的logistic回归函数。 但在这个训练集只给出了两个特征&#xff0c;如果一旦特征变多了&#xff0c;多项式就会变得很多。…