@@ -7,21 +7,22 @@ use crate::sallyport;
7
7
use crate :: syscall:: { SYS_ENARX_CPUID , SYS_ENARX_ERESUME , SYS_ENARX_GETATT } ;
8
8
9
9
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 } ;
13
11
use sgx:: types:: {
14
12
page:: { Flags , SecInfo } ,
13
+ sig:: { Author , Parameters } ,
15
14
ssa:: Exception ,
16
- tcs:: Tcs ,
17
15
} ;
18
16
19
17
use std:: arch:: x86_64:: __cpuid_count;
20
18
use std:: convert:: TryInto ;
21
19
use std:: path:: Path ;
22
20
use std:: sync:: { Arc , RwLock } ;
23
21
22
+ use openssl:: { bn, rsa} ;
23
+
24
24
mod attestation;
25
+ mod builder;
25
26
mod data;
26
27
mod shim;
27
28
@@ -73,78 +74,26 @@ impl crate::backend::Backend for Backend {
73
74
}
74
75
75
76
/// 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) ?;
143
80
Ok ( builder. build ( ) ?)
144
81
}
145
82
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)
148
97
}
149
98
}
150
99
0 commit comments