天天看點

windows10下使用Intel SGX程式設計初體驗

環境搭建

推薦按照以下順序安裝:

  • 安裝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,點選确定。

啟動調試