enclave
{
    from "openenclave/edl/syscall.edl" import *;
    from "platform.edl" import *;
#ifdef EDL_USE_HOST_ENTROPY
    from "openenclave/edl/sgx/entropy.edl" import *;
#endif

    /* 配置参数：后续可按需扩展 */
    struct server_init_args_t
    {
        uint32_t allow_debug;
    };

    trusted
    {
        /* 初始化 TLS 上下文，加载证书/私钥、设置校验策略 */
        public oe_result_t ecall_server_init([in] server_init_args_t* args);

        /* 绑定到宿主提供的监听端口并执行一次握手，成功后持有会话句柄 */
        public oe_result_t ecall_server_accept();

        /* 处理客户端发送的数据流，期望首帧为 DEK；内部缓存明文 */
        public oe_result_t ecall_server_receive_dek(
            [out] uint32_t* dek_hash /* 可选：返回 DEK 指纹，确认成功 */);

        public oe_result_t ecall_server_get_sealed_dek(
            [out, size=buf_len] uint8_t* buf,
            size_t buf_len,
            [out] size_t* out_len);

        /* 供其他 enclave 内组件读取已缓存的 DEK */
        public oe_result_t ecall_server_get_dek(
            [out, size=dek_buf_size] uint8_t* dek_buf,
            size_t dek_buf_size,
            [out] size_t* dek_len);

        /* 清理会话与密钥材料 */
        public void ecall_server_shutdown();

        /* 释放当前 TLS 会话，允许下一次 Accept */
        public oe_result_t ecall_server_reset_session();
    };

    untrusted
    {
        /* 宿主负责监听/接受连接，返回一个 opaque 句柄（如 socket fd） */
        oe_result_t ocall_wait_for_client([out] uint64_t* session_handle);

        /* TLS 栈需要的 send/recv 封装 */
        oe_result_t ocall_session_send(
            uint64_t session_handle,
            [in, count=buf_len] const uint8_t* buf,
            size_t buf_len,
            [out] size_t* bytes_written);

        oe_result_t ocall_session_recv(
            uint64_t session_handle,
            [out, size=buf_len] uint8_t* buf,
            size_t buf_len,
            [out] size_t* bytes_read);

        void ocall_session_close(uint64_t session_handle);

        void ocall_log([in, string] const char* message);
    };
};
