sui_sdk/
verify_personal_message_signature.rs1use std::sync::Arc;
5
6use crate::error::Error;
7use shared_crypto::intent::{Intent, IntentMessage, PersonalMessage};
8use sui_rpc::proto::sui::rpc::v2::{Bcs, UserSignature, VerifySignatureRequest};
9use sui_rpc_api::Client;
10use sui_types::{
11 base_types::SuiAddress,
12 signature::{AuthenticatorTrait, GenericSignature, VerifyParams},
13 signature_verification::VerifiedDigestCache,
14};
15
16pub async fn verify_personal_message_signature(
19 signature: GenericSignature,
20 message: &[u8],
21 address: SuiAddress,
22 client: Option<Client>,
23) -> Result<(), Error> {
24 let intent_msg = IntentMessage::new(
25 Intent::personal_message(),
26 PersonalMessage {
27 message: message.to_vec(),
28 },
29 );
30 match signature {
31 GenericSignature::ZkLoginAuthenticator(ref _sig) => {
32 if let Some(mut client) = client {
33 let message = Bcs::serialize(&message)?.with_name("PersonalMessage");
34 let user_signature =
35 UserSignature::default().with_bcs(Bcs::from(signature.as_ref().to_owned()));
36
37 let res = client
38 .inner_mut()
39 .signature_verification_client()
40 .verify_signature(
41 VerifySignatureRequest::default()
42 .with_address(address.to_string())
43 .with_message(message)
44 .with_signature(user_signature),
45 )
46 .await
47 .map_err(|_| Error::InvalidSignature)?
48 .into_inner();
49
50 if res.is_valid() {
51 Ok(())
52 } else {
53 Err(Error::InvalidSignature)
54 }
55 } else {
56 Err(Error::InvalidSignature)
57 }
58 }
59 _ => signature
60 .verify_claims::<PersonalMessage>(
61 &intent_msg,
62 address,
63 &VerifyParams::default(),
64 Arc::new(VerifiedDigestCache::new_empty()),
65 )
66 .map_err(|_| Error::InvalidSignature),
67 }
68}