Skip to content
This repository was archived by the owner on Jan 27, 2022. It is now read-only.

Commit 48318d2

Browse files
author
manju956
committed
Worker key refresh policy implemenation
This feature initiates refresh of worker encryption key pair based on number of work orders processed in case of Singleton worker or number of pre-processed work orders in case of KME worker. A new pair of encryption key is generated in the enclave and the updated enclave signup details are stored in the KvStorage in workers table. Worker encryption key signature is re-computed when encryption key gets refreshed. When a worker key gets refreshed during the work order submission, a specific error code is returned to client to indicate worker key refresh. On receiving this error code, client retrieves the updated worker details and does work order submission again. Signed-off-by: manju956 <[email protected]>
1 parent ed424e7 commit 48318d2

32 files changed

+651
-125
lines changed

common/cpp/error.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ namespace tcf {
5252
) : Error(TCF_ERR_CRYPTO, msg) {}
5353
}; // class CryptoError
5454

55+
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
56+
class KeyRefreshError : public Error {
57+
public:
58+
explicit KeyRefreshError(
59+
const std::string& msg
60+
) : Error(TCF_ERR_ENCRYPT_KEY_REFRESH, msg) {}
61+
}; // class KeyRefreshError
5562

5663
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5764
class MemoryError : public Error {

common/cpp/tcf_error.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ typedef enum {
4242
TCF_ERR_SYSTEM_BUSY = -10,
4343
TCF_ERR_CRYPTO = -11,
4444
/** Invalid workload ID */
45-
TCF_ERR_INVALID_WORKLOAD = -12
45+
TCF_ERR_INVALID_WORKLOAD = -12,
46+
/* Enclave key refresh error */
47+
TCF_ERR_ENCRYPT_KEY_REFRESH = -13
4648
} tcf_err_t;
4749

4850
typedef enum {

common/python/error_code/enclave_error.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@ class EnclaveError(IntEnum):
3131
# this should be converted to ENCLAVE_ERR_SYSTEM for reporting.
3232
ENCLAVE_ERR_SYSTEM_BUSY = -10,
3333
ENCLAVE_ERR_CRYPTO = -11,
34-
ENCLAVE_ERR_INVALID_WORKLOAD = -12 # Invalid workload ID
34+
# Invalid workload ID
35+
ENCLAVE_ERR_INVALID_WORKLOAD = -12,
36+
# Worker encryption key refresh error
37+
ENCLAVE_ERR_ENCRYPT_KEY_REFRESH = -13

common/python/error_code/error_status.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class WorkOrderStatus(IntEnum):
3333
PROCESSING = 7
3434
BUSY = 8
3535
INVALID_WORKLOAD = 9
36-
UNKNOWN_ERROR = 10
36+
WORKER_ENCRYPT_KEY_REFRESHED = 10
37+
UNKNOWN_ERROR = 11
3738

3839

3940
@unique

config/kme_config.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,8 @@ DataEncryptionAlgorithm = "AES-GCM-256"
105105
# Supported work order formats are JSON-RPC, JSON-RPC-JWT, and Custom format
106106
# starting with tilde "~"
107107
workOrderPayloadFormats = "JSON-RPC"
108+
109+
[WorkerKeyRefresh]
110+
# Configure key refresh interval based on number of preprocessed work orders.
111+
# By default, key refresh feature is disabled.
112+
work_orders_count = 0

config/singleton_enclave_config.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,7 @@ DataEncryptionAlgorithm = "AES-GCM-256"
116116
# starting with tilde "~"
117117
workOrderPayloadFormats = "JSON-RPC"
118118

119+
[WorkerKeyRefresh]
120+
# Configure key refresh interval based on number of processed work orders.
121+
# By default, key refresh feature is disabled.
122+
work_orders_count = 0

enclave_manager/avalon_enclave_manager/base_enclave_info.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,5 +316,3 @@ def _get_sealed_data_file_name(self, relative_path, worker_id):
316316
@returns file_name - Fully qualified file name for sealed data
317317
"""
318318
return os.path.join(TCF_HOME, relative_path + "." + worker_id)
319-
320-
# -----------------------------------------------------------------

enclave_manager/avalon_enclave_manager/base_enclave_manager.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
import json
1919
import logging
2020
import sys
21-
import utility.hex_utils as hex_utils
2221
from abc import ABC, abstractmethod
2322

23+
import utility.hex_utils as hex_utils
24+
import utility.file_utils as file_utils
25+
2426
from database import connector
2527
from avalon_enclave_manager.worker_kv_delegate import WorkerKVDelegate
2628
from avalon_enclave_manager.work_order_kv_delegate import WorkOrderKVDelegate
@@ -34,6 +36,8 @@ class EnclaveManager(ABC):
3436
Abstract base class for Enclave Manager
3537
"""
3638

39+
signup_data = None
40+
3741
def __init__(self, config):
3842

3943
super().__init__()
@@ -143,10 +147,11 @@ def _setup_enclave(self):
143147
if signup_data is None:
144148
logger.error("Failed to create signup data")
145149
return None
150+
EnclaveManager.signup_data = signup_data
146151
except Exception as e:
147152
logger.exception("failed to initialize/signup enclave; %s", str(e))
148153
sys.exit(-1)
149-
return self._get_JSON_from_signup_object(signup_data)
154+
return self._get_JSON_from_signup_object(EnclaveManager.signup_data)
150155

151156
# -----------------------------------------------------------------
152157

@@ -204,7 +209,8 @@ def create_json_worker(enclave_data, config):
204209
worker_type_data["verificationKey"] = enclave_data.verifying_key
205210
worker_type_data["extendedMeasurements"] = \
206211
enclave_data.extended_measurements
207-
worker_type_data["proofDataType"] = enclave_data.proof_data_type
212+
worker_type_data["proofDataType"] = \
213+
config.get("WorkerConfig")["ProofDataType"]
208214
worker_type_data["proofData"] = enclave_data.proof_data
209215
worker_type_data["encryptionKey"] = enclave_data.encryption_key
210216
worker_type_data["encryptionKeySignature"] = \

enclave_manager/avalon_enclave_manager/kme/kme_enclave_info.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import utility.file_utils as file_utils
2626
import avalon_enclave_manager.kme.kme_enclave as enclave
2727
import avalon_enclave_manager.base_enclave_info as enclave_info
28+
import avalon_enclave_manager.worker_key_refresh as key_refresh
2829

2930
logger = logging.getLogger(__name__)
3031

@@ -41,9 +42,9 @@ def __init__(self, config, worker_id):
4142
enclave._SetLogger(logger)
4243
super().__init__(enclave.is_sgx_simulator())
4344

44-
self._config = config
45+
self._config = config["EnclaveModule"]
4546
self._worker_id = worker_id
46-
self._initialize_enclave(config)
47+
self._initialize_enclave(self._config)
4748
enclave_info = self._create_enclave_signup_data()
4849
try:
4950
self.ias_nonce = enclave_info['ias_nonce']
@@ -58,6 +59,8 @@ def __init__(self, config, worker_id):
5859
except KeyError as ke:
5960
raise Exception("missing enclave initialization parameter; {}"
6061
.format(str(ke)))
62+
self.worker_key_refresh = key_refresh.WorkerKeyRefresh(
63+
self, config, "kme")
6164

6265
# -------------------------------------------------------
6366

enclave_manager/avalon_enclave_manager/kme/kme_enclave_manager.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __init__(self, config):
4242

4343
super().__init__(config)
4444
self.proof_data_type = config.get("WorkerConfig")["ProofDataType"]
45+
self.preprocessed_wo_count = 0
4546

4647
# -------------------------------------------------------------------------
4748

@@ -54,8 +55,7 @@ def _create_signup_data(self):
5455
enclave
5556
"""
5657
return enclave_info.\
57-
KeyManagementEnclaveInfo(self._config["EnclaveModule"],
58-
self._worker_id)
58+
KeyManagementEnclaveInfo(self._config, self._worker_id)
5959

6060
# -------------------------------------------------------------------------
6161

@@ -130,10 +130,8 @@ def start_enclave_manager(self):
130130
logger.error("Failed to execute boot time flow; " +
131131
"exiting Intel SGX Enclave manager: {}".format(err))
132132
exit(1)
133-
134133
self._start_kme_listener()
135134

136-
137135
# -------------------------------------------------------------------------
138136

139137
def _start_kme_listener(self):
@@ -155,7 +153,6 @@ def _start_kme_listener(self):
155153
kme_listener = KMEListener(rpc_methods)
156154
kme_listener.start(host_name, port)
157155

158-
159156
# -----------------------------------------------------------------
160157

161158
def GetUniqueVerificationKey(self, **params):
@@ -207,11 +204,30 @@ def RegisterWorkOrderProcessor(self, **params):
207204
def PreProcessWorkOrder(self, **params):
208205
"""
209206
"""
207+
try:
208+
wo_threshold = \
209+
int(self._config["WorkerKeyRefresh"]["work_orders_count"])
210+
except Exception as err:
211+
logger.warning("Failed to get work order count from config file." +
212+
" Setting work orders threshold to 0: %s", str(err))
213+
wo_threshold = 0
214+
210215
wo_request = self._get_request_json("PreProcessWorkOrder")
211216
wo_request["params"] = params
212217
wo_response = self._execute_work_order(json.dumps(wo_request), "")
213218
wo_response_json = json.loads(wo_response)
214219

220+
self.preprocessed_wo_count += 1
221+
if wo_threshold > 0 and self.preprocessed_wo_count == wo_threshold:
222+
try:
223+
enclave_info = EnclaveManager.signup_data
224+
enclave_info.worker_key_refresh._initiate_key_refresh()
225+
# Set preprocessed_wo_count to 0
226+
self.preprocessed_wo_count = 0
227+
except Exception as e:
228+
logger.error("failed to get signup data after key refresh: %s",
229+
str(e))
230+
215231
if "result" in wo_response_json:
216232
return wo_response_json["result"]
217233
else:

0 commit comments

Comments
 (0)