diff --git a/dbs/src/values/peer_card.rs b/dbs/src/values/peer_card.rs index ee08696d7a9afd211e75c4ba62ef9fed8673c810..b68d1bdad333755086c0f0e711eed4aa3fa87bc9 100644 --- a/dbs/src/values/peer_card.rs +++ b/dbs/src/values/peer_card.rs @@ -19,11 +19,35 @@ use crate::*; pub struct PeerCardDbV1 { pub version: u32, pub currency: String, - pub pubkey: String, - pub blockstamp: String, + pub pubkey: PublicKey, + pub blockstamp: Blockstamp, pub endpoints: Vec<String>, - pub status: String, - pub signature: String, + pub signature: Signature, + pub status: bool, +} + +impl PeerCardDbV1 { + pub fn to_raw_string(&self) -> String { + format!( + "{}{}\n", + self.to_raw_unsigned_string(), + self.signature.to_base64(), + ) + } + fn to_raw_unsigned_string(&self) -> String { + format!( + "Version: {}\nType: Peer\nCurrency: {}\nPublicKey: {}\nBlock: {}\nEndpoints:\n{}\n", + self.version, + self.currency, + self.pubkey.to_base58(), + self.blockstamp, + self.endpoints.join("\n"), + ) + } + pub fn verify_sig(&self) -> Result<(), dubp::crypto::keys::SigError> { + self.pubkey + .verify(self.to_raw_unsigned_string().as_bytes(), &self.signature) + } } impl AsBytes for PeerCardDbV1 { @@ -56,3 +80,34 @@ impl ExplorableValue for PeerCardDbV1 { serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into())) } } + +#[cfg(test)] +mod tests { + use super::*; + use unwrap::unwrap; + + #[test] + fn test_old_peer_sig() { + let peer = PeerCardDbV1 { + version: 10, + currency: "g1".to_owned(), + pubkey: unwrap!(PublicKey::from_base58("8iVdpXqFLCxGyPqgVx5YbFSkmWKkceXveRd2yvBKeARL")), + blockstamp: unwrap!(Blockstamp::from_str("423354-00000033A87209DC21BD643088ED8AD52464A80C04BE3F8FBFA4291A9999BE50")), + endpoints: vec![ + "BMAS g1.duniter.org 443".to_owned(), + "BASIC_MERKLED_API 91.121.157.13 10901".to_owned(), + "WS2P e66254bf g1.duniter.org 443 ws2p".to_owned() + ], + signature: unwrap!(Signature::from_base64("qr6Cnr/Qsgw/clbt0LbdkaFaUwhdgBJw5Fzpn8EhI9zM5/rGbVF6kqiB5pRJxf17XtI45qQ7H7SBbl8X2kAtCA==")), + status: true, + + }; + + let peer_raw = peer.to_raw_unsigned_string(); + assert_eq!( + &peer_raw, + "Version: 10\nType: Peer\nCurrency: g1\nPublicKey: 8iVdpXqFLCxGyPqgVx5YbFSkmWKkceXveRd2yvBKeARL\nBlock: 423354-00000033A87209DC21BD643088ED8AD52464A80C04BE3F8FBFA4291A9999BE50\nEndpoints:\nBMAS g1.duniter.org 443\nBASIC_MERKLED_API 91.121.157.13 10901\nWS2P e66254bf g1.duniter.org 443 ws2p\n", + ); + assert!(peer.verify_sig().is_ok()); + } +}