|
3 | 3 | //! This call is responsible for establishing a protected channel with the auth enclave,
|
4 | 4 | //! and relaying the sealed exchange with the auth enclave's `save_access_key` ECALL.
|
5 | 5 |
|
6 |
| -use rtc_types::enclave_messages::ffi_set_access_key; |
| 6 | +use rtc_tenclave::dh::{dh_sessions, sealing, DhSessions, ProtectedChannel}; |
| 7 | +use rtc_types::enclave_messages::errors::SealingError; |
| 8 | +pub use rtc_types::enclave_messages::ffi_set_access_key::SetAccessKeyEncryptedRequest; |
| 9 | +use rtc_types::enclave_messages::{ffi_set_access_key, set_access_key}; |
| 10 | +use rtc_types::EcallResult; |
| 11 | +use sgx_tstd::enclave::get_enclave_id; |
7 | 12 | use sgx_types::{sgx_enclave_id_t, sgx_status_t};
|
8 | 13 |
|
| 14 | +// Handle protected channel establishment |
| 15 | +#[allow(dead_code)] // TODO |
| 16 | +pub(crate) fn save_access_key( |
| 17 | + auth_enclave_id: sgx_enclave_id_t, |
| 18 | + request: set_access_key::Request, |
| 19 | +) -> Result<set_access_key::Response, SealingError> { |
| 20 | + let sessions: &DhSessions<_, _> = dh_sessions(); |
| 21 | + sessions.with_acquire_new_or_established(auth_enclave_id, |channel| { |
| 22 | + save_access_key_sealing(auth_enclave_id, channel, request) |
| 23 | + })? |
| 24 | +} |
| 25 | + |
| 26 | +// Handle message sealing |
| 27 | +fn save_access_key_sealing( |
| 28 | + auth_enclave_id: sgx_enclave_id_t, |
| 29 | + channel: &mut ProtectedChannel, |
| 30 | + request: set_access_key::Request, |
| 31 | +) -> Result<set_access_key::Response, SealingError> { |
| 32 | + let sending_enclave_id: sgx_enclave_id_t = get_enclave_id(); |
| 33 | + |
| 34 | + // Seal the request |
| 35 | + let encrypted_request = |
| 36 | + sealing::rkyv_seal_associated(channel, &request, &sending_enclave_id).unwrap(); |
| 37 | + |
| 38 | + // Exchange with the auth enclave |
| 39 | + let encrypted_response = save_access_key_ffi(auth_enclave_id, encrypted_request)?; |
| 40 | + |
| 41 | + // Unseal the response |
| 42 | + let response = |
| 43 | + unsafe { sealing::rkyv_unseal::<set_access_key::Response>(channel, encrypted_response) }?; |
| 44 | + Ok(response) |
| 45 | +} |
| 46 | + |
| 47 | +/// Handle converting between the [`ffi_set_access_key`] and [`set_access_key`] types. |
| 48 | +fn save_access_key_ffi( |
| 49 | + auth_enclave_id: sgx_enclave_id_t, |
| 50 | + encrypted_request: set_access_key::EncryptedRequest, |
| 51 | +) -> set_access_key::SetAccessKeyResult { |
| 52 | + let ffi_encrypted_request = encrypted_request.into(); |
| 53 | + let ffi_result = save_access_key_u(auth_enclave_id, ffi_encrypted_request); |
| 54 | + ffi_result.into() |
| 55 | +} |
| 56 | + |
| 57 | +// Handle call |
| 58 | +fn save_access_key_u( |
| 59 | + auth_enclave_id: sgx_enclave_id_t, |
| 60 | + encrypted_request: ffi_set_access_key::SetAccessKeyEncryptedRequest, |
| 61 | +) -> ffi_set_access_key::SetAccessKeyResult { |
| 62 | + let mut retval = ffi_set_access_key::SetAccessKeyResult::default(); |
| 63 | + |
| 64 | + // Safety: Copies ffi_set_access_key::SetAccessKeyResult into retval, |
| 65 | + // but only valid for sgx_status_t::SGX_SUCCESS. |
| 66 | + match unsafe { rtc_save_access_key_u(&mut retval, auth_enclave_id, encrypted_request) } { |
| 67 | + sgx_status_t::SGX_SUCCESS => retval, |
| 68 | + status_err => EcallResult::Err(status_err.into()), |
| 69 | + } |
| 70 | +} |
| 71 | + |
9 | 72 | extern "C" {
|
10 |
| - #[allow(dead_code)] // TODO |
11 | 73 | fn rtc_save_access_key_u(
|
12 | 74 | retval: *mut ffi_set_access_key::SetAccessKeyResult,
|
13 | 75 | auth_enclave_id: sgx_enclave_id_t,
|
|
0 commit comments