C++ Arguments to SGX Enclave Edge Functions

2019-01-29 06:00发布

I'm trying to write a simple SGX enclave that takes in a vector of booleans, but apparently edger8r creates c code; so the edl code

enclave{

  from "sgx_tstdc.edl" import *;
  include "BetaDist.h"
  include <vector>

  trusted {
         BetaDist Estimate(std::vector<bool> X, double max_z, double max_delta); 
  };

  untrusted {
  };
};

produces a compile error (Amusingly, the Intel compiler reports it under the title "catastrophic error") saying header vector can't be found.

It seems to me that the problem can be solved just by compiling the output edge code with a c++ flag. Would that work? Even if so, is there a cleaner way to do this (i.e. having edge functions with C++ standard-typed parameters)?

PS: I don't have enough rep to add a new tag, would anyone tag this with 'edger8r'? It'll be helpful I think.

1条回答
唯我独甜
2楼-- · 2019-01-29 06:15

#include is incorrect EDL syntax. No need for hash - include

Arguments in ecalls and ocalls have to be C type - so, vector and bool are not supported.

For vector you need to convert it into C type (maybe create a struct or void pointer), then pass a pointer with its length.

For bool, I guess, better to pass an int to represent a Boolean value.

You also have to specify special attribute for pointers:

  • [in] - if you want to copy it into enclave (you also need to specify its length) (aka pass by value)
  • [out] - if you want to copy back from enclave
  • [user_check] - the easiest option - you just pass a pointer and enclave will read from and write to untrusted memory. (aka pass by pointer)

Do not forget to cast arguments back into C++ types!

查看更多
登录 后发表回答