Ubuntu下SGX学习笔记(1)HelloWorld

案例学习

参考链接添加链接描述
SGX安装成功之后在sgxsdk/SampleCode中会有九个案例代码作为学习SGX的入门资源Ubuntu下SGX学习笔记(1)HelloWorld_第1张图片

复制其中的SampleEnclave作为自己修改参数的基础

【注】SampleEnclave的功能是实现了安全print函数,可以用来安全打印我们需要打印的字符串,即可以实现学习代码的第一步----------安全打印 HelloWorld!

每一个例子中的README.txt文件都是说明

1.实现的功能
2.如何去建立和执行这个代码(环境需求和运行方法)

项目中各个文件关系以及相关介绍

Ubuntu下SGX学习笔记(1)HelloWorld_第2张图片Ubuntu下SGX学习笔记(1)HelloWorld_第3张图片

App文件

app文件存放应用程序中的不可信代码部分,共有3个文件和2个文件夹,App.cpp文件;App.h文件;App.o文件;Edger8rSyntax文件夹和TrustedLibrary文件夹
1.App.cpp文件:该文件是应用程序中不可信部分代码,起哄包括了创建Enclave及销毁Enclave代码(也就是README,txt中的第一个功能),也定义了一些相关的返回码供使用者查看Enclave程序的执行状态。
【注】其中main函数是整个项目的入口函数。是修改参数的文件。
2.App.h文件:该文件是应用程序中的不可信部分代码的头文件,定义了一些宏常亮和函数声明。不用进行更改。
3.App.o文件 自动生成的,无法修改的文件
4.Edger8rSyntax文件夹:该文件夹提供了一些工具,无需进行更改
5.TrustedLibrary文件夹:该文件夹提供了一些函数库,无需进行更改

Enclave文件

Enclave文件夹存放应用程序中可信代码的部分以及可信与不可信代码借口文件,共有6个文件和2个文件夹,Enclave.config.xml文件l;Enclave.h文件;Enclave.edl文件;Enclave.lds文件;Enclave_private.pem文件;Edger8rSyntax文件夹和TrustedLibrary文件夹
1.Enclave.config.xml文件:该文件是Enclave的配置文件,定义了Enclave的元数据信息,不用更改
2.Enclave.cpp文件:该文件是应用程序中可信部分代码、包括了可信函数的实现,是需要修改的文件。
3.Enclave.h文件:该文件是应用程序中的可信部分代码的头文件,定义了一些宏常量和函数声明。要修改( )
4.Enclave.edl文件:该文件是Enclave的接口定义文件,定义了不可信代码调用可信代码的ECALL函数接口和可信代码调用不可信代码的OCALL函数接口,Trusted{}中定义了ECALL函数interface,untrusted{}中定义了OCALL函数interface是我们要修改的文件。
5.Enclave.lds文件:该文件定义了一些Enclave可执行文件信息,不需要更改。
6.Enclave_private.pem文件:该文件是SGX生成的私钥,不需要更改
7.Edger8rSyntax文件夹:该文件提供了Edger工具(生成调用函数的工具)
8.TrustedLibrary文件夹:该文件夹提供了一些函数库,不用进行更改。

Include文件夹

该文件夹存放被Enclave接口定义文件Enclave.edl使用的头文件,包括一些宏定义,不用考虑。只有一个 user_types.h文件。

  • user_type.h文件:该文件定义了用户自定义的类型

Makefile文件

该文件是项目编译的文件,定义了项目的编译信息,包括一些环境设定,主要的有
App Setting (app的设置):包括app要使用的工具以及要链接的库
Enclave Setting(Enclave的设置):Enclave要使用的工具以及要链接的库
APP Objects(整个文件的核心):生成编译后的后缀为.o的文件
Enclave Objects:生成可信文件Enclave_t.c和Enclave_t.h和Enclave_c.o 并对文件进行签名

编写代码

综上说明,要修改的文件包括Enclave.edl 、 Enclave.cpp 、Enclave.h ;App.cpp 以及makefile文件
1.Enclave.edl文件修改
要在Enclave.edl文件中定义不可信代码调用可信函数的接口,比如我们定义的可信函数是 printf_helloworld,在该函数中我们打印“Hello World!”,该函数没有参数 也没有返回值。
【注】ECALL & OCALL
ECALL & OCALL是Enclave的接口
每个Enclave可以定义一个或多个ECALL(为非可信应用程序进入安全区的入口点)
Enclave也可以定义OCALL(OCALL使Enclave中的函数可以调用外部的非可信应用程序, 再返回到Enclave)

1.1 添加ECALL,将代码添加到Enclave.edl 文件中的untrusted{}之前,修改后如图所示:
Ubuntu下SGX学习笔记(1)HelloWorld_第4张图片1.2 修改Enclave.cpp,对被调用的可信函数进行功能的实现,如图所示:
Ubuntu下SGX学习笔记(1)HelloWorld_第5张图片1.3修改Enclave.h,添加printf_helloworld函数声明,该文件修改比较简单。
在这里插入图片描述
2. app文件的修改
在该文件中调用自定义的ECALL函数printf_helloworld打印”Hello World“。该文件修改比较简单
2.1APP.cpp文件的修改
由于不需要Edger8rSyntax和TrustedLibrary相关的函数调用,所以我们把main函数中与这两部分相关的函数调用删除,也就是把下面部分删除:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200318094344160.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODAwMTk3,size_16,color_FFFFFF,t_70
在main函数中的Enclave创建和销毁之间插入我们定义的printf_helloworld函数的调用代码,也就是把以下代码放到”sgx_destroy_enclave(global_eid);“之前。global_eid参数是必须的,是enclave的id。
Ubuntu下SGX学习笔记(1)HelloWorld_第6张图片3. Makefile文件的修改
在Makefile文件中修改编译相关的信息。主要更改”SGX_SDK ?= /opt/intel/sgxsdk“、”App_Cpp_Files := App/App.cpp $(wildcard App/Edger8rSyntax/.cpp) $(wildcard App/TrustedLibrary/.cpp)“和”Enclave_Cpp_Files := Enclave/Enclave.cpp $(wildcard Enclave/Edger8rSyntax/.cpp) $(wildcard Enclave/TrustedLibrary/.cpp)“
1.修改SGX SDK
首先要根据自己电脑sdk的安装位置修改SDK的路径
3. 修改可信代码编译的源文件
由于我们的可信代码可能是多个文件,因此,我们最好在Enclave_Cpp_Files中包括App文件夹中的所有cpp文件,更改后的结果如下。当然在我们的项目中Enclave_Cpp_Files可以不用更改。

编译后运行成功
Ubuntu下SGX学习笔记(1)HelloWorld_第7张图片

你可能感兴趣的:(SGX,linux,c++,sgx)