Intel SGX передает данные из приложения в анклав - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь передать два целых числа в анклав SGX, объединить их и затем вернуть результат обратно в приложение. Однако при компиляции кода ничего не происходит, кроме создания анклава. Ошибка отсутствует, и она, похоже, никогда не достигает функции ECALL.

Если кому-то известно об учебнике, который делает это, и я могу использовать его в качестве справки, то это будет очень признательно.

EDL:

enclave {
    from "sgx_tae_service.edl" import *;

    /* enum definition */
    enum TEE_ERROR {
        TEE_ERROR_INVALID_SIGNATURE = 0,
        TEE_ERROR_INVALID_COUNTER = 1,
        TEE_ERROR_INVALID_SECRET = 2
    };


    trusted {
        /* define ECALLs here. */
        public int in_enclave([in] int* a, [in] int* b);
};

    untrusted {
        /* define OCALLs here. */
        void ocall_print_int([out] int* i);
    };
};

Анклав. cpp

int in_enclave(int* a, int* b){
        ocall_print("In the Enclave.");
        int result =0;
        result = a + b;
        ocall_print_int(&result);

}

Приложение cpp

int test(void) {
    if (initialize_enclave(&global_eid, "enclave.token", "enclave.signed.so") < 0) {
        std::cout << "Fail to initialize enclave." << std::endl;
        return 1;
    }else{

    std::cout<<"Enclave made. "<<"\n";
}
        int a =34, b =23,point = 0;
        in_enclave(global_eid,&point,&a,&b);

    return 0;                                                                                                                                                                                                                                                                             }

1 Ответ

0 голосов
/ 29 мая 2020

См. Исправления ниже. Доверенная функция in_enclave получает a и b, вычисляет сумму и возвращает результат. В (ненадежном) коде приложения результат функции помещается в point.

При вызове функции проверьте возвращаемое значение. Возвращаемое значение с точки зрения основного кода приложения имеет тип sgx_status_t, где ОК - SGX_SUCCESS. Список кодов ошибок можно найти в справочнике разработчиков SGX или поищите sgx_error.h в исходном коде. В этом примере мы могли бы использовать значение status, чтобы определить причину сбоя вызова.

EDL

    trusted {
        public int in_enclave(int a, int b);
    };

Enclave

    int in_enclave(int a, int b){
        return a + b;
    }

Application

    int a = 34, b = 23, point = 0;
    sgx_status_t status = in_enclave(global_eid, &point, a, b);
    if (SGX_SUCCESS != status) {
        // error occurred! ?
    }
    printf("%d\n", point);
...