|
1 | 1 | use std::borrow::Borrow;
|
2 | 2 |
|
3 |
| -use crate::{AttestationError, EnclaveConfig, EnclaveReportResult, RtcEnclave}; |
4 | 3 | use auth_sys::AuthSys;
|
| 4 | +use rtc_types::enclave_messages::set_access_key; |
5 | 5 | use sgx_types::*;
|
6 | 6 |
|
| 7 | +use crate::{AttestationError, EnclaveConfig, EnclaveReportResult, RtcEnclave}; |
| 8 | + |
7 | 9 | /// Wraps all the functionality for interacting with the auth enclave
|
8 | 10 | pub struct RtcAuthEnclave<TCfg>(RtcEnclave<TCfg, AuthSys>)
|
9 | 11 | where
|
|
33 | 35 | self.0.dcap_attestation_azure()
|
34 | 36 | }
|
35 | 37 |
|
| 38 | + /// Save the generated access key for some data. |
| 39 | + /// |
| 40 | + /// This should be called from the data enclave with messages encrypted |
| 41 | + /// using an established protected channel. |
| 42 | + pub fn save_access_key( |
| 43 | + &self, |
| 44 | + encrypted_request: set_access_key::EncryptedRequest, |
| 45 | + ) -> Result<set_access_key::SetAccessKeyResult, sgx_status_t> { |
| 46 | + ecalls::save_access_key(self.0.geteid(), encrypted_request) |
| 47 | + } |
| 48 | + |
36 | 49 | /// Take ownership of self and drop resources
|
37 | 50 | pub fn destroy(self) {
|
38 | 51 | // Take ownership of self and drop
|
|
48 | 61 | self.0.geteid()
|
49 | 62 | }
|
50 | 63 | }
|
| 64 | + |
| 65 | +mod ecalls { |
| 66 | + //! Rust-friendly wrappers for the Edger8r-generated untrusted ECALL bridge functions. |
| 67 | +
|
| 68 | + use auth_sys::ffi; |
| 69 | + use rtc_types::enclave_messages::{ffi_set_access_key, set_access_key}; |
| 70 | + use sgx_types::{sgx_enclave_id_t, sgx_status_t}; |
| 71 | + |
| 72 | + /// Implement [`super::RtcAuthEnclave::save_access_key`]. |
| 73 | + /// |
| 74 | + /// This takes care of converting between the [`set_access_key`] and [`ffi_set_access_key`] types. |
| 75 | + pub(crate) fn save_access_key( |
| 76 | + eid: sgx_enclave_id_t, |
| 77 | + encrypted_request: set_access_key::EncryptedRequest, |
| 78 | + ) -> Result<set_access_key::SetAccessKeyResult, sgx_status_t> { |
| 79 | + let mut retval = ffi_set_access_key::SetAccessKeyResult::default(); |
| 80 | + let encrypted_request: ffi_set_access_key::SetAccessKeyEncryptedRequest = |
| 81 | + encrypted_request.into(); |
| 82 | + |
| 83 | + // Safety: Copies ffi_set_access_key::SetAccessKeyResult into retval, |
| 84 | + // but only valid for sgx_status_t::SGX_SUCCESS. |
| 85 | + let status = unsafe { ffi::rtc_auth_save_access_key(eid, &mut retval, encrypted_request) }; |
| 86 | + |
| 87 | + match status { |
| 88 | + sgx_status_t::SGX_SUCCESS => Ok(set_access_key::SetAccessKeyResult::from(retval)), |
| 89 | + err => Err(err), |
| 90 | + } |
| 91 | + } |
| 92 | +} |
0 commit comments