/*
 * Copyright (C) 2011-2020 Intel Corporation. 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 Intel Corporation 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.edl - Top EDL file. */

enclave {
    
   
    /* Import ECALL/OCALL from sub-directory EDLs.
     *  [from]: specifies the location of EDL file. 
     *  [import]: specifies the functions to import, 
     *  [*]: implies to import all functions.
     */
    from "sgx_tprotected_fs.edl" import *;
    from "sgx_tswitchless.edl" import *;
    from "sgx_pthread.edl" import *;

    trusted{
        public void ecall_sahe_add([user_check] void* a, [user_check] void* b, [user_check]void* c,  size_t outlen, int isLeftFloat, int isRightFloat) transition_using_threads;
        public void ecall_sahe_mul([user_check] void* a, long b, [user_check]void* c,  size_t outlen) transition_using_threads;        
        public void ecall_sahe_sub([user_check] void* a, [user_check] void* b, [user_check]void* c,  size_t outlen, int isLeftFloat, int isRightFloat) transition_using_threads;
        public void ecall_sahe_neg([user_check] void* a, [user_check]void* c,  size_t outlen) transition_using_threads;

        public void ecall_smhe_mul([user_check] void* a, [user_check] void* b, [user_check]void* c,  size_t outlen, int isLeftFloat, int isRightFloat) transition_using_threads;
        public void ecall_smhe_mulp([user_check] void* a,long b, [user_check]void* c,  size_t outlen) transition_using_threads;
        public void ecall_smhe_div([user_check] void* a, [user_check] void* b, [user_check]void* c,  size_t outlen, int isLeftFloat, int isRightFloat) transition_using_threads;
        public void ecall_smhe_pow([user_check] void* a, long b, [user_check]void* c,  size_t outlen) transition_using_threads;
        public void ecall_smhe_inv([user_check] void* a, [user_check]void* c,  size_t outlen) transition_using_threads;

        public void ecall_ore_compare([user_check] void* a, [user_check] void* b, [user_check]int* c) transition_using_threads;


        public void ecall_genMasterKey([user_check] const char* path)  transition_using_threads;
        public void ecall_openMasterKey([user_check] const char *path, [user_check] void* out, size_t outlen) transition_using_threads;
        public void ecall_encryptKeyWithEnclave([user_check] const char* key, size_t keySize, [user_check] const char* path) transition_using_threads;

        public void ecall_init([user_check]void* pTaskQueue);
    };
    /* 
     * ocall_print_string - invokes OCALL to display string buffer inside the enclave.
     *  [in]: copy the string buffer to App outside.
     *  [string]: specifies 'str' is a NULL terminated buffer.
     */
    untrusted {
        void ocall_ereport([in, string] const char *str);
        void ocall_usleep(size_t us) ;
        
        /* 新增：读取DEK文件的OCALL */
        void ocall_read_dek([in, string] const char* filename, 
                               [out, size=max_size] char* buffer, 
                               size_t max_size, 
                               [out] size_t* actual_size);
    };
};