【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…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
