Do not panic but return error for failed dcap ioctl
This commit is contained in:
parent
8e9f1fb933
commit
8efde3915c
@ -154,7 +154,11 @@ impl DevSgx {
|
|||||||
#[cfg(feature = "dcap")]
|
#[cfg(feature = "dcap")]
|
||||||
SGX_CMD_NUM_GET_DCAP_QUOTE_SIZE => {
|
SGX_CMD_NUM_GET_DCAP_QUOTE_SIZE => {
|
||||||
let arg = nonbuiltin_cmd.arg_mut::<u32>()?;
|
let arg = nonbuiltin_cmd.arg_mut::<u32>()?;
|
||||||
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 {
|
unsafe {
|
||||||
*arg = quote_size;
|
*arg = quote_size;
|
||||||
}
|
}
|
||||||
@ -166,13 +170,18 @@ impl DevSgx {
|
|||||||
let input_len = unsafe { *arg.quote_size };
|
let input_len = unsafe { *arg.quote_size };
|
||||||
check_mut_array(arg.quote_buf, input_len as usize)?;
|
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 {
|
if input_len < quote_size {
|
||||||
return_errno!(EINVAL, "provided quote is too small");
|
return_errno!(EINVAL, "provided quote is too small");
|
||||||
}
|
}
|
||||||
|
|
||||||
let quote =
|
let quote = SGX_DCAP_QUOTE_GENERATOR
|
||||||
SGX_DCAP_QUOTE_GENERATOR.generate_quote(unsafe { &*arg.report_data })?;
|
.unwrap()
|
||||||
|
.generate_quote(unsafe { &*arg.report_data })?;
|
||||||
let mut input_quote_buf =
|
let mut input_quote_buf =
|
||||||
unsafe { std::slice::from_raw_parts_mut(arg.quote_buf, quote_size as usize) };
|
unsafe { std::slice::from_raw_parts_mut(arg.quote_buf, quote_size as usize) };
|
||||||
input_quote_buf.copy_from_slice("e);
|
input_quote_buf.copy_from_slice("e);
|
||||||
@ -180,7 +189,14 @@ impl DevSgx {
|
|||||||
#[cfg(feature = "dcap")]
|
#[cfg(feature = "dcap")]
|
||||||
SGX_CMD_NUM_GET_DCAP_SUPPLEMENTAL_SIZE => {
|
SGX_CMD_NUM_GET_DCAP_SUPPLEMENTAL_SIZE => {
|
||||||
let arg = nonbuiltin_cmd.arg_mut::<u32>()?;
|
let arg = nonbuiltin_cmd.arg_mut::<u32>()?;
|
||||||
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 {
|
unsafe {
|
||||||
*arg = supplemental_size;
|
*arg = supplemental_size;
|
||||||
}
|
}
|
||||||
@ -189,7 +205,14 @@ impl DevSgx {
|
|||||||
SGX_CMD_NUM_VER_DCAP_QUOTE => {
|
SGX_CMD_NUM_VER_DCAP_QUOTE => {
|
||||||
let arg = nonbuiltin_cmd.arg_mut::<IoctlVerDCAPQuoteArg>()?;
|
let arg = nonbuiltin_cmd.arg_mut::<IoctlVerDCAPQuoteArg>()?;
|
||||||
let quote_size = arg.quote_size as usize;
|
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)?;
|
check_array(arg.quote_buf, quote_size)?;
|
||||||
let supplemental_slice = if !arg.supplemental_data.is_null() {
|
let supplemental_slice = if !arg.supplemental_data.is_null() {
|
||||||
check_array(arg.supplemental_data, arg.supplemental_data_size as usize)?;
|
check_array(arg.supplemental_data, arg.supplemental_data_size as usize)?;
|
||||||
@ -210,7 +233,9 @@ impl DevSgx {
|
|||||||
let input_quote_buf =
|
let input_quote_buf =
|
||||||
unsafe { std::slice::from_raw_parts(arg.quote_buf, quote_size) };
|
unsafe { std::slice::from_raw_parts(arg.quote_buf, quote_size) };
|
||||||
let (collateral_expiration_status, quote_verification_result, supplemental_data) =
|
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 {
|
unsafe {
|
||||||
*arg.collateral_expiration_status = collateral_expiration_status;
|
*arg.collateral_expiration_status = collateral_expiration_status;
|
||||||
@ -236,9 +261,10 @@ lazy_static! {
|
|||||||
|
|
||||||
#[cfg(feature = "dcap")]
|
#[cfg(feature = "dcap")]
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref SGX_DCAP_QUOTE_GENERATOR: SgxDCAPQuoteGenerator =
|
pub static ref SGX_DCAP_QUOTE_GENERATOR: Option<SgxDCAPQuoteGenerator> =
|
||||||
{ SgxDCAPQuoteGenerator::new() };
|
{ SgxDCAPQuoteGenerator::new() };
|
||||||
pub static ref SGX_DCAP_QUOTE_VERIFIER: SgxDCAPQuoteVerifier = { SgxDCAPQuoteVerifier::new() };
|
pub static ref SGX_DCAP_QUOTE_VERIFIER: Option<SgxDCAPQuoteVerifier> =
|
||||||
|
{ SgxDCAPQuoteVerifier::new() };
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
@ -1,34 +1,37 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
pub use sgx_types::{sgx_ql_qv_result_t, sgx_quote3_error_t, sgx_report_data_t, sgx_target_info_t};
|
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 {
|
pub struct QuoteGenerator {
|
||||||
qe_target_info: sgx_target_info_t,
|
qe_target_info: sgx_target_info_t,
|
||||||
quote_size: u32,
|
quote_size: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QuoteGenerator {
|
impl QuoteGenerator {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Option<Self> {
|
||||||
let mut qe_target_info = sgx_target_info_t::default();
|
let mut qe_target_info = sgx_target_info_t::default();
|
||||||
let mut quote_size: u32 = 0;
|
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 {
|
unsafe {
|
||||||
let mut qe3_ret = sgx_quote3_error_t::SGX_QL_SUCCESS;
|
sgx_status = occlum_ocall_init_dcap_quote_generator(
|
||||||
let sgx_status = occlum_ocall_init_dcap_quote_generator(
|
|
||||||
&mut qe3_ret,
|
&mut qe3_ret,
|
||||||
&mut qe_target_info,
|
&mut qe_target_info,
|
||||||
&mut quote_size,
|
&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 {
|
if sgx_status != sgx_status_t::SGX_SUCCESS || qe3_ret != sgx_quote3_error_t::SGX_QL_SUCCESS
|
||||||
qe_target_info,
|
{
|
||||||
quote_size,
|
error!("Init dcap quote generator return {}", sgx_status);
|
||||||
|
error!("DCAP quote qe3_ret {}", qe3_ret);
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Self {
|
||||||
|
qe_target_info,
|
||||||
|
quote_size,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
pub struct QuoteVerifier {
|
pub struct QuoteVerifier {
|
||||||
supplemental_data_size: u32,
|
supplemental_data_size: u32,
|
||||||
}
|
}
|
||||||
@ -9,15 +10,20 @@ pub struct QuoteVerifier {
|
|||||||
const QVE_ISVSVN_THRESHOLD: sgx_isv_svn_t = 3;
|
const QVE_ISVSVN_THRESHOLD: sgx_isv_svn_t = 3;
|
||||||
|
|
||||||
impl QuoteVerifier {
|
impl QuoteVerifier {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Option<Self> {
|
||||||
let mut supplemental_data_size = 0;
|
let mut supplemental_data_size = 0;
|
||||||
|
let mut sgx_status = sgx_status_t::SGX_SUCCESS;
|
||||||
unsafe {
|
unsafe {
|
||||||
let sgx_status = occlum_ocall_get_supplement_size(&mut supplemental_data_size);
|
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);
|
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user