@@ -29,8 +29,9 @@ use phala_pallets::utils::attestation::{validate as validate_attestation_report,
2929use phala_types:: contract:: contract_id_preimage;
3030use phala_types:: {
3131 contract, messaging:: EncryptedKey , wrap_content_to_sign, AttestationReport ,
32- ChallengeHandlerInfo , EncryptedWorkerKey , HandoverChallenge , SignedContentType ,
33- VersionedWorkerEndpoints , WorkerEndpointPayload , WorkerPublicKey , WorkerRegistrationInfoV2 ,
32+ ChallengeHandlerInfo , EncryptedWorkerKeyV0 , EncryptedWorkerKeyV1 , HandoverChallenge ,
33+ SignedContentType , VersionedWorkerEndpoints , WorkerEndpointPayload , WorkerPublicKey ,
34+ WorkerRegistrationInfoV2 ,
3435} ;
3536use sp_application_crypto:: UncheckedFrom ;
3637use tracing:: { error, info} ;
@@ -1637,7 +1638,9 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
16371638 // Share the key with attestation
16381639 let ecdh_pubkey = challenge_handler. ecdh_pubkey ;
16391640 let iv = crate :: generate_random_iv ( ) ;
1640- let runtime_data = phactory. persistent_runtime_data ( ) . map_err ( from_display) ?;
1641+ let ( runtime_data, svn) = phactory
1642+ . load_persistent_runtime_data_with_svn ( )
1643+ . map_err ( from_display) ?;
16411644 let ( my_identity_key, _) = runtime_data. decode_keys ( ) ;
16421645 let ( ecdh_pubkey, encrypted_key) = key_share:: encrypt_secret_to (
16431646 & my_identity_key,
@@ -1652,21 +1655,22 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
16521655 encrypted_key,
16531656 iv,
16541657 } ;
1655- let runtime_state = phactory. runtime_state ( ) ?;
1656- let genesis_block_hash = runtime_state. genesis_block_hash ;
1657- let encrypted_worker_key = EncryptedWorkerKey {
1658+ let genesis_block_hash = runtime_data. genesis_block_hash ;
1659+ let encrypted_worker_key = EncryptedWorkerKeyV1 {
16581660 genesis_block_hash,
1659- para_id : runtime_state . para_id ,
1661+ para_id : runtime_data . para_id ,
16601662 dev_mode,
16611663 encrypted_key,
1664+ svn,
16621665 } ;
16631666
1664- let worker_key_hash = sp_core:: hashing:: blake2_256 ( & encrypted_worker_key. encode ( ) ) ;
1667+ let encoded_worker_key = encrypted_worker_key. encode ( ) ;
1668+ let payload_hash = sp_core:: hashing:: blake2_256 ( & encoded_worker_key) ;
16651669 let attestation = if !dev_mode && in_sgx {
16661670 Some ( create_attestation_report_on (
16671671 & phactory. platform ,
16681672 attestation_provider,
1669- & worker_key_hash ,
1673+ & payload_hash ,
16701674 phactory. args . ra_timeout ,
16711675 phactory. args . ra_max_retries ,
16721676 ) ?)
@@ -1675,10 +1679,11 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
16751679 None
16761680 } ;
16771681
1678- Ok ( pb:: HandoverWorkerKey :: new (
1679- encrypted_worker_key,
1682+ Ok ( pb:: HandoverWorkerKey {
16801683 attestation,
1681- ) )
1684+ encoded_worker_key_v0 : None ,
1685+ encoded_worker_key_v1 : Some ( encoded_worker_key) ,
1686+ } )
16821687 }
16831688
16841689 // WorkerKey Handover Client
@@ -1741,12 +1746,37 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
17411746
17421747 async fn handover_receive ( & mut self , request : pb:: HandoverWorkerKey ) -> RpcResult < ( ) > {
17431748 let mut phactory = self . lock_phactory ( false , true ) ?;
1744- let encrypted_worker_key = request. decode_worker_key ( ) . map_err ( from_display) ?;
1745-
1746- let dev_mode = encrypted_worker_key. dev_mode ;
1749+ let received_key;
1750+ let payload_hash;
1751+ match (
1752+ & request. encoded_worker_key_v0 ,
1753+ & request. encoded_worker_key_v1 ,
1754+ ) {
1755+ ( None , None ) => return Err ( from_display ( "No worker key found" ) ) ,
1756+ ( Some ( _) , Some ( _) ) => return Err ( from_display ( "Both v0 and v1 worker key found" ) ) ,
1757+ ( Some ( encoded) , None ) => {
1758+ payload_hash = sp_core:: hashing:: blake2_256 ( encoded) ;
1759+ let v0 = EncryptedWorkerKeyV0 :: decode ( & mut & encoded[ ..] )
1760+ . map_err ( |_| from_display ( "Decode worker key failed" ) ) ?;
1761+ received_key = EncryptedWorkerKeyV1 {
1762+ genesis_block_hash : v0. genesis_block_hash ,
1763+ para_id : v0. para_id ,
1764+ dev_mode : v0. dev_mode ,
1765+ encrypted_key : v0. encrypted_key ,
1766+ // If the version of the key is v0, it must from pRuntime v2.0 or v2.1, which never load the
1767+ // keys with a different svn. Thus, we can safely set the svn to current svn.
1768+ svn : phactory. platform . current_svn ( ) . map_err ( from_debug) ?,
1769+ } ;
1770+ }
1771+ ( None , Some ( encoded) ) => {
1772+ payload_hash = sp_core:: hashing:: blake2_256 ( encoded) ;
1773+ received_key = EncryptedWorkerKeyV1 :: decode ( & mut & encoded[ ..] )
1774+ . map_err ( |_| from_display ( "Decode worker key failed" ) ) ?;
1775+ }
1776+ }
1777+ let dev_mode = received_key. dev_mode ;
17471778 // verify RA report
17481779 if !dev_mode {
1749- let worker_key_hash = sp_core:: hashing:: blake2_256 ( & encrypted_worker_key. encode ( ) ) ;
17501780 let raw_attestation = request
17511781 . attestation
17521782 . ok_or_else ( || from_display ( "Server attestation not found" ) ) ?;
@@ -1755,7 +1785,7 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
17551785 . map_err ( |_| from_display ( "Decode server attestation failed" ) ) ?;
17561786 validate_attestation_report (
17571787 attn_to_validate,
1758- & worker_key_hash ,
1788+ & payload_hash ,
17591789 now ( ) ,
17601790 false ,
17611791 vec ! [ ] ,
@@ -1766,7 +1796,7 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
17661796 info ! ( "Skip server RA report check for dev mode key" ) ;
17671797 }
17681798
1769- let encrypted_key = encrypted_worker_key . encrypted_key ;
1799+ let encrypted_key = received_key . encrypted_key ;
17701800 let my_ecdh_key = phactory
17711801 . handover_ecdh_key
17721802 . as_ref ( )
@@ -1782,11 +1812,12 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
17821812 // only seal if the key is successfully updated
17831813 phactory
17841814 . save_runtime_data (
1785- encrypted_worker_key . genesis_block_hash ,
1786- encrypted_worker_key . para_id ,
1815+ received_key . genesis_block_hash ,
1816+ received_key . para_id ,
17871817 sr25519:: Pair :: restore_from_secret_key ( & secret) ,
17881818 false , // we are not sure whether this key is injected
17891819 dev_mode,
1820+ Some ( & received_key. svn ) ,
17901821 )
17911822 . map_err ( from_display) ?;
17921823
0 commit comments