mirror of
https://github.com/intel/linux-sgx
synced 2026-06-08 14:49:32 +00:00
Updates for SGX 2.20 reproducible build.
Signed-off-by: Zhang Lili <lili.z.zhang@intel.com>
This commit is contained in:
@@ -0,0 +1,245 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
# include <unistd.h>
|
||||
# include <pwd.h>
|
||||
# define MAX_PATH FILENAME_MAX
|
||||
#include <time.h>
|
||||
#include "powers_of_two.h"
|
||||
#include "sgx_urts.h"
|
||||
#include "App.h"
|
||||
#include "Enclave_u.h"
|
||||
|
||||
/* Global EID shared by multiple threads */
|
||||
sgx_enclave_id_t global_eid = 0;
|
||||
|
||||
typedef struct _sgx_errlist_t {
|
||||
sgx_status_t err;
|
||||
const char *msg;
|
||||
const char *sug; /* Suggestion */
|
||||
} sgx_errlist_t;
|
||||
|
||||
/* Error code returned by sgx_create_enclave */
|
||||
static sgx_errlist_t sgx_errlist[] = {
|
||||
{
|
||||
SGX_ERROR_UNEXPECTED,
|
||||
"Unexpected error occurred.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_PARAMETER,
|
||||
"Invalid parameter.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_OUT_OF_MEMORY,
|
||||
"Out of memory.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_ENCLAVE_LOST,
|
||||
"Power transition occurred.",
|
||||
"Please refer to the sample \"PowerTransition\" for details."
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ENCLAVE,
|
||||
"Invalid enclave image.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ENCLAVE_ID,
|
||||
"Invalid enclave identification.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_SIGNATURE,
|
||||
"Invalid enclave signature.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_OUT_OF_EPC,
|
||||
"Out of EPC memory.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_NO_DEVICE,
|
||||
"Invalid SGX device.",
|
||||
"Please make sure SGX module is enabled in the BIOS, and install SGX driver afterwards."
|
||||
},
|
||||
{
|
||||
SGX_ERROR_MEMORY_MAP_CONFLICT,
|
||||
"Memory map conflicted.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_METADATA,
|
||||
"Invalid enclave metadata.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_DEVICE_BUSY,
|
||||
"SGX device was busy.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_VERSION,
|
||||
"Enclave version was invalid.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ATTRIBUTE,
|
||||
"Enclave was not authorized.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_ENCLAVE_FILE_ACCESS,
|
||||
"Can't open enclave file.",
|
||||
NULL
|
||||
},
|
||||
};
|
||||
|
||||
/* Check error conditions for loading enclave */
|
||||
void print_error_message(sgx_status_t ret)
|
||||
{
|
||||
size_t idx = 0;
|
||||
size_t ttl = sizeof sgx_errlist/sizeof sgx_errlist[0];
|
||||
|
||||
for (idx = 0; idx < ttl; idx++) {
|
||||
if(ret == sgx_errlist[idx].err) {
|
||||
if(NULL != sgx_errlist[idx].sug)
|
||||
printf("Info: %s\n", sgx_errlist[idx].sug);
|
||||
printf("Error: %s\n", sgx_errlist[idx].msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx == ttl)
|
||||
printf("Error code is 0x%X. Please refer to the \"Intel SGX SDK Developer Reference\" for more details.\n", ret);
|
||||
}
|
||||
|
||||
/* Initialize the enclave:
|
||||
* Call sgx_create_enclave to initialize an enclave instance
|
||||
*/
|
||||
int initialize_enclave(void)
|
||||
{
|
||||
sgx_status_t ret = SGX_ERROR_UNEXPECTED;
|
||||
|
||||
/* Call sgx_create_enclave to initialize an enclave instance */
|
||||
/* Debug Support: set 2nd parameter to 1 */
|
||||
ret = sgx_create_enclave(ENCLAVE_FILENAME, SGX_DEBUG_FLAG, NULL, NULL, &global_eid, NULL);
|
||||
if (ret != SGX_SUCCESS) {
|
||||
print_error_message(ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* OCall functions */
|
||||
void ocall_print_string(const char *str)
|
||||
{
|
||||
/* Proxy/Bridge will check the length and null-terminate
|
||||
* the input string to prevent buffer overflow.
|
||||
*/
|
||||
printf("%s", str);
|
||||
}
|
||||
|
||||
|
||||
/* Application entry */
|
||||
int SGX_CDECL main(int argc, char *argv[])
|
||||
{
|
||||
(void)(argc);
|
||||
(void)(argv);
|
||||
|
||||
|
||||
/* Initialize the enclave */
|
||||
if(initialize_enclave() < 0){
|
||||
printf("Enter a character before exit ...\n");
|
||||
getchar();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// We want to run a program for a really long time by
|
||||
// searching for powers of two between 0 and max_value.
|
||||
// Our initial max_value guess for something that will
|
||||
// take about 60 seconds is 0xffff.
|
||||
uint64_t max_value = 0xffff;
|
||||
time_t t1 = 0, t2 = 0;
|
||||
uint32_t count = 0;
|
||||
|
||||
// Find out what max value takes more than 60 seconds when running
|
||||
// outside the enclave.
|
||||
while ((t2 - t1) < 60)
|
||||
{
|
||||
if ((t2 - t1) < 30)
|
||||
max_value *= 4;
|
||||
else
|
||||
max_value *= 2;
|
||||
|
||||
t1 = time(NULL);
|
||||
count = count_powers_of_two(0, max_value);
|
||||
t2 = time(NULL);
|
||||
printf("There are %u powers of two between 0 and %p (calculated outside the enclave)\n", count, (void*)max_value);
|
||||
printf("\tIt took %u seconds to compute\n", (uint32_t)(t2 - t1));
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
// Now we have a good idea of something that should take at least 60 seconds
|
||||
// Make an ECALL for the same function with AEX Enabled. The function
|
||||
// will also count the number of times it its AEX handler was called back.
|
||||
count = 0;
|
||||
uint64_t aex_count = 0;
|
||||
t1 = time(NULL);
|
||||
sgx_status_t status = count_powers_of_two_with_aex(global_eid, 0, max_value, &count, &aex_count);
|
||||
t2 = time(NULL);
|
||||
if (status != SGX_SUCCESS)
|
||||
{
|
||||
printf("count_powers_of_two_with_aex returned %#x\n", status);
|
||||
print_error_message(status);
|
||||
return -1;
|
||||
}
|
||||
printf("There are %u powers of two between 0 and %p (calculated inside the enclave)\n", count, (void*)max_value);
|
||||
printf("\tIt took %u seconds to compute\n", (uint32_t)(t2 - t1));
|
||||
printf("\tWe counted %lu async enclave exits during this time period. \n", aex_count);
|
||||
|
||||
/* Destroy the enclave */
|
||||
sgx_destroy_enclave(global_eid);
|
||||
|
||||
printf("Info: SampleAEXNotify successfully returned.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _APP_H_
|
||||
#define _APP_H_
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "sgx_error.h" /* sgx_status_t */
|
||||
#include "sgx_eid.h" /* sgx_enclave_id_t */
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
# define FALSE 0
|
||||
#endif
|
||||
|
||||
# define TOKEN_FILENAME "enclave.token"
|
||||
# define ENCLAVE_FILENAME "enclave.signed.so"
|
||||
|
||||
extern sgx_enclave_id_t global_eid; /* global enclave id */
|
||||
|
||||
#endif /* !_APP_H_ */
|
||||
@@ -0,0 +1,13 @@
|
||||
<EnclaveConfiguration>
|
||||
<ProdID>0</ProdID>
|
||||
<ISVSVN>0</ISVSVN>
|
||||
<StackMaxSize>0x40000</StackMaxSize>
|
||||
<HeapMaxSize>0x100000</HeapMaxSize>
|
||||
<TCSNum>10</TCSNum>
|
||||
<TCSPolicy>1</TCSPolicy>
|
||||
<EnableAEXNotify>1</EnableAEXNotify>
|
||||
<!-- Recommend changing 'DisableDebug' to 1 to make the enclave undebuggable for enclave release -->
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "Enclave.h"
|
||||
#include "Enclave_t.h" /* print_string */
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h> /* vsnprintf */
|
||||
#include <string.h>
|
||||
#include <sgx_trts_exception.h>
|
||||
#include <sgx_trts_aex.h>
|
||||
#include <sgx_trts.h>
|
||||
|
||||
#include "powers_of_two.h"
|
||||
|
||||
void count_powers_of_two(uint64_t low, uint64_t high, uint32_t* count)
|
||||
{
|
||||
if(!count) return;
|
||||
const uint32_t local_count = count_powers_of_two(low,high);
|
||||
*count = local_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* printf:
|
||||
* Invokes OCALL to display the enclave buffer to the terminal.
|
||||
*/
|
||||
int printf(const char* fmt, ...)
|
||||
{
|
||||
char buf[BUFSIZ] = { '\0' };
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, BUFSIZ, fmt, ap);
|
||||
va_end(ap);
|
||||
ocall_print_string(buf);
|
||||
return (int)strnlen(buf, BUFSIZ - 1) + 1;
|
||||
}
|
||||
|
||||
uint64_t g_aex_count = 0;
|
||||
|
||||
static void my_aex_notify_handler(const sgx_exception_info_t *info, const void * args)
|
||||
{
|
||||
// This sample will not perform any additional mitigations beyond what the trts
|
||||
// does. It will do some simple counting.
|
||||
(void)info;
|
||||
(void)args;
|
||||
g_aex_count++;
|
||||
}
|
||||
|
||||
// Count the number of powers of two between [low, high].
|
||||
// Also count the number of times our AEX-Notify handler was called.
|
||||
// If the function runs long enough, normal OS preemptive multitasking
|
||||
// should generate an AEX.
|
||||
// You can use additional threads and thread affinity to change the OS
|
||||
// behavior and induce more async enclave exits as needed.
|
||||
void count_powers_of_two_with_aex(uint64_t low, uint64_t high, uint32_t* count, uint64_t* aex_count)
|
||||
{
|
||||
if(!count) return;
|
||||
if(!aex_count) return;
|
||||
|
||||
g_aex_count = 0;
|
||||
|
||||
const char* args = NULL;
|
||||
sgx_aex_mitigation_node_t node;
|
||||
|
||||
sgx_register_aex_handler(&node, my_aex_notify_handler, (const void*)args);
|
||||
sgx_set_ssa_aexnotify(1);
|
||||
|
||||
const uint32_t local_count = count_powers_of_two(low,high);
|
||||
*count = local_count;
|
||||
|
||||
sgx_set_ssa_aexnotify(0);
|
||||
sgx_unregister_aex_handler(my_aex_notify_handler);
|
||||
|
||||
*aex_count = g_aex_count;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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 {
|
||||
|
||||
trusted {
|
||||
/*
|
||||
* count_powers_of_two_with_aex - Counts the number of powers of two between low and high, and also
|
||||
* the number of async enclave exits during this process.
|
||||
*/
|
||||
public void count_powers_of_two_with_aex(uint64_t low, uint64_t high, [out] uint32_t* count, [out] uint64_t* aex_count);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* 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_print_string([in, string] const char *str);
|
||||
};
|
||||
|
||||
};
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ENCLAVE_H_
|
||||
#define _ENCLAVE_H_
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int printf(const char* fmt, ...);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_ENCLAVE_H_ */
|
||||
@@ -0,0 +1,11 @@
|
||||
enclave.so
|
||||
{
|
||||
global:
|
||||
g_global_data_sim;
|
||||
g_global_data;
|
||||
enclave_entry;
|
||||
g_peak_heap_used;
|
||||
g_peak_rsrv_mem_committed;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#ifndef _POWERS_OF_TWO_H__
|
||||
#define _POWERS_OF_TWO_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static bool is_power_of_two(uint64_t x)
|
||||
{
|
||||
return ((x != 0) && !(x & (x - 1)));
|
||||
}
|
||||
|
||||
// The not fastest way to calculate the number of powers of two between [low, high]
|
||||
static uint32_t count_powers_of_two(uint64_t low, uint64_t high)
|
||||
{
|
||||
|
||||
uint32_t num = 0;
|
||||
for (uint64_t i = low; i <= high; i++)
|
||||
{
|
||||
if (is_power_of_two(i))
|
||||
num++;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
#endif /* !_POWERS_OF_TWO_H__ */
|
||||
@@ -0,0 +1,250 @@
|
||||
#
|
||||
# Copyright (C) 2011-2021 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.
|
||||
#
|
||||
#
|
||||
|
||||
######## SGX SDK Settings ########
|
||||
|
||||
SGX_SDK ?= /opt/intel/sgxsdk
|
||||
SGX_MODE ?= HW
|
||||
SGX_ARCH ?= x64
|
||||
SGX_DEBUG ?= 1
|
||||
|
||||
include $(SGX_SDK)/buildenv.mk
|
||||
|
||||
ifeq ($(shell getconf LONG_BIT), 32)
|
||||
SGX_ARCH := x86
|
||||
else ifeq ($(findstring -m32, $(CXXFLAGS)), -m32)
|
||||
SGX_ARCH := x86
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_ARCH), x86)
|
||||
SGX_COMMON_FLAGS := -m32
|
||||
SGX_LIBRARY_PATH := $(SGX_SDK)/lib
|
||||
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x86/sgx_sign
|
||||
SGX_EDGER8R := $(SGX_SDK)/bin/x86/sgx_edger8r
|
||||
else
|
||||
SGX_COMMON_FLAGS := -m64
|
||||
SGX_LIBRARY_PATH := $(SGX_SDK)/lib64
|
||||
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x64/sgx_sign
|
||||
SGX_EDGER8R := $(SGX_SDK)/bin/x64/sgx_edger8r
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
ifeq ($(SGX_PRERELEASE), 1)
|
||||
$(error Cannot set SGX_DEBUG and SGX_PRERELEASE at the same time!!)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(SGX_MODE), HW)
|
||||
$(error Only support HW mode for AEX Notify!!)
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
SGX_COMMON_FLAGS += -O0 -g
|
||||
else
|
||||
SGX_COMMON_FLAGS += -O2
|
||||
endif
|
||||
|
||||
SGX_COMMON_FLAGS += -Wall -Wextra -Winit-self -Wpointer-arith -Wreturn-type \
|
||||
-Waddress -Wsequence-point -Wformat-security \
|
||||
-Wmissing-include-dirs -Wfloat-equal -Wundef -Wshadow \
|
||||
-Wcast-align -Wcast-qual -Wconversion -Wredundant-decls
|
||||
SGX_COMMON_CFLAGS := $(SGX_COMMON_FLAGS) -Wjump-misses-init -Wstrict-prototypes -Wunsuffixed-float-constants
|
||||
SGX_COMMON_CXXFLAGS := $(SGX_COMMON_FLAGS) -Wnon-virtual-dtor -std=c++11
|
||||
|
||||
######## App Settings ########
|
||||
|
||||
Urts_Library_Name := sgx_urts
|
||||
|
||||
App_Cpp_Files := App/App.cpp
|
||||
App_Include_Paths := -IInclude -IApp -I$(SGX_SDK)/include
|
||||
|
||||
App_C_Flags := -fPIC -Wno-attributes $(App_Include_Paths)
|
||||
|
||||
# Three configuration modes - Debug, prerelease, release
|
||||
# Debug - Macro DEBUG enabled.
|
||||
# Prerelease - Macro NDEBUG and EDEBUG enabled.
|
||||
# Release - Macro NDEBUG enabled.
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
App_C_Flags += -DDEBUG -UNDEBUG -UEDEBUG
|
||||
else ifeq ($(SGX_PRERELEASE), 1)
|
||||
App_C_Flags += -DNDEBUG -DEDEBUG -UDEBUG
|
||||
else
|
||||
App_C_Flags += -DNDEBUG -UEDEBUG -UDEBUG
|
||||
endif
|
||||
|
||||
App_Cpp_Flags := $(App_C_Flags)
|
||||
App_Link_Flags := -L$(SGX_LIBRARY_PATH) -l$(Urts_Library_Name) -lpthread
|
||||
|
||||
App_Cpp_Objects := $(App_Cpp_Files:.cpp=.o)
|
||||
|
||||
App_Name := app
|
||||
|
||||
######## Enclave Settings ########
|
||||
|
||||
Trts_Library_Name := sgx_trts
|
||||
Service_Library_Name := sgx_tservice
|
||||
|
||||
Crypto_Library_Name := sgx_tcrypto
|
||||
|
||||
Enclave_Cpp_Files := Enclave/Enclave.cpp
|
||||
Enclave_Include_Paths := -IInclude -IEnclave -I$(SGX_SDK)/include -I$(SGX_SDK)/include/tlibc -I$(SGX_SDK)/include/libcxx
|
||||
|
||||
Enclave_C_Flags := $(Enclave_Include_Paths) -nostdinc -fvisibility=hidden -fpie -ffunction-sections -fdata-sections $(MITIGATION_CFLAGS)
|
||||
CC_BELOW_4_9 := $(shell expr "`$(CC) -dumpversion`" \< "4.9")
|
||||
ifeq ($(CC_BELOW_4_9), 1)
|
||||
Enclave_C_Flags += -fstack-protector
|
||||
else
|
||||
Enclave_C_Flags += -fstack-protector-strong
|
||||
endif
|
||||
|
||||
Enclave_Cpp_Flags := $(Enclave_C_Flags) -nostdinc++
|
||||
|
||||
# Enable the security flags
|
||||
Enclave_Security_Link_Flags := -Wl,-z,relro,-z,now,-z,noexecstack
|
||||
|
||||
# To generate a proper enclave, it is recommended to follow below guideline to link the trusted libraries:
|
||||
# 1. Link sgx_trts with the `--whole-archive' and `--no-whole-archive' options,
|
||||
# so that the whole content of trts is included in the enclave.
|
||||
# 2. For other libraries, you just need to pull the required symbols.
|
||||
# Use `--start-group' and `--end-group' to link these libraries.
|
||||
# Do NOT move the libraries linked with `--start-group' and `--end-group' within `--whole-archive' and `--no-whole-archive' options.
|
||||
# Otherwise, you may get some undesirable errors.
|
||||
Enclave_Link_Flags := $(MITIGATION_LDFLAGS) $(Enclave_Security_Link_Flags) \
|
||||
-Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_TRUSTED_LIBRARY_PATH) \
|
||||
-Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \
|
||||
-Wl,--start-group -lsgx_tstdc -lsgx_tcxx -l$(Crypto_Library_Name) -l$(Service_Library_Name) -Wl,--end-group \
|
||||
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
|
||||
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \
|
||||
-Wl,--defsym,__ImageBase=0 -Wl,--gc-sections \
|
||||
-Wl,--version-script=Enclave/Enclave.lds
|
||||
|
||||
Enclave_Cpp_Objects := $(sort $(Enclave_Cpp_Files:.cpp=.o))
|
||||
|
||||
Enclave_Name := enclave.so
|
||||
Signed_Enclave_Name := enclave.signed.so
|
||||
Enclave_Config_File := Enclave/Enclave.config.xml
|
||||
Enclave_Test_Key := Enclave/Enclave_private_test.pem
|
||||
|
||||
ifeq ($(SGX_MODE), HW)
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
Build_Mode = HW_DEBUG
|
||||
else ifeq ($(SGX_PRERELEASE), 1)
|
||||
Build_Mode = HW_PRERELEASE
|
||||
else
|
||||
Build_Mode = HW_RELEASE
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
.PHONY: all target run
|
||||
all: .config_$(Build_Mode)_$(SGX_ARCH)
|
||||
@$(MAKE) target
|
||||
|
||||
ifeq ($(Build_Mode), HW_RELEASE)
|
||||
target: $(App_Name) $(Enclave_Name)
|
||||
@echo "The project has been built in release hardware mode."
|
||||
@echo "Please sign the $(Enclave_Name) first with your signing key before you run the $(App_Name) to launch and access the enclave."
|
||||
@echo "To sign the enclave use the command:"
|
||||
@echo " $(SGX_ENCLAVE_SIGNER) sign -key <your key> -enclave $(Enclave_Name) -out <$(Signed_Enclave_Name)> -config $(Enclave_Config_File)"
|
||||
@echo "You can also sign the enclave using an external signing tool."
|
||||
|
||||
else
|
||||
target: $(App_Name) $(Signed_Enclave_Name)
|
||||
ifeq ($(Build_Mode), HW_DEBUG)
|
||||
@echo "The project has been built in debug hardware mode."
|
||||
else ifeq ($(Build_Mode), HW_PRERELEASE)
|
||||
@echo "The project has been built in pre-release hardware mode."
|
||||
endif
|
||||
endif
|
||||
|
||||
run: all
|
||||
ifneq ($(Build_Mode), HW_RELEASE)
|
||||
@$(CURDIR)/$(App_Name)
|
||||
@echo "RUN => $(App_Name) [$(SGX_MODE)|$(SGX_ARCH), OK]"
|
||||
endif
|
||||
|
||||
.config_$(Build_Mode)_$(SGX_ARCH):
|
||||
@rm -f .config_* $(App_Name) $(Enclave_Name) $(Signed_Enclave_Name) $(App_Cpp_Objects) App/Enclave_u.* $(Enclave_Cpp_Objects) Enclave/Enclave_t.*
|
||||
@touch .config_$(Build_Mode)_$(SGX_ARCH)
|
||||
|
||||
######## App Objects ########
|
||||
|
||||
App/Enclave_u.h: $(SGX_EDGER8R) Enclave/Enclave.edl
|
||||
@cd App && $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
||||
@echo "GEN => $@"
|
||||
|
||||
App/Enclave_u.c: App/Enclave_u.h
|
||||
|
||||
App/Enclave_u.o: App/Enclave_u.c
|
||||
@$(CC) $(SGX_COMMON_CFLAGS) $(App_C_Flags) -c $< -o $@
|
||||
@echo "CC <= $<"
|
||||
|
||||
App/%.o: App/%.cpp App/Enclave_u.h
|
||||
@$(CXX) $(SGX_COMMON_CXXFLAGS) $(App_Cpp_Flags) -c $< -o $@
|
||||
@echo "CXX <= $<"
|
||||
|
||||
$(App_Name): App/Enclave_u.o $(App_Cpp_Objects)
|
||||
@$(CXX) $^ -o $@ $(App_Link_Flags)
|
||||
@echo "LINK => $@"
|
||||
|
||||
######## Enclave Objects ########
|
||||
|
||||
Enclave/Enclave_t.h: $(SGX_EDGER8R) Enclave/Enclave.edl
|
||||
@cd Enclave && $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
||||
@echo "GEN => $@"
|
||||
|
||||
Enclave/Enclave_t.c: Enclave/Enclave_t.h
|
||||
|
||||
Enclave/Enclave_t.o: Enclave/Enclave_t.c
|
||||
@$(CC) $(SGX_COMMON_CFLAGS) $(Enclave_C_Flags) -c $< -o $@
|
||||
@echo "CC <= $<"
|
||||
|
||||
Enclave/%.o: Enclave/%.cpp Enclave/Enclave_t.h
|
||||
@$(CXX) $(SGX_COMMON_CXXFLAGS) $(Enclave_Cpp_Flags) -c $< -o $@
|
||||
@echo "CXX <= $<"
|
||||
|
||||
$(Enclave_Name): Enclave/Enclave_t.o $(Enclave_Cpp_Objects)
|
||||
@$(CXX) $^ -o $@ $(Enclave_Link_Flags)
|
||||
@echo "LINK => $@"
|
||||
|
||||
$(Signed_Enclave_Name): $(Enclave_Name)
|
||||
ifeq ($(wildcard $(Enclave_Test_Key)),)
|
||||
@echo "There is no enclave test key<Enclave_private_test.pem>."
|
||||
@echo "The project will generate a key<Enclave_private_test.pem> for test."
|
||||
@openssl genrsa -out $(Enclave_Test_Key) -3 3072
|
||||
endif
|
||||
@$(SGX_ENCLAVE_SIGNER) sign -key $(Enclave_Test_Key) -enclave $(Enclave_Name) -out $@ -config $(Enclave_Config_File)
|
||||
@echo "SIGN => $@"
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
clean:
|
||||
@rm -f .config_* $(App_Name) $(Enclave_Name) $(Signed_Enclave_Name) $(App_Cpp_Objects) App/Enclave_u.* $(Enclave_Cpp_Objects) Enclave/Enclave_t.* $(Enclave_Test_Key)
|
||||
@@ -0,0 +1,86 @@
|
||||
------------------------
|
||||
Purpose of SampleAEXNotify
|
||||
------------------------
|
||||
The project demonstrates the AEXNotify mitigation for Intel(R) Software Guard
|
||||
Extensions (Intel(R) SGX) SDK projects development.
|
||||
|
||||
------------------------------------
|
||||
Prerequisite of the Sample Code
|
||||
------------------------------------
|
||||
To enable AEX-Notify feature in an enclave, the hardware must support it
|
||||
and the in-kernel driver must be v6.2 or later.
|
||||
|
||||
------------------------------------
|
||||
How to Build/Execute the Sample Code
|
||||
------------------------------------
|
||||
1. Install Intel(R) SGX SDK for Linux* OS
|
||||
2. Make sure your environment is set:
|
||||
$ source ${sgx-sdk-install-path}/environment
|
||||
3. Build the project with the prepared Makefile:
|
||||
a. Hardware Mode, Debug build:
|
||||
1) Enclave with no mitigation:
|
||||
$ make
|
||||
2) Enclave with mitigations for indirects and returns only:
|
||||
$ make MITIGATION-CVE-2020-0551=CF
|
||||
3) Enclave with full mitigation:
|
||||
$ make MITIGATION-CVE-2020-0551=LOAD
|
||||
b. Hardware Mode, Pre-release build:
|
||||
1) Enclave with no mitigation:
|
||||
$ make SGX_PRERELEASE=1 SGX_DEBUG=0
|
||||
2) Enclave with mitigations for indirects and returns only:
|
||||
$ make SGX_PRERELEASE=1 SGX_DEBUG=0 MITIGATION-CVE-2020-0551=CF
|
||||
3) Enclave with full mitigation:
|
||||
$ make SGX_PRERELEASE=1 SGX_DEBUG=0 MITIGATION-CVE-2020-0551=LOAD
|
||||
c. Hardware Mode, Release build:
|
||||
1) Enclave with no mitigation:
|
||||
$ make SGX_DEBUG=0
|
||||
2) Enclave with mitigations for indirects and returns only:
|
||||
$ make SGX_DEBUG=0 MITIGATION-CVE-2020-0551=CF
|
||||
3) Enclave with full mitigation:
|
||||
$ make SGX_DEBUG=0 MITIGATION-CVE-2020-0551=LOAD
|
||||
4. Execute the binary directly:
|
||||
$ ./app
|
||||
5. Remember to "make clean" before switching build mode
|
||||
|
||||
------------------------------------------
|
||||
Explanation about Configuration Parameters
|
||||
------------------------------------------
|
||||
EnableAEXNotify
|
||||
|
||||
Enables the AEX-Notify feature in the enclave.
|
||||
|
||||
TCSMaxNum, TCSNum, TCSMinPool
|
||||
|
||||
These three parameters will determine whether a thread will be created
|
||||
dynamically when there is no available thread to do the work.
|
||||
|
||||
|
||||
StackMaxSize, StackMinSize
|
||||
|
||||
For a dynamically created thread, StackMinSize is the amount of stack available
|
||||
once the thread is created and StackMaxSize is the total amount of stack that
|
||||
thread can use. The gap between StackMinSize and StackMaxSize is the stack
|
||||
dynamically expanded as necessary at runtime.
|
||||
|
||||
For a static thread, only StackMaxSize is relevant which specifies the total
|
||||
amount of stack available to the thread.
|
||||
|
||||
|
||||
HeapMaxSize, HeapInitSize, HeapMinSize
|
||||
|
||||
HeapMinSize is the amount of heap available once the enclave is initialized.
|
||||
|
||||
HeapMaxSize is the total amount of heap an enclave can use. The gap between
|
||||
HeapMinSize and HeapMaxSize is the heap dynamically expanded as necessary
|
||||
at runtime.
|
||||
|
||||
HeapInitSize is here for compatibility.
|
||||
|
||||
|
||||
-------------------------------------------------
|
||||
Launch token initialization
|
||||
-------------------------------------------------
|
||||
If using libsgx-enclave-common or sgxpsw under version 2.4, an initialized variable launch_token needs to be passed as the 3rd parameter of API sgx_create_enclave. For example,
|
||||
|
||||
sgx_launch_token_t launch_token = {0};
|
||||
sgx_create_enclave(ENCLAVE_FILENAME, SGX_DEBUG_FLAG, launch_token, NULL, &global_eid, NULL);
|
||||
@@ -122,6 +122,7 @@ Note:
|
||||
running in this sample.
|
||||
The project has a pre-preparation script - prepare_sgxssl.sh to prepare the SgxSSL libraries and link to them in
|
||||
the Makefile.
|
||||
Note that script "prepare_sgxssl.sh" requires git installed and configured.
|
||||
- Limitation: No Simulation mode is supported.
|
||||
|
||||
### Running attested TLS server in loop
|
||||
|
||||
@@ -53,20 +53,20 @@ int get_pkey_by_rsa(EVP_PKEY *pk)
|
||||
e = BN_new();
|
||||
if (!e) {
|
||||
PRINT("BN_new failed\n");
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
res = BN_set_word(e, (BN_ULONG)RSA_F4);
|
||||
if (!res) {
|
||||
PRINT("BN_set_word failed (%d)\n", res);
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
rsa = RSA_new();
|
||||
if (!rsa) {
|
||||
PRINT("RSA_new failed\n");
|
||||
res = -1;
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
res = RSA_generate_key_ex(
|
||||
@@ -79,12 +79,15 @@ int get_pkey_by_rsa(EVP_PKEY *pk)
|
||||
if (!res)
|
||||
{
|
||||
PRINT("RSA_generate_key failed (%d)\n", res);
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
// Assign RSA key to EVP_PKEY structure
|
||||
EVP_PKEY_assign_RSA(pk, rsa);
|
||||
|
||||
done:
|
||||
if (e)
|
||||
BN_clear_free(e);
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -100,14 +103,14 @@ int get_pkey_by_ec(EVP_PKEY *pk)
|
||||
if (res <= 0)
|
||||
{
|
||||
PRINT("EC_generate_key failed (%d)\n", res);
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
res = EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_secp384r1);
|
||||
if (res <= 0)
|
||||
{
|
||||
PRINT("EC_generate_key failed (%d)\n", res);
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Generate key */
|
||||
@@ -115,9 +118,13 @@ int get_pkey_by_ec(EVP_PKEY *pk)
|
||||
if (res <= 0)
|
||||
{
|
||||
PRINT("EC_generate_key failed (%d)\n", res);
|
||||
return res;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (ctx)
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,9 +35,9 @@ project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
echo "project_dir is $project_dir"
|
||||
sgxssl_dir=$project_dir/sgxssl
|
||||
openssl_out_dir=$sgxssl_dir/openssl_source
|
||||
openssl_ver_name=openssl-1.1.1q
|
||||
sgxssl_github_archive=https://github.com/01org/intel-sgx-ssl/archive
|
||||
sgxssl_file_name=support_tls_lin_1.1.1q
|
||||
openssl_ver_name=openssl-1.1.1t
|
||||
intel_sgx_ssl_url=https://github.com/intel/intel-sgx-ssl
|
||||
support_tls_branch=support_tls
|
||||
build_script=$sgxssl_dir/Linux/build_openssl.sh
|
||||
server_url_path=https://www.openssl.org/source
|
||||
full_openssl_url=$server_url_path/$openssl_ver_name.tar.gz
|
||||
@@ -56,22 +56,10 @@ if [ $debug == true ] ; then
|
||||
read -n 1 -p "download souce code only, because we need to build ourselves"
|
||||
fi
|
||||
|
||||
openssl_chksum=d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca
|
||||
sgxssl_chksum=0ab6f62bda33e760422d502ba4812d058e50516ebb82e6c7713c78f580a7d622
|
||||
rm -f check_sum_openssl.txt check_sum_sgxssl.txt
|
||||
openssl_chksum=8dee9b24bdb1dcbf0c3d1e9b02fb8f6bf22165e807f45adeb7c9677536859d3b
|
||||
rm -f check_sum_openssl.txt
|
||||
if [ ! -f $build_script ]; then
|
||||
wget $sgxssl_github_archive/$sgxssl_file_name.zip -P $sgxssl_dir/ || exit 1
|
||||
sha256sum $sgxssl_dir/$sgxssl_file_name.zip > $sgxssl_dir/check_sum_sgxssl.txt
|
||||
grep $sgxssl_chksum $sgxssl_dir/check_sum_sgxssl.txt
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "File $sgxssl_dir/$sgxssl_file_name.zip checksum failure"
|
||||
rm -f $sgxssl_dir/$sgxssl_file_name.zip
|
||||
exit -1
|
||||
fi
|
||||
unzip -qq $sgxssl_dir/$sgxssl_file_name.zip -d $sgxssl_dir/ || exit 1
|
||||
mv $sgxssl_dir/intel-sgx-ssl-$sgxssl_file_name/* $sgxssl_dir/ || exit 1
|
||||
rm $sgxssl_dir/$sgxssl_file_name.zip || exit 1
|
||||
rm -rf $sgxssl_dir/intel-sgx-ssl-$sgxssl_file_name || exit 1
|
||||
git clone $intel_sgx_ssl_url -b $support_tls_branch $sgxssl_dir || exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f $openssl_out_dir/$openssl_ver_name.tar.gz ]; then
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# Copyright (C) 2011-2021 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.
|
||||
#
|
||||
#
|
||||
|
||||
include ../sgxenv.mk
|
||||
|
||||
all: server
|
||||
|
||||
server:
|
||||
$(CXX) -c -DTDX_ENV -DCLIENT_USE_QVL $(App_Cpp_Flags) server.cpp openssl_server.cpp ../common/verify_callback.cpp ../common/utility.cpp ../common/openssl_utility.cpp ../common/err_msg.cpp
|
||||
$(CXX) -o tls_server server.o openssl_server.o verify_callback.o utility.o openssl_utility.o err_msg.o $(App_Link_Flags) -lssl -ltdx_tls -lsgx_dcap_quoteverify -l:libtdx_attest.so.1
|
||||
|
||||
clean:
|
||||
rm -f tls_server *.o
|
||||
@@ -0,0 +1,238 @@
|
||||
/**
|
||||
*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) Open Enclave SDK contributors.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE
|
||||
*
|
||||
*/
|
||||
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/ssl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#include "../common/openssl_utility.h"
|
||||
|
||||
int set_up_tls_server(char* server_port, bool keep_server_up);
|
||||
|
||||
int verify_callback(int preverify_ok, X509_STORE_CTX* ctx);
|
||||
|
||||
int create_listener_socket(int port, int& server_socket)
|
||||
{
|
||||
int ret = -1;
|
||||
const int reuse = 1;
|
||||
struct sockaddr_in addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(port);
|
||||
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
server_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (server_socket < 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "socket creation failed\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (setsockopt(
|
||||
server_socket,
|
||||
SOL_SOCKET,
|
||||
SO_REUSEADDR,
|
||||
(const void*)&reuse,
|
||||
sizeof(reuse)) < 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "setsocket failed \n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (bind(server_socket, (struct sockaddr*)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "Unable to bind socket to the port\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (listen(server_socket, 20) < 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "Unable to open socket for listening\n");
|
||||
goto exit;
|
||||
}
|
||||
ret = 0;
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int handle_communication_until_done(
|
||||
int& server_socket_fd,
|
||||
int& client_socket_fd,
|
||||
SSL_CTX*& ssl_server_ctx,
|
||||
SSL*& ssl_session,
|
||||
bool keep_server_up)
|
||||
{
|
||||
int ret = -1;
|
||||
int test_error = 1;
|
||||
waiting_for_connection_request:
|
||||
|
||||
struct sockaddr_in addr;
|
||||
uint len = sizeof(addr);
|
||||
|
||||
// reset ssl_session and client_socket_fd to prepare for the new TLS
|
||||
// connection
|
||||
if (client_socket_fd > 0)
|
||||
{
|
||||
ret = close(client_socket_fd);
|
||||
if (ret != 0) {
|
||||
PRINT(TLS_SERVER "error closing client socket before starting a new TLS session.\n");
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
SSL_free(ssl_session);
|
||||
PRINT(TLS_SERVER " waiting for client connection\n");
|
||||
|
||||
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
|
||||
|
||||
if (client_socket_fd < 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "Unable to accept the client request\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
// create a new SSL structure for a connection
|
||||
if ((ssl_session = SSL_new(ssl_server_ctx)) == nullptr)
|
||||
{
|
||||
PRINT(TLS_SERVER
|
||||
"Unable to create a new SSL connection state object\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
SSL_set_fd(ssl_session, client_socket_fd);
|
||||
|
||||
// wait for a TLS/SSL client to initiate a TLS/SSL handshake
|
||||
|
||||
PRINT(TLS_SERVER "initiating a passive connect SSL_accept\n");
|
||||
test_error = SSL_accept(ssl_session);
|
||||
if (test_error <= 0)
|
||||
{
|
||||
PRINT(TLS_SERVER " SSL handshake failed, error(%d)(%d)\n",
|
||||
test_error, SSL_get_error(ssl_session, test_error));
|
||||
goto exit;
|
||||
}
|
||||
|
||||
PRINT(TLS_SERVER "<---- Read from client:\n");
|
||||
if (read_from_session_peer(
|
||||
ssl_session, CLIENT_PAYLOAD, CLIENT_PAYLOAD_SIZE) != 0)
|
||||
{
|
||||
PRINT(TLS_SERVER " Read from client failed\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
PRINT(TLS_SERVER "<---- Write to client:\n");
|
||||
if (write_to_session_peer(
|
||||
ssl_session, SERVER_PAYLOAD, strlen(SERVER_PAYLOAD)) != 0)
|
||||
{
|
||||
PRINT(TLS_SERVER " Write to client failed\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (keep_server_up)
|
||||
goto waiting_for_connection_request;
|
||||
|
||||
ret = 0;
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int set_up_tls_server(char* server_port, bool keep_server_up)
|
||||
{
|
||||
int ret = 0;
|
||||
int server_socket_fd;
|
||||
int client_socket_fd = -1;
|
||||
unsigned int server_port_number;
|
||||
|
||||
X509* certificate = nullptr;
|
||||
EVP_PKEY* pkey = nullptr;
|
||||
SSL_CONF_CTX* ssl_confctx = SSL_CONF_CTX_new();
|
||||
|
||||
SSL_CTX* ssl_server_ctx = nullptr;
|
||||
SSL* ssl_session = nullptr;
|
||||
if ((ssl_server_ctx = SSL_CTX_new(TLS_server_method())) == nullptr)
|
||||
{
|
||||
PRINT(TLS_SERVER "unable to create a new SSL context\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (initalize_ssl_context(ssl_confctx, ssl_server_ctx) != SGX_SUCCESS)
|
||||
{
|
||||
PRINT(TLS_SERVER "unable to create a initialize SSL context\n ");
|
||||
goto exit;
|
||||
}
|
||||
SSL_CTX_set_verify(ssl_server_ctx, SSL_VERIFY_PEER, &verify_callback);
|
||||
|
||||
if (load_tls_certificates_and_keys(ssl_server_ctx, certificate, pkey) != 0)
|
||||
{
|
||||
PRINT(TLS_SERVER
|
||||
" unable to load certificate and private key on the server\n ");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
server_port_number = (unsigned int)atoi(server_port); // convert to char* to int
|
||||
if (create_listener_socket(server_port_number, server_socket_fd) != 0)
|
||||
{
|
||||
PRINT(TLS_SERVER " unable to create listener socket on the server\n ");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
// handle communication
|
||||
ret = handle_communication_until_done(
|
||||
server_socket_fd,
|
||||
client_socket_fd,
|
||||
ssl_server_ctx,
|
||||
ssl_session,
|
||||
keep_server_up);
|
||||
if (ret != 0)
|
||||
{
|
||||
PRINT(TLS_SERVER "server communication error %d\n", ret);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
ret = close(client_socket_fd); // close the socket connections
|
||||
if (ret != 0)
|
||||
PRINT(TLS_SERVER "error closing client socket\n");
|
||||
ret = close(server_socket_fd);
|
||||
if (ret != 0)
|
||||
PRINT(TLS_SERVER "error closing server socket\n");
|
||||
|
||||
if (ssl_session)
|
||||
{
|
||||
SSL_shutdown(ssl_session);
|
||||
SSL_free(ssl_session);
|
||||
}
|
||||
if (ssl_server_ctx)
|
||||
SSL_CTX_free(ssl_server_ctx);
|
||||
if (ssl_confctx)
|
||||
SSL_CONF_CTX_free(ssl_confctx);
|
||||
if (certificate)
|
||||
X509_free(certificate);
|
||||
if (pkey)
|
||||
EVP_PKEY_free(pkey);
|
||||
return (ret);
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) Open Enclave SDK contributors.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define LOOP_OPTION "-server-in-loop"
|
||||
|
||||
int set_up_tls_server(char* server_port, bool keep_server_up);
|
||||
|
||||
int main(int argc, const char* argv[])
|
||||
{
|
||||
int ret = 1;
|
||||
char* server_port = NULL;
|
||||
int keep_server_up = 0; // should be bool type, 0 false, 1 true
|
||||
|
||||
/* Check argument count */
|
||||
if (argc != 2)
|
||||
{
|
||||
if (argc == 3)
|
||||
{
|
||||
if (strcmp(argv[2], LOOP_OPTION) != 0)
|
||||
{
|
||||
goto print_usage;
|
||||
}
|
||||
else
|
||||
{
|
||||
keep_server_up = 1;
|
||||
goto read_port;
|
||||
}
|
||||
}
|
||||
print_usage:
|
||||
printf(
|
||||
"Usage: %s -port:<port> [%s]\n",
|
||||
argv[0],
|
||||
LOOP_OPTION);
|
||||
return 1;
|
||||
}
|
||||
|
||||
read_port:
|
||||
// read port parameter
|
||||
{
|
||||
char* option = (char*)"-port:";
|
||||
size_t param_len = 0;
|
||||
param_len = strlen(option);
|
||||
if (strncmp(argv[1], option, param_len) == 0)
|
||||
{
|
||||
server_port = (char*)(argv[1] + param_len);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Unknown option %s\n", argv[1]);
|
||||
goto print_usage;
|
||||
}
|
||||
}
|
||||
printf("server port = %s\n", server_port);
|
||||
|
||||
printf("Host: calling setup_tls_server\n");
|
||||
ret = set_up_tls_server(server_port, keep_server_up);
|
||||
if (ret != 0)
|
||||
{
|
||||
printf("Host: setup_tls_server failed\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
printf("Host: %s \n", (ret == 0) ? "succeeded" : "failed");
|
||||
return ret;
|
||||
}
|
||||
@@ -3,6 +3,8 @@ Purpose of Deep Neural Network Library (DNNL)
|
||||
--------------------------
|
||||
The project demonstrates Intel(R) Deep Neural Network Library (DNNL) functions inside Intel(R) SGX environment
|
||||
|
||||
**NOTE**: The SampleDNNL project is validated under GNU Compiler Collection Version <= 9.4. High GCC versions are incompatible with the current version.
|
||||
|
||||
------------------------------------
|
||||
How to Build/Execute the Sample Code
|
||||
------------------------------------
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
|
||||
<!-- Recommend changing 'DisableDebug' to 1 to make the enclave undebuggable for enclave release -->
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
<MiscSelect>1</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFE</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
|
||||
@@ -20,6 +20,6 @@
|
||||
<TCSPolicy>1</TCSPolicy>
|
||||
<!-- Recommend changing 'DisableDebug' to 1 to make the enclave undebuggable for enclave release -->
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
<MiscSelect>1</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFE</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
|
||||
@@ -22,6 +22,6 @@
|
||||
|
||||
<!-- Recommend changing 'DisableDebug' to 1 to make the enclave undebuggable for enclave release -->
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
<MiscSelect>1</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFE</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
|
||||
@@ -18,6 +18,6 @@
|
||||
|
||||
<!-- Recommend changing 'DisableDebug' to 1 to make the enclave undebuggable for enclave release -->
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
<MiscSelect>1</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFE</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
|
||||
@@ -81,10 +81,20 @@ HeapMaxSize, HeapInitSize, HeapMinSize
|
||||
-------------------------------------------------
|
||||
Sample configuration files for the Sample Enclave
|
||||
-------------------------------------------------
|
||||
config.01.xml: There is no dynamic thread, no dynamic heap expansion.
|
||||
config.02.xml: There is no dynamic thread. But dynamic heap expansion can happen.
|
||||
config.03.xml: There are dynamic threads. For a dynamic thread, there's no stack expansion.
|
||||
config.04.xml: There are dynamic threads. For a dynamic thread, stack will expanded as necessary.
|
||||
Below configurations are applicable on EDMM supported platforms with either EDMM supported
|
||||
kernels or EDMM unsupported kernels. If the signed enclave is launched on an EDMM supported
|
||||
platform with an EDMM supported kernel, it will be loaded with EDMM enabled. The following
|
||||
configuration descriptions are only suitable for the case that the signed enclave is
|
||||
launched on an EDMM supported platform with an EDMM supported kernel:
|
||||
|
||||
config.01.xml: There is no dynamic thread, no dynamic heap expansion.
|
||||
config.02.xml: There is no dynamic thread. But dynamic heap expansion can happen.
|
||||
config.03.xml: There are dynamic threads. For a dynamic thread, there's no stack expansion.
|
||||
config.04.xml: There are dynamic threads. For a dynamic thread, stack will expanded as necessary.
|
||||
|
||||
Below configuration is only workable on EDMM supported platforms with EDMM supported kernels:
|
||||
|
||||
config.05.xml: There is a user region where users could operate on.
|
||||
|
||||
-------------------------------------------------
|
||||
Launch token initialization
|
||||
|
||||
@@ -0,0 +1,232 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
# include <unistd.h>
|
||||
# include <pwd.h>
|
||||
# define MAX_PATH FILENAME_MAX
|
||||
|
||||
#define FAIL_SHA 0x1
|
||||
#define FAIL_AES 0x2
|
||||
#define FAIL_ECDSA 0x4
|
||||
|
||||
#include "sgx_urts.h"
|
||||
#include "App.h"
|
||||
#include "Enclave_u.h"
|
||||
|
||||
/* Global EID shared by multiple threads */
|
||||
sgx_enclave_id_t global_eid = 0;
|
||||
|
||||
typedef struct _sgx_errlist_t {
|
||||
sgx_status_t err;
|
||||
const char *msg;
|
||||
const char *sug; /* Suggestion */
|
||||
} sgx_errlist_t;
|
||||
|
||||
/* Error code returned by sgx_create_enclave */
|
||||
static sgx_errlist_t sgx_errlist[] = {
|
||||
{
|
||||
SGX_ERROR_UNEXPECTED,
|
||||
"Unexpected error occurred.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_PARAMETER,
|
||||
"Invalid parameter.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_OUT_OF_MEMORY,
|
||||
"Out of memory.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_ENCLAVE_LOST,
|
||||
"Power transition occurred.",
|
||||
"Please refer to the sample \"PowerTransition\" for details."
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ENCLAVE,
|
||||
"Invalid enclave image.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ENCLAVE_ID,
|
||||
"Invalid enclave identification.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_SIGNATURE,
|
||||
"Invalid enclave signature.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_OUT_OF_EPC,
|
||||
"Out of EPC memory.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_NO_DEVICE,
|
||||
"Invalid SGX device.",
|
||||
"Please make sure SGX module is enabled in the BIOS, and install SGX driver afterwards."
|
||||
},
|
||||
{
|
||||
SGX_ERROR_MEMORY_MAP_CONFLICT,
|
||||
"Memory map conflicted.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_METADATA,
|
||||
"Invalid enclave metadata.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_DEVICE_BUSY,
|
||||
"SGX device was busy.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_VERSION,
|
||||
"Enclave version was invalid.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_INVALID_ATTRIBUTE,
|
||||
"Enclave was not authorized.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_ENCLAVE_FILE_ACCESS,
|
||||
"Can't open enclave file.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_NDEBUG_ENCLAVE,
|
||||
"The enclave is signed as product enclave, and can not be created as debuggable enclave.",
|
||||
NULL
|
||||
},
|
||||
{
|
||||
SGX_ERROR_MEMORY_MAP_FAILURE,
|
||||
"Failed to reserve memory for the enclave.",
|
||||
NULL
|
||||
},
|
||||
};
|
||||
|
||||
/* Check error conditions for loading enclave */
|
||||
void print_error_message(sgx_status_t ret)
|
||||
{
|
||||
size_t idx = 0;
|
||||
size_t ttl = sizeof sgx_errlist/sizeof sgx_errlist[0];
|
||||
|
||||
for (idx = 0; idx < ttl; idx++) {
|
||||
if(ret == sgx_errlist[idx].err) {
|
||||
if(NULL != sgx_errlist[idx].sug)
|
||||
printf("Info: %s\n", sgx_errlist[idx].sug);
|
||||
printf("Error: %s\n", sgx_errlist[idx].msg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (idx == ttl)
|
||||
printf("Error: Unexpected error occurred.\n");
|
||||
}
|
||||
|
||||
/* Initialize the enclave:
|
||||
* Call sgx_create_enclave to initialize an enclave instance
|
||||
*/
|
||||
int initialize_enclave(void)
|
||||
{
|
||||
sgx_status_t ret = SGX_ERROR_UNEXPECTED;
|
||||
|
||||
/* Call sgx_create_enclave to initialize an enclave instance */
|
||||
/* Debug Support: set 2nd parameter to 1 */
|
||||
ret = sgx_create_enclave(ENCLAVE_FILENAME, SGX_DEBUG_FLAG, NULL, NULL, &global_eid, NULL);
|
||||
if (ret != SGX_SUCCESS) {
|
||||
print_error_message(ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* OCall functions */
|
||||
void ocall_print_string(const char *str)
|
||||
{
|
||||
/* Proxy/Bridge will check the length and null-terminate
|
||||
* the input string to prevent buffer overflow.
|
||||
*/
|
||||
printf("%s", str);
|
||||
}
|
||||
|
||||
|
||||
/* Application entry */
|
||||
int SGX_CDECL main(int argc, char *argv[])
|
||||
{
|
||||
(void)(argc);
|
||||
(void)(argv);
|
||||
int result = 0xff;
|
||||
|
||||
/* Initialize the enclave */
|
||||
if(initialize_enclave() < 0){
|
||||
printf("Enter a character before exit ...\n");
|
||||
getchar();
|
||||
return -1;
|
||||
}
|
||||
|
||||
sgx_status_t status = ecall_mbedtls_crypto(global_eid, &result);
|
||||
if (status != SGX_SUCCESS) {
|
||||
printf("ERROR: ECall failed\n");
|
||||
print_error_message(status);
|
||||
printf("Enter a character before exit ...\n");
|
||||
getchar();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Destroy the enclave */
|
||||
sgx_destroy_enclave(global_eid);
|
||||
|
||||
printf("Info: MbedCrypto Sample completed.\n");
|
||||
|
||||
if ( 0 == result) {
|
||||
printf("Info: All test passed.\n");
|
||||
} else {
|
||||
if ( result & FAIL_SHA ) printf("ERROR: SHA256 test failed.\n");
|
||||
if ( result & FAIL_AES ) printf("ERROR: AES-CTR test failed.\n");
|
||||
if ( result & FAIL_ECDSA ) printf("ERROR: ECDSA test failed.\n");
|
||||
}
|
||||
printf("Enter a character before exit ...\n");
|
||||
getchar();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _APP_H_
|
||||
#define _APP_H_
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "sgx_error.h" /* sgx_status_t */
|
||||
#include "sgx_eid.h" /* sgx_enclave_id_t */
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
# define FALSE 0
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
# define ENCLAVE_FILENAME "enclave.signed.so"
|
||||
#endif
|
||||
|
||||
extern sgx_enclave_id_t global_eid; /* global enclave id */
|
||||
|
||||
#endif /* !_APP_H_ */
|
||||
@@ -0,0 +1,12 @@
|
||||
<!-- Please refer to User's Guide for the explanation of each field -->
|
||||
<EnclaveConfiguration>
|
||||
<ProdID>0</ProdID>
|
||||
<ISVSVN>0</ISVSVN>
|
||||
<StackMaxSize>0x40000</StackMaxSize>
|
||||
<HeapMaxSize>0x100000</HeapMaxSize>
|
||||
<TCSNum>10</TCSNum>
|
||||
<TCSPolicy>1</TCSPolicy>
|
||||
<DisableDebug>0</DisableDebug>
|
||||
<MiscSelect>0</MiscSelect>
|
||||
<MiscMask>0xFFFFFFFF</MiscMask>
|
||||
</EnclaveConfiguration>
|
||||
@@ -0,0 +1,312 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h> /* vsnprintf */
|
||||
#include <string.h>
|
||||
|
||||
#include "Enclave.h"
|
||||
#include "Enclave_t.h" /* print_string */
|
||||
#include "mbedtls/aes.h"
|
||||
#include "mbedtls/cipher.h"
|
||||
#include "mbedtls/entropy.h"
|
||||
#include "mbedtls/ctr_drbg.h"
|
||||
#include "mbedtls/ecdsa.h"
|
||||
#include "mbedtls/sha256.h"
|
||||
|
||||
#define FAIL_SHA 0x1
|
||||
#define FAIL_AES 0x2
|
||||
#define FAIL_ECDSA 0x4
|
||||
|
||||
#define mbedtls_printf printf
|
||||
|
||||
/*
|
||||
* printf:
|
||||
* Invokes OCALL to display the enclave buffer to the terminal.
|
||||
* 'printf' function is required for sgx protobuf logging module.
|
||||
*/
|
||||
int printf(const char *fmt, ...)
|
||||
{
|
||||
char buf[BUFSIZ] = {'\0'};
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buf, BUFSIZ, fmt, ap);
|
||||
va_end(ap);
|
||||
ocall_print_string(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mbedtls_crypto_sha256()
|
||||
{
|
||||
unsigned char output[65];
|
||||
memset(output, 0x00, 65);
|
||||
if (mbedtls_sha256( (const unsigned char*)"", 0, output, 0 ) != 0 )
|
||||
{
|
||||
mbedtls_printf ("SHA256 failed\n");
|
||||
return -1;
|
||||
} else {
|
||||
for (int i = 0; i < 32; i++)
|
||||
mbedtls_printf("%02x", output[i]);
|
||||
}
|
||||
mbedtls_printf("\nSHA256 PASSED\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mbedtls_crypto_aes_ctr_enc_dec_buf()
|
||||
{
|
||||
int ret = -1;
|
||||
size_t length = 49, outlen, total_len, i, block_size, iv_len;
|
||||
unsigned char key[64];
|
||||
unsigned char iv[16];
|
||||
unsigned char ad[13];
|
||||
unsigned char tag[16];
|
||||
unsigned char inbuf[64];
|
||||
unsigned char encbuf[64];
|
||||
unsigned char decbuf[64];
|
||||
|
||||
const mbedtls_cipher_info_t *cipher_info;
|
||||
mbedtls_cipher_context_t ctx_dec;
|
||||
mbedtls_cipher_context_t ctx_enc;
|
||||
|
||||
/*
|
||||
* Prepare contexts
|
||||
*/
|
||||
mbedtls_cipher_init( &ctx_dec );
|
||||
mbedtls_cipher_init( &ctx_enc );
|
||||
|
||||
memset( key, 0x2a, sizeof( key ) );
|
||||
|
||||
/* Check and get info structures */
|
||||
cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CTR);
|
||||
if( NULL == cipher_info ) goto exit;
|
||||
if( mbedtls_cipher_info_from_string( "AES-128-CTR" ) != cipher_info ) goto exit;
|
||||
if( strcmp( mbedtls_cipher_info_get_name( cipher_info ),
|
||||
"AES-128-CTR" ) != 0 ) goto exit;
|
||||
|
||||
/* Initialise enc and dec contexts */
|
||||
if( 0 != mbedtls_cipher_setup( &ctx_dec, cipher_info ) ) goto exit;
|
||||
if( 0 != mbedtls_cipher_setup( &ctx_enc, cipher_info ) ) goto exit;
|
||||
|
||||
if( 0 != mbedtls_cipher_setkey( &ctx_dec, key, 128, MBEDTLS_DECRYPT ) ) goto exit;
|
||||
if( 0 != mbedtls_cipher_setkey( &ctx_enc, key, 128, MBEDTLS_ENCRYPT ) ) goto exit;
|
||||
|
||||
/*
|
||||
* Do a few encode/decode cycles
|
||||
*/
|
||||
for( i = 0; i < 3; i++ )
|
||||
{
|
||||
memset( iv , 0x00 + (int)i, sizeof( iv ) );
|
||||
memset( ad, 0x10 + (int)i, sizeof( ad ) );
|
||||
memset( inbuf, 0x20 + (int)i, sizeof( inbuf ) );
|
||||
|
||||
memset( encbuf, 0, sizeof( encbuf ) );
|
||||
memset( decbuf, 0, sizeof( decbuf ) );
|
||||
memset( tag, 0, sizeof( tag ) );
|
||||
|
||||
iv_len = sizeof(iv);
|
||||
|
||||
if( 0 != mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) ) goto exit;
|
||||
if( 0 != mbedtls_cipher_set_iv( &ctx_enc, iv, iv_len ) ) goto exit;
|
||||
|
||||
if( 0 != mbedtls_cipher_reset( &ctx_dec ) ) goto exit;
|
||||
if( 0 != mbedtls_cipher_reset( &ctx_enc ) ) goto exit;
|
||||
|
||||
block_size = mbedtls_cipher_get_block_size( &ctx_enc );
|
||||
if( 0 == block_size ) goto exit;
|
||||
|
||||
/* encode length number of bytes from inbuf */
|
||||
if( 0 != mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) ) goto exit;
|
||||
total_len = outlen;
|
||||
|
||||
if( total_len != length ||
|
||||
( total_len % block_size == 0 &&
|
||||
total_len < length &&
|
||||
total_len + block_size > length ) ) goto exit;
|
||||
|
||||
if( 0 != mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) ) goto exit;
|
||||
total_len += outlen;
|
||||
|
||||
if( total_len != length ||
|
||||
( total_len % block_size == 0 &&
|
||||
total_len > length &&
|
||||
total_len <= length + block_size ) ) goto exit;
|
||||
|
||||
/* decode the previously encoded string */
|
||||
if( 0 != mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) ) goto exit;
|
||||
total_len = outlen;
|
||||
|
||||
if( total_len != length ||
|
||||
( total_len % block_size == 0 &&
|
||||
total_len < length &&
|
||||
total_len + block_size >= length ) ) goto exit;
|
||||
|
||||
if( 0 != mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) ) goto exit;
|
||||
total_len += outlen;
|
||||
|
||||
/* check result */
|
||||
if( total_len != length ) goto exit;
|
||||
if( 0 != memcmp(inbuf, decbuf, length) ) goto exit;
|
||||
}
|
||||
mbedtls_printf("AES-CTR PASSED\n");
|
||||
ret = 0;
|
||||
exit:
|
||||
mbedtls_cipher_free( &ctx_dec );
|
||||
mbedtls_cipher_free( &ctx_enc );
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define ECPARAMS MBEDTLS_ECP_DP_SECP192R1
|
||||
|
||||
static int mbedtls_crypto_ecdsa()
|
||||
{
|
||||
int ret = 1;
|
||||
mbedtls_ecdsa_context ctx_sign, ctx_verify;
|
||||
mbedtls_entropy_context entropy;
|
||||
mbedtls_ctr_drbg_context ctr_drbg;
|
||||
unsigned char message[100];
|
||||
unsigned char hash[32];
|
||||
unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
|
||||
size_t sig_len;
|
||||
const char *pers = "ecdsa";
|
||||
|
||||
mbedtls_ecdsa_init( &ctx_sign );
|
||||
mbedtls_ecdsa_init( &ctx_verify );
|
||||
mbedtls_ctr_drbg_init( &ctr_drbg );
|
||||
|
||||
memset( sig, 0, sizeof( sig ) );
|
||||
memset( message, 0x25, sizeof( message ) );
|
||||
|
||||
/*
|
||||
* Generate a key pair for signing
|
||||
*/
|
||||
mbedtls_printf( " . Seeding the random number generator..." );
|
||||
|
||||
mbedtls_entropy_init( &entropy );
|
||||
if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
|
||||
(const unsigned char *) pers,
|
||||
strlen( pers ) ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mbedtls_printf( " ok\n . Generating key pair..." );
|
||||
|
||||
if( ( ret = mbedtls_ecdsa_genkey( &ctx_sign, ECPARAMS,
|
||||
mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ecdsa_genkey returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mbedtls_printf( " ok (key size: %d bits)\n", (int) ctx_sign.MBEDTLS_PRIVATE(grp).pbits );
|
||||
|
||||
/*
|
||||
* Compute message hash
|
||||
*/
|
||||
mbedtls_printf( " . Computing message hash..." );
|
||||
|
||||
if( ( ret = mbedtls_sha256( message, sizeof( message ), hash, 0 ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_sha256 returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mbedtls_printf( " ok\n" );
|
||||
|
||||
/*
|
||||
* Sign message hash
|
||||
*/
|
||||
mbedtls_printf( " . Signing message hash..." );
|
||||
|
||||
if( ( ret = mbedtls_ecdsa_write_signature( &ctx_sign, MBEDTLS_MD_SHA256,
|
||||
hash, sizeof( hash ),
|
||||
sig, sizeof( sig ), &sig_len,
|
||||
mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ecdsa_write_signature returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
mbedtls_printf( " ok (signature length = %u)\n", (unsigned int) sig_len );
|
||||
|
||||
/*
|
||||
* Transfer public information to verifying context
|
||||
*
|
||||
* We could use the same context for verification and signatures, but we
|
||||
* chose to use a new one in order to make it clear that the verifying
|
||||
* context only needs the public key (Q), and not the private key (d).
|
||||
*/
|
||||
mbedtls_printf( " . Preparing verification context..." );
|
||||
|
||||
if( ( ret = mbedtls_ecp_group_copy( &ctx_verify.MBEDTLS_PRIVATE(grp), &ctx_sign.MBEDTLS_PRIVATE(grp) ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ecp_group_copy returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if( ( ret = mbedtls_ecp_copy( &ctx_verify.MBEDTLS_PRIVATE(Q), &ctx_sign.MBEDTLS_PRIVATE(Q) ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ecp_copy returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify signature
|
||||
*/
|
||||
mbedtls_printf( " ok\n . Verifying signature..." );
|
||||
|
||||
if( ( ret = mbedtls_ecdsa_read_signature( &ctx_verify,
|
||||
hash, sizeof( hash ),
|
||||
sig, sig_len ) ) != 0 )
|
||||
{
|
||||
mbedtls_printf( " failed\n ! mbedtls_ecdsa_read_signature returned %d\n", ret );
|
||||
goto exit;
|
||||
}
|
||||
|
||||
mbedtls_printf( " ok\nECDSA PASSED\n" );
|
||||
|
||||
exit:
|
||||
|
||||
mbedtls_ecdsa_free( &ctx_verify );
|
||||
mbedtls_ecdsa_free( &ctx_sign );
|
||||
mbedtls_ctr_drbg_free( &ctr_drbg );
|
||||
mbedtls_entropy_free( &entropy );
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ecall_mbedtls_crypto()
|
||||
{
|
||||
int ret = 0;
|
||||
if ( 0 != mbedtls_crypto_sha256()) ret |= FAIL_SHA;
|
||||
if ( 0 != mbedtls_crypto_aes_ctr_enc_dec_buf()) ret |= FAIL_AES;
|
||||
if ( 0 != mbedtls_crypto_ecdsa()) ret |= FAIL_ECDSA;
|
||||
return ret;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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_tstdc.edl" import *;
|
||||
trusted {
|
||||
public int ecall_mbedtls_crypto();
|
||||
};
|
||||
|
||||
/*
|
||||
* 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_print_string([in, string] const char *str);
|
||||
};
|
||||
|
||||
};
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (C) 2011-2021 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ENCLAVE_H_
|
||||
#define _ENCLAVE_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int printf(const char *fmt, ...);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* !_ENCLAVE_H_ */
|
||||
@@ -0,0 +1,9 @@
|
||||
enclave.so
|
||||
{
|
||||
global:
|
||||
g_global_data_sim;
|
||||
g_global_data;
|
||||
enclave_entry;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
enclave.so
|
||||
{
|
||||
global:
|
||||
g_global_data_sim;
|
||||
g_global_data;
|
||||
enclave_entry;
|
||||
g_peak_heap_used;
|
||||
g_peak_rsrv_mem_committed;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
@@ -0,0 +1,275 @@
|
||||
#
|
||||
# Copyright (C) 2011-2021 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.
|
||||
#
|
||||
#
|
||||
|
||||
######## SGX SDK Settings ########
|
||||
|
||||
SGX_SDK ?= /opt/intel/sgxsdk
|
||||
SGX_MODE ?= HW
|
||||
SGX_ARCH ?= x64
|
||||
SGX_DEBUG ?= 1
|
||||
|
||||
ifeq ($(shell getconf LONG_BIT), 32)
|
||||
SGX_ARCH := x86
|
||||
else ifeq ($(findstring -m32, $(CXXFLAGS)), -m32)
|
||||
SGX_ARCH := x86
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_ARCH), x86)
|
||||
SGX_COMMON_FLAGS := -m32
|
||||
SGX_LIBRARY_PATH := $(SGX_SDK)/lib
|
||||
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x86/sgx_sign
|
||||
SGX_EDGER8R := $(SGX_SDK)/bin/x86/sgx_edger8r
|
||||
else
|
||||
SGX_COMMON_FLAGS := -m64
|
||||
SGX_LIBRARY_PATH := $(SGX_SDK)/lib64
|
||||
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x64/sgx_sign
|
||||
SGX_EDGER8R := $(SGX_SDK)/bin/x64/sgx_edger8r
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
ifeq ($(SGX_PRERELEASE), 1)
|
||||
$(error Cannot set SGX_DEBUG and SGX_PRERELEASE at the same time!!)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
SGX_COMMON_FLAGS += -O0 -g
|
||||
else
|
||||
SGX_COMMON_FLAGS += -O2
|
||||
endif
|
||||
|
||||
SGX_COMMON_FLAGS += -Wall -Wextra -Winit-self -Wpointer-arith -Wreturn-type \
|
||||
-Waddress -Wsequence-point -Wformat-security \
|
||||
-Wmissing-include-dirs -Wfloat-equal -Wundef -Wshadow \
|
||||
-Wcast-align -Wcast-qual -Wconversion -Wredundant-decls
|
||||
SGX_COMMON_CFLAGS := $(SGX_COMMON_FLAGS) -Wjump-misses-init -Wstrict-prototypes -Wunsuffixed-float-constants
|
||||
SGX_COMMON_CXXFLAGS := $(SGX_COMMON_FLAGS) -Wnon-virtual-dtor -std=c++11
|
||||
|
||||
######## App Settings ########
|
||||
|
||||
ifneq ($(SGX_MODE), HW)
|
||||
Urts_Library_Name := sgx_urts_sim
|
||||
else
|
||||
Urts_Library_Name := sgx_urts
|
||||
endif
|
||||
|
||||
App_Cpp_Files := App/App.cpp
|
||||
App_Include_Paths := -IApp -I$(SGX_SDK)/include
|
||||
|
||||
App_C_Flags := -fPIC -Wno-attributes $(App_Include_Paths)
|
||||
|
||||
# Three configuration modes - Debug, prerelease, release
|
||||
# Debug - Macro DEBUG enabled.
|
||||
# Prerelease - Macro NDEBUG and EDEBUG enabled.
|
||||
# Release - Macro NDEBUG enabled.
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
App_C_Flags += -DDEBUG -UNDEBUG -UEDEBUG
|
||||
else ifeq ($(SGX_PRERELEASE), 1)
|
||||
App_C_Flags += -DNDEBUG -DEDEBUG -UDEBUG
|
||||
else
|
||||
App_C_Flags += -DNDEBUG -UEDEBUG -UDEBUG
|
||||
endif
|
||||
|
||||
App_Cpp_Flags := $(App_C_Flags)
|
||||
App_Link_Flags := -L$(SGX_LIBRARY_PATH) -l$(Urts_Library_Name) -lpthread
|
||||
|
||||
App_Cpp_Objects := $(App_Cpp_Files:.cpp=.o)
|
||||
|
||||
App_Name := app
|
||||
|
||||
######## Enclave Settings ########
|
||||
|
||||
Enclave_Version_Script := Enclave/Enclave_debug.lds
|
||||
ifeq ($(SGX_MODE), HW)
|
||||
ifneq ($(SGX_DEBUG), 1)
|
||||
ifneq ($(SGX_PRERELEASE), 1)
|
||||
# Choose to use 'Enclave.lds' for HW release mode
|
||||
Enclave_Version_Script = Enclave/Enclave.lds
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(SGX_MODE), HW)
|
||||
Trts_Library_Name := sgx_trts_sim
|
||||
Service_Library_Name := sgx_tservice_sim
|
||||
else
|
||||
Trts_Library_Name := sgx_trts
|
||||
Service_Library_Name := sgx_tservice
|
||||
endif
|
||||
Crypto_Library_Name := sgx_tcrypto
|
||||
|
||||
Enclave_Cpp_Files := Enclave/Enclave.cpp
|
||||
Enclave_Include_Paths := -IEnclave -I$(SGX_SDK)/include -I$(SGX_SDK)/include/libcxx -I$(SGX_SDK)/include/tlibc
|
||||
|
||||
Enclave_C_Flags := -nostdinc -fvisibility=hidden -fpie -fstack-protector $(Enclave_Include_Paths) -DPB_ENABLE_SGX
|
||||
Enclave_Cpp_Flags := $(Enclave_C_Flags) -nostdinc++
|
||||
|
||||
# Enable the security flags
|
||||
Enclave_Security_Link_Flags := -Wl,-z,relro,-z,now,-z,noexecstack
|
||||
|
||||
# To generate a proper enclave, it is recommended to follow below guideline to link the trusted libraries:
|
||||
# 1. Link sgx_trts with the `--whole-archive' and `--no-whole-archive' options,
|
||||
# so that the whole content of trts is included in the enclave.
|
||||
# 2. For other libraries, you just need to pull the required symbols.
|
||||
# Use `--start-group' and `--end-group' to link these libraries.
|
||||
# Do NOT move the libraries linked with `--start-group' and `--end-group' within `--whole-archive' and `--no-whole-archive' options.
|
||||
# Otherwise, you may get some undesirable errors.
|
||||
Enclave_Link_Flags := $(Enclave_Security_Link_Flags) \
|
||||
-Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_LIBRARY_PATH) \
|
||||
-Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \
|
||||
-Wl,--start-group -lsgx_tstdc -lsgx_tcxx -lsgx_mbedcrypto -lsgx_pthread -l$(Crypto_Library_Name) -l$(Service_Library_Name) -Wl,--end-group \
|
||||
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
|
||||
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \
|
||||
-Wl,--defsym,__ImageBase=0 \
|
||||
-Wl,--version-script=$(Enclave_Version_Script)
|
||||
|
||||
Enclave_Cpp_Objects := $(Enclave_Cpp_Files:.cpp=.o)
|
||||
|
||||
Enclave_Name := enclave.so
|
||||
Signed_Enclave_Name := enclave.signed.so
|
||||
Enclave_Config_File := Enclave/Enclave.config.xml
|
||||
Enclave_Test_Key := Enclave/Enclave_private_test.pem
|
||||
|
||||
ifeq ($(SGX_MODE), HW)
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
Build_Mode = HW_DEBUG
|
||||
else ifeq ($(SGX_PRERELEASE), 1)
|
||||
Build_Mode = HW_PRERELEASE
|
||||
else
|
||||
Build_Mode = HW_RELEASE
|
||||
endif
|
||||
else
|
||||
ifeq ($(SGX_DEBUG), 1)
|
||||
Build_Mode = SIM_DEBUG
|
||||
else ifeq ($(SGX_PRERELEASE), 1)
|
||||
Build_Mode = SIM_PRERELEASE
|
||||
else
|
||||
Build_Mode = SIM_RELEASE
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
.PHONY: all run target
|
||||
all: .config_$(Build_Mode)_$(SGX_ARCH)
|
||||
@$(MAKE) target
|
||||
|
||||
ifeq ($(Build_Mode), HW_RELEASE)
|
||||
target: $(App_Name) $(Enclave_Name)
|
||||
@echo "The project has been built in release hardware mode."
|
||||
@echo "Please sign the $(Enclave_Name) first with your signing key before you run the $(App_Name) to launch and access the enclave."
|
||||
@echo "To sign the enclave use the command:"
|
||||
@echo " $(SGX_ENCLAVE_SIGNER) sign -key <your key> -enclave $(Enclave_Name) -out <$(Signed_Enclave_Name)> -config $(Enclave_Config_File)"
|
||||
@echo "You can also sign the enclave using an external signing tool."
|
||||
@echo "To build the project in simulation mode set SGX_MODE=SIM. To build the project in prerelease mode set SGX_PRERELEASE=1 and SGX_MODE=HW."
|
||||
else
|
||||
target: $(App_Name) $(Signed_Enclave_Name)
|
||||
ifeq ($(Build_Mode), HW_DEBUG)
|
||||
@echo "The project has been built in debug hardware mode."
|
||||
else ifeq ($(Build_Mode), SIM_DEBUG)
|
||||
@echo "The project has been built in debug simulation mode."
|
||||
else ifeq ($(Build_Mode), HW_PRERELEASE)
|
||||
@echo "The project has been built in pre-release hardware mode."
|
||||
else ifeq ($(Build_Mode), SIM_PRERELEASE)
|
||||
@echo "The project has been built in pre-release simulation mode."
|
||||
else
|
||||
@echo "The project has been built in release simulation mode."
|
||||
endif
|
||||
endif
|
||||
|
||||
run: all
|
||||
ifneq ($(Build_Mode), HW_RELEASE)
|
||||
@$(CURDIR)/$(App_Name)
|
||||
@echo "RUN => $(App_Name) [$(SGX_MODE)|$(SGX_ARCH), OK]"
|
||||
endif
|
||||
|
||||
.config_$(Build_Mode)_$(SGX_ARCH):
|
||||
@rm -f .config_* $(App_Name) $(Enclave_Name) $(Signed_Enclave_Name) $(App_Cpp_Objects) App/Enclave_u.* $(Enclave_Cpp_Objects) Enclave/Enclave_t.*
|
||||
@touch .config_$(Build_Mode)_$(SGX_ARCH)
|
||||
|
||||
######## App Objects ########
|
||||
|
||||
App/Enclave_u.h: $(SGX_EDGER8R) Enclave/Enclave.edl
|
||||
@cd App && $(SGX_EDGER8R) --untrusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
||||
@echo "GEN => $@"
|
||||
|
||||
App/Enclave_u.c: App/Enclave_u.h
|
||||
|
||||
App/Enclave_u.o: App/Enclave_u.c
|
||||
@$(CC) $(SGX_COMMON_CFLAGS) $(App_C_Flags) -c $< -o $@
|
||||
@echo "CC <= $<"
|
||||
|
||||
App/%.o: App/%.cpp App/Enclave_u.h
|
||||
@$(CXX) $(SGX_COMMON_CXXFLAGS) $(App_Cpp_Flags) -c $< -o $@
|
||||
@echo "CXX <= $<"
|
||||
|
||||
$(App_Name): App/Enclave_u.o $(App_Cpp_Objects)
|
||||
@$(CXX) $^ -o $@ $(App_Link_Flags)
|
||||
@echo "LINK => $@"
|
||||
|
||||
######## Enclave Objects ########
|
||||
|
||||
Enclave/Enclave_t.h: $(SGX_EDGER8R) Enclave/Enclave.edl
|
||||
@cd Enclave && $(SGX_EDGER8R) --trusted ../Enclave/Enclave.edl --search-path ../Enclave --search-path $(SGX_SDK)/include
|
||||
@echo "GEN => $@"
|
||||
|
||||
Enclave/Enclave_t.c: Enclave/Enclave_t.h
|
||||
|
||||
Enclave/Enclave_t.o: Enclave/Enclave_t.c
|
||||
@$(CC) $(SGX_COMMON_CFLAGS) $(Enclave_C_Flags) -c $< -o $@
|
||||
@echo "CC <= $<"
|
||||
|
||||
Enclave/%.o: Enclave/%.cpp
|
||||
@$(CXX) $(SGX_COMMON_CXXFLAGS) $(Enclave_Cpp_Flags) -c $< -o $@
|
||||
@echo "CXX <= $<"
|
||||
|
||||
Enclave/%.o: Enclave/%.cc
|
||||
@$(CXX) $(SGX_COMMON_CXXFLAGS) $(Enclave_Cpp_Flags) -c $< -o $@
|
||||
@echo "CXX <= $<"
|
||||
|
||||
$(Enclave_Cpp_Objects): Enclave/Enclave_t.h
|
||||
|
||||
$(Enclave_Name): Enclave/Enclave_t.o $(Enclave_Cpp_Objects)
|
||||
@$(CXX) $^ -o $@ $(Enclave_Link_Flags)
|
||||
@echo "LINK => $@"
|
||||
|
||||
$(Signed_Enclave_Name): $(Enclave_Name)
|
||||
ifeq ($(wildcard $(Enclave_Test_Key)),)
|
||||
@echo "There is no enclave test key<Enclave_private_test.pem>."
|
||||
@echo "The project will generate a key<Enclave_private_test.pem> for test."
|
||||
@openssl genrsa -out $(Enclave_Test_Key) -3 3072
|
||||
endif
|
||||
@$(SGX_ENCLAVE_SIGNER) sign -key $(Enclave_Test_Key) -enclave $(Enclave_Name) -out $@ -config $(Enclave_Config_File)
|
||||
@echo "SIGN => $@"
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
clean:
|
||||
@rm -f .config_* $(App_Name) $(Enclave_Name) $(Signed_Enclave_Name) $(App_Cpp_Objects) App/Enclave_u.* $(Enclave_Cpp_Objects) Enclave/Enclave_t.* $(Enclave_Test_Key)
|
||||
@@ -0,0 +1,30 @@
|
||||
---------------------------
|
||||
Purpose of SampleMbedCrypto
|
||||
---------------------------
|
||||
The project demonstrates how to use Mbedtls cryptographic APIs inside SGX Enclaves.
|
||||
|
||||
------------------------------------
|
||||
How to Build/Execute the Sample Code
|
||||
------------------------------------
|
||||
1. Install Intel(R) SGX SDK for Linux* OS
|
||||
2. Enclave test key(two options):
|
||||
a. Install openssl first, then the project will generate a test key<Enclave_private_test.pem> automatically when you build the project.
|
||||
b. Rename your test key(3072-bit RSA private key) to <Enclave_private_test.pem> and put it under the <Enclave> folder.
|
||||
3. Make sure your environment is set:
|
||||
$ source ${sgx-sdk-install-path}/environment
|
||||
4. Build the project with the prepared Makefile:
|
||||
a. Hardware Mode, Debug build:
|
||||
$ make SGX_MODE=HW SGX_DEBUG=1
|
||||
b. Hardware Mode, Pre-release build:
|
||||
$ make SGX_MODE=HW SGX_PRERELEASE=1
|
||||
c. Hardware Mode, Release build:
|
||||
$ make SGX_MODE=HW
|
||||
d. Simulation Mode, Debug build:
|
||||
$ make SGX_MODE=SIM
|
||||
e. Simulation Mode, Pre-release build:
|
||||
$ make SGX_MODE=SIM SGX_PRERELEASE=1 SGX_DEBUG=0
|
||||
f. Simulation Mode, Release build:
|
||||
$ make SGX_MODE=SIM SGX_DEBUG=0
|
||||
5. Execute the binary directly:
|
||||
$ ./app
|
||||
6. Remember to "make clean" before switching build mode
|
||||
Reference in New Issue
Block a user