123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- #include "string.h"
- #include "stdlib.h"
- #include "stdio.h"
- #include "sgx_trts.h"
- #include "sgx_thread.h"
- #include "sgx_tseal.h"
- #include "Enclave_t.h"
- uint32_t g_secret;
- sgx_thread_mutex_t g_mutex = SGX_THREAD_MUTEX_INITIALIZER;
- static inline void free_allocated_memory(void *pointer)
- {
- if(pointer != NULL)
- {
- free(pointer);
- pointer = NULL;
- }
- }
- int initialize_enclave(struct sealed_buf_t *sealed_buf)
- {
-
- if(sealed_buf == NULL)
- {
- sgx_thread_mutex_lock(&g_mutex);
- g_secret = 0;
- sgx_thread_mutex_unlock(&g_mutex);
- return 0;
- }
-
-
- uint32_t len = sizeof(sgx_sealed_data_t) + sizeof(uint32_t);
-
- if(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index)] == NULL ||
- sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index + 1)] == NULL ||
- !sgx_is_outside_enclave(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index)], len) ||
- !sgx_is_outside_enclave(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index + 1)], len))
- {
- print("Incorrect input parameter(s).\n");
- return -1;
- }
-
- uint32_t unsealed_data = 0;
- uint32_t unsealed_data_length = sizeof(g_secret);
- uint8_t *plain_text = NULL;
- uint32_t plain_text_length = 0;
- uint8_t *temp_sealed_buf = (uint8_t *)malloc(len);
- if(temp_sealed_buf == NULL)
- {
- print("Out of memory.\n");
- return -1;
- }
- sgx_thread_mutex_lock(&g_mutex);
- memcpy(temp_sealed_buf, sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index)], len);
-
- sgx_status_t ret = sgx_unseal_data((sgx_sealed_data_t *)temp_sealed_buf, plain_text, &plain_text_length, (uint8_t *)&unsealed_data, &unsealed_data_length);
- if(ret == SGX_SUCCESS)
- {
- g_secret = unsealed_data;
- sgx_thread_mutex_unlock(&g_mutex);
- free_allocated_memory(temp_sealed_buf);
- return 0;
- }
- else
- {
- sgx_thread_mutex_unlock(&g_mutex);
- print("Failed to reinitialize the enclave.\n");
- free_allocated_memory(temp_sealed_buf);
- return -1;
- }
- }
- int increase_and_seal_data(size_t tid, struct sealed_buf_t* sealed_buf)
- {
- uint32_t sealed_len = sizeof(sgx_sealed_data_t) + sizeof(g_secret);
-
- if(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index)] == NULL ||
- sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index + 1)] == NULL ||
- !sgx_is_outside_enclave(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index)], sealed_len) ||
- !sgx_is_outside_enclave(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index + 1)], sealed_len))
- {
- print("Incorrect input parameter(s).\n");
- return -1;
- }
- char string_buf[BUFSIZ] = {'\0'};
- uint32_t temp_secret = 0;
- uint8_t *plain_text = NULL;
- uint32_t plain_text_length = 0;
- uint8_t *temp_sealed_buf = (uint8_t *)malloc(sealed_len);
- if(temp_sealed_buf == NULL)
- {
- print("Out of memory.\n");
- return -1;
- }
- memset(temp_sealed_buf, 0, sealed_len);
- sgx_thread_mutex_lock(&g_mutex);
-
- temp_secret = ++g_secret;
- sgx_status_t ret = sgx_seal_data(plain_text_length, plain_text, sizeof(g_secret), (uint8_t *)&g_secret, sealed_len, (sgx_sealed_data_t *)temp_sealed_buf);
- if(ret != SGX_SUCCESS)
- {
- sgx_thread_mutex_unlock(&g_mutex);
- print("Failed to seal data\n");
- free_allocated_memory(temp_sealed_buf);
- return -1;
- }
-
- memcpy(sealed_buf->sealed_buf_ptr[MOD2(sealed_buf->index + 1)], temp_sealed_buf, sealed_len);
- sealed_buf->index++;
- sgx_thread_mutex_unlock(&g_mutex);
- free_allocated_memory(temp_sealed_buf);
-
-
-
- snprintf(string_buf, BUFSIZ, "Thread %#x>: %u\n", (unsigned int)tid, (unsigned int)temp_secret);
- print(string_buf);
- return 0;
- }
|