Ubuntu 18.04下Intel SGX应用程序程序开发——获得OCALL调用的返回值

本文中,我们介绍在Enclave函数中调用不可信OCALL函数,并获得OCALL函数的返回值。

1. 复制SampleEnclave示例并建立自己的OcallRetSum项目

SampleEnclave示例实现了安全printf函数,可以被用来安全打印我们需要打印的字符串。我们使用OCALL计算两个整数之间的所有整数的累加和(包括这两个整数),并调用printf函数打印复制的目的字符串。我们把SampleEnclave示例复制到自己的文件夹中,基于该示例,我们开发一个在Enclave函数中调用OCALL函数计算两个整数之间的所有整数的累加和(包括这两个整数)。我们把复制得到的SampleEnclave文件夹名称改成OcallRetSum文件夹。

将文件中的冗余文件删除仅剩下图目录

image-20210305113512956

2. 各个文件内容介绍 2.1 App文件夹

该文件夹存放应用程序中的不可信代码部分,共有2个文件和2个文件夹,App.cpp文件、App.h文件、Edger8rSyntax文件夹和TrustedLibrary文件夹

App.cpp文件:该文件是应用程序中的不可信部分代码,其中包括了创建Enclave及销毁Enclave的代码,也定义了一些相关的返回码供使用者查看Enclave程序的执行状态。其中的main函数是整个项目的入口函数。是我们要修改的文件。

App.h文件:该文件是应用程序中的不可信部分代码的头文件,定义了一些宏常量和函数声明。我们不用进行更改。

Edger8rSyntax文件夹:该文件夹提供了一些工具,我们不用进行更改。

TrustedLibrary文件夹:该文件夹提供了一些函数库,我们不用进行更改。、

2.2 Enclave文件夹

该文件夹存放应用程序中的可信代码部分和可信与不可信代码接口文件,共有6个文件和2个文件夹,Enclave.config.xml文件、Enclave.cpp文件、Enclave.h文件、Enclave.edl文件、Enclave.lds文件、Enclave_private.pem文件、Edger8rSyntax文件夹和TrustedLibrary文件夹

Enclave.config.xml文件:该文件是Enclave的配置文件,定义了Enclave的元数据信息,我们可以不用更改。

Enclave.cpp文件:该文件是应用程序中的可信部分代码,包括了可信函数的实现,是我们要修改的文件。

Enclave.h文件:该文件是应用程序中的可信部分代码的头文件,定义了一些宏常量和函数声明。是我们要修改的文件。

Enclave.edl文件:该文件是Enclave的接口定义文件,定义了不可信代码调用可信代码的ECALL函数接口和可信代码调用不可信代码的OECALL函数接口,trusted{}中定义了ECALL函数接口,untrusted{}中定义了OECALL函数接口是我们要修改的文件。

Enclave.lds文件:该文件定义了一些Enclave可执行文件信息,我们不用更改。

Enclave_private.pem文件:该文件是SGX生成的私钥,我们不用更改。

Edger8rSyntax文件夹:该文件夹提供了一些工具,我们不用进行更改。

TrustedLibrary文件夹:该文件夹提供了一些函数库,我们不用进行更改。

2.3 Include文件夹

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

user_types.h文件:该文件定义了用户自定义的类型。

2.4 Makefile文件

该文件是项目的编译文件,定义了项目的编译信息,详细说明还请参考。是需要修改的部分。

3. 改写代码

需要修改的文件问为Enclave.edl文件、Enclave.cpp文件、Enclave.h文件、App.cpp文件和Makefile文件

3.1 Enclave.edl文件修改

我们要在Enclave.edl文件中定义不可信代码调用可信函数的ECALL接口,比如我们定义的可信函数是ecall_myretsum,在该函数中我们调用OCALL函数ocall_retsum计算两个整数之间的所有整数累加和,该函数没有参数也没有返回值。

但是定义的可信函数式ocall_retsum时,该函数有2个参数:起始整数start和结束整数end。该函数有一个整数返回值。

3.1.1 添加ECALL函数ecall_myretsum,将以下代码添加到Enclave.edl文件中的untrusted{}之前。 trusted{ public void ecall_myretsum(); };

同时因为需要start和end参数的返回值,还将下列代码添加到``untrusted{}`中

size_t ocall_retsum(size_t start, size_t end); 3.1.2 修改后的Enclave.edl文件如下所示 enclave { include "user_types.h" /* buffer_t */ /* Import ECALL/OCALL from sub-directory EDLs. * [from]: specifies the location of EDL file. * [import]: specifies the functions to import, * [*]: implies to import all functions. */ from "Edger8rSyntax/Types.edl" import *; from "Edger8rSyntax/Pointers.edl" import *; from "Edger8rSyntax/Arrays.edl" import *; from "Edger8rSyntax/Functions.edl" import *; from "TrustedLibrary/Libc.edl" import *; from "TrustedLibrary/Libcxx.edl" import ecall_exception, ecall_map; from "TrustedLibrary/Thread.edl" import *; /* * ocall_print_string - invokes OCALL to display string buffer inside the enclave. * [in]: copy the string buffer to App outside. * [string]: specifies 'str' is a NULL terminated buffer. */ trusted{ public void ecall_myretsum(); }; untrusted { void ocall_print_string([in, string] const char *str); size_t ocall_retsum(size_t start, size_t end); }; }; 3.2 Enclave.cpp文件修改

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyygsw.html