in samplecode/pcl/pcl-seal/app/src/main.rs [177:293]
fn main() {
let mut args: Vec<_> = env::args().collect();
let mut sign_type = sgx_quote_sign_type_t::SGX_LINKABLE_SIGNATURE;
args.remove(0);
while !args.is_empty() {
match args.remove(0).as_ref() {
"--unlink" => sign_type = sgx_quote_sign_type_t::SGX_UNLINKABLE_SIGNATURE,
_ => {
panic!("Only --unlink is accepted");
}
}
}
let enclave = match init_enclave() {
Ok(r) => {
println!("[+] Init Enclave Successful {}!", r.geteid());
r
},
Err(x) => {
println!("[-] Init Enclave Failed {}!", x.as_str());
return;
},
};
println!("[+] Running as server...");
let listener = TcpListener::bind("0.0.0.0:3443").unwrap();
match listener.accept() {
Ok((socket, addr)) => {
println!("[+] new client from {:?}", addr);
let mut retval = sgx_status_t::SGX_SUCCESS;
let result = unsafe {
key_provision(enclave.geteid(), &mut retval, socket.as_raw_fd(), sign_type)
};
match result {
sgx_status_t::SGX_SUCCESS => {
println!("[+] ECALL success!");
},
_ => {
println!("[-] ECALL Enclave Failed {}!", result.as_str());
return;
}
}
match retval {
sgx_status_t::SGX_SUCCESS => {
println!("[+] provisioning successed!");
},
x => {
println!("[-] key provisioning failed! {}", x.as_str());
},
}
},
Err(e) => println!("[-] couldn't get client: {:?}", e),
}
let mut pcl_sealed_key_len : u32 = 0;
let result = unsafe { get_sealed_pcl_key_len(enclave.geteid(),
&mut pcl_sealed_key_len as *mut u32) };
if result != sgx_status_t::SGX_SUCCESS {
println!("[-] Call get_sealed_pcl_key_len error {}", result);
}
println!("[+] Get sealed_pcl_key_len = {}", pcl_sealed_key_len);
let mut sealed_key_vec: Vec<u8> = vec![0u8;pcl_sealed_key_len as usize];
let mut retval = sgx_status_t::SGX_SUCCESS;
let result = unsafe {
get_sealed_pcl_key(enclave.geteid(),
&mut retval,
sealed_key_vec.as_mut_ptr(),
pcl_sealed_key_len)
};
if result != sgx_status_t::SGX_SUCCESS {
println!("[-] Call get_sealed_pcl_key error {}", result);
}
if retval != sgx_status_t::SGX_SUCCESS {
println!("[-] get_sealed_pcl_key returned error {}", retval);
}
println!("get_sealed_pcl_key {:02X}", sealed_key_vec.iter().format(""));
let result = init_encrypted_enclave(ENCRYPTED_ENCLAVE_FILE,
&sealed_key_vec);
let payload_enclave = match result {
Ok(r) => {
println!("[+] Init Enclave Successful {}!", r.geteid());
r
},
Err(x) => {
println!("[-] Init Enclave Failed {}!", x.as_str());
return;
},
};
let mut retval : sgx_status_t = sgx_status_t::SGX_SUCCESS;
let input_string = String::from("This is a normal world string passed into Enclave!\n");
let result = unsafe {
f_01ff85f39c4c46adba815dec85546b5579ad1b56(
payload_enclave.geteid(),
&mut retval,
input_string.as_ptr() as * const u8,
input_string.len())
};
if result != sgx_status_t::SGX_SUCCESS {
println!("[-] Call encrypted func error {}", result);
}
if retval != sgx_status_t::SGX_SUCCESS {
println!("[-] encrypted func returned error {}", retval);
}
println!("[+] Done!");
enclave.destroy();
}