Skip to content
Snippets Groups Projects
Select Git revision
  • d9813593398f6661a68d73da04dfb290706e4d3f
  • master default protected
  • dev
  • appimage
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.53.2
  • 0.53.1
  • 0.53.0
  • 0.52.0
  • 0.51.1
  • 0.51.0
  • 0.50.5
  • 0.50.4
  • 0.50.3
  • 0.50.2
  • 0.50.1
  • 0.50.0
  • 0.33.0rc7
  • 0.33.0rc6
  • 0.33.0rc5
  • 0.33.0rc4
  • 0.33.0rc3
  • 0.33.0rc2
  • 0.33.0rc1
  • 0.32.10post1
41 results

out

Blame
  • ack_message.rs 2.21 KiB
    extern crate duniter_crypto;
    extern crate serde;
    extern crate serde_json;
    
    use self::serde::ser::{Serialize, SerializeStruct, Serializer};
    use super::WS2PMessage;
    use duniter_crypto::keys::ed25519::PublicKey as ed25519PublicKey;
    use duniter_crypto::keys::PublicKey;
    
    #[derive(Debug, Clone)]
    pub struct WS2PAckMessageV1 {
        pub currency: String,
        pub pubkey: ed25519PublicKey,
        pub challenge: String,
        pub signature: Option<duniter_crypto::keys::ed25519::Signature>,
    }
    
    impl WS2PMessage for WS2PAckMessageV1 {
        fn parse(v: &serde_json::Value, currency: String) -> Option<Self> {
            let pubkey = match v.get("pub") {
                Some(pubkey) => pubkey.as_str().unwrap().to_string(),
                None => return None,
            };
            let signature = match v.get("sig") {
                Some(signature) => signature.as_str().unwrap().to_string(),
                None => return None,
            };
            let pubkey: ed25519PublicKey = ed25519PublicKey::from_base58(&pubkey).unwrap();
            let signature: Option<duniter_crypto::keys::ed25519::Signature> =
                Some(duniter_crypto::keys::Signature::from_base64(&signature).unwrap());
            Some(WS2PAckMessageV1 {
                currency,
                pubkey,
                challenge: "".to_string(),
                signature,
            })
        }
        fn to_raw(&self) -> String {
            format!(
                "WS2P:ACK:{}:{}:{}",
                self.currency, self.pubkey, self.challenge
            )
        }
        fn verify(&self) -> bool {
            self.pubkey
                .verify(self.to_raw().as_bytes(), &self.signature.unwrap())
        }
    }
    
    impl Serialize for WS2PAckMessageV1 {
        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where
            S: Serializer,
        {
            let mut connect_message_in_json = serializer.serialize_struct("message", 3)?;
            connect_message_in_json.serialize_field("auth", "ACK")?;
            connect_message_in_json.serialize_field("pub", &self.pubkey.to_string())?;
            connect_message_in_json.serialize_field(
                "sig",
                &self
                    .signature
                    .expect("Fail to serialize ACK message : the signature field is set to None !")
                    .to_string(),
            )?;
            connect_message_in_json.end()
        }
    }