[OP-TEE开发学习-1] 从Hello_World开始
在完成了OPTEE环境的配置之后,接下来要做的事情就和我们之前无数次学习新编程语言时做的事情一样——开始编写HelloWorld程序!
幸运的是,OPTEE已经内置了HelloWorld的示例程序,更棒的是,我们可以从这个HelloWorld示例程序入手,开始学习OPTEE里CA和TA的对应开发过程。
本文在《手机安全和可信应用开发指南》(帅峰云,黄腾,宋洋)对照学习下完成。
①Helloworld示例程序实际上手
首先,让我们运行OPTEE,选择qemu模拟的ARMv7作为默认开发平台,在代表REE一侧的控制台输入root指令并运行helloworld示范程序,让我们看看会发生什么吧!
REE终端显示
可以看到,helloworld演示程序中,CA端将数据42自增的指令发送给了TA端,并在结果执行完毕后收到了TA端返回的自增后的数据43,helloworld示例程序执行完毕。
TEE终端显示
再让我们来看看TA端的终端显示:在完成了ctx指向和session建立后,TA终端输出Helloworld的指令显示,并收到来自CA发送的数据42,在完成数据自增43并发送后,TA端关闭session并注销,输出Goodbye指令显示,最后关闭ctx连接,helloworld示例程序执行完毕。
综上可见,OPTEE自带的Helloworld演示程序包含了基本的CA与TA执行通信的执行流程,用户完全可以在此示例程序的基础上,通过学习CA端和TA端程序开发不断完善属于自己的可信应用。
②基于Helloworld的程序开发
在OPTEE中,所有示例程序都被放在/optee/optee_example目录之下,在调用时,需要先对OPTEE进行编译,在打开REE和TEE的对应终端后,可在切换为root身份后,输入optee_example_(name)进行对应的程序运行测试。
那么,这是否意味着我们可以直接在当前目录新建个人的程序“abc”并通过optee_example_abc完成个人可信应用程序的快速调用呢?
答案当然是否定的!
如果我们希望进行基于Helloworld示例程序进行的个人可信应用程序开发,那么我们至少要完成以下三个步骤的操作:
1)CA端操作:在OPTEE的程序规范中,程序目录下的host目录中存储了CA相关的部分,包括main.c(CA程序的源代码),Makefile(CA在编译时使用的文件)
那么,若我们希望添加新的程序功能,我们可以按照OPTEE的规范调用REE的相关程序接口,编辑CA的源代码,之后我们需要对/host/Makefile 中的BINARY和OBJS变量进行修改:在BINARY中定义编译完成后执行文件的名字(就是在REE终端中输入的optee_example_name),并在OBJS中定义需要编译到CA的目标文件。
另外需要注意的是,在Helloworld演示程序中,/host/main.c直接引用了/ta/include/hello_world_ta.h以保证CA和TA的UUID和command ID一致,我们也可以新建一个CA端用的头文件来进行自定义。
2)TA端操作:在OPTEE的程序规范中,程序目录下的ta目录中存储了TA相关的部分,包括hello_world_ta.c(TA程序的源代码),Makefile(TA在编译时使用的文件),sub.mk(TA中需要被编译的源代码定义),user_ta_header_defines.h(用户关键信息定义),include/hello_world_ta.h(定义了CA与TA沟通时的UUID和commandID信息等)
对TA端进行编辑后,同样需要修改ta/Makefile文件,使BINARY变量的值修改至与CA中定义的UUID一致即可。
3)在分别完成了对CA和TA代码的修改后,便可以将CA和TA集成到OPTEE中去以保证能进行测试,此处提供一个简化版的方法,将代码目录name放置在/optee_examples目录下,之后对此目录下的Makefile作如下修改:
将上述第三行中的
EXAMPLE_LIST := $(subst /,,$(dir $(wildcard */Makefile)))
修改为
EXAMPLE_LIST := hello_world aes acipher hotp plugins random secure_storage (name)
4)完成上述修改后,注意要在项目目录下的CMakeLists.txt文件中将project后的可执行文件名修改为optee_examples_(name)。
5) 最后修改user_ta_header_defines.h 中关于TA_UUID的定义和引用ta.h头文件目录即可
之后在OPTEE里REE终端运行时,只需输入optee_examples_(name)即可运行