Skip to content
This repository was archived by the owner on Oct 26, 2021. It is now read-only.

Commit 0a5bad4

Browse files
committed
Implement SGX measure()
Signed-off-by: Lily Sturmann <[email protected]>
1 parent 2a2847f commit 0a5bad4

File tree

4 files changed

+106
-75
lines changed

4 files changed

+106
-75
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ backend-sgx = ["sgx"]
3232

3333
[dependencies]
3434
sev = { git = "https://github.com/enarx/sev", features = ["openssl"], optional = true }
35-
sgx = { git = "https://github.com/enarx/sgx", rev = "e805b51", features = ["asm", "crypto"], optional = true }
35+
sgx = { git = "https://github.com/lkatalin/sgx", branch = "hasher", features = ["asm", "crypto"], optional = true }
3636
koine = { git = "https://github.com/enarx/koine", optional = true }
3737
x86_64 = { version = "0.11", default-features = false, features = ["stable"], optional = true }
3838
kvm-bindings = { version = "0.3", optional = true }

src/backend/sgx/builder.rs

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
use crate::binary::Component;
4+
5+
use anyhow::Result;
6+
use lset::Span;
7+
use primordial::Page;
8+
use sgx::enclave::{Builder, Segment};
9+
use sgx::types::{
10+
page::{Flags, SecInfo},
11+
tcs::Tcs,
12+
};
13+
14+
/// Creates and loads an enclave, then returns the Builder.
15+
pub fn builder(mut shim: Component, mut code: Component) -> Result<Builder> {
16+
// Calculate the memory layout for the enclave.
17+
let layout = crate::backend::sgx::shim::Layout::calculate(shim.region(), code.region());
18+
19+
// Relocate the shim binary.
20+
shim.entry += layout.shim.start;
21+
for seg in shim.segments.iter_mut() {
22+
seg.dst += layout.shim.start;
23+
}
24+
25+
// Relocate the code binary.
26+
code.entry += layout.code.start;
27+
for seg in code.segments.iter_mut() {
28+
seg.dst += layout.code.start;
29+
}
30+
31+
// Create SSAs and TCS.
32+
let ssas = vec![Page::default(); 2];
33+
let tcs = Tcs::new(
34+
shim.entry - layout.enclave.start,
35+
Page::size() * 2, // SSAs after Layout (see below)
36+
ssas.len() as _,
37+
);
38+
39+
let internal = vec![
40+
// TCS
41+
Segment {
42+
si: SecInfo::tcs(),
43+
dst: layout.prefix.start,
44+
src: vec![Page::copy(tcs)],
45+
},
46+
// Layout
47+
Segment {
48+
si: SecInfo::reg(Flags::R),
49+
dst: layout.prefix.start + Page::size(),
50+
src: vec![Page::copy(layout)],
51+
},
52+
// SSAs
53+
Segment {
54+
si: SecInfo::reg(Flags::R | Flags::W),
55+
dst: layout.prefix.start + Page::size() * 2,
56+
src: ssas,
57+
},
58+
// Heap
59+
Segment {
60+
si: SecInfo::reg(Flags::R | Flags::W | Flags::X),
61+
dst: layout.heap.start,
62+
src: vec![Page::default(); Span::from(layout.heap).count / Page::size()],
63+
},
64+
// Stack
65+
Segment {
66+
si: SecInfo::reg(Flags::R | Flags::W),
67+
dst: layout.stack.start,
68+
src: vec![Page::default(); Span::from(layout.stack).count / Page::size()],
69+
},
70+
];
71+
72+
let shim_segs: Vec<_> = shim.segments.into_iter().map(Segment::from).collect();
73+
let code_segs: Vec<_> = code.segments.into_iter().map(Segment::from).collect();
74+
75+
// Initiate the enclave building process.
76+
let mut builder = Builder::new(layout.enclave).expect("Unable to create builder");
77+
builder.load(&internal)?;
78+
builder.load(&shim_segs)?;
79+
builder.load(&code_segs)?;
80+
81+
Ok(builder)
82+
}

src/backend/sgx/mod.rs

+22-73
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,22 @@ use crate::sallyport;
77
use crate::syscall::{SYS_ENARX_CPUID, SYS_ENARX_ERESUME, SYS_ENARX_GETATT};
88

99
use anyhow::{anyhow, Result};
10-
use lset::Span;
11-
use primordial::Page;
12-
use sgx::enclave::{Builder, Enclave, Entry, Registers, Segment};
10+
use sgx::enclave::{Enclave, Entry, Registers, Segment};
1311
use sgx::types::{
1412
page::{Flags, SecInfo},
13+
sig::{Author, Parameters},
1514
ssa::Exception,
16-
tcs::Tcs,
1715
};
1816

1917
use std::arch::x86_64::__cpuid_count;
2018
use std::convert::TryInto;
2119
use std::path::Path;
2220
use std::sync::{Arc, RwLock};
2321

22+
use openssl::{bn, rsa};
23+
2424
mod attestation;
25+
mod builder;
2526
mod data;
2627
mod shim;
2728

@@ -73,78 +74,26 @@ impl crate::backend::Backend for Backend {
7374
}
7475

7576
/// Create a keep instance on this backend
76-
fn build(&self, mut code: Component, _sock: Option<&Path>) -> Result<Arc<dyn Keep>> {
77-
let mut shim = Component::from_bytes(SHIM)?;
78-
79-
// Calculate the memory layout for the enclave.
80-
let layout = crate::backend::sgx::shim::Layout::calculate(shim.region(), code.region());
81-
82-
// Relocate the shim binary.
83-
shim.entry += layout.shim.start;
84-
for seg in shim.segments.iter_mut() {
85-
seg.dst += layout.shim.start;
86-
}
87-
88-
// Relocate the code binary.
89-
code.entry += layout.code.start;
90-
for seg in code.segments.iter_mut() {
91-
seg.dst += layout.code.start;
92-
}
93-
94-
// Create SSAs and TCS.
95-
let ssas = vec![Page::default(); 2];
96-
let tcs = Tcs::new(
97-
shim.entry - layout.enclave.start,
98-
Page::size() * 2, // SSAs after Layout (see below)
99-
ssas.len() as _,
100-
);
101-
102-
let internal = vec![
103-
// TCS
104-
Segment {
105-
si: SecInfo::tcs(),
106-
dst: layout.prefix.start,
107-
src: vec![Page::copy(tcs)],
108-
},
109-
// Layout
110-
Segment {
111-
si: SecInfo::reg(Flags::R),
112-
dst: layout.prefix.start + Page::size(),
113-
src: vec![Page::copy(layout)],
114-
},
115-
// SSAs
116-
Segment {
117-
si: SecInfo::reg(Flags::R | Flags::W),
118-
dst: layout.prefix.start + Page::size() * 2,
119-
src: ssas,
120-
},
121-
// Heap
122-
Segment {
123-
si: SecInfo::reg(Flags::R | Flags::W | Flags::X),
124-
dst: layout.heap.start,
125-
src: vec![Page::default(); Span::from(layout.heap).count / Page::size()],
126-
},
127-
// Stack
128-
Segment {
129-
si: SecInfo::reg(Flags::R | Flags::W),
130-
dst: layout.stack.start,
131-
src: vec![Page::default(); Span::from(layout.stack).count / Page::size()],
132-
},
133-
];
134-
135-
let shim_segs: Vec<_> = shim.segments.into_iter().map(Segment::from).collect();
136-
let code_segs: Vec<_> = code.segments.into_iter().map(Segment::from).collect();
137-
138-
// Initiate the enclave building process.
139-
let mut builder = Builder::new(layout.enclave).expect("Unable to create builder");
140-
builder.load(&internal)?;
141-
builder.load(&shim_segs)?;
142-
builder.load(&code_segs)?;
77+
fn build(&self, code: Component, _sock: Option<&Path>) -> Result<Arc<dyn Keep>> {
78+
let shim = Component::from_bytes(SHIM)?;
79+
let builder = builder::builder(shim, code)?;
14380
Ok(builder.build()?)
14481
}
14582

146-
fn measure(&self, mut _code: Component) -> Result<String> {
147-
unimplemented!()
83+
fn measure(&self, code: Component) -> Result<String> {
84+
let shim = Component::from_bytes(SHIM)?;
85+
86+
let builder = builder::builder(shim, code)?;
87+
88+
// Use Builder's hasher to get enclave measurement.
89+
let hasher = builder.hasher();
90+
let vendor = Author::new(0, 0);
91+
let exp = bn::BigNum::from_u32(3u32)?;
92+
let key = rsa::Rsa::generate_with_e(3072, &exp)?;
93+
let sig = hasher.finish(Parameters::default()).sign(vendor, key)?;
94+
let mrenclave = sig.measurement().mrenclave();
95+
let json = format!(r#"{{ "backend": "sgx", "mrenclave": {:?} }}"#, mrenclave);
96+
Ok(json)
14897
}
14998
}
15099

0 commit comments

Comments
 (0)