1use rialo_s_pubkey::Pubkey;
2use rialo_s_signature::Signature;
3pub use rialo_s_signer::PresignerError;
4use rialo_s_signer::{Signer, SignerError};
5
6#[derive(Clone, Debug, Default)]
11pub struct Presigner {
12 pubkey: Pubkey,
13 signature: Signature,
14}
15
16impl Presigner {
17 pub fn new(pubkey: &Pubkey, signature: &Signature) -> Self {
18 Self {
19 pubkey: *pubkey,
20 signature: *signature,
21 }
22 }
23}
24
25impl Signer for Presigner {
26 fn try_pubkey(&self) -> Result<Pubkey, SignerError> {
27 Ok(self.pubkey)
28 }
29
30 fn try_sign_message(&self, message: &[u8]) -> Result<Signature, SignerError> {
31 if self.signature.verify(self.pubkey.as_ref(), message) {
32 Ok(self.signature)
33 } else {
34 Err(PresignerError::VerificationFailure.into())
35 }
36 }
37
38 fn is_interactive(&self) -> bool {
39 false
40 }
41}
42
43impl<T> PartialEq<T> for Presigner
44where
45 T: Signer,
46{
47 fn eq(&self, other: &T) -> bool {
48 self.pubkey() == other.pubkey()
49 }
50}
51
52#[cfg(test)]
53mod tests {
54 use rialo_s_keypair::keypair_from_seed;
55
56 use super::*;
57
58 #[test]
59 fn test_presigner() {
60 let keypair = keypair_from_seed(&[0u8; 32]).unwrap();
61 let pubkey = keypair.pubkey();
62 let data = [1u8];
63 let sig = keypair.sign_message(&data);
64
65 let presigner = Presigner::new(&pubkey, &sig);
67 assert_eq!(presigner.try_pubkey().unwrap(), pubkey);
68 assert_eq!(presigner.pubkey(), pubkey);
69 assert_eq!(presigner.try_sign_message(&data).unwrap(), sig);
70 assert_eq!(presigner.sign_message(&data), sig);
71 let bad_data = [2u8];
72 assert!(presigner.try_sign_message(&bad_data).is_err());
73 assert_eq!(presigner.sign_message(&bad_data), Signature::default());
74
75 assert_eq!(presigner, keypair);
77 assert_eq!(keypair, presigner);
78 let presigner2 = Presigner::new(&pubkey, &sig);
79 assert_eq!(presigner, presigner2);
80 }
81}