【TA】OP-TEE demo学习
前言:工作原因接触Apple软件需要搭建TA环境,涉及到OP-TEE,学习一下
OP-TEE(Open Portable Trusted Execution Environment)是一个开放源代码的可信执行环境(TEE)软件框架。它提供了安全的执行环境,用于保护应用程序和敏感数据免受恶意软件和攻击的威胁。
OP-TEE 的设计目标是在安全芯片或安全处理器中创建一个隔离的执行环境,称为可信执行环境(Trusted Execution Environment,TEE)。在 TEE 中,应用程序可以在受保护的环境中运行,与普通操作系统和应用程序相互隔离。
OP-TEE 提供了一组安全的API和服务,包括密钥管理、加密算法、认证、安全存储等功能,以满足应用程序对安全性和隐私保护的需求。它支持多种硬件平台和操作系统,并且具有可移植性和灵活性。
OP-TEE 常用于安全关键应用的开发,例如支付、数字版权管理、安全认证、安全存储等领域。它被广泛应用于移动设备、物联网设备、汽车电子等领域,以提供强大的安全保护和隐私保护能力。
下面这段demo用于通过 RPC 调用可信执行环境(TEE)中的加密模块。
// SPDX-License-Identifier: BSD-2-Clause
/** Copyright (c) 2014, STMicroelectronics International N.V.* All rights reserved.*/
#include <stdint.h>#include <ta_rpc.h>
#include <tee_api.h>
#include <trace.h>
#include <ta_crypt.h>
#include <ta_sims_test.h>\\TA_CRYPT_UUID 是一个唯一标识符,用于标识加密模块的 UUID。
static TEE_UUID cryp_uuid = TA_CRYPT_UUID;\\TEE_Result 是一个枚举类型,表示函数执行结果的状态码。
static TEE_Result rpc_call_cryp(bool sec_mem, uint32_t nParamTypes,TEE_Param pParams[4], uint32_t cmd)
{\\定义了一个函数 rpc_call_cryp,它接受一些参数并返回一个 TEE_Result 类型的结果。这个函数的作用是通过 RPC 调用 TEE 中的加密模块,并传递相应的参数。TEE_TASessionHandle cryp_session = TEE_HANDLE_NULL;TEE_Result res = TEE_ERROR_GENERIC;uint32_t origin = 0;TEE_Param params[4] = { };size_t n = 0;uint32_t types =TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);\\在函数内部,首先通过调用 TEE_OpenTASession 函数打开与加密模块对应的会话。如果会话打开成功,就可以进行后续的操作;否则,函数将返回错误结果。res = TEE_OpenTASession(&cryp_uuid, TEE_TIMEOUT_INFINITE, types,params, &cryp_session, &origin);if (res != TEE_SUCCESS) {EMSG("rpc_sha256 - TEE_OpenTASession returned 0x%x\n",(unsigned int)res);return res;}types = nParamTypes;\\函数根据参数 sec_mem 的值决定是否使用安全内存(secure memory)。如果需要使用安全内存,则初始化一个 params 数组,并将输入参数拷贝到其中。如果不需要使用安全内存,则直接使用输入参数。if (sec_mem) {TEE_MemFill(params, 0, sizeof(params));for (n = 0; n < 4; n++) {switch (TEE_PARAM_TYPE_GET(types, n)) {case TEE_PARAM_TYPE_VALUE_INPUT:case TEE_PARAM_TYPE_VALUE_INOUT:params[n].value = pParams[n].value;break;case TEE_PARAM_TYPE_MEMREF_INPUT:case TEE_PARAM_TYPE_MEMREF_OUTPUT:case TEE_PARAM_TYPE_MEMREF_INOUT:params[n].memref.buffer =TEE_Malloc(pParams[n].memref.size, 0);if (!params[n].memref.buffer)TEE_Panic(0);params[n].memref.size = pParams[n].memref.size;if (TEE_PARAM_TYPE_GET(types, n) !=TEE_PARAM_TYPE_MEMREF_OUTPUT)TEE_MemMove(params[n].memref.buffer,pParams[n].memref.buffer,pParams[n].memref.size);break;default:break;}}} else {TEE_MemMove(params, pParams, sizeof(params));}\\函数通过调用 TEE_InvokeTACommand 函数发送命令给加密模块,并获取结果。最后,关闭会话,并根据需要将结果拷贝回原始参数中。res = TEE_InvokeTACommand(cryp_session, TEE_TIMEOUT_INFINITE, cmd,types, params, &origin);if (res != TEE_SUCCESS) {EMSG("rpc_call_cryp - TEE_InvokeTACommand returned 0x%x\n",(unsigned int)res);}TEE_CloseTASession(cryp_session);if (sec_mem) {for (n = 0; n < 4; n++) {switch (TEE_PARAM_TYPE_GET(types, n)) {case TEE_PARAM_TYPE_VALUE_INOUT:case TEE_PARAM_TYPE_VALUE_OUTPUT:pParams[n].value = params[n].value;break;case TEE_PARAM_TYPE_MEMREF_INPUT:case TEE_PARAM_TYPE_MEMREF_OUTPUT:case TEE_PARAM_TYPE_MEMREF_INOUT:if (TEE_PARAM_TYPE_GET(types, n) !=TEE_PARAM_TYPE_MEMREF_INPUT)TEE_MemMove(pParams[n].memref.buffer,params[n].memref.buffer,params[n].memref.size);pParams[n].memref.size = params[n].memref.size;TEE_Free(params[n].memref.buffer);break;default:break;}}}return res;
}\\rpc_sha224: 这个函数通过调用 rpc_call_cryp 来执行 SHA-224 哈希算法的操作。
TEE_Result rpc_sha224(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
{return rpc_call_cryp(sec_mem, nParamTypes, pParams,TA_CRYPT_CMD_SHA224);
}\\rpc_sha256: 这个函数通过调用 rpc_call_cryp 来执行 SHA-256 哈希算法的操作。
TEE_Result rpc_sha256(bool sec_mem, uint32_t nParamTypes, TEE_Param pParams[4])
{return rpc_call_cryp(sec_mem, nParamTypes, pParams,TA_CRYPT_CMD_SHA256);
}TEE_Result rpc_aes256ecb_encrypt(bool sec_mem, uint32_t nParamTypes,TEE_Param pParams[4])
{return rpc_call_cryp(sec_mem, nParamTypes, pParams,TA_CRYPT_CMD_AES256ECB_ENC);
}TEE_Result rpc_aes256ecb_decrypt(bool sec_mem, uint32_t nParamTypes,TEE_Param pParams[4])
{return rpc_call_cryp(sec_mem, nParamTypes, pParams,TA_CRYPT_CMD_AES256ECB_DEC);
}TEE_Result rpc_open(void *session_context, uint32_t param_types,TEE_Param params[4])
{TEE_TASessionHandle session = TEE_HANDLE_NULL;uint32_t orig = 0;TEE_Result res = TEE_ERROR_GENERIC;TEE_UUID uuid = TA_SIMS_TEST_UUID;uint32_t types =TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_OUTPUT, TEE_PARAM_TYPE_NONE,TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);TEE_Param par[4] = { };(void)session_context;(void)param_types;res = TEE_OpenTASession(&uuid, TEE_TIMEOUT_INFINITE, 0, NULL, &session,&orig);if (res != TEE_SUCCESS)return res;TEE_MemFill(params, 0, sizeof(TEE_Param) * 4);res =TEE_InvokeTACommand(session, TEE_TIMEOUT_INFINITE,TA_SIMS_CMD_GET_COUNTER, types, par, &orig);if (res != TEE_SUCCESS)goto exit;exit:TEE_CloseTASession(session);return res;
}
地址
相关文章:
【TA】OP-TEE demo学习
前言:工作原因接触Apple软件需要搭建TA环境,涉及到OP-TEE,学习一下 OP-TEE(Open Portable Trusted Execution Environment)是一个开放源代码的可信执行环境(TEE)软件框架。它提供了安全的执行环…...
什么是实时操作系统(UCOS简介)
uC/OS-III官网:Home Page - Weston Embedded Solutions 一、裸机与RTOS介绍 下面我将从不同方面阐述裸机与试试操作系统的区别,从而进一步介绍裸机和实时操作系统 定义: 裸机:裸机指的是没有任何操作系统或软件层的硬件系统。在…...
软考-操作系统
/4操作系统的作用 进程 进程的概念 进程是程序的一次执行过程,没有程序就没有进程 进程可有多个线程,线程可共享资源 进程的两个基本属性: 可拥有资源的独立单位可独立调度和分配资源的基本单位 线程可共享: 内存地址空间代码…...
【EasyExcel】excel表格的导入和导出
【EasyExcel】excel表格的导入和导出 【一】EasyExcel简介【二】EasyExcel使用【1】EasyExcel相关依赖【2】写Excel(1)最简单的写(方式一)(2)最简单的写(方式二)(3)排除模型中的属性字段(4&…...
Unity shader内置standard代码解析
最近有相关需求制作,所以这里编写一个文档,方便后续的流程查看。 下载源码 由于unity内置的shader是无法查看源码的,你需要去官网下载对应版本内置源码查看 在引擎下载那里,会有一个Built in Shaders,下载 打开以后…...
Redis 有序集合操作实战(全)
目录 ZADD 加入有序集 ZCARD 取成员数量 ZCOUNT 计算区间成员数量 ZINCRBY 运算 ZRANGE 取区间成员(升序) ZRANGEBYSCORE 按分值排序取成员 ZRANK 取成员排名 ZREM 移除成员 ZREMRANGEBYRANK 按位置区间批量移除 ZREMRANGEBYSCORE 按分值区间移除 ZREVRANGE 取区间成…...
化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设
化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设 化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设 目前计算机网络中各主机和服务器等网络设备的时间基本处于无序的状态。 随着计算机网络应用的不断涌现,计算机的时间同步问…...
计算机网络工程师多选题系列——操作系统
得多选者得天下啊同志们! 摘录按照章节顺序,但事实上各章节习题有交叉。 1 操作系统 1.1 操作系统概论 操作系统的主要功能:进程管理、存储管理、文件管理、设备管理和用户接口。 操作系统的主要功能——设备管理:为用户程序提…...
matlab读写json文件
Background 通常,在matlab中使用mat文件进行数据存储。MAT文件是MATLAB中用来存储数据的二进制文件格式。MAT文件可以包含各种数据类型,包括数字、矩阵、向量、结构体、字符和函数等。但是,当和其他语言有交互时,mat文件会不太方便…...
数据治理-数据仓库环境
数据仓库环境包括一系列组织起来以满足企业需求的架构组件,从源系统流动到数据暂存区,数据可以在这里被清晰,当数据集成并存储在数据仓库或操作数据存储中时,可以对其进行补充丰富。在数据仓库中,可以通过数据集市或数…...
DevOps与CI/CD常见面试问题汇总
01 您能告诉我们DevOps和Agile(敏捷)之间的根本区别吗? 答:尽管DevOps与敏捷方法(这是最流行的SDLC[Software Development Life Cycle]方法之一)有一些相似之处,但两者在软件开发方面都是根本不同的方法。以下是两者之…...
OJ练习第178题——收集树中金币
收集树中金币 力扣链接:2603. 收集树中金币 题目描述 给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。再给…...
uni-app打包iOS ipa文件后不上架App store为用户提供下载解决过程记录
写在前面,itms-services协议是什么 itms-services协议是苹果提供的一种让iOS应用在用户设备上无线安装或升级的协议。 具体来说: itms-services表示iOS应用无线安装服务的URL方案,格式为:itms-services://?actiondownload-manifest&urlMANIFEST_URL其中MANIF…...
MySQL学习系列(2)-每天学习10个知识
目录 1. INNER JOIN 和 ON 子句2. 死锁3. SELECT * 和 SELECT column1, column24. 数据库的视图5. MySQL的触发器类型6. MySQL表的备份和恢复7. MySQL存储引擎8. 索引优化9. MySQL中的子查询10. 使用连接(JOIN)从多个表中检索数据 👍 点赞&am…...
黑马JVM总结(十四)
(1)分代回收_1 Java虚拟机都是结合前面几种算法,让他们协同工作,具体实现是虚拟机里面一个叫做分代的垃圾回收机制,把我们堆内存大的区域划分为两块新生代、老年代 新生代有划分为伊甸园、幸存区Form、幸存区To 为什…...
vue项目升级webpack
vue项目升级webpack 目录 1. vue项目中影响webpack版本的是什么 2.理解package.json中库前缀^和~区别 3.升级webpack4到5操作 1. vue项目中影响webpack版本的是什么 答案是:vue/cli-service版本 2.理解package.json中库前缀^和~区别 x.y.z x代表大版本…...
ubuntu的root用户修改密码失败
解决如下: 查看文件属性是否有a或i lsattr /etc/group /etc/passwd /etc/shadow 移除a和i的属性权限 chattr -ai /etc/group /etc/passwd /etc/shadow 再次使用passwd进行修改密码,就成功了...
C++---链表
1、链表 1.1、链表的结构 每个链表开头都有一个头指针Head尾节点的指针域为NULL,用于判断此列表是否结束 如果一个链表开始就为NULL,那么该链表为空链表 链表中的先后不代表在真实内存中的位置,只是单纯的逻辑上关系 1.2、创建链表 我们首…...
Unity使用Mirror制作局域网的同步
1.脚本布置.参考tank那个demo制作 1.新建空物体,为管理脚本的物体:manager,挂载NetworkManager,kcpTransport,NetworkManagerHud. 2.设置玩家出生点,spawnPoint,设置好初始化的position的位置(*),挂载NetworkStartPosition的脚本 3.新建Player的预制体,挂载NetworkIdentity,Ne…...
算法 N皇后问题-(递归回溯)
牛客网 BM59. 解题思路: 行列、斜叉不在一条直线上。 命令行为 row, 列为col, row 从0开始递归直到最后一行,列从0开始遍历,直到最后一列,中间每一步记录或清除位置状态,状态分为 m1[col] 1, m2[row-col] 1, m3[r…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
