Skip to content

Commit a544272

Browse files
author
valdok
committed
Added SgxFile migration code from sdk ver 2.17
1 parent f695d70 commit a544272

File tree

1 file changed

+174
-0
lines changed

1 file changed

+174
-0
lines changed

cosmwasm/enclaves/shared/utils/src/storage.rs

+174
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use crate::results::UnwrapOrSgxErrorUnexpected;
22

3+
use core::mem;
4+
use core::ptr::null;
35
use std::io::{Read, Write};
6+
use std::mem::*;
47
use std::sgxfs::SgxFile;
8+
use std::slice;
59

610
use sgx_types::*;
711
use std::untrusted::fs;
@@ -46,3 +50,173 @@ pub fn rewrite_on_untrusted(bytes: &[u8], filepath: &str) -> SgxResult<()> {
4650

4751
write_to_untrusted(bytes, filepath)
4852
}
53+
54+
55+
56+
//////////////
57+
#[repr(packed)]
58+
pub struct file_md_plain {
59+
pub file_id: u64,
60+
pub major_version: u8,
61+
pub minor_version: u8,
62+
63+
pub key_id: [u8; 32],
64+
pub cpu_svn: [u8; 16],
65+
pub isv_svn: u16,
66+
pub use_user_kdk_key: u8,
67+
pub attribute_mask_flags: u64,
68+
pub attribute_mask_xfrm: u64,
69+
pub meta_data_gmac: [u8; 16],
70+
pub update_flag: u8,
71+
}
72+
73+
const file_md_encrypted_data_size: usize = 3072;
74+
const file_md_encrypted_filename_size: usize = 260;
75+
76+
#[repr(packed)]
77+
pub struct file_md_encrypted {
78+
pub clean_filename: [u8; file_md_encrypted_filename_size],
79+
pub size: u64,
80+
81+
// that was deleted in 2.18
82+
pub mc_uuid: [u8; 16],
83+
pub mc_value: u32,
84+
85+
pub mht_key: [u8; 16],
86+
pub mht_gmac: [u8; 16],
87+
88+
pub data: [u8; file_md_encrypted_data_size],
89+
}
90+
91+
#[repr(packed)]
92+
pub struct file_md {
93+
pub plain: file_md_plain,
94+
pub encr: file_md_encrypted,
95+
pub padding: [u8; 610],
96+
}
97+
98+
pub fn unseal_file_from_2_17(
99+
sPath: &str,
100+
should_check_fname: bool,
101+
) -> Result<Vec<u8>, sgx_status_t> {
102+
let mut file = match File::open(sPath) {
103+
Ok(f) => f,
104+
Err(e) => {
105+
return Err(/*e*/ sgx_status_t::SGX_ERROR_UNEXPECTED);
106+
}
107+
};
108+
109+
let mut bytes = Vec::new();
110+
if let Err(e) = file.read_to_end(&mut bytes) {
111+
return Err(/*e*/ sgx_status_t::SGX_ERROR_UNEXPECTED);
112+
}
113+
114+
if bytes.len() < mem::size_of::<file_md>() {
115+
return Err(sgx_status_t::SGX_ERROR_UNEXPECTED);
116+
}
117+
118+
unsafe {
119+
let p_md = bytes.as_mut_ptr() as *const file_md;
120+
121+
let mut key_request: sgx_key_request_t = sgx_key_request_t::default();
122+
123+
key_request.key_name = sgx_types::SGX_KEYSELECT_SEAL;
124+
key_request.key_policy = sgx_types::SGX_KEYPOLICY_MRSIGNER;
125+
126+
key_request.attribute_mask.flags = sgx_types::TSEAL_DEFAULT_FLAGSMASK;
127+
key_request.attribute_mask.xfrm = 0x0;
128+
key_request.misc_mask = sgx_types::TSEAL_DEFAULT_MISCMASK;
129+
130+
key_request.cpu_svn.svn = (*p_md).plain.cpu_svn;
131+
key_request.isv_svn = (*p_md).plain.isv_svn;
132+
key_request.key_id.id = (*p_md).plain.key_id;
133+
134+
let mut cur_key: sgx_key_128bit_t = sgx_key_128bit_t::default();
135+
136+
let mut st = sgx_get_key(&key_request, &mut cur_key);
137+
if sgx_status_t::SGX_SUCCESS != st {
138+
return Err(st);
139+
}
140+
141+
let mut md_decr: file_md_encrypted = file_md_encrypted {
142+
clean_filename: [0; file_md_encrypted_filename_size],
143+
size: 0,
144+
mc_uuid: [0; 16],
145+
mc_value: 0,
146+
mht_key: [0; 16],
147+
mht_gmac: [0; 16],
148+
149+
data: [0; 3072],
150+
};
151+
152+
let p_iv: [u8; 12] = [0; 12];
153+
154+
st = sgx_rijndael128GCM_decrypt(
155+
&cur_key,
156+
std::ptr::addr_of!((*p_md).encr) as *const u8,
157+
mem::size_of::<file_md_encrypted>() as u32,
158+
std::ptr::addr_of!(md_decr) as *mut uint8_t,
159+
p_iv.as_ptr() as *const u8,
160+
12,
161+
null(),
162+
0,
163+
&(*p_md).plain.meta_data_gmac,
164+
);
165+
166+
if sgx_status_t::SGX_SUCCESS != st {
167+
return Err(st);
168+
}
169+
170+
let ret_size = std::ptr::read_unaligned(std::ptr::addr_of!(md_decr.size)) as usize;
171+
if ret_size > file_md_encrypted_data_size {
172+
return Err(sgx_status_t::SGX_ERROR_UNEXPECTED);
173+
}
174+
175+
bytes.resize(ret_size, 0);
176+
bytes.copy_from_slice(slice::from_raw_parts(md_decr.data.as_ptr(), ret_size));
177+
178+
if should_check_fname {
179+
let raw_path = sPath.as_bytes();
180+
181+
let mut fname0: usize = 0;
182+
for i in 0..raw_path.len() {
183+
if raw_path[i] == '/' as u8 {
184+
fname0 = i + 1;
185+
}
186+
}
187+
188+
let file_name_len = raw_path.len() - fname0;
189+
190+
if file_name_len > file_md_encrypted_filename_size {
191+
return Err(sgx_status_t::SGX_ERROR_FILE_NAME_MISMATCH);
192+
}
193+
194+
if (file_name_len < file_md_encrypted_filename_size)
195+
&& (md_decr.clean_filename[file_name_len] != 0)
196+
{
197+
return Err(sgx_status_t::SGX_ERROR_FILE_NAME_MISMATCH);
198+
}
199+
200+
let src_name = slice::from_raw_parts(&raw_path[fname0], file_name_len);
201+
let dst_name = slice::from_raw_parts(&md_decr.clean_filename[0], file_name_len);
202+
203+
if src_name != dst_name {
204+
return Err(sgx_status_t::SGX_ERROR_FILE_NAME_MISMATCH);
205+
}
206+
}
207+
};
208+
209+
Ok(bytes)
210+
}
211+
212+
pub fn migrate_file_from_2_17(sPath: &str, should_check_fname: bool) -> sgx_status_t {
213+
let data = match unseal_file_from_2_17(sPath, should_check_fname) {
214+
Ok(x) => x,
215+
Err(e) => {
216+
return e;
217+
}
218+
};
219+
220+
seal(data.as_slice(), sPath);
221+
return sgx_status_t::SGX_SUCCESS;
222+
}

0 commit comments

Comments
 (0)