@@ -29,8 +29,9 @@ use phala_pallets::utils::attestation::{validate as validate_attestation_report,
29
29
use phala_types:: contract:: contract_id_preimage;
30
30
use phala_types:: {
31
31
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 ,
34
35
} ;
35
36
use sp_application_crypto:: UncheckedFrom ;
36
37
use tracing:: { error, info} ;
@@ -1637,7 +1638,9 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1637
1638
// Share the key with attestation
1638
1639
let ecdh_pubkey = challenge_handler. ecdh_pubkey ;
1639
1640
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) ?;
1641
1644
let ( my_identity_key, _) = runtime_data. decode_keys ( ) ;
1642
1645
let ( ecdh_pubkey, encrypted_key) = key_share:: encrypt_secret_to (
1643
1646
& my_identity_key,
@@ -1652,21 +1655,22 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1652
1655
encrypted_key,
1653
1656
iv,
1654
1657
} ;
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 {
1658
1660
genesis_block_hash,
1659
- para_id : runtime_state . para_id ,
1661
+ para_id : runtime_data . para_id ,
1660
1662
dev_mode,
1661
1663
encrypted_key,
1664
+ svn,
1662
1665
} ;
1663
1666
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) ;
1665
1669
let attestation = if !dev_mode && in_sgx {
1666
1670
Some ( create_attestation_report_on (
1667
1671
& phactory. platform ,
1668
1672
attestation_provider,
1669
- & worker_key_hash ,
1673
+ & payload_hash ,
1670
1674
phactory. args . ra_timeout ,
1671
1675
phactory. args . ra_max_retries ,
1672
1676
) ?)
@@ -1675,10 +1679,11 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1675
1679
None
1676
1680
} ;
1677
1681
1678
- Ok ( pb:: HandoverWorkerKey :: new (
1679
- encrypted_worker_key,
1682
+ Ok ( pb:: HandoverWorkerKey {
1680
1683
attestation,
1681
- ) )
1684
+ encoded_worker_key_v0 : None ,
1685
+ encoded_worker_key_v1 : Some ( encoded_worker_key) ,
1686
+ } )
1682
1687
}
1683
1688
1684
1689
// WorkerKey Handover Client
@@ -1741,12 +1746,37 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1741
1746
1742
1747
async fn handover_receive ( & mut self , request : pb:: HandoverWorkerKey ) -> RpcResult < ( ) > {
1743
1748
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 ;
1747
1778
// verify RA report
1748
1779
if !dev_mode {
1749
- let worker_key_hash = sp_core:: hashing:: blake2_256 ( & encrypted_worker_key. encode ( ) ) ;
1750
1780
let raw_attestation = request
1751
1781
. attestation
1752
1782
. ok_or_else ( || from_display ( "Server attestation not found" ) ) ?;
@@ -1755,7 +1785,7 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1755
1785
. map_err ( |_| from_display ( "Decode server attestation failed" ) ) ?;
1756
1786
validate_attestation_report (
1757
1787
attn_to_validate,
1758
- & worker_key_hash ,
1788
+ & payload_hash ,
1759
1789
now ( ) ,
1760
1790
false ,
1761
1791
vec ! [ ] ,
@@ -1766,7 +1796,7 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1766
1796
info ! ( "Skip server RA report check for dev mode key" ) ;
1767
1797
}
1768
1798
1769
- let encrypted_key = encrypted_worker_key . encrypted_key ;
1799
+ let encrypted_key = received_key . encrypted_key ;
1770
1800
let my_ecdh_key = phactory
1771
1801
. handover_ecdh_key
1772
1802
. as_ref ( )
@@ -1782,11 +1812,12 @@ impl<Platform: pal::Platform + Serialize + DeserializeOwned> PhactoryApi for Rpc
1782
1812
// only seal if the key is successfully updated
1783
1813
phactory
1784
1814
. 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 ,
1787
1817
sr25519:: Pair :: restore_from_secret_key ( & secret) ,
1788
1818
false , // we are not sure whether this key is injected
1789
1819
dev_mode,
1820
+ Some ( & received_key. svn ) ,
1790
1821
)
1791
1822
. map_err ( from_display) ?;
1792
1823
0 commit comments