当前位置: 首页 > news >正文

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

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

tpm2_evictcontrol的功能是使一个被加载的密钥持久保存、或者从TPM中移除一个持久密钥。命令描述为:此命令允许一个临时对象被持久化,或者一个持久对象被移除。HANDLE参数控制句柄将被分配到的索引。如果通过-c指定的对象是临时的,并且指定了永久HANDLE,则该对象将在HANDLE处被持久化;如果HANDLE是-,那么对象将被持久化在第一个可用的永久句柄位置;如果通过-c指定的对象是一个永久句柄,那么该对象将从其永久句柄位置被逐出(移除)。

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

先来看第一段代码:

/ Register this tool with tpm2_tool.c
TPM2_TOOL_REGISTER("evictcontrol", 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_evictcontrol.c也可以说tpm2_evictcontrol命令中,宏展开后为:

static const tpm2_tool tool = {.name		= "evictcontrol",.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_evictcontrol.c,来看具体的几个函数。

(1)tpm2_tool_onstart

tpm2_tool_onstart函数代码如下:

static bool tpm2_tool_onstart(tpm2_options **opts) {const struct option topts[] = {{ "hierarchy",      required_argument, 0, 'C' },{ "auth",           required_argument, 0, 'P' },{ "object-context", required_argument, 0, 'c' },{ "output",         required_argument, 0, 'o' },{ "cphash",         required_argument, 0,  0  },};*opts = tpm2_options_new("C:P:c:o:", ARRAY_LEN(topts), topts, on_option,on_arg, 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_<command> call*/rc = evictcontrol(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.auth_hierarchy.object.session);/** 3. Close auxiliary sessions*/return rc;
}

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

相关文章:

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

TPM 2.0中的tpm2_evictcontrol命令对应的源文件就是tpm2_evictcontrol.c&#xff0c;该文件位于tpm2-tools/tools/下&#xff0c;一共有339行&#xff08;版本5.5&#xff09;。 tpm2_evictcontrol的功能是使一个被加载的密钥持久保存、或者从TPM中移除一个持久密钥。命令描述…...

SpringCloud_OpenFeign服务调用和Resilience4J断路器

文章目录 一、负载均衡概论1、服务器负载均衡2、客户端负载均衡3、客户端负载均衡策略(SpringCloudRibbon)4、客户端负载均衡策略(SpringCloudLoadBalancer) 二、SpringCloudOpenFeign服务调用1、OpenFeign服务调用的使用2、OpenFeign服务调用的日志增强3、OpenFeign服务调用超…...

【C++】switch 语句

目录 1、缘起 2、笔记整理 3、if 和 switch 区别 4、总结 1、缘起 最近&#xff08;2023-04-29&#xff09;在 BiliBili 黑马程序员学习 C 编程语言&#xff0c;今天学习到了 switch 语句。以前在学习 C 语言 的时候&#xff0c;对这块知识点掌握的不是很好&#xff0c;…...

【Database-06】Centos 9 安装docker版的Oceanbase

1、安装docker 1.1、卸载旧版本 旧版本的 Docker 被称为docker或docker-engine。如果安装了这些&#xff0c;卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotat…...

TiDB Operator 和 Operator Dashboard

TiDB Operator 和 Operator Dashboard V1TiDB Operator概念实现 Operator Dashboard概念实现 V2思路实例代码TiDB ARM OperatorTiDB ARM Operator Dashboard V1 为了演示如何编写 TiDB Operator 和 Operator Dashboard&#xff0c;我们将分别介绍它们的概念和实现。 TiDB Ope…...

计算机网络闲谈01——QUIC协议

计算机网络闲谈01——QUIC协议 预备知识 重传机制 RTT 一个连接的往返时间 RTO 重传超时时间 RTT和RTO 的关系是&#xff1a;由于网络波动的不确定性&#xff0c;每个RTT都是动态变化的&#xff0c;所以RTO也应随着RTT动态变化。 流量控制 对发送方发送速率的控制 称之为…...

楼层滚动效果(超级简单,易懂)

系列文章目录 文章目录 系列文章目录一、楼层滚动效果图如下1. 下图是纯Css实现的楼层滚动2.通过Js优化后的楼层滚动如下图(&#x1f339;&#x1f339;) 二、楼层滚动&#xff08;Css实现&#xff09;1.滚动原理2.代码如下 三、楼层滚动&#xff08;JsCss优化后的楼层滚动&…...

FPGA、 CPU、GPU、ASIC区别

一、为什么使用 FPGA&#xff1f; 众所周知&#xff0c;通用处理器&#xff08;CPU&#xff09;的摩尔定律已入暮年&#xff0c;而机器学习和 Web 服务的规模却在指数级增长。 人们使用定制硬件来加速常见的计算任务&#xff0c;然而日新月异的行业又要求这些定制的硬件可被重新…...

ChatGPT 之父承认 GPT-5 并不存在,为什么 OpenAI 总是这么实诚?|万字详述

ChatGPT 诞生前传 来源: 爱范儿 微信号&#xff1a;ifanr 最近&#xff0c;OpenAI 的 CEO Sam Altman 在一场公开会议上为 GPT-5 辟谣。 他声称 OpenAI 并没有在训练 GPT-5&#xff0c;而是一直基于 GPT-4 做别的工作。 OpenAI 是一家非常有趣的机构&#xff0c;和微软、Go…...

华为交换机配置telnet登录图文教程

一、配置交换机管理vlan和地址&#xff0c;配置交换机接口 1.关闭多余的信息提示&#xff1a; [Huawei]undo in en Info: Information center is disabled. [Huawei] 2.交换机配置 在工作中通过Telnet方式登录交换机进行设备登录管理能更加便利&#xff0c;不需要到机房里…...

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…...

Matlab对日期变量和时间变量的管理

Matlab2012a内置了三个函数 datanumdatevecdatestr 靠这三个函数&#xff0c;可以基本实现日期变量和时间变量的管理。下面直接来看。 &#xff08;1&#xff09;datanum 这个函数用来将字符串&#xff0c;日期矢量转为通用日&#xff08;数值型&#xff09;。所谓的通用日…...

js字符串 常用方法 并带详细讲解

JavaScript中字符串是一种基本数据类型&#xff0c;表示文本数据。字符串常用方法有以下几种&#xff1a; length&#xff1a;返回字符串的长度。 let str "hello world"; console.log(str.length); // 11indexOf&#xff1a;返回字符串中指定字符或子串的位置&am…...

Oracle_Audit_审计

1、什么是审计审计&#xff08;Audit)用于监视用户所执行的数据库操作&#xff0c;并且Oracle会将审计跟踪结果存放到OS文件&#xff08;默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/&#xff09;或数据库&#xff08;存储在system表空间中的SYS.AUD$表中&#xff0c;可通…...

python算法中的深度学习算法之生成对抗网络(详解)

目录 学习目标: 学习内容: 生成对抗网络 Ⅰ. 生成器 Ⅱ. 判别器...

【VM服务管家】VM4.0软件使用_1.2 工具类

目录 1.2.1 文本保存&#xff1a;逐行保存格式化模块输出的方法1.2.2 脚本模块&#xff1a;循环模块搭配脚本使用的方法1.2.3 几何查找&#xff1a;彩色图像的几何查找方法1.2.4 深度学习&#xff1a;图像分割的面积的获取方法1.2.5 颜色识别&#xff1a;使用颜色识别工具做分类…...

Android系统架构

Application层&#xff0c;也就是应用层&#xff0c;不仅包括通话短信联系人这种系统级的应用&#xff0c;还包括用户自己安装的一些第三方应用Framework层&#xff0c;这一层大部分用Java写的&#xff0c;包括系统服务和四大组件Library层&#xff0c;这一层大部分都是C/C写的…...

零基础想成为黑客,只需要四步

前言 首先要明白&#xff0c;该篇文章说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心之一就是渗透攻防技术&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模…...

ChatGPT研究报告:AIGC带来新一轮范式转移

本文约4000字&#xff0c;目标是快速建立AIGC知识体系&#xff0c;含有大量的计算专业名词&#xff0c;建议阅读同时扩展搜索。 一、行业现状 1、概念界定 区别于PGC与UGC不同的&#xff0c;AIGC是利用人工智能技术自动生成内容的新型生产方式。 2、数据模态 按照模态区分&a…...

自助式数据分析平台:jvs数据智仓-统计报表的使用条件及界面介绍

统计报表界面介绍 统计报表是指利用表格和报表等形式&#xff0c;将数据以清晰的结构和布局的方式呈现出来&#xff0c;以便用户进行数据分析和决策制定的一种BI统计方法。表格式的BI统计通常采用交叉表格、分组表、报表等形式&#xff0c;对数据进行整合、分析和展示&#xff…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...