123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- #include "sgx_utils.h"
- #include "util.h"
- #include <stdlib.h>
- #include <string.h>
- #include "se_memcpy.h"
- #include "trts_inst.h"
- #include "sgx_trts.h"
- #include "se_cdefs.h"
- SGX_ACCESS_VERSION(tservice, 2)
- sgx_status_t sgx_get_key(const sgx_key_request_t *key_request, sgx_key_128bit_t *key)
- {
- sgx_status_t err = SGX_ERROR_UNEXPECTED;
- void *buffer = NULL;
- size_t size = 0, buf_ptr =0;
- sgx_key_request_t *tmp_key_request = NULL;
- sgx_key_128bit_t *tmp_key = NULL;
- egetkey_status_t egetkey_status = EGETKEY_SUCCESS;
- int i = 0;
-
-
-
- if(!key_request || !sgx_is_within_enclave(key_request, sizeof(*key_request)))
- {
- err = SGX_ERROR_INVALID_PARAMETER;
- goto CLEANUP;
- }
- if (key_request->reserved1 != 0)
- {
- err = SGX_ERROR_INVALID_PARAMETER;
- goto CLEANUP;
- }
- for (i=0; i<SGX_KEY_REQUEST_RESERVED2_BYTES; ++i)
- {
- if (key_request->reserved2[i] != 0)
- {
- err = SGX_ERROR_INVALID_PARAMETER;
- goto CLEANUP;
- }
- }
-
- if(!key || !sgx_is_within_enclave(key, sizeof(*key)))
- {
- err = SGX_ERROR_INVALID_PARAMETER;
- goto CLEANUP;
- }
-
- if(key_request->key_policy & ~(SGX_KEYPOLICY_MRENCLAVE | SGX_KEYPOLICY_MRSIGNER))
- {
- err = SGX_ERROR_INVALID_PARAMETER;
- goto CLEANUP;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- size = ROUND_TO(sizeof(*key_request), KEY_REQUEST_ALIGN_SIZE) + ROUND_TO(sizeof(*key), KEY_ALIGN_SIZE);
- size += MAX(KEY_REQUEST_ALIGN_SIZE, KEY_ALIGN_SIZE) - 1;
- buffer = malloc(size);
- if(buffer == NULL)
- {
- err = SGX_ERROR_OUT_OF_MEMORY;
- goto CLEANUP;
- }
- memset(buffer, 0, size);
- buf_ptr = reinterpret_cast<size_t>(buffer);
- buf_ptr = ROUND_TO(buf_ptr, KEY_REQUEST_ALIGN_SIZE);
- tmp_key_request = reinterpret_cast<sgx_key_request_t *>(buf_ptr);
- buf_ptr += sizeof(*tmp_key_request);
- buf_ptr = ROUND_TO(buf_ptr, KEY_ALIGN_SIZE);
- tmp_key = reinterpret_cast<sgx_key_128bit_t *>(buf_ptr);
-
- memcpy_s(tmp_key_request, sizeof(*tmp_key_request), key_request, sizeof(*key_request));
-
- egetkey_status = (egetkey_status_t) do_egetkey(tmp_key_request, tmp_key);
- switch(egetkey_status)
- {
- case EGETKEY_SUCCESS:
- err = SGX_SUCCESS;
- break;
- case EGETKEY_INVALID_ATTRIBUTE:
- err = SGX_ERROR_INVALID_ATTRIBUTE;
- break;
- case EGETKEY_INVALID_CPUSVN:
- err = SGX_ERROR_INVALID_CPUSVN;
- break;
- case EGETKEY_INVALID_ISVSVN:
- err = SGX_ERROR_INVALID_ISVSVN;
- break;
- case EGETKEY_INVALID_KEYNAME:
- err = SGX_ERROR_INVALID_KEYNAME;
- break;
- default:
- err = SGX_ERROR_UNEXPECTED;
- break;
- }
- CLEANUP:
- if((SGX_SUCCESS != err) && (NULL != key))
- {
-
-
- sgx_read_rand(reinterpret_cast<uint8_t *>(key), sizeof(*key));
- }
- else if(NULL != key)
- {
-
- memcpy_s(key, sizeof(*key), tmp_key, sizeof(*tmp_key));
- }
-
- if(buffer)
- {
- memset_s(buffer, size, 0, size);
- free(buffer);
- }
- return err;
- }
|