@@ -59,7 +59,7 @@ def __init__(self, config, signup_data, measurements):
5959 # Need to come up with a scheme to generate both for every unique
6060 # encryption key.
6161 self .encryption_key_nonce = ""
62- self .encryption_key_signature = ""
62+ self .encryption_key_signature = signup_data . encryption_key_signature
6363 self .enclave_id = signup_data .enclave_id
6464 self .extended_measurements = measurements
6565
@@ -330,6 +330,20 @@ def create_enclave_signup_data():
330330 return enclave_signup_data
331331
332332
333+ # -----------------------------------------------------------------
334+ def initiate_key_refresh (enclave_data ):
335+ """
336+ Initiate worker encryption key refresh and update worker details
337+ and updates worker details to kv storage
338+ @param enclave_data - enclave signup data
339+ """
340+ try :
341+ enclave_signup_data = enclave_data .initiate_refresh_enclave_key ()
342+ except Exception as e :
343+ logger .error ("failed to get signup data after key refresh: %s" , str (e ))
344+ return enclave_signup_data
345+
346+
333347# -----------------------------------------------------------------
334348def execute_work_order (enclave_data , input_json_str , indent = 4 ):
335349 """
@@ -430,6 +444,25 @@ def create_json_worker(enclave_data, config):
430444 return json_worker_info
431445
432446
447+ # -----------------------------------------------------------------
448+ def persist_worker (enclave_manager , kv_helper ):
449+ """
450+ Persists worker to KvStorage
451+
452+ @param enclave_manager - instance of EnclaveManager class
453+ @param kv_helper - instance of KvStorage
454+ """
455+ worker_info = create_json_worker (enclave_manager , enclave_manager .config )
456+ logger .info ("Persisting worker to workers table" )
457+ worker_id = crypto_utils .strip_begin_end_public_key (
458+ enclave_manager .enclave_id ).encode ("UTF-8" )
459+ # Calculate sha256 of worker id to get 32 bytes. The TC spec proxy
460+ # model contracts expect byte32. Then take a hexdigest for hex str.
461+ worker_id = hashlib .sha256 (worker_id ).hexdigest ()
462+
463+ kv_helper .set ("workers" , worker_id , worker_info )
464+
465+
433466# -----------------------------------------------------------------
434467def start_enclave_manager (config ):
435468 """
@@ -475,17 +508,35 @@ def start_enclave_manager(config):
475508
476509 try :
477510 sleep_interval = int (config ["EnclaveManager" ]["sleep_interval" ])
511+ key_refresh_interval = \
512+ int (config ["WorkerKeyRefresh" ]["key_refresh_interval" ])
478513 except Exception as err :
479514 logger .error ("Failed to get sleep interval from config file. " +
480515 "Setting sleep interval to 10 seconds: %s" , str (err ))
481516 sleep_interval = 10
482517
518+ # key_refresh_time is the time elapsed since last key refresh
519+ key_refresh_time = 0
483520 try :
484521 while True :
522+ if key_refresh_interval > 0 and \
523+ key_refresh_time >= key_refresh_interval :
524+ logger .info ("Initiate Worker Key refresh based on timer" )
525+ updated_enclave_signup_data = \
526+ initiate_key_refresh (enclave_manager .enclave_data )
527+ # Update Enclave Manager with updated signup data
528+ # after key refresh
529+ enclave_manager = EnclaveManager (
530+ config , enclave_signup_data , extended_measurements )
531+ # Persist updated worker to KV storage
532+ persist_worker (enclave_manager , kv_helper )
533+ key_refresh_time = 0
534+
485535 # Poll KV storage for new work-order requests and process
486536 enclave_manager .process_work_orders (kv_helper )
487537 logger .info ("Enclave manager sleeping for %d secs" , sleep_interval )
488538 time .sleep (sleep_interval )
539+ key_refresh_time = key_refresh_time + sleep_interval
489540 except Exception as inst :
490541 logger .error ("Error while processing work-order; " +
491542 "shutting down enclave manager" )
0 commit comments