Get image key to buffer for both aecs and grpc_ratls
This commit is contained in:
parent
566f32f7fc
commit
1d24a1e83c
@ -17,13 +17,14 @@ use std::os::raw::{c_int, c_char};
|
|||||||
|
|
||||||
#[link(name = "aecs_client")]
|
#[link(name = "aecs_client")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn aecs_client_get_secret_and_save_file(
|
fn aecs_client_get_secret_by_buffer(
|
||||||
aec_server_endpoint: *const c_char,
|
aec_server_endpoint: *const c_char,
|
||||||
aecs_server_policy: *const c_char,
|
aecs_server_policy: *const c_char,
|
||||||
secret_service: *const c_char,
|
secret_service: *const c_char,
|
||||||
secret_name: *const c_char,
|
secret_name: *const c_char,
|
||||||
nonce: *const c_char,
|
nonce: *const c_char,
|
||||||
save_file_name: *const c_char
|
secret_outbuf: *const u8,
|
||||||
|
secret_outbuf_len: *mut i32
|
||||||
) -> c_int;
|
) -> c_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,6 +97,50 @@ fn load_ra_config(ra_conf_path: &str) -> Result<InitRAConfig, Box<dyn Error>> {
|
|||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct KeyInfo {
|
||||||
|
path: String,
|
||||||
|
val_buf: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_kms_keys(kms_keys: Vec<KmsKeys>, kms_server: CString) -> Result<Vec<KeyInfo>, Box<dyn Error>> {
|
||||||
|
let mut keys_info: Vec<KeyInfo> = Vec::new();
|
||||||
|
for keys in kms_keys {
|
||||||
|
let key = CString::new(&*keys.key).unwrap();
|
||||||
|
let service =CString::new(keys.service).unwrap();
|
||||||
|
// Max key length is 10K
|
||||||
|
let mut buffer: Vec<u8> = vec![0; 10240];
|
||||||
|
let buffer_ptr: *const u8 = buffer.as_ptr();
|
||||||
|
let mut buffer_len: i32 = buffer.len() as i32;
|
||||||
|
let len_ptr: *mut i32 = &mut buffer_len as *mut i32;
|
||||||
|
|
||||||
|
let ret = unsafe {
|
||||||
|
aecs_client_get_secret_by_buffer(
|
||||||
|
kms_server.as_ptr(),
|
||||||
|
std::ptr::null(),
|
||||||
|
service.as_ptr(),
|
||||||
|
key.as_ptr(),
|
||||||
|
std::ptr::null(),
|
||||||
|
buffer_ptr,
|
||||||
|
len_ptr
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if ret != 0 {
|
||||||
|
println!("aecs_client_get_secret_by_buffer failed return {}", ret);
|
||||||
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.resize(buffer_len as usize, 0);
|
||||||
|
|
||||||
|
let key_info: KeyInfo = KeyInfo {
|
||||||
|
path: keys.path.clone(),
|
||||||
|
val_buf: buffer.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
keys_info.push(key_info);
|
||||||
|
}
|
||||||
|
Ok(keys_info)
|
||||||
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
// Load the configuration from initfs
|
// Load the configuration from initfs
|
||||||
@ -103,14 +148,6 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
const INIT_RA_CONF: &str = "/etc/init_ra_conf.json";
|
const INIT_RA_CONF: &str = "/etc/init_ra_conf.json";
|
||||||
let image_config = load_config(IMAGE_CONFIG_FILE)?;
|
let image_config = load_config(IMAGE_CONFIG_FILE)?;
|
||||||
|
|
||||||
// Get the MAC of Occlum.json.protected file
|
|
||||||
let occlum_json_mac = {
|
|
||||||
let mut mac: sgx_aes_gcm_128bit_tag_t = Default::default();
|
|
||||||
parse_str_to_bytes(&image_config.occlum_json_mac, &mut mac)?;
|
|
||||||
mac
|
|
||||||
};
|
|
||||||
let occlum_json_mac_ptr = &occlum_json_mac as *const sgx_aes_gcm_128bit_tag_t;
|
|
||||||
|
|
||||||
// Do parse to get Init RA information
|
// Do parse to get Init RA information
|
||||||
let init_ra_conf = load_ra_config(INIT_RA_CONF)?;
|
let init_ra_conf = load_ra_config(INIT_RA_CONF)?;
|
||||||
// Extract RA config part
|
// Extract RA config part
|
||||||
@ -127,32 +164,40 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
// Get the image encrypted key through RA
|
// Get the image encrypted key through RA
|
||||||
let secret = CString::new("image_key").unwrap();
|
let secret = CString::new("image_key").unwrap();
|
||||||
let service = CString::new("service1").unwrap();
|
let service = CString::new("service1").unwrap();
|
||||||
let filename = CString::new("/etc/image_key").unwrap();
|
let mut buffer: Vec<u8> = vec![0; 256];
|
||||||
|
let buffer_ptr: *const u8 = buffer.as_ptr();
|
||||||
|
let mut buffer_len: i32 = buffer.len() as i32;
|
||||||
|
let len_ptr: *mut i32 = &mut buffer_len as *mut i32;
|
||||||
|
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
aecs_client_get_secret_and_save_file(
|
aecs_client_get_secret_by_buffer(
|
||||||
server_addr.as_ptr(),
|
server_addr.as_ptr(),
|
||||||
std::ptr::null(),
|
std::ptr::null(),
|
||||||
service.as_ptr(),
|
service.as_ptr(),
|
||||||
secret.as_ptr(),
|
secret.as_ptr(),
|
||||||
std::ptr::null(),
|
std::ptr::null(),
|
||||||
filename.as_ptr())
|
buffer_ptr,
|
||||||
|
len_ptr
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
if ret != 0 {
|
if ret != 0 {
|
||||||
println!("grpc_ratls_get_secret failed return {}", ret);
|
println!("aecs_client_get_secret_by_buffer failed return {}", ret);
|
||||||
return Err(Box::new(std::io::Error::last_os_error()));
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const IMAGE_KEY_FILE: &str = "/etc/image_key";
|
buffer.resize(buffer_len as usize, 0);
|
||||||
let key_str = load_key(IMAGE_KEY_FILE)?;
|
let key_string = String::from_utf8(buffer)
|
||||||
// Remove key file which is not needed any more
|
.expect("error converting to string");
|
||||||
fs::remove_file(IMAGE_KEY_FILE)?;
|
let key_str = key_string
|
||||||
|
.trim_end_matches(|c| c == '\r' || c == '\n').to_string();
|
||||||
let mut key: sgx_key_128bit_t = Default::default();
|
let mut key: sgx_key_128bit_t = Default::default();
|
||||||
parse_str_to_bytes(&key_str, &mut key)?;
|
parse_str_to_bytes(&key_str, &mut key)?;
|
||||||
Some(key)
|
Some(key)
|
||||||
}
|
},
|
||||||
"integrity-only" => None,
|
"integrity-only" => {
|
||||||
|
None
|
||||||
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
let key_ptr = key
|
let key_ptr = key
|
||||||
@ -160,57 +205,23 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
.map(|key| key as *const sgx_key_128bit_t)
|
.map(|key| key as *const sgx_key_128bit_t)
|
||||||
.unwrap_or(std::ptr::null());
|
.unwrap_or(std::ptr::null());
|
||||||
|
|
||||||
// Do one time key acquire to force all necessary libraries got loaded to memory.
|
let keys_info: Vec<KeyInfo> =
|
||||||
// Thus after mount rootfs, the API could run successfully.
|
get_kms_keys(init_ra_conf.kms_keys, server_addr).unwrap();
|
||||||
// The key got this time will be dropped.
|
|
||||||
unsafe {
|
|
||||||
let kms_key = init_ra_conf.kms_keys[0].clone();
|
|
||||||
let key = CString::new(kms_key.key).unwrap();
|
|
||||||
let file = CString::new(kms_key.path).unwrap();
|
|
||||||
let service =CString::new(kms_key.service).unwrap();
|
|
||||||
|
|
||||||
aecs_client_get_secret_and_save_file(
|
|
||||||
server_addr.as_ptr(),
|
|
||||||
std::ptr::null(),
|
|
||||||
service.as_ptr(),
|
|
||||||
key.as_ptr(),
|
|
||||||
std::ptr::null(),
|
|
||||||
file.as_ptr());
|
|
||||||
// Remove key file which is not needed any more
|
|
||||||
fs::remove_file(file.into_string().unwrap())?;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Mount the image
|
// Mount the image
|
||||||
const SYS_MOUNT_FS: i64 = 363;
|
const SYS_MOUNT_FS: i64 = 363;
|
||||||
let ret = unsafe { syscall(SYS_MOUNT_FS, key_ptr, occlum_json_mac_ptr) };
|
// User can provide valid path for runtime mount and boot
|
||||||
|
// Otherwise, just pass null pointer to do general mount and boot
|
||||||
|
let root_config_path: *const i8 = std::ptr::null();
|
||||||
|
let ret = unsafe { syscall(
|
||||||
|
SYS_MOUNT_FS, key_ptr, root_config_path) };
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
return Err(Box::new(std::io::Error::last_os_error()));
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite ra_config to rootfs
|
|
||||||
fs::create_dir_all("/etc/kubetee")?;
|
|
||||||
fs::write("/etc/kubetee/unified_attestation.json", ra_conf_string.clone().into_bytes())?;
|
|
||||||
|
|
||||||
// Get keys and save to path
|
// Get keys and save to path
|
||||||
for keys in init_ra_conf.kms_keys {
|
for key_info in keys_info {
|
||||||
let key = CString::new(keys.key).unwrap();
|
fs::write(key_info.path, key_info.val_buf.as_slice())?;
|
||||||
let file = CString::new(keys.path).unwrap();
|
|
||||||
let service =CString::new(keys.service).unwrap();
|
|
||||||
|
|
||||||
let ret = unsafe {
|
|
||||||
aecs_client_get_secret_and_save_file(
|
|
||||||
server_addr.as_ptr(),
|
|
||||||
std::ptr::null(),
|
|
||||||
service.as_ptr(),
|
|
||||||
key.as_ptr(),
|
|
||||||
std::ptr::null(),
|
|
||||||
file.as_ptr())
|
|
||||||
};
|
|
||||||
|
|
||||||
if ret != 0 {
|
|
||||||
println!("Failed to get key {:?}, return {}", key, ret);
|
|
||||||
// return Err(Box::new(std::io::Error::last_os_error()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -218,13 +229,10 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
type sgx_key_128bit_t = [u8; 16];
|
type sgx_key_128bit_t = [u8; 16];
|
||||||
#[allow(non_camel_case_types)]
|
|
||||||
type sgx_aes_gcm_128bit_tag_t = [u8; 16];
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
struct ImageConfig {
|
struct ImageConfig {
|
||||||
occlum_json_mac: String,
|
|
||||||
image_type: String,
|
image_type: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,13 +247,6 @@ fn load_config(config_path: &str) -> Result<ImageConfig, Box<dyn Error>> {
|
|||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_key(key_path: &str) -> Result<String, Box<dyn Error>> {
|
|
||||||
let mut key_file = File::open(key_path)?;
|
|
||||||
let mut key = String::new();
|
|
||||||
key_file.read_to_string(&mut key)?;
|
|
||||||
Ok(key.trim_end_matches(|c| c == '\r' || c == '\n').to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_str_to_bytes(arg_str: &str, bytes: &mut [u8]) -> Result<(), Box<dyn Error>> {
|
fn parse_str_to_bytes(arg_str: &str, bytes: &mut [u8]) -> Result<(), Box<dyn Error>> {
|
||||||
let bytes_str_vec = {
|
let bytes_str_vec = {
|
||||||
let bytes_str_vec: Vec<&str> = arg_str.split('-').collect();
|
let bytes_str_vec: Vec<&str> = arg_str.split('-').collect();
|
||||||
|
@ -16,11 +16,12 @@ use std::os::raw::{c_int, c_char};
|
|||||||
|
|
||||||
#[link(name = "grpc_ratls_client")]
|
#[link(name = "grpc_ratls_client")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn grpc_ratls_get_secret(
|
fn grpc_ratls_get_secret_to_buf(
|
||||||
server_addr: *const c_char, // grpc server address+port, such as "localhost:50051"
|
server_addr: *const c_char, // grpc server address+port, such as "localhost:50051"
|
||||||
config_json: *const c_char, // ratls handshake config json file
|
config_json: *const c_char, // ratls handshake config json file
|
||||||
name: *const c_char, // secret name to be requested
|
name: *const c_char, // secret name to be requested
|
||||||
secret_file: *const c_char // secret file to be saved
|
secret_buf: *const u8, // secret buffer provided by user
|
||||||
|
buf_len: *mut u32 // buffer size
|
||||||
) -> c_int;
|
) -> c_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,6 +74,47 @@ fn load_ra_config(ra_conf_path: &str) -> Result<InitRAConfig, Box<dyn Error>> {
|
|||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct KeyInfo {
|
||||||
|
path: String,
|
||||||
|
val_buf: Vec<u8>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_kms_keys(kms_keys: Vec<KmsKeys>, kms_server: CString, kms_config: CString) -> Result<Vec<KeyInfo>, Box<dyn Error>> {
|
||||||
|
let mut keys_info: Vec<KeyInfo> = Vec::new();
|
||||||
|
for keys in kms_keys {
|
||||||
|
let key = CString::new(&*keys.key).unwrap();
|
||||||
|
// Max key length is 10K
|
||||||
|
let mut buffer: Vec<u8> = vec![0; 10240];
|
||||||
|
let buffer_ptr: *const u8 = buffer.as_ptr();
|
||||||
|
let mut buffer_len: u32 = buffer.len() as u32;
|
||||||
|
let len_ptr: *mut u32 = &mut buffer_len as *mut u32;
|
||||||
|
|
||||||
|
let ret = unsafe {
|
||||||
|
grpc_ratls_get_secret_to_buf(
|
||||||
|
kms_server.as_ptr(),
|
||||||
|
kms_config.as_ptr(),
|
||||||
|
key.as_ptr(),
|
||||||
|
buffer_ptr,
|
||||||
|
len_ptr
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if ret != 0 {
|
||||||
|
println!("grpc_ratls_get_secret_to_buf failed return {}", ret);
|
||||||
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer.resize(buffer_len as usize, 0);
|
||||||
|
|
||||||
|
let key_info: KeyInfo = KeyInfo {
|
||||||
|
path: keys.path.clone(),
|
||||||
|
val_buf: buffer.clone()
|
||||||
|
};
|
||||||
|
|
||||||
|
keys_info.push(key_info);
|
||||||
|
}
|
||||||
|
Ok(keys_info)
|
||||||
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
// Load the configuration from initfs
|
// Load the configuration from initfs
|
||||||
@ -80,14 +122,6 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
const INIT_RA_CONF: &str = "/etc/init_ra_conf.json";
|
const INIT_RA_CONF: &str = "/etc/init_ra_conf.json";
|
||||||
let image_config = load_config(IMAGE_CONFIG_FILE)?;
|
let image_config = load_config(IMAGE_CONFIG_FILE)?;
|
||||||
|
|
||||||
// Get the MAC of Occlum.json.protected file
|
|
||||||
let occlum_json_mac = {
|
|
||||||
let mut mac: sgx_aes_gcm_128bit_tag_t = Default::default();
|
|
||||||
parse_str_to_bytes(&image_config.occlum_json_mac, &mut mac)?;
|
|
||||||
mac
|
|
||||||
};
|
|
||||||
let occlum_json_mac_ptr = &occlum_json_mac as *const sgx_aes_gcm_128bit_tag_t;
|
|
||||||
|
|
||||||
// Do parse to get Init RA information
|
// Do parse to get Init RA information
|
||||||
let init_ra_conf = load_ra_config(INIT_RA_CONF)?;
|
let init_ra_conf = load_ra_config(INIT_RA_CONF)?;
|
||||||
// Extract RA config part
|
// Extract RA config part
|
||||||
@ -101,14 +135,20 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
"encrypted" => {
|
"encrypted" => {
|
||||||
// Get the image encrypted key through RA
|
// Get the image encrypted key through RA
|
||||||
let secret = CString::new("image_key").unwrap();
|
let secret = CString::new("image_key").unwrap();
|
||||||
let filename = CString::new("/etc/image_key").unwrap();
|
let mut buffer: Vec<u8> = vec![0; 256];
|
||||||
|
let buffer_ptr: *const u8 = buffer.as_ptr();
|
||||||
|
let mut buffer_len: u32 = buffer.len() as u32;
|
||||||
|
let len_ptr: *mut u32 = &mut buffer_len as *mut u32;
|
||||||
|
|
||||||
|
//Read to buffer instead of file system for better security
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
grpc_ratls_get_secret(
|
grpc_ratls_get_secret_to_buf(
|
||||||
server_addr.as_ptr(),
|
server_addr.as_ptr(),
|
||||||
config_json.as_ptr(),
|
config_json.as_ptr(),
|
||||||
secret.as_ptr(),
|
secret.as_ptr(),
|
||||||
filename.as_ptr())
|
buffer_ptr,
|
||||||
|
len_ptr
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
if ret != 0 {
|
if ret != 0 {
|
||||||
@ -116,15 +156,18 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
return Err(Box::new(std::io::Error::last_os_error()));
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const IMAGE_KEY_FILE: &str = "/etc/image_key";
|
buffer.resize(buffer_len as usize, 0);
|
||||||
let key_str = load_key(IMAGE_KEY_FILE)?;
|
let key_string = String::from_utf8(buffer)
|
||||||
// Remove key file which is not needed any more
|
.expect("error converting to string");
|
||||||
fs::remove_file(IMAGE_KEY_FILE)?;
|
let key_str = key_string
|
||||||
|
.trim_end_matches(|c| c == '\r' || c == '\n').to_string();
|
||||||
let mut key: sgx_key_128bit_t = Default::default();
|
let mut key: sgx_key_128bit_t = Default::default();
|
||||||
parse_str_to_bytes(&key_str, &mut key)?;
|
parse_str_to_bytes(&key_str, &mut key)?;
|
||||||
Some(key)
|
Some(key)
|
||||||
}
|
},
|
||||||
"integrity-only" => None,
|
"integrity-only" => {
|
||||||
|
None
|
||||||
|
},
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
let key_ptr = key
|
let key_ptr = key
|
||||||
@ -132,51 +175,23 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
.map(|key| key as *const sgx_key_128bit_t)
|
.map(|key| key as *const sgx_key_128bit_t)
|
||||||
.unwrap_or(std::ptr::null());
|
.unwrap_or(std::ptr::null());
|
||||||
|
|
||||||
// Do one time key acquire to force all necessary libraries got loaded to memory.
|
let keys_info: Vec<KeyInfo> =
|
||||||
// Thus after mount rootfs, the API could run successfully.
|
get_kms_keys(init_ra_conf.kms_keys, server_addr, config_json).unwrap();
|
||||||
// The key got this time will be dropped.
|
|
||||||
unsafe {
|
|
||||||
let kms_key = init_ra_conf.kms_keys[0].clone();
|
|
||||||
let key = CString::new(kms_key.key).unwrap();
|
|
||||||
let file = CString::new(kms_key.path).unwrap();
|
|
||||||
|
|
||||||
grpc_ratls_get_secret(
|
|
||||||
server_addr.as_ptr(),
|
|
||||||
config_json.as_ptr(),
|
|
||||||
key.as_ptr(),
|
|
||||||
file.as_ptr());
|
|
||||||
// Remove key file which is not needed any more
|
|
||||||
fs::remove_file(file.into_string().unwrap())?;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Mount the image
|
// Mount the image
|
||||||
const SYS_MOUNT_FS: i64 = 363;
|
const SYS_MOUNT_FS: i64 = 363;
|
||||||
let ret = unsafe { syscall(SYS_MOUNT_FS, key_ptr, occlum_json_mac_ptr) };
|
// User can provide valid path for runtime mount and boot
|
||||||
|
// Otherwise, just pass null pointer to do general mount and boot
|
||||||
|
let root_config_path: *const i8 = std::ptr::null();
|
||||||
|
let ret = unsafe { syscall(
|
||||||
|
SYS_MOUNT_FS, key_ptr, root_config_path) };
|
||||||
if ret < 0 {
|
if ret < 0 {
|
||||||
return Err(Box::new(std::io::Error::last_os_error()));
|
return Err(Box::new(std::io::Error::last_os_error()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite ra_config to rootfs
|
|
||||||
fs::write("ra_config.json", ra_conf_string.into_bytes())?;
|
|
||||||
let config_json = CString::new("ra_config.json").unwrap();
|
|
||||||
|
|
||||||
// Get keys and save to path
|
// Get keys and save to path
|
||||||
for keys in init_ra_conf.kms_keys {
|
for key_info in keys_info {
|
||||||
let key = CString::new(keys.key).unwrap();
|
fs::write(key_info.path, key_info.val_buf.as_slice())?;
|
||||||
let file = CString::new(keys.path).unwrap();
|
|
||||||
|
|
||||||
let ret = unsafe {
|
|
||||||
grpc_ratls_get_secret(
|
|
||||||
server_addr.as_ptr(),
|
|
||||||
config_json.as_ptr(),
|
|
||||||
key.as_ptr(),
|
|
||||||
file.as_ptr())
|
|
||||||
};
|
|
||||||
|
|
||||||
if ret != 0 {
|
|
||||||
println!("Failed to get key {:?}, return {}", key, ret);
|
|
||||||
// return Err(Box::new(std::io::Error::last_os_error()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -184,13 +199,10 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
type sgx_key_128bit_t = [u8; 16];
|
type sgx_key_128bit_t = [u8; 16];
|
||||||
#[allow(non_camel_case_types)]
|
|
||||||
type sgx_aes_gcm_128bit_tag_t = [u8; 16];
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
#[serde(deny_unknown_fields)]
|
#[serde(deny_unknown_fields)]
|
||||||
struct ImageConfig {
|
struct ImageConfig {
|
||||||
occlum_json_mac: String,
|
|
||||||
image_type: String,
|
image_type: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,13 +217,6 @@ fn load_config(config_path: &str) -> Result<ImageConfig, Box<dyn Error>> {
|
|||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_key(key_path: &str) -> Result<String, Box<dyn Error>> {
|
|
||||||
let mut key_file = File::open(key_path)?;
|
|
||||||
let mut key = String::new();
|
|
||||||
key_file.read_to_string(&mut key)?;
|
|
||||||
Ok(key.trim_end_matches(|c| c == '\r' || c == '\n').to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_str_to_bytes(arg_str: &str, bytes: &mut [u8]) -> Result<(), Box<dyn Error>> {
|
fn parse_str_to_bytes(arg_str: &str, bytes: &mut [u8]) -> Result<(), Box<dyn Error>> {
|
||||||
let bytes_str_vec = {
|
let bytes_str_vec = {
|
||||||
let bytes_str_vec: Vec<&str> = arg_str.split('-').collect();
|
let bytes_str_vec: Vec<&str> = arg_str.split('-').collect();
|
||||||
|
Loading…
Reference in New Issue
Block a user