2017-01-07 22 views
0

2つの異なるアプリケーションから作成された2つのエンクレーブ間でローカルアテステーションを実行しようとしています。Intel SGXでのローカルアテステーション

Linux用のサンプルコードであるhereは、3つの異なるエンクレーブを作成し、それらの間に安全な接続を確立します。しかし、これらのエンクレーブはすべて同じアプリケーションで作成されているため、すべてのエンクレーブIDを認識しています。

2つの異なるアプリケーションが作成されている場合、互いに通信する必要があるエンクレーブがあります。どのようにしてソースエンクレーブが宛先エンクレーブのIDを知ることができますか?そのIDはあるアプリケーションから「一般的な」方法(IPC)でエンクレーブに送信する必要がありますか?

私は先の飛び地を開始し、そのIDを印刷して、いくつかの簡単なテストを試してみた:「26ce00000002」

をそれから私は、この実行している先の飛び地に接続しようとするために、ローカル認証の例では、このIDを使用:

uint64_t wrapper(const char *c) { 
    errno = 0; 
    uint64_t result = strtoull(c, NULL, 16); 

    if (errno == EINVAL) { 
     cout << "WRONG NUMBER" << endl; 
    } else if (errno == ERANGE) { 
     cout << "Too big\n"; 
    } 

    return result; 
} 

uint32_t load_enclaves() { 
    uint32_t enclave_temp_no; 
    int ret, launch_token_updated; 
    sgx_launch_token_t launch_token; 

    enclave_temp_no = 0; 

    ret = sgx_create_enclave(ENCLAVE1_PATH, SGX_DEBUG_FLAG, &launch_token, &launch_token_updated, &e1_enclave_id, NULL); 
    if (ret != SGX_SUCCESS) { 
     return ret; 
    } 
    enclave_temp_no++; 
    g_enclave_id_map.insert(std::pair<sgx_enclave_id_t, uint32_t>(e1_enclave_id, enclave_temp_no)); 

const char *test = "26ce00000002"; 
e2_enclave_id = wrapper(test); 

    enclave_temp_no++; 
    g_enclave_id_map.insert(std::pair<sgx_enclave_id_t, uint32_t>(e2_enclave_id, enclave_temp_no)); 

    return SGX_SUCCESS; 
} 

int main(int argc, char **argv) { 
    uint32_t ret_status; 
    sgx_status_t status; 


    if(load_enclaves() != SGX_SUCCESS) { 
     printf("\nLoad Enclave Failure"); 
    } 

    printf("\nAvaliable Enclaves"); 
    printf("\nEnclave1 - EnclaveID %lx",e1_enclave_id); 
    printf("\nEnclave2 - EnclaveID %lx",e2_enclave_id); 

    do { 
     //Test Create session between Enclave1(Source) and Enclave2(Destination) 
     status = Enclave1_test_create_session(e1_enclave_id, &ret_status, e1_enclave_id, e2_enclave_id); 
     if (status!=SGX_SUCCESS) 
     { 
      printf("Enclave1_test_create_session Ecall failed: Error status code is %x", status); 
      print_error_message(status); 
      break; 
     } 
     else 
     { 
      if(ret_status==0) 
      { 
       printf("\n\nSecure Channel Establishment between Source (E1) and Destination (E2) Enclaves successful !!!"); 
      } 
      else 
      { 
       printf("\nSession establishment and key exchange failure between Source (E1) and Destination (E2): Error return status is %x\n", ret_status); 
       break; 
      } 
     } 

ソースエンクレーブでローカルアテステーションプログラムを実行すると、 "SGX_ERROR_INVALID_ENCLAVE_ID"エラーが発生しますか?このエラーは、ローカルアテステーションのサンプルプログラムではスローされませんが、SGXライブラリのどこかから来ています。なぜ、ターゲットエンクレーブがまだ実行されているのかわからないので、IDが存在するはずです。

答えて

3

エンクレーブIDを交換するための安全な接続は必要ありません。アプリケーションは、必要なエンクレーブのIDを取得するために対応するアプリケーションによって取り出すことができるエンクレーブ名とともに、レジストリまたはディスクにエンクレーブIDを格納することができます。次に、アプリケーションは、ソースエンクレーブへのECALLを実行し、デスティネーションエンクレーブのエンクレーブIDを渡して、ソースエンクレーブとデスティネーションエンクレーブとの間のセッションを開始します。宛先エンクレーブのエンクレーブIDを受信すると、ソースエンクレーブはOCALLをコアの信頼できないコードに入れ、ECALLを宛先エンクレーブに送り、ECDH鍵交換プロトコルを使用してセッションを確立するために必要なメッセージを交換する。

関連する問題