Skip to content

Commit 12a004e

Browse files
authored
Return encoded extrinsics without padding (#2287)
* Return exact xt length * fix compile * fix clippy * fix test
1 parent d40bc3d commit 12a004e

File tree

9 files changed

+148
-92
lines changed

9 files changed

+148
-92
lines changed

tee-worker/core-primitives/enclave-api/ffi/src/lib.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ extern "C" {
1515
quote: *const u8,
1616
quote_size: u32,
1717
unchecked_extrinsic: *mut u8,
18-
unchecked_extrinsic_size: u32,
18+
unchecked_extrinsic_max_size: u32,
19+
unchecked_extrinsic_size: *mut u32,
1920
) -> sgx_status_t;
2021

2122
pub fn init(
@@ -127,7 +128,8 @@ extern "C" {
127128
w_url: *const u8,
128129
w_url_size: u32,
129130
unchecked_extrinsic: *mut u8,
130-
unchecked_extrinsic_size: u32,
131+
unchecked_extrinsic_max_size: u32,
132+
unchecked_extrinsic_size: *mut u32,
131133
skip_ra: c_int,
132134
) -> sgx_status_t;
133135

@@ -137,7 +139,8 @@ extern "C" {
137139
w_url: *const u8,
138140
w_url_size: u32,
139141
unchecked_extrinsic: *mut u8,
140-
unchecked_extrinsic_size: u32,
142+
unchecked_extrinsic_max_size: u32,
143+
unchecked_extrinsic_size: *mut u32,
141144
skip_ra: c_int,
142145
quoting_enclave_target_info: Option<&sgx_target_info_t>,
143146
quote_size: Option<&u32>,
@@ -158,15 +161,17 @@ extern "C" {
158161
retval: *mut sgx_status_t,
159162
collateral: *const sgx_ql_qve_collateral_t,
160163
unchecked_extrinsic: *mut u8,
161-
unchecked_extrinsic_size: u32,
164+
unchecked_extrinsic_max_size: u32,
165+
unchecked_extrinsic_size: *mut u32,
162166
) -> sgx_status_t;
163167

164168
pub fn generate_register_tcb_info_extrinsic(
165169
eid: sgx_enclave_id_t,
166170
retval: *mut sgx_status_t,
167171
collateral: *const sgx_ql_qve_collateral_t,
168172
unchecked_extrinsic: *mut u8,
169-
unchecked_extrinsic_size: u32,
173+
unchecked_extrinsic_max_size: u32,
174+
unchecked_extrinsic_size: *mut u32,
170175
) -> sgx_status_t;
171176

172177
pub fn dump_ias_ra_cert_to_disk(
@@ -206,7 +211,8 @@ extern "C" {
206211
fiat_currency: *const u8,
207212
fiat_currency_size: u32,
208213
unchecked_extrinsic: *mut u8,
209-
unchecked_extrinsic_size: u32,
214+
unchecked_extrinsic_max_size: u32,
215+
unchecked_extrinsic_size: *mut u32,
210216
) -> sgx_status_t;
211217

212218
pub fn update_weather_data_xt(
@@ -217,7 +223,8 @@ extern "C" {
217223
weather_info_latitude: *const u8,
218224
weather_info_latitude_size: u32,
219225
unchecked_extrinsic: *mut u8,
220-
unchecked_extrinsic_size: u32,
226+
unchecked_extrinsic_max_size: u32,
227+
unchecked_extrinsic_size: *mut u32,
221228
) -> sgx_status_t;
222229

223230
pub fn run_state_provisioning_server(

tee-worker/core-primitives/enclave-api/src/remote_attestation.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,9 @@ impl RemoteAttestation for Enclave {
136136
let mut retval = sgx_status_t::SGX_SUCCESS;
137137

138138
let mut unchecked_extrinsic: Vec<u8> = vec![0u8; EXTRINSIC_MAX_SIZE];
139+
let mut unchecked_extrinsic_size: u32 = 0;
139140

140-
trace!("Generating dcap_ra_extrinsic with URL: {}", w_url);
141+
trace!("Generating ias_ra_extrinsic with URL: {}", w_url);
141142

142143
let url = w_url.encode();
143144

@@ -149,14 +150,15 @@ impl RemoteAttestation for Enclave {
149150
url.len() as u32,
150151
unchecked_extrinsic.as_mut_ptr(),
151152
unchecked_extrinsic.len() as u32,
153+
&mut unchecked_extrinsic_size as *mut u32,
152154
skip_ra.into(),
153155
)
154156
};
155157

156158
ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result));
157159
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
158160

159-
Ok(unchecked_extrinsic)
161+
Ok(Vec::from(&unchecked_extrinsic[..unchecked_extrinsic_size as usize]))
160162
}
161163
fn generate_dcap_ra_extrinsic_from_quote(
162164
&self,
@@ -165,6 +167,7 @@ impl RemoteAttestation for Enclave {
165167
) -> EnclaveResult<Vec<u8>> {
166168
let mut retval = sgx_status_t::SGX_SUCCESS;
167169
let mut unchecked_extrinsic: Vec<u8> = vec![0u8; EXTRINSIC_MAX_SIZE];
170+
let mut unchecked_extrinsic_size: u32 = 0;
168171
let url = url.encode();
169172

170173
let result = unsafe {
@@ -177,13 +180,14 @@ impl RemoteAttestation for Enclave {
177180
quote.len() as u32,
178181
unchecked_extrinsic.as_mut_ptr(),
179182
unchecked_extrinsic.len() as u32,
183+
&mut unchecked_extrinsic_size as *mut u32,
180184
)
181185
};
182186

183187
ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result));
184188
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
185189

186-
Ok(unchecked_extrinsic.to_vec())
190+
Ok(Vec::from(&unchecked_extrinsic[..unchecked_extrinsic_size as usize]))
187191
}
188192

189193
fn generate_dcap_ra_quote(&self, skip_ra: bool) -> EnclaveResult<Vec<u8>> {
@@ -242,7 +246,7 @@ impl RemoteAttestation for Enclave {
242246
trace!("Generating dcap_ra_extrinsic with URL: {}", w_url);
243247

244248
let mut unchecked_extrinsic: Vec<u8> = vec![0u8; EXTRINSIC_MAX_SIZE];
245-
249+
let mut unchecked_extrinsic_size: u32 = 0;
246250
let url = w_url.encode();
247251

248252
let result = unsafe {
@@ -253,6 +257,7 @@ impl RemoteAttestation for Enclave {
253257
url.len() as u32,
254258
unchecked_extrinsic.as_mut_ptr(),
255259
unchecked_extrinsic.len() as u32,
260+
&mut unchecked_extrinsic_size as *mut u32,
256261
skip_ra.into(),
257262
quoting_enclave_target_info.as_ref(),
258263
quote_size.as_ref(),
@@ -262,12 +267,13 @@ impl RemoteAttestation for Enclave {
262267
ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result));
263268
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
264269

265-
Ok(unchecked_extrinsic)
270+
Ok(Vec::from(&unchecked_extrinsic[..unchecked_extrinsic_size as usize]))
266271
}
267272

268273
fn generate_register_quoting_enclave_extrinsic(&self, fmspc: Fmspc) -> EnclaveResult<Vec<u8>> {
269274
let mut retval = sgx_status_t::SGX_SUCCESS;
270275
let mut unchecked_extrinsic: Vec<u8> = vec![0u8; EXTRINSIC_MAX_SIZE];
276+
let mut unchecked_extrinsic_size: u32 = 0;
271277

272278
trace!("Generating register quoting enclave");
273279

@@ -280,19 +286,21 @@ impl RemoteAttestation for Enclave {
280286
collateral_ptr,
281287
unchecked_extrinsic.as_mut_ptr(),
282288
unchecked_extrinsic.len() as u32,
289+
&mut unchecked_extrinsic_size as *mut u32,
283290
)
284291
};
285292
let free_status = unsafe { sgx_ql_free_quote_verification_collateral(collateral_ptr) };
286293
ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result));
287294
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
288295
ensure!(free_status == sgx_quote3_error_t::SGX_QL_SUCCESS, Error::SgxQuote(free_status));
289296

290-
Ok(unchecked_extrinsic)
297+
Ok(Vec::from(&unchecked_extrinsic[..unchecked_extrinsic_size as usize]))
291298
}
292299

293300
fn generate_register_tcb_info_extrinsic(&self, fmspc: Fmspc) -> EnclaveResult<Vec<u8>> {
294301
let mut retval = sgx_status_t::SGX_SUCCESS;
295302
let mut unchecked_extrinsic: Vec<u8> = vec![0u8; EXTRINSIC_MAX_SIZE];
303+
let mut unchecked_extrinsic_size: u32 = 0;
296304

297305
trace!("Generating tcb_info registration");
298306

@@ -305,14 +313,15 @@ impl RemoteAttestation for Enclave {
305313
collateral_ptr,
306314
unchecked_extrinsic.as_mut_ptr(),
307315
unchecked_extrinsic.len() as u32,
316+
&mut unchecked_extrinsic_size as *mut u32,
308317
)
309318
};
310319
let free_status = unsafe { sgx_ql_free_quote_verification_collateral(collateral_ptr) };
311320
ensure!(result == sgx_status_t::SGX_SUCCESS, Error::Sgx(result));
312321
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
313322
ensure!(free_status == sgx_quote3_error_t::SGX_QL_SUCCESS, Error::SgxQuote(free_status));
314323

315-
Ok(unchecked_extrinsic)
324+
Ok(Vec::from(&unchecked_extrinsic[..unchecked_extrinsic_size as usize]))
316325
}
317326

318327
fn dump_ias_ra_cert_to_disk(&self) -> EnclaveResult<()> {

tee-worker/core-primitives/enclave-api/src/teeracle_api.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ impl TeeracleApi for Enclave {
4545
crypto_currency, fiat_currency
4646
);
4747
let mut retval = sgx_status_t::SGX_SUCCESS;
48-
let response_len = 8192;
49-
let mut response: Vec<u8> = vec![0u8; response_len as usize];
48+
let response_max_len = 8192;
49+
let mut response: Vec<u8> = vec![0u8; response_max_len as usize];
50+
let mut response_len: u32 = 0;
5051

5152
let crypto_curr = crypto_currency.encode();
5253
let fiat_curr = fiat_currency.encode();
@@ -60,23 +61,25 @@ impl TeeracleApi for Enclave {
6061
fiat_curr.as_ptr(),
6162
fiat_curr.len() as u32,
6263
response.as_mut_ptr(),
63-
response_len,
64+
response_max_len,
65+
&mut response_len as *mut u32,
6466
)
6567
};
6668

6769
ensure!(res == sgx_status_t::SGX_SUCCESS, Error::Sgx(res));
6870
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
6971

70-
Ok(response)
72+
Ok(Vec::from(&response[..response_len as usize]))
7173
}
7274
fn update_weather_data_xt(&self, longitude: &str, latitude: &str) -> EnclaveResult<Vec<u8>> {
7375
info!(
7476
"TeeracleApi update_weather_data_xt in with latitude: {}, longitude: {}",
7577
latitude, longitude
7678
);
7779
let mut retval = sgx_status_t::SGX_SUCCESS;
78-
let response_len = 8192;
79-
let mut response: Vec<u8> = vec![0u8; response_len as usize];
80+
let response_max_len = 8192;
81+
let mut response: Vec<u8> = vec![0u8; response_max_len as usize];
82+
let mut response_len: u32 = 0;
8083

8184
let longitude_encoded: Vec<u8> = longitude.encode();
8285
let latitude_encoded: Vec<u8> = latitude.encode();
@@ -90,12 +93,13 @@ impl TeeracleApi for Enclave {
9093
latitude_encoded.as_ptr(),
9194
latitude_encoded.len() as u32,
9295
response.as_mut_ptr(),
93-
response_len,
96+
response_max_len,
97+
&mut response_len as *mut u32,
9498
)
9599
};
96100

97101
ensure!(res == sgx_status_t::SGX_SUCCESS, Error::Sgx(res));
98102
ensure!(retval == sgx_status_t::SGX_SUCCESS, Error::Sgx(retval));
99-
Ok(response)
103+
Ok(Vec::from(&response[..response_len as usize]))
100104
}
101105
}

tee-worker/core-primitives/utils/src/buffer.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ use std::vec::Vec;
2424
use crate::sgx_reexport_prelude::thiserror;
2525

2626
/// Fills a given buffer with data and the left over buffer space with white spaces.
27+
/// Throw an error if the buffer size is not enough to hold `data`,
28+
/// return the length of `data` otherwise.
2729
pub fn write_slice_and_whitespace_pad(
2830
writable: &mut [u8],
2931
data: Vec<u8>,
30-
) -> Result<(), BufferError> {
32+
) -> Result<usize, BufferError> {
3133
ensure!(
3234
data.len() <= writable.len(),
3335
BufferError::InsufficientBufferSize(writable.len(), data.len())
@@ -36,10 +38,10 @@ pub fn write_slice_and_whitespace_pad(
3638
left.clone_from_slice(&data);
3739
// fill the right side with whitespace
3840
right.iter_mut().for_each(|x| *x = 0x20);
39-
Ok(())
41+
Ok(data.len())
4042
}
4143

42-
#[derive(Debug, thiserror::Error)]
44+
#[derive(Debug, PartialEq, Eq, thiserror::Error)]
4345
pub enum BufferError {
4446
#[error("Insufficient buffer size. Actual: {0}, required: {1}")]
4547
InsufficientBufferSize(usize, usize),
@@ -49,6 +51,15 @@ pub enum BufferError {
4951
mod tests {
5052
use super::*;
5153

54+
#[test]
55+
fn write_slice_and_whitespace_pad_works() {
56+
let mut writable = vec![0; 32];
57+
let data = vec![1; 30];
58+
assert_eq!(write_slice_and_whitespace_pad(&mut writable, data), Ok(30));
59+
assert_eq!(&writable[..30], vec![1; 30]);
60+
assert_eq!(&writable[30..], vec![0x20; 2]);
61+
}
62+
5263
#[test]
5364
fn write_slice_and_whitespace_pad_returns_error_if_buffer_too_small() {
5465
let mut writable = vec![0; 32];

tee-worker/enclave-runtime/Enclave.edl

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ enclave {
9595

9696
public sgx_status_t generate_ias_ra_extrinsic(
9797
[in, size=w_url_size] uint8_t* w_url, uint32_t w_url_size,
98-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size,
98+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
99+
[out] uint32_t* unchecked_extrinsic_size,
99100
int skip_ra
100101
);
101102
public sgx_status_t generate_dcap_ra_quote(
@@ -108,37 +109,43 @@ enclave {
108109
public sgx_status_t generate_dcap_ra_extrinsic_from_quote(
109110
[in, size=w_url_size] uint8_t* w_url, uint32_t w_url_size,
110111
[in, size=quote_size] uint8_t* quote, uint32_t quote_size,
111-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size
112+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
113+
[out] uint32_t* unchecked_extrinsic_size
112114
);
113115

114116
public sgx_status_t generate_dcap_ra_extrinsic(
115117
[in, size=w_url_size] uint8_t* w_url, uint32_t w_url_size,
116-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size,
118+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
119+
[out] uint32_t* unchecked_extrinsic_size,
117120
int skip_ra,
118121
[in] const sgx_target_info_t* quoting_enclave_target_info,
119122
[in] uint32_t* quote_size
120123
);
121124

122125
public sgx_status_t generate_register_quoting_enclave_extrinsic(
123126
[in] const sgx_ql_qve_collateral_t *p_quote_collateral,
124-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size
127+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
128+
[out] uint32_t* unchecked_extrinsic_size
125129
);
126130

127131
public sgx_status_t generate_register_tcb_info_extrinsic(
128132
[in] const sgx_ql_qve_collateral_t *p_quote_collateral,
129-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size
133+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
134+
[out] uint32_t* unchecked_extrinsic_size
130135
);
131136

132137
public sgx_status_t update_market_data_xt(
133138
[in, size=crypto_currency_size] uint8_t* crypto_currency, uint32_t crypto_currency_size,
134139
[in, size=fiat_currency_size] uint8_t* fiat_currency, uint32_t fiat_currency_size,
135-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size
140+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
141+
[out] uint32_t* unchecked_extrinsic_size
136142
);
137143

138144
public sgx_status_t update_weather_data_xt(
139145
[in, size=weather_info_logitude_size] uint8_t* weather_info_logitude, uint32_t weather_info_logitude_size,
140146
[in, size=weather_info_latitude_size] uint8_t* weather_info_latitude, uint32_t weather_info_latitude_size,
141-
[out, size=unchecked_extrinsic_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_size
147+
[out, size=unchecked_extrinsic_max_size] uint8_t* unchecked_extrinsic, uint32_t unchecked_extrinsic_max_size,
148+
[out] uint32_t* unchecked_extrinsic_size
142149
);
143150

144151
public sgx_status_t dump_ias_ra_cert_to_disk();

0 commit comments

Comments
 (0)