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

Commit 20fd5ed

Browse files
committed
feat(rtc_auth_enclave): add stub for save_access_key ECALL
1 parent 2e14843 commit 20fd5ed

File tree

5 files changed

+159
-0
lines changed

5 files changed

+159
-0
lines changed

codegen/auth_enclave/bindings.h

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,88 @@
1818

1919
#define SET_ACCESS_KEY_RESPONSE_SIZE 1
2020

21+
typedef uint8_t RecommendedAesGcmIv[12];
22+
23+
typedef struct SetAccessKeyEncryptedResponse {
24+
sgx_aes_gcm_128bit_tag_t tag;
25+
uint8_t ciphertext[SET_ACCESS_KEY_RESPONSE_SIZE];
26+
uint8_t aad[0];
27+
RecommendedAesGcmIv nonce;
28+
} SetAccessKeyEncryptedResponse;
29+
30+
/**
31+
* Failed to acquire session / protected channel.
32+
*
33+
* See: `rtc_tenclave::dh::sessions::DhSessions`
34+
*/
35+
typedef enum AcquireSessionError_Tag {
36+
/**
37+
* This should generally be treated as an unrecoverable error.
38+
*/
39+
ACQUIRE_SESSION_ERROR_CHANNEL_MUTEX_POISONED,
40+
ACQUIRE_SESSION_ERROR_NO_ACTIVE_SESSION,
41+
ACQUIRE_SESSION_ERROR_SGX,
42+
} AcquireSessionError_Tag;
43+
44+
typedef struct AcquireSessionError {
45+
AcquireSessionError_Tag tag;
46+
union {
47+
struct {
48+
sgx_enclave_id_t no_active_session;
49+
};
50+
struct {
51+
sgx_status_t sgx;
52+
};
53+
};
54+
} AcquireSessionError;
55+
56+
typedef enum SealingError_Tag {
57+
SEALING_ERROR_CHANNEL_NOT_FOUND,
58+
SEALING_ERROR_RKYV_BUFFER_SERIALIZER_ERROR,
59+
SEALING_ERROR_SGX,
60+
} SealingError_Tag;
61+
62+
typedef struct SealingError {
63+
SealingError_Tag tag;
64+
union {
65+
struct {
66+
struct AcquireSessionError channel_not_found;
67+
};
68+
struct {
69+
sgx_status_t sgx;
70+
};
71+
};
72+
} SealingError;
73+
74+
/**
75+
* FFI safe result type that can be converted to and from a rust result.
76+
*/
77+
typedef enum EcallResult_SetAccessKeyEncryptedResponse__SealingError_Tag {
78+
ECALL_RESULT_SET_ACCESS_KEY_ENCRYPTED_RESPONSE_SEALING_ERROR_OK_SET_ACCESS_KEY_ENCRYPTED_RESPONSE_SEALING_ERROR,
79+
ECALL_RESULT_SET_ACCESS_KEY_ENCRYPTED_RESPONSE_SEALING_ERROR_ERR_SET_ACCESS_KEY_ENCRYPTED_RESPONSE_SEALING_ERROR,
80+
} EcallResult_SetAccessKeyEncryptedResponse__SealingError_Tag;
81+
82+
typedef struct EcallResult_SetAccessKeyEncryptedResponse__SealingError {
83+
EcallResult_SetAccessKeyEncryptedResponse__SealingError_Tag tag;
84+
union {
85+
struct {
86+
struct SetAccessKeyEncryptedResponse ok;
87+
};
88+
struct {
89+
struct SealingError err;
90+
};
91+
};
92+
} EcallResult_SetAccessKeyEncryptedResponse__SealingError;
93+
94+
typedef struct EcallResult_SetAccessKeyEncryptedResponse__SealingError SetAccessKeyResult;
95+
96+
typedef struct SetAccessKeyEncryptedRequest {
97+
sgx_aes_gcm_128bit_tag_t tag;
98+
uint8_t ciphertext[SET_ACCESS_KEY_REQUEST_SIZE];
99+
uint8_t aad[ARCHIVED_ENCLAVE_ID_SIZE];
100+
RecommendedAesGcmIv nonce;
101+
} SetAccessKeyEncryptedRequest;
102+
21103
/**
22104
* FFI safe result type that can be converted to and from a rust result.
23105
*/

rtc_auth_enclave/src/ecalls/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//! ECALL definitions
2+
3+
mod save_access_key;
4+
mod save_access_key_impl;
5+
6+
pub use save_access_key::save_access_key;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//! ECALL definition: [`save_access_key`]
2+
3+
use rtc_tenclave::dh::{sealing, ProtectedChannel};
4+
use rtc_types::enclave_messages::{ffi_set_access_key, set_access_key};
5+
use sgx_types::sgx_enclave_id_t;
6+
7+
use crate::ecalls::save_access_key_impl::save_access_key_impl;
8+
use crate::DhSessions;
9+
10+
/// FFI wrapper.
11+
///
12+
/// This takes care of converting between the [`ffi_set_access_key`] and [`set_access_key`] types.
13+
#[no_mangle]
14+
pub unsafe extern "C" fn save_access_key(
15+
encrypted_request: ffi_set_access_key::SetAccessKeyEncryptedRequest,
16+
) -> ffi_set_access_key::SetAccessKeyResult {
17+
let encrypted_request: set_access_key::EncryptedRequest = encrypted_request.into();
18+
let result: set_access_key::SetAccessKeyResult =
19+
unsafe { save_access_key_acquiring_channel(encrypted_request) };
20+
result.into()
21+
}
22+
23+
/// This takes care of acquiring the sending enclave's channel.
24+
unsafe fn save_access_key_acquiring_channel(
25+
encrypted_request: set_access_key::EncryptedRequest,
26+
) -> set_access_key::SetAccessKeyResult {
27+
let &claimed_sending_enclave_id = unsafe {
28+
sealing::rkyv_peek_associated::<set_access_key::Request, sgx_enclave_id_t>(
29+
&encrypted_request,
30+
)
31+
};
32+
33+
let sessions: &DhSessions<_, _> = crate::dh_sessions();
34+
let result = sessions
35+
.with_acquire_established(claimed_sending_enclave_id, |channel| unsafe {
36+
save_access_key_sealing(channel, encrypted_request)
37+
})?;
38+
result
39+
}
40+
41+
/// This takes care of the sealing and unsealing.
42+
unsafe fn save_access_key_sealing(
43+
channel: &mut ProtectedChannel,
44+
encrypted_request: set_access_key::EncryptedRequest,
45+
) -> set_access_key::SetAccessKeyResult {
46+
// Unseal the request
47+
let (request, _sending_enclave_id) = unsafe {
48+
sealing::rkyv_unseal_associated::<set_access_key::Request, sgx_enclave_id_t>(
49+
channel,
50+
encrypted_request,
51+
)
52+
}?;
53+
54+
let response = &save_access_key_impl(request);
55+
56+
// Seal the response
57+
let sealed_response = sealing::rkyv_seal(channel, response)?;
58+
Ok(sealed_response)
59+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//! Implementation for [`crate::ecalls::save_access_key`]
2+
3+
use std::println;
4+
5+
use rtc_types::enclave_messages::set_access_key;
6+
7+
pub(crate) fn save_access_key_impl(request: set_access_key::Request) -> set_access_key::Response {
8+
println!("TODO: save_access_key_impl({:?})", request);
9+
set_access_key::Response { success: false }
10+
}

rtc_auth_enclave/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#![deny(unsafe_op_in_unsafe_fn)]
44
#![deny(clippy::mem_forget)]
55

6+
mod ecalls;
7+
68
#[cfg(not(target_env = "sgx"))]
79
extern crate sgx_tstd as std;
810

0 commit comments

Comments
 (0)