af_keys/
utils.rs

1use anyhow::{Error, bail};
2use sui_sdk_types::{Address, UserSignature};
3
4use crate::PublicKey;
5
6/// Checks if the signer of the signature matches the provided address.
7///
8/// Checks both padded and unpadded addresses for ZkLogin signature.
9/// Fails for Multisig signature as it has combined address only.
10pub fn is_signature_signer(signature: &UserSignature, signer: Address) -> Result<bool, Error> {
11    Ok(match &signature {
12        UserSignature::Multisig(_) => {
13            bail!("failed to verify multisig signature signer as it has only combined address")
14        }
15        UserSignature::ZkLogin(signature) => signature
16            .inputs
17            .public_identifier()
18            .derive_address()
19            .any(|address| address == signer),
20        _ => {
21            let public_key = PublicKey::try_from(signature)?;
22            public_key.address()? == signer
23        }
24    })
25}