Add SGX KSS support
Signed-off-by: Zheng, Qi <huaiqing.zq@antgroup.com>
This commit is contained in:
		
							parent
							
								
									8cb08aac29
								
							
						
					
					
						commit
						7db9d9b955
					
				| @ -24,7 +24,16 @@ | ||||
|     "metadata": { | ||||
|         "product_id": 0, | ||||
|         "version_number": 0, | ||||
|         "debuggable": true | ||||
|         "debuggable": true, | ||||
|         "enable_kss": false, | ||||
|         "family_id": { | ||||
|             "high": "0x0", | ||||
|             "low": "0x0" | ||||
|         }, | ||||
|         "ext_prod_id": { | ||||
|             "high": "0x0", | ||||
|             "low": "0x0" | ||||
|         } | ||||
|     }, | ||||
|     "mount": [ | ||||
|         { | ||||
|  | ||||
							
								
								
									
										68
									
								
								src/pal/src/base64.c
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										68
									
								
								src/pal/src/base64.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | ||||
| /*
 | ||||
|  * Base64 encoding/decoding (RFC1341) | ||||
|  * Copyright (c) 2005-2011, Jouni Malinen <j@w1.fi> | ||||
|  * | ||||
|  * This software may be distributed under the terms of the BSD license. | ||||
|  * See README for more details. | ||||
|  */ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| #include "pal_log.h" | ||||
| #include "base64.h" | ||||
| 
 | ||||
| 
 | ||||
| static const unsigned char base64_table[65] = | ||||
|     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||||
| 
 | ||||
| static size_t base64_decode_len(const char *b64input) { | ||||
|     size_t len = strlen(b64input), padding = 0; | ||||
| 
 | ||||
|     if (b64input[len - 1] == '=' && b64input[len - 2] == '=') { //last two chars are =
 | ||||
|         padding = 2; | ||||
|     } else if (b64input[len - 1] == '=') { //last char is =
 | ||||
|         padding = 1; | ||||
|     } | ||||
| 
 | ||||
|     return (len * 3) / 4 - padding; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * base64_decode - Base64 decode | ||||
|  */ | ||||
| void base64_decode(const char *b64input, unsigned char *dest, size_t dest_len) { | ||||
|     unsigned char dtable[256], *pos, block[4], tmp; | ||||
|     size_t i, count, olen; | ||||
|     size_t len = strlen(b64input); | ||||
| 
 | ||||
|     memset(dtable, 0x80, 256); | ||||
|     for (i = 0; i < sizeof(base64_table) - 1; i++) { | ||||
|         dtable[base64_table[i]] = (unsigned char) i; | ||||
|     } | ||||
|     dtable['='] = 0; | ||||
| 
 | ||||
|     olen = base64_decode_len(b64input); | ||||
|     if (olen > dest_len) { | ||||
|         PAL_WARN("Base64 encoded length %ld is biggeer than %ld\n", olen, dest_len); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     pos = dest; | ||||
|     count = 0; | ||||
|     for (i = 0; i < len; i++) { | ||||
|         tmp = dtable[(unsigned char)b64input[i]]; | ||||
|         if (tmp == 0x80) { | ||||
|             continue; | ||||
|         } | ||||
|         block[count] = tmp; | ||||
|         count++; | ||||
|         if (count == 4) { | ||||
|             *pos++ = (block[0] << 2) | (block[1] >> 4); | ||||
|             *pos++ = (block[1] << 4) | (block[2] >> 2); | ||||
|             *pos++ = (block[2] << 6) | block[3]; | ||||
|             count = 0; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										14
									
								
								src/pal/src/base64.h
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										14
									
								
								src/pal/src/base64.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| #ifndef __BASE64_H__ | ||||
| #define __BASE64_H__ | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| void base64_decode(const char *b64input, unsigned char *dest, size_t dest_len); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #endif /* __BASE64_H__ */ | ||||
| @ -22,6 +22,7 @@ | ||||
| #include "pal_enclave.h" | ||||
| #include "pal_error.h" | ||||
| #include "pal_log.h" | ||||
| #include "base64.h" | ||||
| 
 | ||||
| #define MAX_PATH            FILENAME_MAX | ||||
| #define TOKEN_FILENAME      "enclave.token" | ||||
| @ -43,6 +44,20 @@ static int get_enclave_debug_flag() { | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| /* Get enable kss flag according to env "OCCLUM_ENABLE_KSS" */ | ||||
| static int get_enable_kss_flag() { | ||||
|     const char *enable_kss_val = getenv("OCCLUM_ENABLE_KSS"); | ||||
|     if (enable_kss_val) { | ||||
|         if (!strcmp(enable_kss_val, "1") || | ||||
|                 !strcasecmp(enable_kss_val, "y") || | ||||
|                 !strcasecmp(enable_kss_val, "yes") || | ||||
|                 !strcasecmp(enable_kss_val, "true")) { | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| static const char *get_enclave_absolute_path(const char *instance_dir) { | ||||
|     static char enclave_path[MAX_PATH + 1] = {0}; | ||||
|     strncat(enclave_path, instance_dir, MAX_PATH); | ||||
| @ -102,8 +117,36 @@ int pal_init_enclave(const char *instance_dir) { | ||||
|     /* Debug Support: set 2nd parameter to 1 */ | ||||
|     const char *enclave_path = get_enclave_absolute_path(instance_dir); | ||||
|     int sgx_debug_flag = get_enclave_debug_flag(); | ||||
|     ret = sgx_create_enclave(enclave_path, sgx_debug_flag, &token, &updated, &global_eid, | ||||
|                              NULL); | ||||
|     int sgx_enable_kss = get_enable_kss_flag(); | ||||
| 
 | ||||
|     /* If enable kss, use sgx_create_enclave_ex to create enclave */ | ||||
|     if (sgx_enable_kss) { | ||||
|         sgx_kss_config_t kss_config = { 0 }; | ||||
|         const void *enclave_ex_p[32] = { 0 }; | ||||
|         const char *sgx_conf_id = getenv("OCCLUM_CONF_ID_BASE64"); | ||||
|         const char *sgx_conf_svn = getenv("OCCLUM_CONF_SVN"); | ||||
| 
 | ||||
|         if (sgx_conf_id) { | ||||
|             base64_decode(sgx_conf_id, kss_config.config_id, SGX_CONFIGID_SIZE); | ||||
|         } | ||||
| 
 | ||||
|         if (sgx_conf_svn) { | ||||
|             unsigned long svn_val = strtoul(sgx_conf_svn, NULL, 0); | ||||
|             /* CONFIG SVN is 16 bits long */ | ||||
|             if (svn_val > 0xFFFF) { | ||||
|                 PAL_WARN("Invalid CONFIG SVN value: 0x%lx\n", svn_val); | ||||
|             } else { | ||||
|                 kss_config.config_svn = svn_val; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         enclave_ex_p[SGX_CREATE_ENCLAVE_EX_KSS_BIT_IDX] = (const void *)&kss_config; | ||||
|         ret = sgx_create_enclave_ex(enclave_path, sgx_debug_flag, &token, &updated, &global_eid, | ||||
|                                     NULL, SGX_CREATE_ENCLAVE_EX_KSS, enclave_ex_p); | ||||
|     } else { | ||||
|         ret = sgx_create_enclave(enclave_path, sgx_debug_flag, &token, &updated, &global_eid, | ||||
|                                  NULL); | ||||
|     } | ||||
|     if (ret != SGX_SUCCESS) { | ||||
|         const char *sgx_err_msg = pal_get_sgx_error_msg(ret); | ||||
|         PAL_ERROR("Failed to create enclave with error code 0x%x: %s", ret, sgx_err_msg); | ||||
|  | ||||
| @ -27,7 +27,16 @@ | ||||
|     "metadata": { | ||||
|         "product_id": 0, | ||||
|         "version_number": 0, | ||||
|         "debuggable": true | ||||
|         "debuggable": true, | ||||
|         "enable_kss": false, | ||||
|         "family_id": { | ||||
|             "high": "0x0", | ||||
|             "low": "0x0" | ||||
|         }, | ||||
|         "ext_prod_id": { | ||||
|             "high": "0x0", | ||||
|             "low": "0x0" | ||||
|         } | ||||
|     }, | ||||
|     "mount": [ | ||||
|         { | ||||
|  | ||||
| @ -155,6 +155,8 @@ fn main() { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|        let kss_tuple = parse_kss_conf(&occlum_config); | ||||
| 
 | ||||
|         // Generate the enclave configuration
 | ||||
|         let sgx_enclave_configuration = EnclaveConfiguration { | ||||
|             ProdID: occlum_config.metadata.product_id, | ||||
| @ -175,6 +177,11 @@ fn main() { | ||||
|             ReservedMemMinSize: user_space_size.unwrap() as u64, | ||||
|             ReservedMemInitSize: user_space_size.unwrap() as u64, | ||||
|             ReservedMemExecutable: 1, | ||||
|             EnableKSS: kss_tuple.0, | ||||
|             ISVEXTPRODID_H: kss_tuple.1, | ||||
|             ISVEXTPRODID_L: kss_tuple.2, | ||||
|             ISVFAMILYID_H: kss_tuple.3, | ||||
|             ISVFAMILYID_L: kss_tuple.4, | ||||
|         }; | ||||
|         let enclave_config = serde_xml_rs::to_string(&sgx_enclave_configuration).unwrap(); | ||||
|         debug!("The enclave config:{:?}", enclave_config); | ||||
| @ -286,6 +293,30 @@ fn parse_memory_size(mem_str: &str) -> Result<usize, &str> { | ||||
|     Ok(mem_val * unit_factor) | ||||
| } | ||||
| 
 | ||||
| fn get_u64_id_high_and_low(id: &OcclumMetaID) -> (u64, u64) { | ||||
|     let id_high = u64::from_str_radix(id.high.trim_start_matches("0x"), 16) | ||||
|         .expect("64 bit hex string ID required, such as 0x1234567812345678"); | ||||
|     let id_low = u64::from_str_radix(id.low.trim_start_matches("0x"), 16) | ||||
|         .expect("64 bit hex string ID required, such as 0x1234567812345678"); | ||||
| 
 | ||||
|     (id_high, id_low) | ||||
| } | ||||
| 
 | ||||
| // Return a tuple (EnableKSS, ISVEXTPRODID_H, ISVEXTPRODID_L, ISVFAMILYID_H, ISVFAMILYID_L)
 | ||||
| fn parse_kss_conf(occlum_config: &OcclumConfiguration | ||||
| ) -> (u32, u64, u64, u64, u64) | ||||
| { | ||||
|     match occlum_config.metadata.enable_kss { | ||||
|         true => { | ||||
|             let ext_prod_id = get_u64_id_high_and_low(&occlum_config.metadata.ext_prod_id); | ||||
|             let family_id = get_u64_id_high_and_low(&occlum_config.metadata.family_id); | ||||
| 
 | ||||
|             (1, ext_prod_id.0, ext_prod_id.1, family_id.0, family_id.1) | ||||
|         }, | ||||
|         false => (0, 0, 0, 0, 0) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn gen_user_mount_config( | ||||
|     mount_conf: Vec<OcclumMount>, | ||||
|     occlum_conf_user_fs_mac: String, | ||||
| @ -385,11 +416,20 @@ struct OcclumProcess { | ||||
|     default_mmap_size: String, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, PartialEq, Deserialize)] | ||||
| struct OcclumMetaID { | ||||
|     high: String, | ||||
|     low: String | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, PartialEq, Deserialize)] | ||||
| struct OcclumMetadata { | ||||
|     product_id: u32, | ||||
|     version_number: u32, | ||||
|     debuggable: bool, | ||||
|     enable_kss: bool, | ||||
|     family_id: OcclumMetaID, | ||||
|     ext_prod_id: OcclumMetaID | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | ||||
| @ -443,6 +483,11 @@ struct EnclaveConfiguration { | ||||
|     ReservedMemMinSize: u64, | ||||
|     ReservedMemInitSize: u64, | ||||
|     ReservedMemExecutable: u32, | ||||
|     EnableKSS: u32, | ||||
|     ISVEXTPRODID_H: u64, | ||||
|     ISVEXTPRODID_L: u64, | ||||
|     ISVFAMILYID_H: u64, | ||||
|     ISVFAMILYID_L: u64, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, PartialEq, Clone, Serialize)] | ||||
|  | ||||
							
								
								
									
										34
									
								
								tools/occlum
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								tools/occlum
									
									
									
									
									
								
							| @ -36,6 +36,10 @@ get_enclave_debuggable_flag() { | ||||
|     jq '.metadata.debuggable' $instance_dir/Occlum.json | ||||
| } | ||||
| 
 | ||||
| get_enclave_enable_kss_flag() { | ||||
|     jq '.metadata.enable_kss' $instance_dir/Occlum.json | ||||
| } | ||||
| 
 | ||||
| exit_error() { | ||||
|     echo "Error: $@" >&2 | ||||
|     exit 1 | ||||
| @ -312,11 +316,21 @@ cmd_build() { | ||||
|     echo "Built the Occlum image and enclave successfully" | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| cmd_run() { | ||||
|     check_has_built | ||||
|     check_has_run | ||||
|     check_aesm_service | ||||
| 
 | ||||
|     loop=true | ||||
|     while [ -n "$1" ] && [ "$loop" = "true" ]; do | ||||
|         case "$1" in | ||||
|         --config-id)     [ -n "$2" ] && export OCCLUM_CONF_ID_BASE64=$2 ; shift 2 || exit_error "Empty Base64 Encoded Occlum Config ID provided"     ;; | ||||
|         --config-svn)    [ -n "$2" ] && export OCCLUM_CONF_SVN=$2 ; shift 2 || exit_error "Empty Occlum Config SVN provided"   ;; | ||||
|         *) loop=false ;; | ||||
|         esac | ||||
|     done | ||||
| 
 | ||||
|     SGX_MODE=$(cat $instance_dir/.sgx_mode) | ||||
|     if [[ -n $SGX_MODE && "$SGX_MODE" != "HW" ]]; then | ||||
|         export LD_LIBRARY_PATH="$instance_dir/build/lib:$SGX_SDK/sdk_libs/" | ||||
| @ -329,6 +343,11 @@ cmd_run() { | ||||
|     if [ "`get_enclave_debuggable_flag`" == "false" ]; then | ||||
|         export OCCLUM_RELEASE_ENCLAVE=1 | ||||
|     fi | ||||
| 
 | ||||
|     if [ "`get_enclave_enable_kss_flag`" == "true" ]; then | ||||
|         export OCCLUM_ENABLE_KSS=1 | ||||
|     fi | ||||
| 
 | ||||
|     RUST_BACKTRACE=1 "$instance_dir/build/bin/occlum-run" "$@" | ||||
| 
 | ||||
|     echo "built" > $status_file | ||||
| @ -338,6 +357,15 @@ cmd_start() { | ||||
|     check_has_built | ||||
|     check_aesm_service | ||||
| 
 | ||||
|     loop=true | ||||
|     while [ -n "$1" ] && [ "$loop" = "true" ]; do | ||||
|         case "$1" in | ||||
|         --config-id)     [ -n "$2" ] && export OCCLUM_CONF_ID_BASE64=$2 ; shift 2 || exit_error "Empty Base64 Encoded Occlum Config ID provided"     ;; | ||||
|         --config-svn)    [ -n "$2" ] && export OCCLUM_CONF_SVN=$2 ; shift 2 || exit_error "Empty Occlum Config SVN provided"   ;; | ||||
|         *) loop=false ;; | ||||
|         esac | ||||
|     done | ||||
| 
 | ||||
|     SGX_MODE=$(cat $instance_dir/.sgx_mode) | ||||
|     if [[ -n $SGX_MODE && "$SGX_MODE" != "HW" ]]; then | ||||
|         export LD_LIBRARY_PATH="$instance_dir/build/lib:$SGX_SDK/sdk_libs/" | ||||
| @ -350,6 +378,10 @@ cmd_start() { | ||||
|     if [ "`get_enclave_debuggable_flag`" == "false" ]; then | ||||
|         export OCCLUM_RELEASE_ENCLAVE=1 | ||||
|     fi | ||||
| 
 | ||||
|     if [ "`get_enclave_enable_kss_flag`" == "true" ]; then | ||||
|         export OCCLUM_ENABLE_KSS=1 | ||||
|     fi | ||||
|     RUST_BACKTRACE=1 "$instance_dir/build/bin/occlum_exec_client" start | ||||
| 
 | ||||
|     echo "built" > $status_file | ||||
| @ -565,7 +597,7 @@ case "$cmd" in | ||||
|         cmd_run "${@:2}" | ||||
|         ;; | ||||
|     start) | ||||
|         cmd_start | ||||
|         cmd_start "${@:2}" | ||||
|         ;; | ||||
|     exec) | ||||
|         cmd_exec "${@:2}" | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user