43. TA镜像文件的签名
来源:互联网 发布:猪八戒身份证软件 编辑:程序博客网 时间:2024/05/20 16:33
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 ArgumentParserparser = 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_5from Crypto.Hash import SHA256from Crypto.PublicKey import RSAimport 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签名生成signaturesig = 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等操作
阅读全文
0 0
- 43. TA镜像文件的签名
- 对TA 镜像文件的加密
- 44. TA镜像加载时的验证
- system 镜像签名 fec等信息
- 生成的签名文件
- apk文件的签名
- 忙碌的TA
- TA最喜欢的玩具
- 我的TA 2017
- optee 的helloworld ta
- 自动运行VMWARE的镜像文件
- [zz] Android模拟器的镜像文件
- initrd镜像文件的作用
- Android的镜像文件(image)
- Android 4.0 的镜像文件
- Android镜像文件的拆解
- 如何打开bin的镜像文件
- losetup分区过的镜像文件
- 安装Windows10 和环境下的caffe(新版)
- android 用户授权
- APK的Dex文件结构和它的方法数统计分析
- bzoj2431: [HAOI2009]逆序对数列
- YUV fullrange
- 43. TA镜像文件的签名
- 数据库中的约束和三大范式
- 环境变量 和 系统变量 的path 区别
- centos 安装jdk1.8和tomcat
- bzoj1355: [Baltic2009]Radio Transmission
- C.Primer.Plus(第六版)第九章 编程练习
- Excel导入SqlServer2012提示“消息7314”
- 使用ScrollView制作Title渐变,配合RecyclerView展示列表
- 毕业3年的程序员,怎么进BAT | 12000字揭秘阿里连环炮面试(附开发手册)