Skip to content
This repository was archived by the owner on May 9, 2022. It is now read-only.

Commit ee53654

Browse files
committed
feat(rtc_data_enclave::ocalls): flesh out save_access_key OCALL
1 parent df73450 commit ee53654

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

rtc_data_enclave/src/ocalls/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ mod save_sealed_blob_impl;
55

66
// Re-export the OCALL entry points we're interested in:
77

8+
#[allow(unused_imports)] // TODO
9+
pub(crate) use save_access_key_impl::save_access_key;
810
pub(crate) use save_sealed_blob_impl::save_sealed_blob_u;

rtc_data_enclave/src/ocalls/save_access_key_impl.rs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,73 @@
33
//! This call is responsible for establishing a protected channel with the auth enclave,
44
//! and relaying the sealed exchange with the auth enclave's `save_access_key` ECALL.
55
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;
712
use sgx_types::{sgx_enclave_id_t, sgx_status_t};
813

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+
972
extern "C" {
10-
#[allow(dead_code)] // TODO
1173
fn rtc_save_access_key_u(
1274
retval: *mut ffi_set_access_key::SetAccessKeyResult,
1375
auth_enclave_id: sgx_enclave_id_t,

0 commit comments

Comments
 (0)