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.
#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!
来源:https://stackoverflow.com/questions/41901884/c-arguments-to-sgx-enclave-edge-functions