Skip to content

Commit

Permalink
0.7.7 venus patch3 (#387)
Browse files Browse the repository at this point in the history
* feat: update spec version

* fix: fix tee verify block failed

* fix: reset the corresponding ingress sequence while clearing the master key

* fix: ready for runtime hot upgrade

* fix: update old master pubkey, support list

---------

Co-authored-by: Bill.W <[email protected]>
  • Loading branch information
ytqaljn and 0xbillw authored Aug 5, 2024
1 parent 8ef3bd2 commit 2ea7a15
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 21 deletions.
10 changes: 4 additions & 6 deletions pallets/audit/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -501,15 +501,14 @@ pub mod pallet {
result: idle_result,
tee_puk: tee_puk.clone(),
};

let master_puk = T::TeeWorkerHandler::get_master_publickey()?;

let encoding = verify_idle_info.encode();
let hashing = sp_io::hashing::sha2_256(&encoding);
let sig =
sp_core::sr25519::Signature::try_from(signature.as_slice()).or(Err(Error::<T>::MalformedSignature))?;

ensure!(
sp_io::crypto::sr25519_verify(&sig, &hashing, &master_puk),
T::TeeWorkerHandler::verify_master_sig(&sig, hashing),
Error::<T>::VerifyTeeSigFailed
);

Expand Down Expand Up @@ -634,14 +633,13 @@ pub mod pallet {
service_bloom_filter: s_service_bloom_filter,
};

let master_puk = T::TeeWorkerHandler::get_master_publickey()?;
let encoding = verify_service_info.encode();
let hashing = sp_io::hashing::sha2_256(&encoding);
let sig =
sp_core::sr25519::Signature::try_from(signature.as_slice()).or(Err(Error::<T>::MalformedSignature))?;

ensure!(
sp_io::crypto::sr25519_verify(&sig, &hashing, &master_puk),
T::TeeWorkerHandler::verify_master_sig(&sig, hashing),
Error::<T>::VerifyTeeSigFailed
);

Expand Down
12 changes: 4 additions & 8 deletions pallets/file-bank/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -594,13 +594,12 @@ pub mod pallet {

let idle_sig_info_encode = tag_sig_info.encode();
let original = sp_io::hashing::sha2_256(&idle_sig_info_encode);
let master_puk = T::TeeWorkerHandler::get_master_publickey()?;

let sig =
sp_core::sr25519::Signature::try_from(tee_sig.as_slice()).or(Err(Error::<T>::MalformedSignature))?;

ensure!(
sp_io::crypto::sr25519_verify(&sig, &original, &master_puk),
T::TeeWorkerHandler::verify_master_sig(&sig, original),
Error::<T>::VerifyTeeSigFailed
);
ensure!(tag_sig_info.miner == sender, Error::<T>::MinerError);
Expand Down Expand Up @@ -721,13 +720,12 @@ pub mod pallet {
original.extend_from_slice(&idle_sig_info_encode);
original.extend_from_slice(&tee_puk_encode);
let original = sp_io::hashing::sha2_256(&original);
let master_puk = T::TeeWorkerHandler::get_master_publickey()?;

let sig =
sp_core::sr25519::Signature::try_from(tee_sig_need_verify.as_slice()).or(Err(Error::<T>::MalformedSignature))?;

ensure!(
sp_io::crypto::sr25519_verify(&sig, &original, &master_puk),
T::TeeWorkerHandler::verify_master_sig(&sig, original),
Error::<T>::VerifyTeeSigFailed
);

Expand Down Expand Up @@ -816,13 +814,11 @@ pub mod pallet {
original.extend_from_slice(&tee_puk_encode);
let original = sp_io::hashing::sha2_256(&original);

let master_puk = T::TeeWorkerHandler::get_master_publickey()?;

let sig =
sp_core::sr25519::Signature::try_from(tee_sig_need_verify.as_slice()).or(Err(Error::<T>::MalformedSignature))?;

ensure!(
sp_io::crypto::sr25519_verify(&sig, &original, &master_puk),
T::TeeWorkerHandler::verify_master_sig(&sig, original),
Error::<T>::VerifyTeeSigFailed
);

Expand Down Expand Up @@ -1181,9 +1177,9 @@ pub mod pallet {
let _ = ensure_root(origin)?;

let file = <File<T>>::try_get(&file_hash).map_err(|_| Error::<T>::NonExistent)?;
let _ = Self::delete_user_file(&file_hash, &owner, &file)?;
Self::bucket_remove_file(&file_hash, &owner, &file)?;
Self::remove_user_hold_file_list(&file_hash, &owner)?;
<File<T>>::remove(file_hash);

Ok(())
}
Expand Down
8 changes: 8 additions & 0 deletions pallets/mq/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ pub mod pallet {
pub fn offchain_ingress(sender: &MessageOrigin) -> Option<u64> {
OffchainIngress::<T>::get(sender)
}

pub fn reset_ingress_channel_seq(sender: MessageOrigin) {
OffchainIngress::<T>::remove(sender);
}
}

#[pallet::hooks]
Expand Down Expand Up @@ -263,6 +267,10 @@ pub mod pallet {
fn queue_message(payload: impl Encode + BindTopic) {
Pallet::<Self::Config>::queue_bound_message(Self::message_origin(), payload);
}

fn reset_ingress_channel_seq(sender: MessageOrigin) {
Pallet::<Self::Config>::reset_ingress_channel_seq(sender);
}
}

pub trait MasterPubkeySupplier {
Expand Down
6 changes: 4 additions & 2 deletions pallets/sminer/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -897,12 +897,14 @@ pub mod pallet {
original.extend_from_slice(&encoding);
original.extend_from_slice(&tee_puk_encode);
let original_text = sp_io::hashing::sha2_256(&original);
let master_puk = T::TeeWorkerHandler::get_master_publickey()?;

let sig = sp_core::sr25519::Signature::try_from(tee_sig_need_verify.as_slice())
.or(Err(Error::<T>::MalformedSignature))?;

ensure!(sp_io::crypto::sr25519_verify(&sig, &original_text, &master_puk), Error::<T>::VerifyTeeSigFailed);
ensure!(
T::TeeWorkerHandler::verify_master_sig(&sig, original_text.clone()),
Error::<T>::VerifyTeeSigFailed
);

let now = <frame_system::Pallet<T>>::block_number();
T::TeeWorkerHandler::update_work_block(now, &tee_puk)?;
Expand Down
57 changes: 53 additions & 4 deletions pallets/tee-worker/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ use sp_io::hashing;

type AccountOf<T> = <T as frame_system::Config>::AccountId;

type SHA256 = [u8; 32];

#[frame_support::pallet]
pub mod pallet {
use super::*;
Expand Down Expand Up @@ -265,6 +267,12 @@ pub mod pallet {
#[pallet::storage]
pub type MasterPubkey<T: Config> = StorageValue<_, MasterPublicKey>;

#[pallet::storage]
pub type OldMasterPubkey<T: Config> = StorageValue<_, MasterPublicKey>;

#[pallet::storage]
pub type OldMasterPubkeyList<T: Config> = StorageValue<_, Vec<MasterPublicKey>, ValueQuery>;

/// The block number and unix timestamp when the master-key is launched
#[pallet::storage]
pub type MasterKeyLaunchedAt<T: Config> = StorageValue<_, (BlockNumberFor<T>, u64)>;
Expand Down Expand Up @@ -428,6 +436,27 @@ pub mod pallet {
Ok(())
}

#[pallet::call_index(14)]
#[pallet::weight(Weight::from_parts(10_000u64, 0) + T::DbWeight::get().writes(1u64))]
pub fn clear_master_key(origin: OriginFor<T>) -> DispatchResult {
T::GovernanceOrigin::ensure_origin(origin)?;

ensure!(MasterPubkey::<T>::get().is_some(), Error::<T>::MasterKeyAlreadyLaunched);
ensure!(MasterKeyFirstHolder::<T>::get().is_some(), Error::<T>::MasterKeyLaunching);

let old_pubkey = MasterPubkey::<T>::get().ok_or(Error::<T>::WorkerNotFound)?;
MasterKeyFirstHolder::<T>::kill();
let old_pubkey2 = OldMasterPubkey::<T>::get().ok_or(Error::<T>::WorkerNotFound)?;
OldMasterPubkeyList::<T>::mutate(|list| {
list.push(old_pubkey);
list.push(old_pubkey2);
});
MasterPubkey::<T>::kill();
Self::reset_keyfairy_channel_seq();

Ok(())
}

/// Registers a worker on the blockchain
/// This is the legacy version that support EPID attestation type only.
///
Expand Down Expand Up @@ -818,6 +847,10 @@ pub mod pallet {
MasterKeyLaunchedAt::<T>::put((block_number, now));
Self::deposit_event(Event::<T>::MasterKeyLaunched);
}

fn reset_keyfairy_channel_seq() {
Self::reset_ingress_channel_seq(MessageOrigin::Keyfairy);
}
}

impl<T: Config + ces_pallet_mq::Config> MessageOriginInfo for Pallet<T> {
Expand Down Expand Up @@ -911,8 +944,8 @@ pub trait TeeWorkerHandler<AccountId, Block> {
fn get_stash(pbk: &WorkerPublicKey) -> Result<AccountId, DispatchError>;
fn punish_scheduler(pbk: WorkerPublicKey) -> DispatchResult;
fn get_pubkey_list() -> Vec<WorkerPublicKey>; // get_controller_list
fn get_master_publickey() -> Result<MasterPublicKey, DispatchError>;
fn update_work_block(now: Block, pbk: &WorkerPublicKey) -> DispatchResult;
fn verify_master_sig(sig: &sp_core::sr25519::Signature, hash: SHA256) -> bool;
}

impl<T: Config> TeeWorkerHandler<AccountOf<T>, BlockNumberFor<T>> for Pallet<T> {
Expand Down Expand Up @@ -985,10 +1018,26 @@ impl<T: Config> TeeWorkerHandler<AccountOf<T>, BlockNumberFor<T>> for Pallet<T>
acc_list
}

fn get_master_publickey() -> Result<MasterPublicKey, DispatchError> {
let pk = MasterPubkey::<T>::try_get().map_err(|_| Error::<T>::MasterKeyUninitialized)?;
fn verify_master_sig(sig: &sp_core::sr25519::Signature, hash: SHA256) -> bool {
let cur_pubkey = match <MasterPubkey<T>>::try_get().map_err(|_| Error::<T>::MasterKeyUninitialized) {
Ok(cur_pubkey) => cur_pubkey,
Err(_) => return false,
};

let mut flag = false;
let pubkey_list = OldMasterPubkeyList::<T>::get();
for pubkey in pubkey_list {
if sp_io::crypto::sr25519_verify(&sig, &hash, &pubkey) {
flag = true;
break;
}
}

if sp_io::crypto::sr25519_verify(&sig, &hash, &cur_pubkey) || flag {
return true;
}

Ok(pk)
false
}

fn update_work_block(now: BlockNumberFor<T>, pbk: &WorkerPublicKey) -> DispatchResult {
Expand Down
2 changes: 1 addition & 1 deletion standalone/chain/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// and set impl_version to 0. If only runtime
// implementation changes and behavior does not, then leave spec_version as
// is and increment impl_version.
spec_version: 101,
spec_version: 107,
impl_version: 0,
apis: RUNTIME_API_VERSIONS,
transaction_version: 1,
Expand Down

0 comments on commit 2ea7a15

Please sign in to comment.