/*
 * Copyright (C) 2017-2018 Baidu, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *   * Neither the name of Baidu, Inc., nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

enclave {
    from "sgx_backtrace.edl" import *;
    from "sgx_tstd.edl" import *;
    from "sgx_stdio.edl" import *;
    from "sgx_net.edl" import *;
    from "sgx_time.edl" import *;
    from "sgx_tstdc.edl" import *;

    include "sgx_quote.h"


    trusted {
	public sgx_status_t run_server(int fd);
	public sgx_status_t run_client(int fd);
    };

    untrusted {
	sgx_status_t ocall_sgx_init_quote([out] sgx_target_info_t *ret_ti,
					  [out] sgx_epid_group_id_t *ret_gid);
        sgx_status_t ocall_get_ias_socket([out] int *ret_fd);
        sgx_status_t ocall_get_quote(  [in, size = sigrl_len] uint8_t * p_sigrl,
                                       uint32_t sigrl_len,
                                       [in] sgx_report_t *report,
                                       sgx_quote_sign_type_t quote_type,
                                       [in] sgx_spid_t *p_spid,
                                       [in] sgx_quote_nonce_t *p_nonce,
                                       [out] sgx_report_t *p_qe_report,
                                       [out, size = maxlen] sgx_quote_t *p_quote,
                                       uint32_t maxlen,
                                       [out] uint32_t* p_quote_len);
	sgx_status_t ocall_get_update_info([in] sgx_platform_info_t * platformBlob,
					   int32_t enclaveTrusted,
					   [out] sgx_update_info_bit_t * update_info);
    };
};
