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

本文对tpm2_verifysignature.c中的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;
}

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_verifysignature.c)中,如下:

static bool on_option(char key, char *value) {switch (key) {case 'c':ctx.context_arg = value;break;case 'g': {ctx.halg = tpm2_alg_util_from_optarg(value, tpm2_alg_util_flags_hash);if (ctx.halg == TPM2_ALG_ERROR) {LOG_ERR("Unable to convert algorithm, got: \"%s\"", value);return false;}ctx.flags.halg = 1;}break;case 'm': {ctx.msg_file_path = value;ctx.flags.msg = 1;}break;case 'd': {ctx.msg_hash = malloc(sizeof(TPM2B_DIGEST));ctx.msg_hash->size = sizeof(ctx.msg_hash->buffer);if (!files_load_bytes_from_path(value, ctx.msg_hash->buffer,&ctx.msg_hash->size)) {LOG_ERR("Could not load digest from file!");return false;}ctx.flags.digest = 1;}break;case 0:LOG_WARN("Option \"--format\" is deprecated, use \"--scheme\"");/* falls through */case 'f':ctx.format = tpm2_alg_util_from_optarg(value, tpm2_alg_util_flags_sig);if (ctx.format == TPM2_ALG_ERROR) {LOG_ERR("Unknown signing scheme, got: \"%s\"", value);return false;}ctx.flags.fmt = 1;break;case 's':ctx.sig_file_path = value;ctx.flags.sig = 1;break;case 't':ctx.out_file_path = value;ctx.flags.ticket = 1;break;/* no default */}return true;
}

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

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

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

其中的参数说明如下:

OPTIONS

  • -c--key-context=OBJECT:

    Context object for the key context used for the operation. Either a file or a handle number. See section "Context Object Format". —— 用于操作的密钥上下文的上下文对象。文件号或句柄号。

  • -g--hash-algorithm=ALGORITHM:

    The hash algorithm used to digest the message. Algorithms should follow the "formatting standards", see section "Algorithm Specifiers". Also, see section "Supported Hash Algorithms" for a list of supported hash algorithms. —— 用于摘要消息的哈希算法。

  • -m--message=FILE:

    The message file, containing the content to be digested. —— 消息文件,包含要被摘要的内容。

  • -d--digest=FILE:

    The input hash file, containing the hash of the message. If this option is selected, then the message (-m) and algorithm (-g) options do not need to be specified. —— 输入哈希文件,包含消息的哈希。如果此选项被选择,则不需要指定消息(-m)和算法(-g)选项。

  • -s--signature=FILE:

    The input signature file of the signature to be validated. —— 要验证其签名的输入签名文件。

  • -f--scheme=SCHEME:

    The signing scheme that was used to sign the message. This option should only be specified if the signature comes in from a non tss standard, like openssl. See "Signature format specifiers" for more details. The tss format contains the signature metadata required to understand it's signature scheme.

    Signing schemes should follow the "formatting standards", see section "Algorithm Specifiers". —— 用于对消息进行签名的签名方案。只有当签名来自非tss标准(如openssl)时,才应指定此选项。

  • --format=SCHEME:

    Deprecated. Same as --scheme. —— 已弃用。与--scheme相同。

  • -t--ticket=FILE:

    The ticket file to record the validation structure. —— 记录验证结构的票据文件。

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_verifysignature.c中的tpm2_tool_onstart函数就基本分析完了。

tpm2-tools源码分析之tpm2_verifysignature.c(2)相关推荐

  1. Spring Developer Tools 源码分析:二、类路径监控

    在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath ...

  2. kazoo源码分析:Zookeeper客户端start概述

    kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...

  3. kubeadm源码分析(内含kubernetes离线包,三步安装)

    k8s离线安装包 三步安装,简单到难以置信 kubeadm源码分析 说句实在话,kubeadm的代码写的真心一般,质量不是很高. 几个关键点来先说一下kubeadm干的几个核心的事: kubeadm ...

  4. 《深入理解Spark:核心思想与源码分析》——1.2节Spark初体验

    本节书摘来自华章社区<深入理解Spark:核心思想与源码分析>一书中的第1章,第1.2节Spark初体验,作者耿嘉安,更多章节内容可以访问云栖社区"华章社区"公众号查看 ...

  5. soundtouch源码分析__based on csdn :

    1. soundtouch介绍和相关资源 The SoundTouch Library Copyright © Olli Parviainen 2001-2014 SoundTouch is an o ...

  6. linux nDPI 协议检测 源码分析

    关于nDPI的基本功能就不在这介绍了,有兴趣了解的读者可以阅读官方的快速入门指南:https://github.com/ntop/nDPI/blob/dev/doc/nDPI_QuickStartGu ...

  7. java 源码分析_Java 源代码编译成 Class 文件的过程分析

    原标题:Java 源代码编译成 Class 文件的过程分析 在上篇文章< Java三种编译方式:前端编译 JIT编译 AOT编译 >中了解到了它们各有什么优点和缺点,以及前端编译+JIT编 ...

  8. 【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )

    文章目录 一.添加应用源码分析 1.LaunchpadAdapter 适配器 2.适配器添加元素 3.PackageAppData 元素 一.添加应用源码分析 1.LaunchpadAdapter 适 ...

  9. zg手册 之 python2.7.7源码分析(1)-- python中的对象

    为什么80%的码农都做不了架构师?>>>    源代码主要目录结构 Demo: python 的示例程序 Doc: 文档 Grammar: 用BNF的语法定义了Python的全部语法 ...

最新文章

  1. 第一次失效_特斯拉螺栓腐蚀失效分析_搜狐汽车
  2. java canvas 画圆_java – 如何在Android中通过canvas绘制圆?
  3. ExtJS 3.2 学习笔记(1)
  4. proxool数据库连接池使用方法
  5. 微信模板消息发送帮助类
  6. 一、Scrapy爬虫概述
  7. 华为防火墙配置命令大全,超级详细
  8. 2.3.1 浮点数的表示
  9. 物理光学3 电磁波的折射与反射
  10. iOS完全免费的4个APP,良心安利!谁说便宜没好货
  11. Top10响应式手机网页开发软件
  12. 动态代理 ---- 框架基础技术
  13. HTML常见标签的用法
  14. word转PDF后mathtype公式乱码以及图片分辨率降低等一系列问题|完美解决
  15. 动手做个VR眼镜,找回童年的感觉
  16. OpenCms JSP 模板开发——创建一个简单的JSP模板
  17. 联想Z485安装64位ubantu
  18. JavaScript淘宝秒杀案例
  19. 精益生产(Lean manufacturing)
  20. imindmap11汉化版下载附带激活码

热门文章

  1. RestTemplate的POST请求
  2. CSS——学成在线案例
  3. 手机 pdf 宝宝 学字
  4. axios学习笔记--nprogress
  5. 【leetcode】旋转字符串 c++ python
  6. 现代设计模式讲解,包含React用例
  7. EM算法推导pLSA
  8. uniapp 绑定/更改手机号,验证码倒计时,手机格式中间四位变成*
  9. 《设计模式与游戏完美开发》——第六周读书笔记
  10. iOS 手机相册英文字母的设定