0

多くのドキュメントを読んだ後、最初の単純なエンクレーブ関数を実行しました。

enclave {
     //Include files 

     //Import other edl files

     //Data structure declarations to be used as parameters of the
     //function prototypes in edl

     trusted {
          public function myFirstMethod([in]  int *a, [in]  int *b,[out] int *sum);
     };

     untrusted {
     };
};

次に、bash で edger8r を実行します。

sgx_edger8r enclave.edl

次に、スキーマからわかるように、次のファイルが生成されました。

生成されたファイル

enclave_t.cしたがって、私が見つけた唯一の参照がこの関数にあると仮定します。

static sgx_status_t SGX_CDECL sgx_myFirstMethod(void* pms)
{
    CHECK_REF_POINTER(pms, sizeof(ms_myFirstMethod_t));
    ms_myFirstMethod_t* ms = SGX_CAST(ms_myFirstMethod_t*, pms);
    sgx_status_t status = SGX_SUCCESS;
    int* _tmp_a = ms->ms_a;
    size_t _len_a = sizeof(*_tmp_a);
    int* _in_a = NULL;
    int* _tmp_b = ms->ms_b;
    size_t _len_b = sizeof(*_tmp_b);
    int* _in_b = NULL;

    CHECK_UNIQUE_POINTER(_tmp_a, _len_a);
    CHECK_UNIQUE_POINTER(_tmp_b, _len_b);

    if (_tmp_a != NULL) {
        _in_a = (int*)malloc(_len_a);
        if (_in_a == NULL) {
            status = SGX_ERROR_OUT_OF_MEMORY;
            goto err;
        }

        memcpy(_in_a, _tmp_a, _len_a);
    }
    if (_tmp_b != NULL) {
        _in_b = (int*)malloc(_len_b);
        if (_in_b == NULL) {
            status = SGX_ERROR_OUT_OF_MEMORY;
            goto err;
        }

        memcpy(_in_b, _tmp_b, _len_b);
    }
    ms->ms_retval = myFirstMethod(_in_a, _in_b);
err:
    if (_in_a) free(_in_a);
    if (_in_b) free(_in_b);

    return status;
}

特に

    ms->ms_retval = myFirstMethod(_in_a, _in_b);

しかし、どこに置くのmyFirstMethodですか?また、エンクレーブをアプリケーションの一部として静的ライブラリとしてコンパイルする方法についても説明します。

私が検索した限り、これらのリンクのチュートリアルは次のとおりです。

すべてが GNU/Linux でネイティブに実行されない Visual Studio について言及しているため、私がフォローするのは少し難しいです。

編集1:

さらに見てみると、https://github.com/01org/linux-sgxで、リンクが言及しているようにシミュレーションモードでコンパイルできることがわかりました。

make SGX_MODE=SIM

そして、ドライバーsdkを正常にインストールしました。実際のモードではなく、SIMULATION モードでコンパイルしたい。

4

2 に答える 2

1

edger8r の自動生成された出力は、エンクレーブと信頼できない外部世界との間のインターフェイスを提供するためだけのものです。実装を含めることは想定されていません。

myFirstMethod別のソース ファイルで定義する必要があります。たとえばenclave.c、またはenclave.cppプロジェクトの残りの部分とリンクします。関数のシグネチャは、edl で宣言したものとまったく同じです。ただし、edger8r が消費するポインター修飾子は除きます。

次のようになります。

enclave.cpp:

void myFirstMethod(int *a, int *b, int *sum)
{
  *sum = *a + *b;
}
于 2017-11-04T16:20:02.710 に答える