use nonempty::NonEmpty;
use shared_crypto::intent::Intent;
use crate::committee::EpochId;
use crate::error::{SuiError, SuiResult};
use crate::signature::VerifyParams;
use crate::transaction::{SenderSignedData, TransactionDataAPI};
pub fn verify_sender_signed_data_message_signatures(
txn: &SenderSignedData,
current_epoch: EpochId,
verify_params: &VerifyParams,
) -> SuiResult {
let intent_message = txn.intent_message();
assert_eq!(intent_message.intent, Intent::sui_transaction());
if intent_message.value.is_system_tx() {
return Ok(());
}
let signers: NonEmpty<_> = txn.intent_message().value.signers();
fp_ensure!(
txn.inner().tx_signatures.len() == signers.len(),
SuiError::SignerSignatureNumberMismatch {
actual: txn.inner().tx_signatures.len(),
expected: signers.len()
}
);
let present_sigs = txn.get_signer_sig_mapping(verify_params.verify_legacy_zklogin_address)?;
for s in signers {
if !present_sigs.contains_key(&s) {
return Err(SuiError::SignerSignatureAbsent {
expected: s.to_string(),
actual: present_sigs.keys().map(|s| s.to_string()).collect(),
});
}
}
for (signer, signature) in present_sigs {
signature.verify_authenticator(intent_message, signer, current_epoch, verify_params)?;
}
Ok(())
}