1 项目概述
1.1项目需求
为确保用户的数据的安全,ARM公司提出了trustzone技术,个人将trustzone理解为cortex的虚拟化技术。在不增加硬件的情况下,使用trustzone技术达到硬件加密的效果。
1.2重点概念简要介绍
1.2.1 TrustZone机制:
将一个物理处理器分时复用为两个逻辑处理器,一个是REE(rich execute enviorment)另一个是TEE(Trusted execute enviorment)。
1.2.2 OP-TEE:
(open source project Trusted Execution Environment),一款优秀的开源可信执行环境。
1.2.3其它优秀的TEE解决方案:
高通的Qsee, Trustonic的tee OS,opentee, 海思,Mstar, VIA,豆荚科技等。
1.2.4 GP:
TEE和REE通信的一个国际标准。(可以理解为一个库或者协议,不同厂家的TEE系统,他的接口均遵守GP标准)
1.3. 参考资料
官方给的参考文档
https://optee.readthedocs.io/en/latest/index.html
1.4开发的几个阶段
作为平台组维护成员需要掌握
1.需要具备基本的系统构建能力,包括在板卡上部署optee;在虚拟机内部署qemu模拟开发环境;
2.对optee框架的基本了解
3.对GP的掌握,尤其对TEE的应用开发能力
4.对基本密码学的熟悉
5.对加密框架的熟悉
作为控制机或者客户端项目开发人员需要掌握:
1.对GP 通用REE侧接口的掌握。
2.对TEE侧,公司内部提供其它接口的熟悉;
3.对openssl库的熟悉;
4.对加密算法的了解。
2 系统构建
如果对optee项目几个重要文件夹介绍:
optee-os:optee系统的内核源码和相关文档,编译后该目录会产生optee的镜像文件; optee-client:CA程序调用的用户空间的接口库(libteec)源码;守护进程tee_supplicant等;
optee-test:这是官方提供的测试程序xtext的源码,为optee中提供各种算法的逻辑并提供相应的测试程序;
optee-example:该目录官方用来存放TA和CA的示例代码。也可在该目录下编写自己的测试代码。
2.1 在板子上构建optee
网上有教程记录如何在imx6* 板子上去构建含 optee 的系统;
如下两篇文章有一定的代表性:
https://blog.csdn.net/u010071291/article/details/53860056
https://www.jianshu.com/p/5cdefb033e10
2.2 使用yocto构建optee
使用yocto构建含optee的嵌入式发行版;
《附件1:i.MX_Yocto项目用户手册.pdf》为个人翻译的i.MX官方的快速构建手册;
《附件2:local.conf 》local.conf为yocto3.02构建过程一个较为重要的配置文件;
《附件3:opencv_4.2.0.imx.bb》如果OpenCV部分构建出错,可参考附件3。
2.2.1 基于optee的linux发行版构建
在可正常制作出yocto的发行版的基础上,仅需改变其配置项目,即可完成对optee的构建;在i.MX_Yocto项目用户手册中有相关描述;注意:需要用imx官方提供的yocto版本,而不是yocto提供的;meta-imx/meta-bsp/conf/layer.conf 文件中,包含如下配置选项;
DISTRO_FEATURES_append = “ optee ”
按照yocto正常构建流程完成系统的构建,此时该系统刷到板子上即可支持optee;
2.2.2 使用yocto构建optee-example
optee在构建过程中其实并没有optee-example,该文件是我的demo的一个文件夹;这里仿照optee-test完成optee-example的移植;
首先,在如下网站去搜索想要的内容,该网站可提供大部分你想要的构建yocto的组件;
http://layers.openembedded.org/
详细的移植过程请参考:
《附件4:基于Yocto项目 在linux上构建optee-example.pdf》
optee-example_1.0.imx.bb为编写的配方文件
《附件5:optee-example_1.0.imx.bb》
2.3 在qemu中搭建optee的运行环境
建议需要在linux环境下构建qemu的开发环境,因为tee的程序在qemu上实现后,应用代码可直接移植到板子上使用。
常规的开发环境可参考
《附件6:OP-TEE在QEMU平台上运行环境的搭建及编译.pdf》;
但是由于网络等原因,大部分是构建不成功的;由于文件大小限制,且该部分不涉及保密所以上传到百度网盘。
链接:https://pan.baidu.com/s/1iNSuef4WQpfQReDocjGdiw
提取码:auto
Qemu下载部分强烈不建议自己repo,下载解压后其它请参考附件一;
解压缩后,你可能遇到如下问题;
下面是一些安装搭建时需要的工具和库;
$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf automake bc bison build-essential cscope curl device-tree-compiler expect flex ftp-upload gdisk iasl libattr1-dev libc6:i386 libcap-dev libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev libpixman-1-dev libssl-dev libstdc++6:i386 libtool libz1:i386 make mtools netcat python-crypto python-serial python-wand unzip uuid-dev xdg-utils xterm xz-utils zlib1g-dev
ImportError: No module named Crypto.PublicKey
sudo apt-get install python-pip
(如果没有安装pip的话,需要这一操作)
pip install pycrypto
打个补丁:
--- a/util/memfd.c
+++ b/util/memfd.c
@@ -31,9 +31,7 @@
#include "qemu/memfd.h"
-#ifdef CONFIG_MEMFD
-#include <sys/memfd.h>
-#elif defined CONFIG_LINUX
+#if defined CONFIG_LINUX && !defined CONFIG_MEMFD
#include <sys/syscall.h>
#include <asm/unistd.h>
————————————————
--- a/configure
+++ b/configure
@@ -3923,7 +3923,7 @@ fi
# check if memfd is supported
memfd=no
cat > $TMPC << EOF
-#include <sys/memfd.h>
+#include <sys/mman.h>
int main(void)
{
————————————————
其它参考附件6进行编译
3 TEE的使用
3.1 GP 介绍
GP(GlobalPlatform )
https://globalplatform.org/
GlobalPlatform(GP)是跨行业的国际标准组织,致力于开发、制定并发布安全芯片的技术标准;目前所有TEE系统(如豆荚科技、海思、高通等公司开发的TEE),内部实现的方式可能各有差别,但是完成的功能和接口函数均满足GP标准;
此处记录了TEE的两个标准文件,分别是关于REE侧API和TEE侧ApI;
附件7:TEE_Client_API_Specification-V1.0.pdf
附件8:GPD_TEE_Internal_Core_API_Specification_v1.2.1_CC.pdf
3.2 qemu的xtext
Qemu的xtext是op-tee的硬件自检程序,里面内置了很多使用例程,但遗憾的是该部分是收费的,且无太多详细资料外传。只能自己琢磨;
3.3 OP-TEE应用开发
3.3.1 Optee在qemu中的目录
基于QEMU平台的optee工程中各目录的作用介绍如下:
bios_qemu_tz_arm:
在qemu平台中运行tz arm的bios代码,启动最初阶段会被使用到,用来加载kernel, OP-TEE os image, rootfs并启动linux kernel和OP-TEE OS
build:
这个工程的编译目录,里面包含了各种makefile文件和相关配置文件
busybox:
busybox的源代码,用于制作rootfs的使用被使用到
gen_rootfs:
存放制作rootfs时使用的相关脚本和配置文件
hello_work:
一个示例代码,目录下包含了TA和CA部分的代码,在Linux shell端运行hello_world指令,就能调用CA接口,最终会穿到TEE中执行对应的TA部分的代码
linux:
linux内核代码,在driver/tee目录下存放的是tee对应的驱动程序
optee_client:包含了CA程序调用的userspace层面的接口库的源代码。其中tee_supplicant目录中的代码会被编译成一个Binary,该binary主要的作用是,当调用CA接口,需要加载TA image时,TEE OS通过该binary从文件系统中来获取TA image,并传递給TEE OS,然后再讲TA image运行到TEE OS中。
optee_os:存放OP-TEE OS的源代码和相关文档
optee_test:opentee的测试程序xtest的源代码,主要用来测试TEE中提供的各种算法逻辑和提供的其他功能
out:
编译完成之后输出目录(该目录编译完成之后才会生成)
qemu:
qemu源代码
soc_term:
在启动时与gnome-terminal命令一起启动终端,用于建立启动的两个terminal的端口监听,方便OP-TEE OS的log和linux kernel log分别输出到两个terminal中。
toolchains:
编译时需要使用的toolchain。
3.3.2 应用代码目录
1)为何要使用qemu
optee的应用程序不管是放到qemu下运行,还是放到yocto编译的系统中运行,均遵循GP协议,代码内容不变,仅需改变Host/makefile 少量编译内容。
2)应用代码目录
把optee的所有应用程序放到optee_examples文件夹下,这样仅需配置该目录下的makefile即可。
3)系统构建
系统是不提供optee_example的,因为他不是tee系统的核心组件;但是我们可以模仿optee_test,对optee_example进行系统构建;在各层的Makefile等文件中搜索optee_test,模仿配置optee_example;
4)optee_example的添加
demo例程可以全部放到optee_examples下,也可仅放项目中使用的程序,修改Host/makefile即可控制是否对optee_example下例程是否进行编译。
3.3.3 应用实现方案
整体设计方案
使用OP-TEE来实现特定的安全功能就需要开发者根据自己的实际需求开发特定的CA和TA程序;开发CA和TA的程序所需的接口函数由GP提供,详见附件7和8;
《附件7:TEE_Client_API_Specification-V1.0.pdf》
《附件8:GPD_TEE_Internal_Core_API_Specification_v1.2.1_CC.pdf》
借助OP-TEE来实现特定安全需求时,一次完整的功能调用一般都是起源于CA,TA做具体功能实现并返回数据到CA,而整个过程需要经过OP-TEE的client端接口,OP-TEE在Linux kernel端的驱动,Monitor模式下的SMC处理,OP-TEE OS的thread处理,OP-TEE中的TA程序运行,OP-TEE端底层库或者硬件资源支持等几个阶段。当TA执行完具体请求之后会按照原路径将得到的数据返回给CA。
整体设计方案-Libteec库的调用过程
这个是一个完整的CA应用程序调用的流程;先初始化context,然后打开session,传递变量,发送command ID(告诉TA,CA要调用那个TA函数),关闭session,释放资源;
详见GP 标准和optee_example代码 hello ;
整体设计方案-TEE侧的TA命令操作的实现
大概流程:entry_invoke_command函数根据填入的cmd参数,进入invokecommand处理流程;copy CA侧传入的内存;在session链表中找到对应的session,进入对应的TA函数中执行,根据cmd和传入内存或变量,执行对应函数;
如上述TA侧应用,根据传入cmd判断是进入哪个entry point;比如执行变量加 ,根据传入的参数 执行完变量加后传回CA侧;
整体设计方案-REE侧的守护进程 tee_suppliant
守护进程是开机启动的一个TEE进程,随时处理请求;
整体设计方案-REE侧的守护进程 tee_suppliant 在文件系统的启动
如下图所示,在系统启动时,在文件系统启动脚本S09_optee中启动该守护进程;S代表启动脚本启动的服务;9代表启动的优先级 从小到大最大为99(一般90以后为用户启动的脚本);
3.3.4 应用例程列举
在optee_example中已完成了对hello word 、变量的自增减、随机数产生、常见加密算法的单独实现、文件操作、秘钥的下发更换、可信通道熟悉等例程;下面对每个例程简要介绍:
-
hello
主要用使用简单例子介绍可信应用和客户端应用的框架。 -
random
optee下生成随机数,随机数后面是加密算法和产生密钥必备的。 -
basicAlg
常见的算法在optee下的实现。针对 basicAlg下一章会对基本算法进行说明。
RSA1024/RSA2048/HMAC/SHA1/SHA256/AES/PBKDF2/RAMDON等 -
secure_storage
optee对文件的操作,创建、保存、截断、删除等操作。 -
save_key
对前期设备更换密钥的一个例程。 -
onLinePay
借鉴手机支付,建立可信通道,用来传输保密等级较高的数据。
各例程在附录9中简要介绍了使用说明
《附件9:optee-example在qemu中的运行.pdf》
4加密算法
在掌握了TEE与REE的基本通信后,就需要对基本的加密算法有基本的了解;
4.1一般使用流程简要总结:
编码目的:压缩空间,便于传输,减少带宽。
摘要目的:数据完整性,是否在传输过程中被修改。
加密目的:传输过程中既是被截取也无法查看原文,因为没有秘钥。
数字签名:是对摘要后的数据进行加密
数字证书:自己服务器公钥给权威机构(CA),权威机构对服务器的公钥和其他信息进行hash摘要再用权威机构的公钥进行加密后给客户服务器,客户把这个公钥给浏览器。
1、数据第一步编码(base64等)
2、第二步进行摘要(md5,sha256)
3、第三步对摘要后的数据进行加密(对称和非对称加密) 其实每一步都可以摘要:如数据本身摘要(md5)一次,然后编码(base64),然后对编码的数据在摘要(md5),然后对摘要的数据加密,然后对加密的后数据在摘要。
4.2 编码:Base64和URL编码
Base64 参考《基本密码学算法之:Base64.pdf》
Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据,由大小写字母、数字、+和/ 64个字符组成。将二进制文件3个字节作为一个处理单元,分为4个字节,每个字节6位,即3个字节可由4个可打印字符来表示。编码时肯定会出现数据不是3的倍数,Base64编码会采用0补全,最后末尾添加n个 “=”表示 补了几个字节的0。常见于URL中二进制图片的传递。
URL编码
由于url只能使用英文字母、数字和某些标点符号,不能使用其他文字和符号,比如中文。例如:春的UTF-8编码分别是E6 98 A5,每个字节前面加一个%因此,最后春 url编码得到"%E6%98%A5;当然如果浏览器采用其他编码形式结果又会不同。如:GB2312编码是B4 BA,最后得到%b4%ba
4.3摘要(哈希):
摘要的目的是为了校验信息的完整性,保证信息在传输过程中不被篡改。例如你在网络上需要下载一个非官方论坛软件,但又担心软件被第三方篡改,可以将该软件的md5值和官方下载的md5值进行对比,如果一致,则可放心使用。摘要算法有如下几个特点:
输入相同时,输出一致;输入不同时,输出不同。通过输出,不能计算出输入 对输入的任何细微修改,都会导致完全不同的输出。
由于以上特性,摘要也常被用来给密码加密,不过由于计算机运算能力的提升以及越来越丰富的破解手段,已不建议使用摘要算法来给密码加密。
通过摘要信息不能还原原始信息,仅用来验证完整性。
4.4 对称加密和非对称加密
加密是为了保证数据安全传输,使得其他人不能获取的具体信息内容。例如你想给某人发送一封密信,或通过互联网给人发送密码,这些对隐秘性要求比较强的事情,就需要对信息进行加密。
加密的专注点不在可用性上,这点和编码有明显的区别。加密是可逆的,明文 + 秘钥 = 加密信息
加密又分为对称加密和非对称加密,区别在于在加密和解密信息时秘钥是不是同一个。 加密信息能通过密钥被还原为原始信息
1、对称加密:DES, AES 对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。 不足之处是,交易双方都使用同样钥匙,安全性得不到保证。 常见的对称加密有DES,3DES,AES,Blowfish,Twofish,IDEA,RC6,CAST5 等。
2、非对称加密: RSA。 密钥是成对出现。使用一对“私钥-公钥”,用私钥加密的内容只有对应公钥才能解开 常见的非对称加密有 RSA、ESA、ECC 等。
公钥:公开给所有人。不能通过公钥反推出私钥;public key
私钥:自己留存,不公开。有且只有一个对应的私钥;secret key
特点:通过私钥加密的密文只能通过公钥能解密,通过公钥加密的密文也只能通过私钥能解密。 但由于算法强度比对称加密复杂,加解密的速度比对称加解密的速度要慢。
4.5 数字签名和数字证书
数字签名
简单说就是对数据进行信息摘要后再用私钥加密而成。可用RSA的私钥进行签名,用RSA的公钥进行验签。
数字证书
用户为了确认服务器的公钥,服务器把自己的公钥给到证书机构(certificate authority,简称CA),CA将服务器的公钥和其他信息 使用Hash信息摘要以后再用CA自己的私钥加密生成 数字证书 发给服务器。服务器再把这个数字证书给到用户(浏览器)。CA的公钥怎么确认?一般比较著名的机构的公钥都在"受信任的根证书颁发机构"列表中,浏览器自动会在里面查询获得。
5 秘钥加密与可信通道
在项目中应用,如果采用base64编码,该方案最主要的还是用来降低通讯量,加密的等级也非常低;设备终端与服务器之间使用加密通信,就需要了解秘钥加密、秘钥分发、可信通道的建立等;
5.1秘钥加密
《附件10:密钥加密方案介绍.pdf》
5.2可信通道
《附件11:密钥在线下发.pdf》
《附件12:在线支付系统可信通道建立(OP-TEE侧实现demo).pdf》
5.3 典型通信与相应实现过程
如果感觉可信通道有点复杂,可参考常用的身份认证方案;
身份认证:HMAC
HMAC算法的典型应用:该应用提供了一次安全响应的过程。
HMAC算法的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1)先由客户端向服务器发出一个验证请求。
(2)服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3)客户端将收到的随机数与自己的密钥进行HMAC-SHA1运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
6 总结
整个过程需要对系统构建、OP-TEE系统框架、CA与TA应用代码、密码学算法、加密通道等做了描述。各部分内容均较多,在目前篇幅的情况下,本文插入了多个附录文档,但这仍只是做到了各个方向都粗略的叙述;
在具体的实践过程中,仍有很多需改进的地方。在项目实践过程中,实现了OP-TEE和项目应用代码的单独编译,项目应用代码通过网络通信完成和CA通信,来调用对应的TA完成登录密码的保存、加密、读取、验证等功能;
CA放在 :
root@imx6qsabresd:/# find -name optee_example_*
./usr/bin/optee_example_random
./usr/bin/optee_example_hotp
./usr/bin/optee_example_secure_storage
./usr/bin/optee_example_aes
./usr/bin/optee_example_hello_world
…
TA放在:
root@imx6qsabresd:/# find -name *.ta
./lib/optee_armtz/5dbac793-f574-4871-8ad3-04331ec17f24.ta
./lib/optee_armtz/5ce0c432-0ab0-40e5-a056-782ca0e6aba2.ta
./lib/optee_armtz/5b9e0e40-2636-11e1-ad9e-0002a5d5c51b.ta
./lib/optee_armtz/9aaaf200-2450-11e4-abe2-0002a5d5c51b.ta
./lib/optee_armtz/a4c04d50-f180-11e8-8eb2-f2801f1b9fd1.ta
可优化为项目应用代码直接调用编译过的libteec库,并在项目应用代码中完成CA代码的编写,与TA直接通信,这更具有实际意义。