環境搭建
推薦按照以下順序安裝:
- 安裝ME
第一步安裝ME,下載下傳位址。下載下傳後直接點選安裝即可。
- 安裝vs2017
這裡注意了,一定不要下載下傳vs2019,因為目前vs2019還沒有支援intelSGX的調試器,估計以後可以,不過在我安裝的時候還不行。是以這裡推薦使用vs2017.我是先使用2019後面發現沒有調試器退回去安裝的2017.
- 安裝sdk
下載下傳位址,選擇Guard Extension SDK for windows下載下傳即可。不過這裡需要注意的是,需要注冊,否則下載下傳不了。注冊很簡單,用郵箱就行。安裝時直接點選就可以了。
hello world
建立enclave工程
1、打開vs2017,從“檔案 -> 建立 -> 項目”,選擇“Intel SGX Enclave Project”,輸入名稱為Enclave1(工程名),建立enclave項目。
2、建立好後,修改Source Files檔案夾下的Enclave1.edl檔案,修改檔案内容如下:
enclave {
from "sgx_tstdc.edl" import *;
trusted {
/* define ECALLs here. */
public void foo([out, size=len] char* buf, size_t len); //此處為添加的内容
};
untrusted {
/* define OCALLs here. */
};
};
在上述檔案中,我們實際上隻添加了一句代碼,即在trusted中添加:
public void foo([out, size=len] char* buf, size_t len); //此處為添加的内容
此表示我們在可信空間聲明了函數foo。
3、修改Source Files檔案夾下的Enclave1.cpp檔案,添加如下内容:
#include <string.h>
void foo(char *buf, size_t len)
{
const char *secret = "Hello Enclave!";
if (len > strlen(secret))
{
memcpy(buf, secret, strlen(secret) + 1);
}
}
此代碼是在trusted空間中實作前面聲明的foo函數,以供未來調用。
4、修改Enclave1項目的屬性。
(1)右鍵Enclave1項目,選擇“屬性”打開Enclave1屬性頁,在最頂上的“配置項(c)”處選擇“所有配置”,其右邊的“平台(P)”處選擇“Win32”,點選“應用”
(2)點選在“配置屬性”下面的“調試”,在右側“要啟動的調試器”中選擇“Intel® SGX Debugger”,下面的“Working Directory”後面修改為“$(OutDir)”,點選“确定”
建立應用工程
上面建立好enclave工程後,我們可以建立一個untrusted的應用來調用我們trusted空間的foo函數,步驟如下:
1、右鍵“解決方案‘Enclave1’ -> 添加 -> 建立項目 -> 空項目”,輸入名稱為main(工程名),點選确定建立項目。
2、在main項目的“源檔案”下添加“main.cpp”,并在檔案中添加如下代碼:
//main.cpp
#include <stdio.h>
#include <tchar.h>
#include "sgx_urts.h"
#include "enclave1_u.h"
#define ENCLAVE_FILE _T("Enclave1.signed.dll")
#define MAX_BUF_LEN 100
int main() {
sgx_enclave_id_t eid;
sgx_status_t ret = SGX_SUCCESS;
sgx_launch_token_t token = { 0 };
int updated = 0;
char buffer[MAX_BUF_LEN] = "Hello World!";
// Create the Enclave with above launch token.
ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL);
if (ret != SGX_SUCCESS) {
printf("App: error %#x, failed to create enclave.\n", ret);
return -1;
}
// An Enclave call (ECALL) will happen here.
foo(eid, buffer, MAX_BUF_LEN);
printf("%s", buffer);
// Destroy the enclave when all Enclave calls finished.
if (SGX_SUCCESS != sgx_destroy_enclave(eid))
return -1;
return 0;
}
3、導入Enclave的依賴
- 右鍵main項目,選擇"Intel SGX Configuration->Import Enclave"同時在Enclave1.edl前面勾選,點選确定;
- 右鍵main項目,選擇“屬性”打開main屬性頁,在最頂上的“配置項(c)”處選擇“所有配置”,其右邊的“平台(P)”處選擇“Win32”,點選“确定”;
- 右鍵“解決方案‘Enclave1’ -> 屬性 ”,點選“通用屬性”下的“啟動項目”,點選“單啟動項目”,并在下面選擇“main”;
- 點選“項目依賴項”,在右邊選擇項目"main",并在下面的依賴于(D)中勾選Enclave1,點選确定。