diff --git a/src/libos/src/fs/dev_fs/dev_sgx/mod.rs b/src/libos/src/fs/dev_fs/dev_sgx/mod.rs index ca9edca2..f9cc939b 100644 --- a/src/libos/src/fs/dev_fs/dev_sgx/mod.rs +++ b/src/libos/src/fs/dev_fs/dev_sgx/mod.rs @@ -154,7 +154,11 @@ impl DevSgx { #[cfg(feature = "dcap")] SGX_CMD_NUM_GET_DCAP_QUOTE_SIZE => { let arg = nonbuiltin_cmd.arg_mut::()?; - let quote_size = SGX_DCAP_QUOTE_GENERATOR.get_quote_size(); + if SGX_DCAP_QUOTE_GENERATOR.is_none() { + return_errno!(EIO, "DCAP device not ready"); + } + + let quote_size = SGX_DCAP_QUOTE_GENERATOR.unwrap().get_quote_size(); unsafe { *arg = quote_size; } @@ -166,13 +170,18 @@ impl DevSgx { let input_len = unsafe { *arg.quote_size }; check_mut_array(arg.quote_buf, input_len as usize)?; - let quote_size = SGX_DCAP_QUOTE_GENERATOR.get_quote_size(); + if SGX_DCAP_QUOTE_GENERATOR.is_none() { + return_errno!(EIO, "DCAP device not ready"); + } + + let quote_size = SGX_DCAP_QUOTE_GENERATOR.unwrap().get_quote_size(); if input_len < quote_size { return_errno!(EINVAL, "provided quote is too small"); } - let quote = - SGX_DCAP_QUOTE_GENERATOR.generate_quote(unsafe { &*arg.report_data })?; + let quote = SGX_DCAP_QUOTE_GENERATOR + .unwrap() + .generate_quote(unsafe { &*arg.report_data })?; let mut input_quote_buf = unsafe { std::slice::from_raw_parts_mut(arg.quote_buf, quote_size as usize) }; input_quote_buf.copy_from_slice("e); @@ -180,7 +189,14 @@ impl DevSgx { #[cfg(feature = "dcap")] SGX_CMD_NUM_GET_DCAP_SUPPLEMENTAL_SIZE => { let arg = nonbuiltin_cmd.arg_mut::()?; - let supplemental_size = SGX_DCAP_QUOTE_VERIFIER.get_supplemental_data_size(); + + if SGX_DCAP_QUOTE_VERIFIER.is_none() { + return_errno!(EIO, "DCAP device not ready"); + } + + let supplemental_size = SGX_DCAP_QUOTE_VERIFIER + .unwrap() + .get_supplemental_data_size(); unsafe { *arg = supplemental_size; } @@ -189,7 +205,14 @@ impl DevSgx { SGX_CMD_NUM_VER_DCAP_QUOTE => { let arg = nonbuiltin_cmd.arg_mut::()?; let quote_size = arg.quote_size as usize; - let supplemental_size = SGX_DCAP_QUOTE_VERIFIER.get_supplemental_data_size(); + + if SGX_DCAP_QUOTE_VERIFIER.is_none() { + return_errno!(EIO, "DCAP device not ready"); + } + + let supplemental_size = SGX_DCAP_QUOTE_VERIFIER + .unwrap() + .get_supplemental_data_size(); check_array(arg.quote_buf, quote_size)?; let supplemental_slice = if !arg.supplemental_data.is_null() { check_array(arg.supplemental_data, arg.supplemental_data_size as usize)?; @@ -210,7 +233,9 @@ impl DevSgx { let input_quote_buf = unsafe { std::slice::from_raw_parts(arg.quote_buf, quote_size) }; let (collateral_expiration_status, quote_verification_result, supplemental_data) = - SGX_DCAP_QUOTE_VERIFIER.verify_quote(input_quote_buf)?; + SGX_DCAP_QUOTE_VERIFIER + .unwrap() + .verify_quote(input_quote_buf)?; unsafe { *arg.collateral_expiration_status = collateral_expiration_status; @@ -236,9 +261,10 @@ lazy_static! { #[cfg(feature = "dcap")] lazy_static! { - pub static ref SGX_DCAP_QUOTE_GENERATOR: SgxDCAPQuoteGenerator = + pub static ref SGX_DCAP_QUOTE_GENERATOR: Option = { SgxDCAPQuoteGenerator::new() }; - pub static ref SGX_DCAP_QUOTE_VERIFIER: SgxDCAPQuoteVerifier = { SgxDCAPQuoteVerifier::new() }; + pub static ref SGX_DCAP_QUOTE_VERIFIER: Option = + { SgxDCAPQuoteVerifier::new() }; } #[repr(C)] diff --git a/src/libos/src/util/sgx/dcap/quote_generator.rs b/src/libos/src/util/sgx/dcap/quote_generator.rs index d024aa60..07df6496 100644 --- a/src/libos/src/util/sgx/dcap/quote_generator.rs +++ b/src/libos/src/util/sgx/dcap/quote_generator.rs @@ -1,34 +1,37 @@ use super::*; pub use sgx_types::{sgx_ql_qv_result_t, sgx_quote3_error_t, sgx_report_data_t, sgx_target_info_t}; +#[derive(Copy, Clone)] pub struct QuoteGenerator { qe_target_info: sgx_target_info_t, quote_size: u32, } impl QuoteGenerator { - pub fn new() -> Self { + pub fn new() -> Option { let mut qe_target_info = sgx_target_info_t::default(); let mut quote_size: u32 = 0; + let mut sgx_status = sgx_status_t::SGX_SUCCESS; + let mut qe3_ret = sgx_quote3_error_t::SGX_QL_SUCCESS; unsafe { - let mut qe3_ret = sgx_quote3_error_t::SGX_QL_SUCCESS; - let sgx_status = occlum_ocall_init_dcap_quote_generator( + sgx_status = occlum_ocall_init_dcap_quote_generator( &mut qe3_ret, &mut qe_target_info, &mut quote_size, ); - assert_eq!(sgx_status_t::SGX_SUCCESS, sgx_status); - assert_eq!( - sgx_quote3_error_t::SGX_QL_SUCCESS, - qe3_ret, - "fail to launch QE" - ); } - Self { - qe_target_info, - quote_size, + if sgx_status != sgx_status_t::SGX_SUCCESS || qe3_ret != sgx_quote3_error_t::SGX_QL_SUCCESS + { + error!("Init dcap quote generator return {}", sgx_status); + error!("DCAP quote qe3_ret {}", qe3_ret); + None + } else { + Some(Self { + qe_target_info, + quote_size, + }) } } diff --git a/src/libos/src/util/sgx/dcap/quote_verifier.rs b/src/libos/src/util/sgx/dcap/quote_verifier.rs index 6d474997..1ef3d0fe 100644 --- a/src/libos/src/util/sgx/dcap/quote_verifier.rs +++ b/src/libos/src/util/sgx/dcap/quote_verifier.rs @@ -1,5 +1,6 @@ use super::*; +#[derive(Copy, Clone)] pub struct QuoteVerifier { supplemental_data_size: u32, } @@ -9,15 +10,20 @@ pub struct QuoteVerifier { const QVE_ISVSVN_THRESHOLD: sgx_isv_svn_t = 3; impl QuoteVerifier { - pub fn new() -> Self { + pub fn new() -> Option { let mut supplemental_data_size = 0; + let mut sgx_status = sgx_status_t::SGX_SUCCESS; unsafe { - let sgx_status = occlum_ocall_get_supplement_size(&mut supplemental_data_size); - assert_eq!(sgx_status_t::SGX_SUCCESS, sgx_status); - assert_ne!(supplemental_data_size, 0); + sgx_status = occlum_ocall_get_supplement_size(&mut supplemental_data_size); } - Self { - supplemental_data_size, + + if sgx_status != sgx_status_t::SGX_SUCCESS || supplemental_data_size == 0 { + error!("DCAP Quote Verifier new failed {}", sgx_status); + None + } else { + Some(Self { + supplemental_data_size, + }) } }