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}