aesm_logic.cpp 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008
  1. /*
  2. * Copyright (C) 2011-2017 Intel Corporation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in
  12. * the documentation and/or other materials provided with the
  13. * distribution.
  14. * * Neither the name of Intel Corporation nor the names of its
  15. * contributors may be used to endorse or promote products derived
  16. * from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. *
  30. */
  31. #include "QEClass.h"
  32. #include "LEClass.h"
  33. #include "PSEClass.h"
  34. #include "PVEClass.h"
  35. #include "PCEClass.h"
  36. #include "PSEPRClass.h"
  37. #include "arch.h"
  38. #include "sgx_report.h"
  39. #include "sgx_tseal.h"
  40. #include "epid_pve_type.h"
  41. #include "util.h"
  42. #include <assert.h>
  43. #include <time.h>
  44. #include "oal/oal.h"
  45. #include "oal/aesm_thread.h"
  46. #include "aesm_encode.h"
  47. #include "pairing_blob.h"
  48. #include "aesm_epid_blob.h"
  49. #include "aesm_xegd_blob.h"
  50. #include "aesm_logic.h"
  51. #include "pve_logic.h"
  52. #include "qe_logic.h"
  53. #include "pse_op_logic.h"
  54. #include "platform_info_logic.h"
  55. #include "prov_msg_size.h"
  56. #include "se_sig_rl.h"
  57. #include "se_quote_internal.h"
  58. #include "endpoint_select_info.h"
  59. #include "se_wrapper.h"
  60. #include "PSDAService.h"
  61. #include "ippcp.h"
  62. #include "ippcore.h"
  63. #include <time.h>
  64. #include <string>
  65. #include "ippcp.h"
  66. #include "ippcore.h"
  67. #include "prof_fun.h"
  68. #include "upse/helper.h"
  69. #include "aesm_long_lived_thread.h"
  70. #include "sgx_profile.h"
  71. #include "service_enclave_mrsigner.hh"
  72. #define __STDC_FORMAT_MACROS
  73. #include <inttypes.h>
  74. #define CHECK_SERVICE_STATUS if (!is_service_running()) return AESM_SERVICE_STOPPED;
  75. #define CHECK_SGX_STATUS if (g_sgx_device_status != SGX_ENABLED) return AESM_SGX_DEVICE_NOT_AVAILABLE;
  76. AESMLogicMutex AESMLogic::_qe_pve_mutex;
  77. AESMLogicMutex AESMLogic::_pse_mutex;
  78. AESMLogicMutex AESMLogic::_le_mutex;
  79. bool AESMLogic::_is_qe_psvn_set;
  80. bool AESMLogic::_is_pse_psvn_set;
  81. bool AESMLogic::_is_pce_psvn_set;
  82. psvn_t AESMLogic::_qe_psvn;
  83. psvn_t AESMLogic::_pce_psvn;
  84. psvn_t AESMLogic::_pse_psvn;
  85. aesm_thread_t AESMLogic::qe_thread = NULL;
  86. aesm_thread_t AESMLogic::pse_thread = NULL;
  87. uint32_t AESMLogic::active_extended_epid_group_id;
  88. static ae_error_t read_global_extended_epid_group_id(uint32_t *xeg_id)
  89. {
  90. char path_name[MAX_PATH];
  91. ae_error_t ae_ret = aesm_get_pathname(FT_PERSISTENT_STORAGE, EXTENDED_EPID_GROUP_ID_FID, path_name, MAX_PATH);
  92. if(AE_SUCCESS != ae_ret){
  93. return ae_ret;
  94. }
  95. FILE * f = fopen(path_name, "r");
  96. if( f == NULL){
  97. return OAL_CONFIG_FILE_ERROR;
  98. }
  99. ae_ret = OAL_CONFIG_FILE_ERROR;
  100. if(fscanf(f, "%" SCNu32, xeg_id)==1){
  101. ae_ret = AE_SUCCESS;
  102. }
  103. fclose(f);
  104. return ae_ret;
  105. }
  106. static ae_error_t set_global_extended_epid_group_id(uint32_t xeg_id)
  107. {
  108. char path_name[MAX_PATH];
  109. ae_error_t ae_ret = aesm_get_pathname(FT_PERSISTENT_STORAGE, EXTENDED_EPID_GROUP_ID_FID, path_name, MAX_PATH);
  110. if(AE_SUCCESS != ae_ret){
  111. return ae_ret;
  112. }
  113. FILE *f = fopen(path_name, "w");
  114. if(f == NULL){
  115. return OAL_CONFIG_FILE_ERROR;
  116. }
  117. ae_ret = OAL_CONFIG_FILE_ERROR;
  118. if(fprintf(f, "%" PRIu32, xeg_id)>0){
  119. ae_ret = AE_SUCCESS;
  120. }
  121. fclose(f);
  122. return ae_ret;
  123. }
  124. uint32_t AESMLogic::get_active_extended_epid_group_id()
  125. {
  126. return active_extended_epid_group_id;
  127. }
  128. static ae_error_t thread_to_load_qe(aesm_thread_arg_type_t arg)
  129. {
  130. epid_blob_with_cur_psvn_t epid_data;
  131. ae_error_t ae_ret = AE_FAILURE;
  132. UNUSED(arg);
  133. AESM_DBG_TRACE("start to load qe");
  134. memset(&epid_data, 0, sizeof(epid_data));
  135. AESMLogicLock lock(AESMLogic::_qe_pve_mutex);
  136. if((ae_ret = EPIDBlob::instance().read(epid_data)) == AE_SUCCESS)
  137. {
  138. AESM_DBG_TRACE("EPID blob is read successfully, loading QE ...");
  139. ae_ret = CQEClass::instance().load_enclave();
  140. if(AE_SUCCESS != ae_ret)
  141. {
  142. AESM_DBG_WARN("fail to load QE: %d", ae_ret);
  143. }else{
  144. AESM_DBG_TRACE("QE loaded successfully");
  145. bool resealed = false;
  146. se_static_assert(SGX_TRUSTED_EPID_BLOB_SIZE_SDK>=SGX_TRUSTED_EPID_BLOB_SIZE_SIK);
  147. // Just take this chance to reseal EPID blob in case TCB is
  148. // upgraded, return value is ignored and no provisioning is
  149. // triggered.
  150. ae_ret = static_cast<ae_error_t>(CQEClass::instance().verify_blob(
  151. epid_data.trusted_epid_blob,
  152. SGX_TRUSTED_EPID_BLOB_SIZE_SDK,
  153. &resealed));
  154. if(AE_SUCCESS != ae_ret)
  155. {
  156. AESM_DBG_WARN("Failed to verify EPID blob: %d", ae_ret);
  157. EPIDBlob::instance().remove();
  158. }else{
  159. uint32_t epid_xeid;
  160. // Check whether EPID blob XEGDID is aligned with active extended group id if it exists.
  161. if ((EPIDBlob::instance().get_extended_epid_group_id(&epid_xeid) == AE_SUCCESS) && (epid_xeid == AESMLogic::get_active_extended_epid_group_id())) {
  162. AESM_DBG_TRACE("EPID blob Verified");
  163. // XEGDID is aligned
  164. if (true == resealed)
  165. {
  166. AESM_DBG_TRACE("EPID blob is resealed");
  167. if ((ae_ret = EPIDBlob::instance().write(epid_data))
  168. != AE_SUCCESS)
  169. {
  170. AESM_DBG_WARN("Failed to update epid blob: %d", ae_ret);
  171. }
  172. }
  173. }
  174. else { // XEGDID is NOT aligned
  175. AESM_DBG_TRACE("XEGDID mismatch in EPIDBlob, remove it...");
  176. EPIDBlob::instance().remove();
  177. }
  178. }
  179. }
  180. }else{
  181. AESM_DBG_TRACE("Fail to read EPID Blob");
  182. }
  183. AESM_DBG_TRACE("QE Thread finished succ");
  184. return AE_SUCCESS;
  185. }
  186. static ae_error_t thread_to_init_pse(aesm_thread_arg_type_t arg)
  187. {
  188. UNUSED(arg);
  189. AESM_DBG_INFO("start to init_ps");
  190. AESMLogicLock lock(AESMLogic::_pse_mutex);
  191. ae_error_t psError = CPSEClass::instance().init_ps();
  192. UNUSED(psError);// To ignore the error that the symbol not used in release mode
  193. AESM_DBG_INFO("init_ps return ( ae %d)", psError);
  194. return AE_SUCCESS;
  195. }
  196. // Must be called when AESM starts
  197. ae_error_t AESMLogic::service_start()
  198. {
  199. AESM_PROFILE_INIT;
  200. ae_error_t ae_ret = AE_SUCCESS;
  201. AESM_LOG_INIT();
  202. #ifdef SGX_USE_OPT_LIB
  203. ippInit();
  204. #endif
  205. AESM_DBG_INFO("aesm service is starting");
  206. // Try to read active extended epid group id from data file
  207. ae_ret = read_global_extended_epid_group_id(&AESMLogic::active_extended_epid_group_id);
  208. if (AE_SUCCESS != ae_ret){
  209. AESM_DBG_INFO("Fail to read extended epid group id, default extended epid group used");
  210. AESMLogic::active_extended_epid_group_id = DEFAULT_EGID; // Use default extended epid group id 0 if it is not available from data file
  211. }
  212. else{
  213. AESM_DBG_INFO("active extended group id %d used", AESMLogic::active_extended_epid_group_id);
  214. }
  215. if (AE_SUCCESS != (XEGDBlob::verify_xegd_by_xgid(active_extended_epid_group_id)) ||
  216. AE_SUCCESS != (EndpointSelectionInfo::verify_file_by_xgid(active_extended_epid_group_id))){// Try to load XEGD and URL file to make sure it is valid
  217. AESM_LOG_WARN_ADMIN("%s", g_admin_event_string_table[SGX_ADMIN_EVENT_PCD_NOT_AVAILABLE]);
  218. AESM_LOG_WARN("%s: original extended epid group id = %d", g_event_string_table[SGX_EVENT_PCD_NOT_AVAILABLE], AESMLogic::active_extended_epid_group_id);
  219. AESMLogic::active_extended_epid_group_id = DEFAULT_EGID;// If the active extended epid group id read from data file is not valid, switch to default extended epid group id
  220. }
  221. ae_ret = CLEClass::instance().load_enclave();
  222. if(AE_SUCCESS != ae_ret)
  223. {
  224. AESM_DBG_INFO("fail to load LE: %d", ae_ret);
  225. AESM_LOG_FATAL("%s", g_event_string_table[SGX_EVENT_SERVICE_UNAVAILABLE]);
  226. return ae_ret;
  227. }
  228. ae_error_t aesm_ret1 = aesm_create_thread(thread_to_load_qe, 0,&qe_thread);
  229. ae_error_t aesm_ret2 = aesm_create_thread(thread_to_init_pse, 0, &pse_thread);
  230. if(AE_SUCCESS != aesm_ret1 ){
  231. AESM_DBG_WARN("Fail to create thread to preload QE:(ae %d)",aesm_ret1);
  232. }
  233. if(AE_SUCCESS != aesm_ret2 ){
  234. AESM_DBG_WARN("Fail to create thread to init PSE:( ae %d)",aesm_ret2);
  235. }
  236. start_white_list_thread();
  237. AESM_DBG_TRACE("aesm service is started");
  238. return AE_SUCCESS;
  239. }
  240. void AESMLogic::service_stop()
  241. {
  242. ae_error_t ae_ret, thread_ret;
  243. // Waiting for QE and PSE thread
  244. ae_ret = aesm_wait_thread(qe_thread, &thread_ret, AESM_STOP_TIMEOUT);
  245. if (ae_ret != AE_SUCCESS || thread_ret != AE_SUCCESS)
  246. {
  247. AESM_DBG_INFO("aesm_wait_thread failed(qe_thread):(ae %d) (%d)", ae_ret, thread_ret);
  248. }
  249. (void)aesm_free_thread(qe_thread);//release thread handle to free memory
  250. ae_ret = aesm_wait_thread(pse_thread, &thread_ret, AESM_STOP_TIMEOUT);
  251. if (ae_ret != AE_SUCCESS || thread_ret != AE_SUCCESS)
  252. {
  253. AESM_DBG_INFO("aesm_wait_thread failed(pse_thread):(ae %d) (%d)", ae_ret, thread_ret);
  254. }
  255. (void)aesm_free_thread(pse_thread);//release thread handle to free memory
  256. //waiting for pending threads util timeout
  257. stop_all_long_lived_threads(0);//waiting for pending threads util timeout
  258. CPVEClass::instance().unload_enclave();
  259. CPCEClass::instance().unload_enclave();
  260. CPSEClass::instance().unload_enclave();
  261. CQEClass::instance().unload_enclave();
  262. CLEClass::instance().unload_enclave();
  263. CPSEPRClass::instance().unload_enclave();
  264. AESM_DBG_INFO("start to stop psda service");
  265. PSDAService::instance().stop_service();
  266. AESM_DBG_INFO("aesm service down");
  267. AESM_LOG_FINI();
  268. AESM_PROFILE_OUTPUT;
  269. }
  270. bool AESMLogic::is_service_running()
  271. {
  272. return true;
  273. }
  274. ae_error_t AESMLogic::save_unverified_white_list(const uint8_t *white_list_cert, uint32_t white_list_cert_size)
  275. {
  276. wl_cert_chain_t old_cert;
  277. const wl_cert_chain_t *p_new_cert = reinterpret_cast<const wl_cert_chain_t *>(white_list_cert);
  278. uint32_t old_cert_size = sizeof(old_cert);
  279. memset(&old_cert, 0, sizeof(old_cert));
  280. if((aesm_read_data(FT_PERSISTENT_STORAGE, AESM_WHITE_LIST_CERT_TO_BE_VERIFY_FID, reinterpret_cast<uint8_t *>(&old_cert), &old_cert_size) == AE_SUCCESS)
  281. && (old_cert_size == sizeof(old_cert)) && (white_list_cert_size >= sizeof(wl_cert_chain_t)))
  282. {
  283. if(_ntohl(p_new_cert->wl_cert.wl_version) <= _ntohl(old_cert.wl_cert.wl_version))
  284. {
  285. AESM_DBG_WARN("White list version downgraded! current version is %d, new version is %d",
  286. _ntohl(old_cert.wl_cert.wl_version), _ntohl(p_new_cert->wl_cert.wl_version));
  287. return OAL_PARAMETER_ERROR; // OAL_PARAMETER_ERROR used here is to indicate the white list is incorrect
  288. }
  289. }
  290. return aesm_write_data(FT_PERSISTENT_STORAGE, AESM_WHITE_LIST_CERT_TO_BE_VERIFY_FID, white_list_cert, white_list_cert_size);
  291. }
  292. aesm_error_t AESMLogic::white_list_register(
  293. const uint8_t *white_list_cert, uint32_t white_list_cert_size)
  294. {
  295. AESM_DBG_INFO("enter function");
  296. AESM_LOG_INFO_ADMIN("%s", g_admin_event_string_table[SGX_ADMIN_EVENT_WL_UPDATE_START]);
  297. CHECK_SERVICE_STATUS;
  298. AESMLogicLock lock(_le_mutex);
  299. CHECK_SERVICE_STATUS;
  300. ae_error_t ret_le = AE_SUCCESS;
  301. aesm_error_t ret = AESM_UNEXPECTED_ERROR;
  302. if (NULL == white_list_cert||0==white_list_cert_size){
  303. AESM_DBG_TRACE("Invalid parameter");
  304. AESM_LOG_ERROR_ADMIN("%s", g_admin_event_string_table[SGX_ADMIN_EVENT_WL_UPDATE_FAIL]);
  305. return AESM_PARAMETER_ERROR;
  306. }
  307. ae_error_t ae_ret = CLEClass::instance().load_enclave();
  308. if (AE_FAILED(ae_ret))
  309. {
  310. switch (ae_ret)
  311. {
  312. case AE_SERVER_NOT_AVAILABLE:
  313. AESM_DBG_WARN("LE not loaded due to AE_SERVER_NOT_AVAILABLE, possible SGX Env Not Ready");
  314. ret_le = save_unverified_white_list(white_list_cert, white_list_cert_size);
  315. break;
  316. case AESM_AE_OUT_OF_EPC:
  317. AESM_DBG_WARN("LE not loaded due to out of EPC");
  318. ret = AESM_OUT_OF_EPC;
  319. goto exit;
  320. default:
  321. AESM_DBG_ERROR("LE not loaded:(ae%d)", ae_ret);
  322. ret = AESM_UNEXPECTED_ERROR;
  323. goto exit;
  324. }
  325. }
  326. else
  327. {
  328. ret_le = static_cast<ae_error_t>(CLEClass::instance().white_list_register(
  329. white_list_cert, white_list_cert_size));
  330. }
  331. switch (ret_le)
  332. {
  333. case AE_SUCCESS:
  334. ret = AESM_SUCCESS;
  335. break;
  336. case LE_INVALID_PARAMETER:
  337. AESM_DBG_TRACE("Invalid parameter");
  338. ret = AESM_PARAMETER_ERROR;
  339. break;
  340. default:
  341. AESM_DBG_WARN("unexpeted error (ae %d)", ret_le);
  342. ret = AESM_UNEXPECTED_ERROR;
  343. break;
  344. }
  345. exit:
  346. // Always log success or failure to the Admin log before returning
  347. if (AE_FAILED(ae_ret) || AE_FAILED(ret_le)) {
  348. AESM_LOG_ERROR_ADMIN("%s", g_admin_event_string_table[SGX_ADMIN_EVENT_WL_UPDATE_FAIL]);
  349. } else {
  350. const wl_cert_chain_t* wl = reinterpret_cast<const wl_cert_chain_t*>(white_list_cert);
  351. AESM_LOG_INFO_ADMIN("%s for Version: %d", g_admin_event_string_table[SGX_ADMIN_EVENT_WL_UPDATE_SUCCESS],
  352. _ntohl(wl->wl_cert.wl_version));
  353. }
  354. return ret;
  355. }
  356. aesm_error_t AESMLogic::get_launch_token(
  357. const uint8_t * mrenclave, uint32_t mrenclave_size,
  358. const uint8_t *public_key, uint32_t public_key_size,
  359. const uint8_t *se_attributes, uint32_t se_attributes_size,
  360. uint8_t * lictoken, uint32_t lictoken_size)
  361. {
  362. AESM_DBG_INFO("enter function");
  363. CHECK_SERVICE_STATUS;
  364. AESMLogicLock lock(_le_mutex);
  365. CHECK_SERVICE_STATUS;
  366. ae_error_t ret_le = AE_SUCCESS;
  367. if (NULL == mrenclave ||
  368. NULL == public_key ||
  369. NULL == se_attributes ||
  370. NULL == lictoken)
  371. {
  372. // Sizes are checked in CLEClass::get_launch_token()
  373. AESM_DBG_TRACE("Invalid parameter");
  374. return AESM_PARAMETER_ERROR;
  375. }
  376. ae_error_t ae_ret = CLEClass::instance().load_enclave();
  377. if(ae_ret == AE_SERVER_NOT_AVAILABLE)
  378. {
  379. AESM_LOG_ERROR("%s", g_event_string_table[SGX_EVENT_SERVICE_UNAVAILABLE]);
  380. AESM_DBG_FATAL("LE not loaded due to AE_SERVER_NOT_AVAILABLE, possible SGX Env Not Ready");
  381. return AESM_NO_DEVICE_ERROR;
  382. }
  383. else if(ae_ret == AESM_AE_OUT_OF_EPC)
  384. {
  385. AESM_DBG_ERROR("LE not loaded due to out of EPC");
  386. return AESM_OUT_OF_EPC;
  387. }
  388. else if(AE_FAILED(ae_ret))
  389. {
  390. AESM_DBG_ERROR("LE not loaded:%d", ae_ret);
  391. return AESM_SERVICE_UNAVAILABLE;
  392. }
  393. ret_le = static_cast<ae_error_t>(CLEClass::instance().get_launch_token(
  394. const_cast<uint8_t *>(mrenclave), mrenclave_size,
  395. const_cast<uint8_t *>(public_key), public_key_size,
  396. const_cast<uint8_t *>(se_attributes), se_attributes_size,
  397. lictoken, lictoken_size));
  398. switch (ret_le)
  399. {
  400. case AE_SUCCESS:
  401. return AESM_SUCCESS;
  402. case LE_INVALID_PARAMETER:
  403. AESM_DBG_TRACE("Invalid parameter");
  404. return AESM_PARAMETER_ERROR;
  405. case LE_INVALID_ATTRIBUTE:
  406. case LE_INVALID_PRIVILEGE_ERROR:
  407. AESM_DBG_TRACE("Launch token error");
  408. return AESM_GET_LICENSETOKEN_ERROR;
  409. case LE_WHITELIST_UNINITIALIZED_ERROR:
  410. AESM_DBG_TRACE("LE whitelist uninitialized error");
  411. return AESM_UNEXPECTED_ERROR;
  412. default:
  413. AESM_DBG_WARN("unexpeted error (ae %d)", ret_le);
  414. return AESM_UNEXPECTED_ERROR;
  415. }
  416. }
  417. /* This function will be called outside aesm(from urts_internal) */
  418. extern "C" sgx_status_t get_launch_token(const enclave_css_t* signature,
  419. const sgx_attributes_t* attribute,
  420. sgx_launch_token_t* launch_token)
  421. {
  422. AESM_DBG_INFO("enter function");
  423. return AESMLogic::get_launch_token(signature, attribute, launch_token);
  424. }
  425. ae_error_t AESMLogic::get_qe_isv_svn(uint16_t& isv_svn)
  426. {
  427. if(!_is_qe_psvn_set){
  428. ae_error_t ae_err = CQEClass::instance().load_enclave();
  429. if(AE_SUCCESS != ae_err){
  430. AESM_DBG_ERROR("Fail to load QE Enclave:(ae %d)",ae_err);
  431. return ae_err;
  432. }
  433. }
  434. assert(_is_qe_psvn_set);
  435. if(0!=memcpy_s(&isv_svn, sizeof(isv_svn), &_qe_psvn.isv_svn, sizeof(_qe_psvn.isv_svn))){
  436. AESM_DBG_ERROR("memcpy failed");
  437. return AE_FAILURE;
  438. }
  439. return AE_SUCCESS;
  440. }
  441. ae_error_t AESMLogic::get_pce_isv_svn(uint16_t& isv_svn)
  442. {
  443. if(!_is_pce_psvn_set){
  444. ae_error_t ae_err = CPCEClass::instance().load_enclave();
  445. if(AE_SUCCESS != ae_err){
  446. AESM_DBG_ERROR("Fail to load PCE Enclave:(ae %d)",ae_err);
  447. return ae_err;
  448. }
  449. }
  450. assert(_is_pce_psvn_set);
  451. if(0!=memcpy_s(&isv_svn, sizeof(isv_svn), &_pce_psvn.isv_svn, sizeof(_pce_psvn.isv_svn))){
  452. AESM_DBG_ERROR("memcpy failed");
  453. return AE_FAILURE;
  454. }
  455. return AE_SUCCESS;
  456. }
  457. ae_error_t AESMLogic::get_pse_isv_svn(uint16_t& isv_svn)
  458. {
  459. ae_error_t retVal = AE_SUCCESS;
  460. if(!_is_pse_psvn_set){
  461. ae_error_t ae_err = CPSEClass::instance().load_enclave();
  462. if(AE_SUCCESS != ae_err){
  463. AESM_DBG_ERROR("Fail to load PSEOP Enclave:(ae %d)",ae_err);
  464. retVal = ae_err;
  465. }
  466. }
  467. if (AE_SUCCESS == retVal) {
  468. assert(_is_pse_psvn_set);
  469. if(0!=memcpy_s(&isv_svn, sizeof(isv_svn), &_pse_psvn.isv_svn, sizeof(_pse_psvn.isv_svn))){
  470. AESM_DBG_ERROR("memcpy failed");
  471. retVal = AE_FAILURE;
  472. }
  473. }
  474. SGX_DBGPRINT_ONE_STRING_TWO_INTS_CREATE_SESSION(__FUNCTION__" returning ", retVal, isv_svn);
  475. return retVal;
  476. }
  477. ae_error_t AESMLogic::get_qe_cpu_svn(sgx_cpu_svn_t& cpu_svn)
  478. {
  479. if(!_is_qe_psvn_set){
  480. ae_error_t ae_err = CQEClass::instance().load_enclave();
  481. if(AE_SUCCESS != ae_err){
  482. AESM_DBG_ERROR("Fail to load QE Enclave:( ae %d)",ae_err);
  483. return ae_err;
  484. }
  485. }
  486. assert(_is_qe_psvn_set);
  487. if(0!=memcpy_s(&cpu_svn, sizeof(sgx_cpu_svn_t), &_qe_psvn.cpu_svn, sizeof(_qe_psvn.cpu_svn))){
  488. AESM_DBG_ERROR("memcpy failed");
  489. return AE_FAILURE;
  490. }
  491. return AE_SUCCESS;
  492. }
  493. ae_error_t AESMLogic::set_psvn(uint16_t prod_id, uint16_t isv_svn, sgx_cpu_svn_t cpu_svn, uint32_t mrsigner_index)
  494. {
  495. if(prod_id == QE_PROD_ID){
  496. if(mrsigner_index == AE_MR_SIGNER){
  497. if(_is_qe_psvn_set){
  498. if(0!=memcmp(&_qe_psvn.isv_svn, &isv_svn, sizeof(isv_svn))||
  499. 0!=memcmp(&_qe_psvn.cpu_svn, &cpu_svn, sizeof(sgx_cpu_svn_t))){
  500. AESM_DBG_ERROR("PSVN unmatched for QE/PVE");
  501. return AE_PSVN_UNMATCHED_ERROR;
  502. }
  503. }else{
  504. if(0!=memcpy_s(&_qe_psvn.isv_svn, sizeof(_qe_psvn.isv_svn), &isv_svn, sizeof(isv_svn))||
  505. 0!=memcpy_s(&_qe_psvn.cpu_svn, sizeof(_qe_psvn.cpu_svn), &cpu_svn, sizeof(sgx_cpu_svn_t))){
  506. AESM_DBG_ERROR("memcpy failed");
  507. return AE_FAILURE;
  508. }
  509. AESM_DBG_TRACE("get QE or PvE isv_svn=%d",(int)isv_svn);
  510. _is_qe_psvn_set = true;
  511. return AE_SUCCESS;
  512. }
  513. }else if(mrsigner_index==PCE_MR_SIGNER){
  514. if(_is_pce_psvn_set){
  515. if(0!=memcmp(&_pce_psvn.isv_svn, &isv_svn, sizeof(isv_svn))||
  516. 0!=memcmp(&_pce_psvn.cpu_svn, &cpu_svn, sizeof(sgx_cpu_svn_t))){
  517. AESM_DBG_ERROR("PSVN unmatched for PCE");
  518. return AE_PSVN_UNMATCHED_ERROR;
  519. }
  520. }else{
  521. if(0!=memcpy_s(&_pce_psvn.isv_svn, sizeof(_pce_psvn.isv_svn), &isv_svn, sizeof(isv_svn))||
  522. 0!=memcpy_s(&_pce_psvn.cpu_svn, sizeof(_pce_psvn.cpu_svn), &cpu_svn, sizeof(sgx_cpu_svn_t))){
  523. AESM_DBG_ERROR("memcpy failed");
  524. return AE_FAILURE;
  525. }
  526. AESM_DBG_TRACE("get PCE isv_svn=%d", (int)isv_svn);
  527. _is_pce_psvn_set = true;
  528. return AE_SUCCESS;
  529. }
  530. }
  531. }else if(prod_id == PSE_PROD_ID){
  532. if(mrsigner_index == AE_MR_SIGNER){
  533. if(_is_pse_psvn_set){
  534. if(0!=memcmp(&_pse_psvn.isv_svn, &isv_svn, sizeof(isv_svn))||
  535. 0!=memcmp(&_pse_psvn.cpu_svn, &cpu_svn, sizeof(sgx_cpu_svn_t))){
  536. AESM_DBG_ERROR("PSVN unmatched for PSE");
  537. return AE_PSVN_UNMATCHED_ERROR;
  538. }
  539. }else{
  540. if(0!=memcpy_s(&_pse_psvn.isv_svn, sizeof(_pse_psvn.isv_svn), &isv_svn, sizeof(isv_svn))||
  541. 0!=memcpy_s(&_pse_psvn.cpu_svn, sizeof(_pse_psvn.cpu_svn), &cpu_svn, sizeof(sgx_cpu_svn_t))){
  542. AESM_DBG_ERROR("memcpy failed");
  543. return AE_FAILURE;
  544. }
  545. AESM_DBG_TRACE("get PSE isv_svn=%d", (int)isv_svn);
  546. _is_pse_psvn_set = true;
  547. return AE_SUCCESS;
  548. }
  549. }
  550. }
  551. return AE_SUCCESS;
  552. }
  553. sgx_status_t AESMLogic::get_launch_token(const enclave_css_t* signature,
  554. const sgx_attributes_t* attribute,
  555. sgx_launch_token_t* launch_token)
  556. {
  557. AESM_DBG_INFO("enter function");
  558. AESMLogicLock lock(_le_mutex);
  559. ae_error_t ret_le = AE_SUCCESS;
  560. uint32_t mrsigner_index = UINT32_MAX;
  561. // load LE to get launch token
  562. if((ret_le=CLEClass::instance().load_enclave()) != AE_SUCCESS)
  563. {
  564. if(ret_le == AESM_AE_NO_DEVICE)
  565. {
  566. AESM_DBG_FATAL("LE not loaded due to no SGX device available, possible SGX Env Not Ready");
  567. return SGX_ERROR_NO_DEVICE;
  568. }
  569. else if(ret_le == AESM_AE_OUT_OF_EPC)
  570. {
  571. AESM_DBG_FATAL("LE not loaded due to out of EPC");
  572. return SGX_ERROR_OUT_OF_EPC;
  573. }
  574. else
  575. {
  576. AESM_DBG_FATAL("fail to load LE:%d",ret_le);
  577. return SGX_ERROR_SERVICE_UNAVAILABLE;
  578. }
  579. }
  580. ret_le = static_cast<ae_error_t>(CLEClass::instance().get_launch_token(
  581. const_cast<uint8_t*>(reinterpret_cast<const uint8_t *>(&signature->body.enclave_hash)),
  582. sizeof(sgx_measurement_t),
  583. const_cast<uint8_t*>(reinterpret_cast<const uint8_t *>(&signature->key.modulus)),
  584. sizeof(signature->key.modulus),
  585. const_cast<uint8_t*>(reinterpret_cast<const uint8_t *>(attribute)),
  586. sizeof(sgx_attributes_t),
  587. reinterpret_cast<uint8_t*>(launch_token),
  588. sizeof(token_t),
  589. &mrsigner_index));
  590. switch (ret_le)
  591. {
  592. case AE_SUCCESS:
  593. break;
  594. case LE_INVALID_PARAMETER:
  595. AESM_DBG_TRACE("Invalid parameter");
  596. return SGX_ERROR_INVALID_PARAMETER;
  597. case LE_INVALID_ATTRIBUTE:
  598. case LE_INVALID_PRIVILEGE_ERROR:
  599. AESM_DBG_TRACE("Launch token error");
  600. return SGX_ERROR_SERVICE_INVALID_PRIVILEGE;
  601. case LE_WHITELIST_UNINITIALIZED_ERROR:
  602. AESM_DBG_TRACE("LE whitelist uninitialized error");
  603. return SGX_ERROR_UNEXPECTED;
  604. default:
  605. AESM_DBG_WARN("unexpected error (ae%d)", ret_le);
  606. return SGX_ERROR_UNEXPECTED;
  607. }
  608. token_t *lt = reinterpret_cast<token_t *>(launch_token);
  609. ret_le = set_psvn(signature->body.isv_prod_id, signature->body.isv_svn, lt->cpu_svn_le, mrsigner_index);
  610. if(AE_PSVN_UNMATCHED_ERROR == ret_le)
  611. {
  612. //QE or PSE has been changed, but AESM doesn't restart. Will not provide service.
  613. return SGX_ERROR_SERVICE_UNAVAILABLE;
  614. }else if(AE_SUCCESS != ret_le) {
  615. AESM_DBG_ERROR("fail to save psvn:(ae%d)", ret_le);
  616. return SGX_ERROR_UNEXPECTED;
  617. }
  618. return SGX_SUCCESS;
  619. }
  620. #define CHECK_LONG_TERM_PAIRING_STATUS \
  621. if(!query_pse_thread_status()){\
  622. return AESM_BUSY; \
  623. }
  624. aesm_error_t AESMLogic::create_session(
  625. uint32_t* session_id,
  626. uint8_t* se_dh_msg1, uint32_t se_dh_msg1_size)
  627. {
  628. AESM_DBG_INFO("AESMLogic::create_session");
  629. CHECK_SERVICE_STATUS;
  630. AESMLogicLock lock(_pse_mutex);
  631. CHECK_SERVICE_STATUS;
  632. CHECK_LONG_TERM_PAIRING_STATUS;
  633. ae_error_t psStatus;
  634. // If PSDA not loaded or CSE not provisioned
  635. if (CPSEClass::instance().get_status() == PSE_STATUS_INIT ||
  636. CPSEClass::instance().get_status() == PSE_STATUS_UNAVAILABLE )
  637. {
  638. AESM_DBG_ERROR("unexpected status PSE_STATUS_INIT : PSDA not loaded or CSE not provisioned.");
  639. return AESM_PSDA_UNAVAILABLE;
  640. }
  641. else
  642. psStatus = PlatformInfoLogic::create_session_pre_internal();
  643. if (OAL_THREAD_TIMEOUT_ERROR == psStatus){
  644. AESM_DBG_INFO("AESM is busy in intializing for pse");
  645. return AESM_BUSY;
  646. }
  647. if (PVE_PROV_ATTEST_KEY_NOT_FOUND == psStatus) {
  648. AESM_DBG_INFO("Key not found reported by Provisioning backend");
  649. return AESM_UNRECOGNIZED_PLATFORM;
  650. }
  651. if(OAL_PROXY_SETTING_ASSIST == psStatus){
  652. AESM_DBG_INFO("Proxy assist required in initializing for pse");
  653. return AESM_PROXY_SETTING_ASSIST;
  654. }
  655. if(PSW_UPDATE_REQUIRED == psStatus){
  656. AESM_DBG_INFO("PSW software update required");
  657. return AESM_UPDATE_AVAILABLE;
  658. }
  659. if(AESM_AE_OUT_OF_EPC == psStatus)
  660. return AESM_OUT_OF_EPC;
  661. if (AE_SUCCESS != psStatus) {
  662. AESM_DBG_ERROR("psStatus = 0x%X in create_session", psStatus);
  663. }
  664. return PSEOPAESMLogic::create_session(session_id, se_dh_msg1, se_dh_msg1_size);
  665. }
  666. aesm_error_t AESMLogic::exchange_report(
  667. uint32_t session_id,
  668. const uint8_t* se_dh_msg2, uint32_t se_dh_msg2_size,
  669. uint8_t* se_dh_msg3, uint32_t se_dh_msg3_size)
  670. {
  671. AESM_DBG_INFO("AESMLogic::exchange_report");
  672. CHECK_SERVICE_STATUS;
  673. AESMLogicLock lock(_pse_mutex);
  674. CHECK_SERVICE_STATUS;
  675. CHECK_LONG_TERM_PAIRING_STATUS;
  676. return PSEOPAESMLogic::exchange_report(session_id,
  677. se_dh_msg2,
  678. se_dh_msg2_size,
  679. se_dh_msg3,
  680. se_dh_msg3_size);
  681. }
  682. aesm_error_t AESMLogic::close_session(
  683. uint32_t session_id)
  684. {
  685. AESM_DBG_INFO("AESMLogic::close_session");
  686. CHECK_SERVICE_STATUS;
  687. AESMLogicLock lock(_pse_mutex);
  688. CHECK_SERVICE_STATUS;
  689. return PSEOPAESMLogic::close_session(session_id);
  690. }
  691. aesm_error_t AESMLogic::invoke_service(
  692. const uint8_t* pse_message_req, uint32_t pse_message_req_size,
  693. uint8_t* pse_message_resp, uint32_t pse_message_resp_size)
  694. {
  695. AESM_DBG_INFO("AESMLogic::invoke_service");
  696. CHECK_SERVICE_STATUS;
  697. AESMLogicLock lock(_pse_mutex);
  698. CHECK_SERVICE_STATUS;
  699. CHECK_LONG_TERM_PAIRING_STATUS;
  700. return PSEOPAESMLogic::invoke_service(pse_message_req,
  701. pse_message_req_size,
  702. pse_message_resp,
  703. pse_message_resp_size);
  704. }
  705. aesm_error_t AESMLogic::get_ps_cap(
  706. uint64_t* ps_cap)
  707. {
  708. AESM_DBG_INFO("AESMLogic::get_ps_cap");
  709. CHECK_SERVICE_STATUS;
  710. AESMLogicLock lock(_pse_mutex);
  711. CHECK_SERVICE_STATUS;
  712. return PSEOPAESMLogic::get_ps_cap(ps_cap);
  713. }
  714. #define CHECK_EPID_PROVISIONG_STATUS \
  715. if(!query_pve_thread_status()){\
  716. return AESM_BUSY;\
  717. }
  718. aesm_error_t AESMLogic::init_quote(
  719. uint8_t *target_info, uint32_t target_info_size,
  720. uint8_t *gid, uint32_t gid_size)
  721. {
  722. ae_error_t ret = AE_SUCCESS;
  723. uint16_t qe_isv_svn = 0xFFFF;
  724. uint16_t pce_isv_svn = 0xFFFF;
  725. sgx_cpu_svn_t qe_cpu_svn;
  726. memset(&qe_cpu_svn, 0, sizeof(qe_cpu_svn));
  727. AESM_DBG_INFO("init_quote");
  728. if(sizeof(sgx_target_info_t) != target_info_size ||
  729. sizeof(sgx_epid_group_id_t) != gid_size)
  730. {
  731. return AESM_PARAMETER_ERROR;
  732. }
  733. AESMLogicLock lock(_qe_pve_mutex);
  734. CHECK_EPID_PROVISIONG_STATUS;
  735. ret = get_pce_isv_svn(pce_isv_svn);
  736. if(AE_SUCCESS != ret)
  737. {
  738. if(AESM_AE_OUT_OF_EPC == ret)
  739. return AESM_OUT_OF_EPC;
  740. else if(AESM_AE_NO_DEVICE == ret)
  741. return AESM_NO_DEVICE_ERROR;
  742. else if(AE_SERVER_NOT_AVAILABLE == ret)
  743. return AESM_SERVICE_UNAVAILABLE;
  744. return AESM_UNEXPECTED_ERROR;
  745. }
  746. ret = get_qe_cpu_svn(qe_cpu_svn);
  747. if(AE_SUCCESS != ret)
  748. {
  749. if(AESM_AE_OUT_OF_EPC == ret)
  750. return AESM_OUT_OF_EPC;
  751. else if(AESM_AE_NO_DEVICE == ret)
  752. return AESM_NO_DEVICE_ERROR;
  753. else if(AE_SERVER_NOT_AVAILABLE == ret)
  754. return AESM_SERVICE_UNAVAILABLE;
  755. return AESM_UNEXPECTED_ERROR;
  756. }
  757. ret = get_qe_isv_svn(qe_isv_svn);
  758. if(AE_SUCCESS != ret)
  759. {
  760. if(AESM_AE_OUT_OF_EPC == ret)
  761. return AESM_OUT_OF_EPC;
  762. else if(AESM_AE_NO_DEVICE == ret)
  763. return AESM_NO_DEVICE_ERROR;
  764. else if(AE_SERVER_NOT_AVAILABLE == ret)
  765. return AESM_SERVICE_UNAVAILABLE;
  766. return AESM_UNEXPECTED_ERROR;
  767. }
  768. return QEAESMLogic::init_quote(
  769. reinterpret_cast<sgx_target_info_t *>(target_info),
  770. gid, gid_size, pce_isv_svn, qe_isv_svn, qe_cpu_svn);
  771. }
  772. aesm_error_t AESMLogic::get_quote(const uint8_t *report, uint32_t report_size,
  773. uint32_t quote_type,
  774. const uint8_t *spid, uint32_t spid_size,
  775. const uint8_t *nonce, uint32_t nonce_size,
  776. const uint8_t *sigrl, uint32_t sigrl_size,
  777. uint8_t *qe_report, uint32_t qe_report_size,
  778. uint8_t *quote, uint32_t buf_size)
  779. {
  780. ae_error_t ret = AE_SUCCESS;
  781. uint16_t pce_isv_svn = 0xFFFF;
  782. AESM_DBG_INFO("get_quote");
  783. if(sizeof(sgx_report_t) != report_size ||
  784. sizeof(sgx_spid_t) != spid_size)
  785. {
  786. return AESM_PARAMETER_ERROR;
  787. }
  788. if((nonce && sizeof(sgx_quote_nonce_t) != nonce_size)
  789. || (qe_report && sizeof(sgx_report_t) != qe_report_size))
  790. {
  791. return AESM_PARAMETER_ERROR;
  792. }
  793. AESMLogicLock lock(_qe_pve_mutex);
  794. CHECK_EPID_PROVISIONG_STATUS;
  795. ret = get_pce_isv_svn(pce_isv_svn);
  796. if(AE_SUCCESS != ret)
  797. {
  798. if(AESM_AE_OUT_OF_EPC == ret)
  799. return AESM_OUT_OF_EPC;
  800. else if(AESM_AE_NO_DEVICE == ret)
  801. return AESM_NO_DEVICE_ERROR;
  802. else if(AE_SERVER_NOT_AVAILABLE == ret)
  803. return AESM_SERVICE_UNAVAILABLE;
  804. return AESM_UNEXPECTED_ERROR;
  805. }
  806. return QEAESMLogic::get_quote(report, quote_type, spid, nonce, sigrl,
  807. sigrl_size, qe_report, quote, buf_size, pce_isv_svn);
  808. }
  809. uint32_t AESMLogic::endpoint_selection(endpoint_selection_infos_t& es_info)
  810. {
  811. AESMLogicLock lock(_qe_pve_mutex);
  812. SGX_DBGPRINT_ONE_STRING_TWO_INTS_ENDPOINT_SELECTION(__FUNCTION__" (line, 0)", __LINE__, 0);
  813. return EndpointSelectionInfo::instance().start_protocol(es_info);
  814. }
  815. uint32_t AESMLogic::is_gid_matching_result_in_epid_blob(const GroupId& gid)
  816. {
  817. AESMLogicLock lock(_qe_pve_mutex);
  818. EPIDBlob& epid_blob = EPIDBlob::instance();
  819. uint32_t le_gid;
  820. if(epid_blob.get_sgx_gid(&le_gid)!=AE_SUCCESS){//get littlen endian gid
  821. return GIDMT_UNEXPECTED_ERROR;
  822. }
  823. le_gid=_htonl(le_gid);//use bigendian gid
  824. se_static_assert(sizeof(le_gid)==sizeof(gid));
  825. if(memcmp(&le_gid,&gid,sizeof(gid))!=0){
  826. return GIDMT_UNMATCHED;
  827. }
  828. return GIDMT_MATCHED;
  829. }
  830. aesm_error_t AESMLogic::report_attestation_status(
  831. uint8_t* platform_info, uint32_t platform_info_size,
  832. uint32_t attestation_status,
  833. uint8_t* update_info, uint32_t update_info_size)
  834. {
  835. AESM_DBG_INFO("report_attestation_status");
  836. AESMLogicLock lock(_pse_mutex);
  837. CHECK_LONG_TERM_PAIRING_STATUS;
  838. return PlatformInfoLogic::report_attestation_status(platform_info, platform_info_size, attestation_status, update_info, update_info_size);
  839. }
  840. ae_error_t AESMLogic::get_white_list_size_without_lock(uint32_t *white_list_cert_size)
  841. {
  842. uint32_t white_cert_size = 0;
  843. ae_error_t ae_ret = aesm_query_data_size(FT_PERSISTENT_STORAGE, AESM_WHITE_LIST_CERT_FID, &white_cert_size);
  844. if (AE_SUCCESS == ae_ret)
  845. {
  846. if (white_cert_size != 0){//file existing and not 0 size
  847. *white_list_cert_size = white_cert_size;
  848. return AE_SUCCESS;
  849. }
  850. else
  851. return AE_FAILURE;
  852. }
  853. else
  854. {
  855. return ae_ret;
  856. }
  857. }
  858. aesm_error_t AESMLogic::get_white_list_size(
  859. uint32_t* white_list_cert_size)
  860. {
  861. if (NULL == white_list_cert_size){
  862. return AESM_PARAMETER_ERROR;
  863. }
  864. CHECK_SERVICE_STATUS;
  865. AESMLogicLock lock(_le_mutex);
  866. CHECK_SERVICE_STATUS;
  867. ae_error_t ae_ret = get_white_list_size_without_lock(white_list_cert_size);
  868. if (AE_SUCCESS == ae_ret)
  869. return AESM_SUCCESS;
  870. else
  871. return AESM_UNEXPECTED_ERROR;
  872. }
  873. aesm_error_t AESMLogic::get_white_list(
  874. uint8_t *white_list_cert, uint32_t buf_size)
  875. {
  876. uint32_t white_cert_size=0;
  877. if (NULL == white_list_cert){
  878. return AESM_PARAMETER_ERROR;
  879. }
  880. CHECK_SERVICE_STATUS;
  881. AESMLogicLock lock(_le_mutex);
  882. CHECK_SERVICE_STATUS;
  883. ae_error_t ae_ret = get_white_list_size_without_lock(&white_cert_size);
  884. if (AE_SUCCESS != ae_ret)
  885. return AESM_UNEXPECTED_ERROR;
  886. if (white_cert_size != buf_size)
  887. {
  888. return AESM_PARAMETER_ERROR;
  889. }
  890. ae_ret = aesm_read_data(FT_PERSISTENT_STORAGE, AESM_WHITE_LIST_CERT_FID, white_list_cert, &white_cert_size);
  891. if (AE_SUCCESS != ae_ret){
  892. AESM_DBG_WARN("Fail to read white cert list file");
  893. return AESM_UNEXPECTED_ERROR;
  894. }
  895. return AESM_SUCCESS;
  896. }
  897. ae_error_t sgx_error_to_ae_error(sgx_status_t status)
  898. {
  899. if(SGX_ERROR_OUT_OF_MEMORY == status)
  900. return AE_OUT_OF_MEMORY_ERROR;
  901. if(SGX_SUCCESS == status)
  902. return AE_SUCCESS;
  903. return AE_FAILURE;
  904. }
  905. aesm_error_t AESMLogic::switch_extended_epid_group(
  906. uint32_t extended_epid_group_id
  907. )
  908. {
  909. AESM_DBG_INFO("AESMLogic::switch_extended_epid_group");
  910. ae_error_t ae_ret;
  911. if ((ae_ret = XEGDBlob::verify_xegd_by_xgid(extended_epid_group_id)) != AE_SUCCESS ||
  912. (ae_ret = EndpointSelectionInfo::verify_file_by_xgid(extended_epid_group_id)) != AE_SUCCESS){
  913. AESM_DBG_INFO("Fail to switch to extended epid group to %d due to XEGD blob for URL blob not available", extended_epid_group_id);
  914. return AESM_PARAMETER_ERROR;
  915. }
  916. ae_ret = set_global_extended_epid_group_id(extended_epid_group_id);
  917. if (ae_ret != AE_SUCCESS){
  918. AESM_DBG_INFO("Fail to switch to extended epid group %d", extended_epid_group_id);
  919. return AESM_UNEXPECTED_ERROR;
  920. }
  921. AESM_DBG_INFO("Succ to switch to extended epid group %d in data file, restart aesm required to use it", extended_epid_group_id);
  922. return AESM_SUCCESS;
  923. }
  924. aesm_error_t AESMLogic::get_extended_epid_group_id(
  925. uint32_t* extended_epid_group_id)
  926. {
  927. AESM_DBG_INFO("AESMLogic::get_extended_epid_group");
  928. if (NULL == extended_epid_group_id)
  929. {
  930. return AESM_PARAMETER_ERROR;
  931. }
  932. *extended_epid_group_id = get_active_extended_epid_group_id();
  933. return AESM_SUCCESS;
  934. }