Skip to main content

rialo_s_presigner/
lib.rs

1use rialo_s_pubkey::Pubkey;
2use rialo_s_signature::Signature;
3pub use rialo_s_signer::PresignerError;
4use rialo_s_signer::{Signer, SignerError};
5
6/// A `Signer` implementation that represents a `Signature` that has been
7/// constructed externally. Performs a signature verification against the
8/// expected message upon `sign()` requests to affirm its relationship to
9/// the `message` bytes
10#[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        // Signer
66        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        // PartialEq
76        assert_eq!(presigner, keypair);
77        assert_eq!(keypair, presigner);
78        let presigner2 = Presigner::new(&pubkey, &sig);
79        assert_eq!(presigner, presigner2);
80    }
81}