solana_sdk/
signature.rs

1//! Functionality for public and private keys.
2#![cfg(feature = "full")]
3
4// legacy module paths
5use {
6    crate::pubkey::Pubkey,
7    std::borrow::{Borrow, Cow},
8};
9pub use {
10    crate::signer::{keypair::*, null_signer::*, presigner::*, *},
11    solana_signature::{ParseSignatureError, Signature, SIGNATURE_BYTES},
12};
13
14pub trait Signable {
15    fn sign(&mut self, keypair: &Keypair) {
16        let signature = keypair.sign_message(self.signable_data().borrow());
17        self.set_signature(signature);
18    }
19    fn verify(&self) -> bool {
20        self.get_signature()
21            .verify(self.pubkey().as_ref(), self.signable_data().borrow())
22    }
23
24    fn pubkey(&self) -> Pubkey;
25    fn signable_data(&self) -> Cow<[u8]>;
26    fn get_signature(&self) -> Signature;
27    fn set_signature(&mut self, signature: Signature);
28}
29
30#[cfg(test)]
31mod tests {
32    use {super::*, solana_sdk::signer::keypair::Keypair};
33    #[test]
34    fn test_signature_fromstr() {
35        let signature = Keypair::new().sign_message(&[0u8]);
36
37        let mut signature_base58_str = bs58::encode(signature).into_string();
38
39        assert_eq!(signature_base58_str.parse::<Signature>(), Ok(signature));
40
41        signature_base58_str.push_str(&bs58::encode(<[u8; 64]>::from(signature)).into_string());
42        assert_eq!(
43            signature_base58_str.parse::<Signature>(),
44            Err(ParseSignatureError::WrongSize)
45        );
46
47        signature_base58_str.truncate(signature_base58_str.len() / 2);
48        assert_eq!(signature_base58_str.parse::<Signature>(), Ok(signature));
49
50        signature_base58_str.truncate(signature_base58_str.len() / 2);
51        assert_eq!(
52            signature_base58_str.parse::<Signature>(),
53            Err(ParseSignatureError::WrongSize)
54        );
55
56        let mut signature_base58_str = bs58::encode(<[u8; 64]>::from(signature)).into_string();
57        assert_eq!(signature_base58_str.parse::<Signature>(), Ok(signature));
58
59        // throw some non-base58 stuff in there
60        signature_base58_str.replace_range(..1, "I");
61        assert_eq!(
62            signature_base58_str.parse::<Signature>(),
63            Err(ParseSignatureError::Invalid)
64        );
65
66        // too long input string
67        // longest valid encoding
68        let mut too_long = bs58::encode(&[255u8; SIGNATURE_BYTES]).into_string();
69        // and one to grow on
70        too_long.push('1');
71        assert_eq!(
72            too_long.parse::<Signature>(),
73            Err(ParseSignatureError::WrongSize)
74        );
75    }
76}