aesm_logic.cpp 36 KB

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