1#![cfg(feature = "full")]
3
4use {
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 signature_base58_str.replace_range(..1, "I");
61 assert_eq!(
62 signature_base58_str.parse::<Signature>(),
63 Err(ParseSignatureError::Invalid)
64 );
65
66 let mut too_long = bs58::encode(&[255u8; SIGNATURE_BYTES]).into_string();
69 too_long.push('1');
71 assert_eq!(
72 too_long.parse::<Signature>(),
73 Err(ParseSignatureError::WrongSize)
74 );
75 }
76}