历经一年多时间的系统整理合补充,《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件,从用户空间到内核空间的顺序对TEE技术详细阐述,读者可从用户空间到TEE内核一步一步了解系统安全的所有内容,同时书中也提供了相关的示例代码,读者可根据自身实际需求开发TA。

为方便和及时的回复读者对书中或者TEE相关的问题的疑惑(每天必看一次),也为了大家能有一个统一的交流平台。我搭建了一个简单的论坛,网址如下:

https://www.huangtengxq.com/discuz/forum.php

关于您的疑问可在“相关技术讨论“”中发帖,我会逐一回复。也欢迎大家发帖,一起讨论TEE相关的一些有意思的feature。共同交流。同时该论坛中也会添加关于移动端虚拟化的相关技术的板块,欢迎各位共同交流学习

非常感谢在此期间大家的支持以及各位友人的支持和帮助!!!。 
若觉得书中内容有错误的地方,欢迎大家指出,私信或者在博文中留言联系方式亦可发邮件至:shuaifengyun@126.com,多谢各位了!!!!我会第一时间处理。书中最新的勘误会发布在《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解》 勘误一文中

  

TA镜像文件的是在OP-TEE工程编译过程中被编译生成,也可以通过单独调用AT目录下的脚本来进行编译,但是前提是OP-TEE工程被完整编译过。编译后会生成原始的TA镜像文件然后使用签名脚本对该文件进行电子签名生成.ta文件,这也就是最终的TA镜像文件。

1. TA镜像文件的编译

  编译TA镜像文件是通过对TA源代码目录中的Makefile文件执行make指令开始,该Makefile文件将会包含optee_os/ta/mk/ta_dev_kit.mk文件,在该文件中会定义各种目标依赖关系和Object,编译完需要的目标和object之后,编译器将会按照optee_os/ta/arch/arm/link.mk文件中的依赖关系链接成xxx.ta文件,其中xxx是该TA的UUID的值,在link.mk中的连接依赖关系如下:

$(link-script-pp): $(link-script) $(MAKEFILE_LIST)@$(cmd-echo-silent) '  CPP     $@'$(q)mkdir -p $(dir $@)$(q)$(CPP$(sm)) -Wp,-P,-MT,$@,-MD,$(link-script-dep) \$(link-script-cppflags-$(sm)) $< > $@$(link-out-dir)/$(binary).elf: $(objs) $(libdeps) $(link-script-pp)@$(cmd-echo-silent) '  LD      $@'$(q)$(LD$(sm)) $(ldargs-$(binary).elf) -o $@$(link-out-dir)/$(binary).dmp: $(link-out-dir)/$(binary).elf@$(cmd-echo-silent) '  OBJDUMP $@'$(q)$(OBJDUMP$(sm)) -l -x -d $< > $@$(link-out-dir)/$(binary).stripped.elf: $(link-out-dir)/$(binary).elf@$(cmd-echo-silent) '  OBJCOPY $@'$(q)$(OBJCOPY$(sm)) --strip-unneeded $< $@$(link-out-dir)/$(binary).ta: $(link-out-dir)/$(binary).stripped.elf \$(TA_SIGN_KEY)@echo '  SIGN    $@'$(q)$(SIGN) --key $(TA_SIGN_KEY) --in $< --out $@

  $(link-out-dir)/$(binary).stripped.elf目标会将TA镜像文件中的调试信息给删除然后再次使用,在原始的TA镜像文件的头部有一个ta_head的段,该段中存放的就是该TA的基本信息以及被调用到的入口地址,该段中的内容将会在加载TA进行到OP-TEE时和调用TA执行特定command的时候被使用到。存放在该段中的内容定义在optee_os/ta/arch/arm/user_ta_header.c文件中,其内容如下:

const struct ta_head ta_head __section(".ta_head") = {.uuid = TA_UUID,   //TA的UUID值.stack_size = TA_STACK_SIZE + TA_FRAMEWORK_STACK_SIZE,  //TA运行栈大小.flags = TA_FLAG_USER_MODE | TA_FLAGS,    //该TA运行flag表示该TA将运行在用户红箭
#ifdef __ILP32__/** This workaround is neded on 32-bit because it seems we can't* initialize a 64-bit integer from the address of a function.*/.entry.ptr32 = { .lo = (uint32_t)__utee_entry },
#else.entry.ptr64 = (uint64_t)__utee_entry,    //定义该TA的入口函数
#endif
};

2. 对TA镜像文件的签名

  生成原始的TA镜像文件之后将会对该进行文件进行签名生成最终的xxx.ta文件,该文件会被保存在REE的文件系统中。对原始TA镜像文件的签名是通过调用调用optee_os/scripts/sign.py文件使用optee_os/keys目录下的RSA2048的 私钥default_ta.pem来完成,当该TA需要被正式release的时候需要使用自有的私钥替换掉该。sign.py文件的内容如下

#!/usr/bin/env python
#解析输入参数的函数
def get_args():
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('--key', required=True, help='Name of key file')
parser.add_argument('--in', required=True, dest='inf', \help='Name of in file')
parser.add_argument('--out', required=True, help='Name of out file')
return parser.parse_args()
#脚本的入口函数
def main():#导入各种依赖python库
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
import struct
#解析输入参数
args = get_args()
#打开输入的RSA key并读取该key的内容存放到key变量中
f = open(args.key, 'rb')
key = RSA.importKey(f.read())
f.close()
#打开原始的TA镜像文件并读取该文件中的内容保存到img变量中
f = open(args.inf, 'rb')
img = f.read()
f.close()
#创建爱你RSA签名结构体和sha256运算结构体
signer = PKCS1_v1_5.new(key)
h = SHA256.new()
digest_len = h.digest_size #设定SHA256计算的输出结果长度
sig_len = len(signer.sign(h))  #设定签名长度
img_size = len(img)    #获取原始进行文件内容的长度
magic = 0x4f545348 # magic值
img_type = 0       # TA类型代号
algo = 0x70004830  # TEE_ALG_RSASSA_PKCS1_V1_5_SHA256(TA中验签对应的算法ID)
#将magic, img_type, img_size, algo, digese等信息按照一定的格式转成后存放在shdr变量中
shdr = struct.pack('<IIIIHH', \magic, img_type, img_size, algo, digest_len, sig_len)#将shdr变量和TA原始镜像文件的内容填充到SH256结构体数据区域中
h.update(shdr)
h.update(img)
#对h的摘要使用输入的私钥做RSA2048签名生成signature
sig = signer.sign(h)
#并将shdr, shdr+img的SHA结果,signature,原始TA镜像文件内容写入到输出文件
f = open(args.out, 'wb')
f.write(shdr)
f.write(h.digest())
f.write(sig)
f.write(img)
f.close()
if __name__ == "__main__":
main()

签名完成之后TA镜像文件中的内容示意图如下:

签名后的TA镜像文件在被加载到OP-TEE的内存中之前OP-TEE会使用signature对该镜像文件进行合法性检查,而TA中的ta_head段中的内容将会在open session操作的时候被使用到,主要告知系统如何调用到TA中的open session, invoke command, closesession等操作

43. TA镜像文件的签名相关推荐

  1. 44. TA镜像加载时的验证

    历经一年多时间的系统整理合补充,<手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 >一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件, ...

  2. .net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO

    ISO文件格式被很多虚拟光驱软件和刻录软件支持,比较典型的有WinISO ,Alcohol 120%这些软件.有的时候需要自己制作一个ISO文件的话,则需要找专门的工具;其实要做一个ISO的文件可以很 ...

  3. 分享Kali Linux 2016.2第43周镜像

    分享Kali Linux 2016.2第43周镜像 Kali Linux官方于10月23日如约发布了2016.2第43周镜像.和以往一样,此次镜像包含了11个镜像文件,包含PC端的32和64位镜像,还 ...

  4. QEMU 使用的镜像文件:qcow2 与 raw

    本文介绍了 qcow2 和 raw,它们都是 QEMU(KVM)虚拟机使用的磁盘文件格式,本文将从其实现原理,支持特性,以及读写效率等进行对比和分析,最后还要介绍这两种格式的磁盘文件如何转化. 0 评 ...

  5. 关于ark取得进程的镜像文件路径

    最近看到一个trojan把自己拷到回收站里隐藏,然后发现我两万年前写的ark取得的进程路径还是原路径... 突然想起来很久以前看到某群的讨论 拿破伦19:22:03 话说,一个运行中的文件,然后移动他 ...

  6. 麒麟linux恢复bin,(麒麟教学)关于晶晨处理器TTL命令恢复镜像文件教程

    今天交大家如何通过命令来恢复晶晨处理器盒子镜像文件的教程, 今天就拿烽火H G 6 80-L机顶盒做教程,处理器是S905LB型号的 则说明为晶晨处理器,首先需要用TTL刷机小板与机顶盒主板 进行连接 ...

  7. 校验 CentOS 7 镜像文件

    验证镜像文件的原因 CentOS Vault(http://vault.centos.org/)页脚的镜像站链接上有段英文,指出页脚的镜像站链接不受 CentOS 团队的监控,除此之外还有一个原因就是 ...

  8. Ubuntu篇——Ubuntu20.04备份成ISO镜像文件并安装到其他电脑上(完整步骤)

    一.安装systemback. (如已安装请跳过) 1.要在Ubuntu 18.04或Ubuntu 18.10系统上安装systemback,首先删除PPA: sudo add-apt-reposit ...

  9. android 镜像文件制作

    一:update.zip包的制作    1:新建一个目标,在此目录下准备好需要的文件,如system目录文件.boot.img.recovery.img等.      mkdir testupdate ...

  10. 了解一下,Android 10中镜像文件的制作

    缘起 写<深入理解Android Java虚拟机ART>一书的时候,我自己做了基于模拟器使用的系统镜像,供我学习ART使用.编译系统镜像的步骤是这样的: 先创建一个avd设备,取个名字,比 ...

最新文章

  1. webpack 占位符_通过示例学习Webpack:占位符图像模糊
  2. Android SQLite数据库增删改查操作
  3. Activity和Service通信 Bind方式
  4. mysql汉字格式_mysql 中的varchar255 uft-8 的格式到底能放多少汉字
  5. 98 年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下 CVPR 最佳论文提名​...
  6. 梦里看到你为我写的情书
  7. 容器内部使用docker命令时报错:缺少libcrypto.so.10
  8. ubuntu16.04利用SVN下载文件
  9. 什么是JavaSE,写给第一次接触Java的人
  10. android vlc m3u8,Exoplayer播放m3u8文件Android
  11. 搞了一个更完善的javaagent项目结构
  12. 亚马逊又挂了,只是因为半价清仓活动?
  13. CSS3——渐变(线性渐变、径向渐变、重复性渐变)
  14. 打印机共享无法访问该计算机,共享打印机拒绝访问怎么办详细解决方案
  15. 地形图测量中的等高线裁剪方法
  16. xctf攻防世界 CRYPTO高手进阶区 best_rsa
  17. 在Python中将列表转换为字典的10种方法
  18. electron另存为图片
  19. 视频号如何引流?怎样利用视频号引流?视频号引流的方法和技巧
  20. 城市垃圾渗滤液除氨氮的技术分享

热门文章

  1. 3D数学基础:向量运算
  2. 抖音如何充钱上热门 抖音怎么上热门方法
  3. 玩转windbg软件调试视频教程发布-windbg入门教程
  4. vue炫酷好看的登陆界面
  5. 用拉格朗日插值法,牛顿插值和分段线性插值计算近似值
  6. 亚马逊中国发布2015图书排行榜
  7. Android 8.0 解决不能自动安装APK问题(完美适配)
  8. axio请求与响应拦截器
  9. Java接入第三方微博登陆
  10. Apache监控与调优(七)MPM相关参数