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

在Enclave.cpp文件中实现ecall_myretsum函数,该函数比较简单,就是定义两个整数参数和一个存储返回值的整数变量,并调用OCALL函数ocall_retsum计算累加和,获得计算结果,然后调用printf函数打印计算的累加和。

这个地方需要注意的是:获得OCALL函数的返回值和获得普通的C/C++函数的返回值是不一样的,获得C/C++函数的返回值可以直接通过赋值得到,但是获得OCALL函数的返回值需要把存储返回值的变量的地址传给Enclave函数,OCALL函数执行完之后,SGX会把返回值复制到地址参数指向的内存地址处,从而将返回值返回给想返回的变量。

事实上,在SGX中,OCALL函数执行时是有返回值的,返回的是该函数执行的状态,可以通过赋值获得OCALL函数执行的状态,从而判断有没有正确执行。

3.2.1 将以下代码添加到Enclave.cpp文件中 void ecall_myretsum() {     size_t start = 5;     size_t end = 10;     size_t sum = 0;     ocall_retsum(&sum,start, end);     printf("%d\n", sum); } 3.2.2 修改后的Enclave.cpp文件如下所示 #include "Enclave.h" #include "Enclave_t.h" /* print_string */ #include <stdarg.h> #include <stdio.h> /* vsnprintf */ #include <string.h> /* * printf: * Invokes OCALL to display the enclave buffer to the terminal. */ int printf(const char* fmt, ...) { char buf[BUFSIZ] = { '\0' }; va_list ap; va_start(ap, fmt); vsnprintf(buf, BUFSIZ, fmt, ap); va_end(ap); ocall_print_string(buf); return (int)strnlen(buf, BUFSIZ - 1) + 1; } void ecall_myretsum() {     size_t start = 5;     size_t end = 10;     size_t sum = 0;     ocall_retsum(&sum,start, end);     printf("%d\n", sum); } 3.3 Enclave.h文件修改

我们在Enclave.h文件中添加ecall_myretsum函数声明,该文件修改比较简单。

3.3.1将以下代码添加到Enclave.h文件中

void ecall_myretsum();

3.3.2 修改后的Enclave.h文件如下所示 #ifndef _ENCLAVE_H_ #define _ENCLAVE_H_ #include <stdlib.h> #include <assert.h> #if defined(__cplusplus) extern "C" { #endif void printf(const char *fmt, ...); void ecall_myretsum(); #if defined(__cplusplus) } #endif #endif /* !_ENCLAVE_H_ */ 3.4 App.cpp文件修改

我们在该文件中调用自定义的OCALL函数ocall_retsum并调用自定义的ECALL函数ecall_myretsum。

3.4.1 修改main函数

由于我们不需要Edger8rSyntax和TrustedLibrary相关的函数调用,所以我们把main函数中与这两部分相关的函数调用删除,也就是把下面部分删除:

/* Utilize edger8r attributes */ edger8r_array_attributes(); edger8r_pointer_attributes(); edger8r_type_attributes(); edger8r_function_attributes(); /* Utilize trusted libraries */ ecall_libc_functions(); ecall_libcxx_functions(); ecall_thread_functions();

image-20210304164923690

3.4.2 main函数中插入函数调用

在main函数之前插入OCALL函数ocall_retsum的实现,该函数计算两个整数之间的所有整数的累加和(包括这两个整数),并返回计算的累加值。即将以下代码插入到main函数之前

size_t ocall_retsum(size_t start, size_t end){       size_t sum = 0;       for (; start <= end; start++)           sum += start;       return sum;   }

在main函数中的Enclave创建和销毁之间插入我们定义的ecall_myretsum函数的调用代码,也就是把以下代码放到sgx_destroy_enclave(global_eid);之前。global_eid参数是必须的,是enclave的id。

ecall_myretsum(global_eid);

3.4.3 删除无关代码

我们也可以将main函数后面的无关代码给删了,也就是删除以下代码。

printf("Info: SampleEnclave successfully returned.\n"); printf("Enter a character before exit ...\n"); getchar();

修改后的main函数及其之前如下所示

size_t ocall_retsum(size_t start, size_t end){       size_t sum = 0;       for (; start <= end; start++)           sum += start;       return sum;   } /* Application entry */ int SGX_CDECL main(int argc, char *argv[]) { (void)(argc); (void)(argv); /* Initialize the enclave */ if(initialize_enclave() < 0){ printf("Enter a character before exit ...\n"); getchar(); return -1; } ecall_myretsum(global_eid); /* Destroy the enclave */ sgx_destroy_enclave(global_eid); return 0; } 3.5 Makefile文件修改

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

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