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

Commit f297a27

Browse files
committed
WIP(rtc_tenclave): sealing
1 parent caabc26 commit f297a27

File tree

8 files changed

+117
-1
lines changed

8 files changed

+117
-1
lines changed

rtc_auth_enclave/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rtc_data_enclave/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rtc_exec_enclave/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rtc_tenclave/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rtc_tenclave/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ ring = { version = "0.17.0-alpha.8", default-features = false }
6363
sodalite = { version = "0.4.0", default-features = false }
6464
cfg-if = "1.0.0"
6565
hex = { version = "0.4.3", default-features = false, features = ["alloc"] }
66+
rkyv = { version = "0.6.6", default_features = false, features = ["const_generics", "strict"] }
6667

6768
[dev-dependencies]
6869
thiserror_std = { package = "thiserror", version = "1.0.9" }

rtc_tenclave/src/dh/protected_channel.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl ProtectedChannel {
5454

5555
pub fn decrypt_message<const MESSAGE_SIZE: usize, const AAD_SIZE: usize>(
5656
&self,
57-
message: EncryptedEnclaveMessage<MESSAGE_SIZE, AAD_SIZE>,
57+
message: &EncryptedEnclaveMessage<MESSAGE_SIZE, AAD_SIZE>,
5858
) -> Result<[u8; MESSAGE_SIZE], sgx_status_t> {
5959
let mut dst = [0_u8; MESSAGE_SIZE];
6060
rsgx_rijndael128GCM_decrypt(

rtc_tenclave/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ pub mod dh;
2626
pub mod crypto;
2727
pub mod enclave;
2828
pub mod kv_store;
29+
pub mod sealing;
2930
pub mod util;

rtc_tenclave/src/sealing.rs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use core::mem::size_of;
2+
3+
use sgx_types::sgx_status_t;
4+
5+
use rkyv::{
6+
ser::serializers::{BufferSerializer, BufferSerializerError},
7+
Aligned, Archive, Deserialize, Infallible, Serialize,
8+
};
9+
10+
use rtc_types::{
11+
binhelpers::{rkyv_read_array, rkyv_write_array},
12+
enclave_messages::{set_access_key, EncryptedEnclaveMessage},
13+
};
14+
15+
use crate::dh::ProtectedChannel;
16+
17+
pub fn rkyv_seal_associated<T, A>(
18+
channel: &mut ProtectedChannel,
19+
unsealed: &T,
20+
associated: &A,
21+
) -> Result<
22+
EncryptedEnclaveMessage<{ size_of::<T::Archived>() }, { size_of::<A::Archived>() }>,
23+
SealingError,
24+
>
25+
where
26+
T: Serialize<BufferSerializer<Aligned<[u8; size_of::<T::Archived>()]>>>,
27+
A: Serialize<BufferSerializer<Aligned<[u8; size_of::<A::Archived>()]>>>,
28+
{
29+
let plaintext = rkyv_write_array(unsealed)?;
30+
let aad = rkyv_write_array(associated)?;
31+
let sealed = channel.encrypt_message(plaintext, aad)?;
32+
Ok(sealed)
33+
}
34+
35+
pub unsafe fn rkyv_unseal_associated<T, A>(
36+
channel: &ProtectedChannel,
37+
sealed: &EncryptedEnclaveMessage<{ size_of::<T::Archived>() }, { size_of::<A::Archived>() }>,
38+
) -> Result<(T, A), SealingError>
39+
where
40+
T: Archive,
41+
T::Archived: Deserialize<T, Infallible>,
42+
A: Archive,
43+
A::Archived: Deserialize<A, Infallible>,
44+
{
45+
let plaintext = &channel.decrypt_message(sealed)?;
46+
let unsealed = unsafe { rkyv_read_array(plaintext) };
47+
let associated = unsafe { rkyv_read_array(&sealed.aad) };
48+
Ok((unsealed, associated))
49+
}
50+
51+
pub fn rkyv_seal<T>(
52+
channel: &mut ProtectedChannel,
53+
unsealed: &T,
54+
) -> Result<EncryptedEnclaveMessage<{ size_of::<T::Archived>() }, 0>, SealingError>
55+
where
56+
T: Serialize<BufferSerializer<Aligned<[u8; size_of::<T::Archived>()]>>>,
57+
{
58+
let bytes = rkyv_write_array(unsealed)?;
59+
let sealed = channel.encrypt_message(bytes, [])?;
60+
Ok(sealed)
61+
}
62+
63+
pub unsafe fn rkyv_unseal<T>(
64+
channel: &ProtectedChannel,
65+
sealed: &EncryptedEnclaveMessage<{ size_of::<T::Archived>() }, 0>,
66+
) -> Result<T, SealingError>
67+
where
68+
T: Archive,
69+
T::Archived: Deserialize<T, Infallible>,
70+
{
71+
let bytes = &channel.decrypt_message(sealed)?;
72+
let unsealed = unsafe { rkyv_read_array(bytes) };
73+
Ok(unsealed)
74+
}
75+
76+
// #[cfg(test)]
77+
// mod tests {
78+
// use core::mem::size_of_val;
79+
//
80+
// use super::*;
81+
//
82+
// #[test]
83+
// fn test_seal_unseal_request() {
84+
// let test = |request: &Request| {
85+
// let bytes = &rkyv_write_array(request).unwrap();
86+
// assert_eq!(size_of_val(bytes), ARCHIVED_FOO_SIZE);
87+
//
88+
// let unsealed = &unsafe { rkyv_read_array(bytes) };
89+
// assert_eq!(request, unsealed);
90+
// };
91+
// proptest!(|(value: Request)| test(&value));
92+
// }
93+
// }
94+
95+
pub enum SealingError {
96+
Rkyv(BufferSerializerError),
97+
Sgx(sgx_status_t),
98+
}
99+
100+
impl From<BufferSerializerError> for SealingError {
101+
fn from(error: BufferSerializerError) -> Self {
102+
SealingError::Rkyv(error)
103+
}
104+
}
105+
106+
impl From<sgx_status_t> for SealingError {
107+
fn from(status: sgx_status_t) -> Self {
108+
SealingError::Sgx(status)
109+
}
110+
}

0 commit comments

Comments
 (0)