首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >英特尔SGX的本地认证

英特尔SGX的本地认证
EN

Stack Overflow用户
提问于 2017-01-07 10:11:51
回答 1查看 890关注 0票数 0

我试图在从两个不同的应用程序创建的两个飞地之间执行本地认证。

为Linux 这里提供的示例代码创建了3个不同的包,然后在它们之间建立安全连接。但是这些飞地都是由同一个应用程序创建的,因此它知道所有的飞地is。

如果两个不同的应用程序正在创建自己的飞地,它们应该相互通信,那么源enclave如何知道目标飞地的ID?该ID是否必须通过“通用”方式(IPC)从一个应用程序传输到飞地?

通过启动目标飞地并打印其ID:"26ce00000002“,我尝试了一些简单的测试。

然后,我在本地认证示例中使用了这个ID来尝试连接到这个正在运行的目标飞地:

代码语言:javascript
运行
复制
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应该存在!?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-24 08:52:47

我们不需要安全连接来交换飞地id。应用程序可以将飞地id存储在注册表或磁盘上,以及相应的应用程序可以检索的飞地名称,以获得所需飞地的id。然后,应用程序通过在源飞地中执行ECALL来启动源飞地和目标飞地之间的会话,并传入目标飞地的enclave id。在接收到目标飞地的enclave id后,源enclave对核心不可信代码执行OCALL操作,然后对目标飞地执行ECALL操作,以交换使用ECDH密钥交换协议建立会话所需的消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41520253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档