From 7418a9c94236b51b1e8a2167b4aa6e75ee37e9a6 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Wed, 28 Aug 2019 15:14:25 +0200
Subject: [PATCH] [fix] crypto: security: clear seed when keypair it's droped

---
 Cargo.lock                                    |  1 -
 lib/core/conf/src/keys.rs                     | 34 +++++++++++++----
 lib/core/conf/src/lib.rs                      |  6 +--
 lib/core/core/src/lib.rs                      |  6 +--
 lib/core/module/src/lib.rs                    |  2 +-
 lib/crypto/src/bases/b58.rs                   |  4 +-
 lib/crypto/src/keys/bin_signable.rs           |  2 +-
 lib/crypto/src/keys/ed25519.rs                | 37 +++++++++----------
 lib/crypto/src/keys/mod.rs                    | 34 +++++++++--------
 lib/crypto/src/keys/seed.rs                   | 17 +++++++--
 lib/crypto/src/lib.rs                         | 36 ------------------
 lib/dubp/common-doc/Cargo.toml                |  3 +-
 .../src/documents/certification/v10.rs        |  7 ++--
 .../user-docs/src/documents/identity/v10.rs   |  2 +-
 .../user-docs/src/documents/membership/v10.rs |  2 +-
 .../user-docs/src/documents/revocation/v10.rs |  6 +--
 .../user-docs/src/documents/transaction.rs    |  2 +-
 lib/dunp/network-documents/src/lib.rs         |  2 +-
 lib/modules/ws2p-v1-legacy/src/lib.rs         | 12 +++---
 .../ws2p-v1-legacy/src/ws_connections/mod.rs  |  2 +-
 lib/modules/ws2p/ws2p-messages/lib.rs         |  2 +-
 .../src/controller/meta_datas.rs              | 12 +++---
 lib/modules/ws2p/ws2p-protocol/src/lib.rs     |  2 +-
 .../src/controllers/incoming_connections.rs   |  2 +-
 .../src/controllers/outgoing_connections.rs   |  2 +-
 lib/modules/ws2p/ws2p/src/services/mod.rs     |  2 +-
 .../ws2p/ws2p/tests/connection_negociation.rs |  4 +-
 27 files changed, 118 insertions(+), 125 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 12bb427b..dd1f3de4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -376,7 +376,6 @@ dependencies = [
  "pest_derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pretty_assertions 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
  "shrinkwraprs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "unwrap 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/lib/core/conf/src/keys.rs b/lib/core/conf/src/keys.rs
index 84bb0579..1fd36b91 100644
--- a/lib/core/conf/src/keys.rs
+++ b/lib/core/conf/src/keys.rs
@@ -201,20 +201,29 @@ mod tests {
             )
         );
         assert_eq!(
-            result_key_pairs.network_keypair.seed(),
+            result_key_pairs.network_keypair.seed().clone(),
             Seed::from_base58(BASE58_SEED_INIT).expect("Wrong data in BASE58_SEED_INIT"),
         );
 
         // We expect member key to update as intended
         assert_eq!(
-            result_key_pairs.member_keypair.unwrap().public_key(),
+            result_key_pairs
+                .member_keypair
+                .clone()
+                .unwrap()
+                .public_key(),
             PubKey::Ed25519(
                 ed25519::PublicKey::from_base58(BASE58_PUB_TEST)
                     .expect("Wrong data in BASE58_PUB_TEST")
             )
         );
         assert_eq!(
-            result_key_pairs.member_keypair.unwrap().seed(),
+            result_key_pairs
+                .member_keypair
+                .clone()
+                .unwrap()
+                .seed()
+                .clone(),
             Seed::from_base58(BASE58_SEED_TEST).expect("Wrong data in BASE58_SEED_TEST"),
         );
     }
@@ -240,7 +249,7 @@ mod tests {
             )
         );
         assert_eq!(
-            result_key_pairs.network_keypair.seed(),
+            result_key_pairs.network_keypair.seed().clone(),
             Seed::from_base58(BASE58_SEED_TEST).expect("Wrong data in BASE58_SEED_TEST")
         );
         // We expect member key not to change
@@ -273,20 +282,29 @@ mod tests {
             )
         );
         assert_ne!(
-            result_key_pairs.network_keypair.seed(),
+            result_key_pairs.network_keypair.seed().clone(),
             Seed::from_base58(BASE58_SEED_INIT).expect("Wrong data in BASE58_SEED_TEST")
         );
 
         // We expect member key not to change
         assert_eq!(
-            result_key_pairs.member_keypair.unwrap().public_key(),
+            result_key_pairs
+                .member_keypair
+                .clone()
+                .unwrap()
+                .public_key(),
             PubKey::Ed25519(
                 ed25519::PublicKey::from_base58(BASE58_PUB_INIT)
                     .expect("Wrong data in BASE58_PUB_TEST")
             )
         );
         assert_eq!(
-            result_key_pairs.member_keypair.unwrap().seed(),
+            result_key_pairs
+                .member_keypair
+                .clone()
+                .unwrap()
+                .seed()
+                .clone(),
             Seed::from_base58(BASE58_SEED_INIT).expect("Wrong data in BASE58_SEED_TEST")
         );
     }
@@ -317,7 +335,7 @@ mod tests {
             )
         );
         assert_eq!(
-            result_key_pairs.network_keypair.seed(),
+            result_key_pairs.network_keypair.seed().clone(),
             Seed::from_base58(BASE58_SEED_INIT).expect("Wrong data in BASE58_SEED_TEST")
         );
 
diff --git a/lib/core/conf/src/lib.rs b/lib/core/conf/src/lib.rs
index 03bd0fb0..4a41a3a9 100644
--- a/lib/core/conf/src/lib.rs
+++ b/lib/core/conf/src/lib.rs
@@ -355,7 +355,7 @@ impl DursConfTrait for DuRsConf {
     }
 }
 
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
 /// Keypairs filled in by the user (via a file or by direct entry in the terminal).
 pub struct DuniterKeyPairs {
     /// Keypair used by the node to sign its communications with other nodes. This keypair is mandatory, if it's not filled in, a random keypair is generated.
@@ -369,12 +369,12 @@ impl Serialize for DuniterKeyPairs {
     where
         S: Serializer,
     {
-        let member_seed = if let Some(member_keypair) = self.member_keypair {
+        let member_seed = if let Some(ref member_keypair) = self.member_keypair {
             member_keypair.seed().to_string()
         } else {
             String::from("")
         };
-        let member_pub = if let Some(member_keypair) = self.member_keypair {
+        let member_pub = if let Some(ref member_keypair) = self.member_keypair {
             member_keypair.public_key().to_string()
         } else {
             String::from("")
diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs
index b17037a9..8c0ad966 100644
--- a/lib/core/core/src/lib.rs
+++ b/lib/core/core/src/lib.rs
@@ -405,14 +405,13 @@ impl DursCore<DuRsConf> {
                         .modules()
                         .get(&NM::name().to_string().as_str())
                         .cloned();
-                    let keypairs = self.keypairs;
 
                     // Load module conf and keys
                     let ((module_conf, _), required_keys) = get_module_conf_and_keys::<NM>(
                         self.currency_name.as_ref(),
                         &soft_meta_datas.conf.get_global_conf(),
                         module_conf_json,
-                        keypairs,
+                        self.keypairs.clone(),
                     )?;
 
                     let sync_params = network_sync.clone();
@@ -491,13 +490,12 @@ impl DursCore<DuRsConf> {
                     .modules()
                     .get(&M::name().to_string().as_str())
                     .cloned();
-                let keypairs = self.keypairs;
                 // Load module conf and keys
                 let ((module_conf, _), required_keys) = get_module_conf_and_keys::<M>(
                     self.currency_name.as_ref(),
                     &soft_meta_datas.conf.get_global_conf(),
                     module_conf_json,
-                    keypairs,
+                    self.keypairs.clone(),
                 )?;
 
                 let thread_builder = thread::Builder::new().name(M::name().0.into());
diff --git a/lib/core/module/src/lib.rs b/lib/core/module/src/lib.rs
index 2f6a6824..71400044 100644
--- a/lib/core/module/src/lib.rs
+++ b/lib/core/module/src/lib.rs
@@ -264,7 +264,7 @@ pub enum RequiredKeys {
     None(),
 }
 
-#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
 /// Contains the keys the module needs
 pub enum RequiredKeysContent {
     /// Contains the member keypair (private key included).
diff --git a/lib/crypto/src/bases/b58.rs b/lib/crypto/src/bases/b58.rs
index 8c28ba88..53686c24 100644
--- a/lib/crypto/src/bases/b58.rs
+++ b/lib/crypto/src/bases/b58.rs
@@ -46,7 +46,7 @@ pub fn str_base58_to_32bytes(base58_data: &str) -> Result<[u8; 32], BaseConverti
     }
 }
 
-/// Create an array of 64bytes from a Base58 string.
+/*/// Create an array of 64bytes from a Base58 string.
 pub fn str_base58_to_64bytes(base58_data: &str) -> Result<[u8; 64], BaseConvertionError> {
     match base58_data.from_base58() {
         Ok(result) => {
@@ -70,4 +70,4 @@ pub fn str_base58_to_64bytes(base58_data: &str) -> Result<[u8; 64], BaseConverti
             Err(BaseConvertionError::InvalidBaseConverterLength)
         }
     }
-}
+}*/
diff --git a/lib/crypto/src/keys/bin_signable.rs b/lib/crypto/src/keys/bin_signable.rs
index b0a89418..23ed48f1 100644
--- a/lib/crypto/src/keys/bin_signable.rs
+++ b/lib/crypto/src/keys/bin_signable.rs
@@ -116,7 +116,7 @@ mod tests {
 
     #[test]
     fn test_bin_signable() {
-        let key_pair = ed25519::KeyPairFromSeedGenerator::generate(&Seed::new([
+        let key_pair = ed25519::KeyPairFromSeedGenerator::generate(Seed::new([
             0u8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
             10, 11, 12, 13, 14, 15,
         ]));
diff --git a/lib/crypto/src/keys/ed25519.rs b/lib/crypto/src/keys/ed25519.rs
index db072b99..1803fdac 100644
--- a/lib/crypto/src/keys/ed25519.rs
+++ b/lib/crypto/src/keys/ed25519.rs
@@ -24,7 +24,7 @@ use super::PublicKey as PublicKeyMethods;
 use crate::bases::*;
 use base58::ToBase58;
 use base64;
-use clear_on_drop::ClearOnDrop;
+use clear_on_drop::clear::Clear;
 use ring::signature::{Ed25519KeyPair as RingKeyPair, KeyPair, UnparsedPublicKey, ED25519};
 use serde::de::{Deserialize, Deserializer, Error, SeqAccess, Visitor};
 use serde::ser::{Serialize, SerializeTuple, Serializer};
@@ -213,7 +213,7 @@ impl super::Signator for Signator {
 }
 
 /// Store a ed25519 cryptographic key pair (`PublicKey` + `PrivateKey`)
-#[derive(Debug, Copy, Clone, Eq)]
+#[derive(Debug, Clone, Eq)]
 pub struct Ed25519KeyPair {
     /// Store a Ed25519 public key.
     pub pubkey: PublicKey,
@@ -221,6 +221,13 @@ pub struct Ed25519KeyPair {
     pub seed: Seed,
 }
 
+impl Drop for Ed25519KeyPair {
+    #[inline]
+    fn drop(&mut self) {
+        self.seed.clear();
+    }
+}
+
 impl Display for Ed25519KeyPair {
     fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
         write!(f, "({}, hidden)", self.pubkey.to_base58())
@@ -247,8 +254,8 @@ impl super::KeyPair for Ed25519KeyPair {
         self.pubkey
     }
 
-    fn seed(&self) -> Seed {
-        self.seed
+    fn seed(&self) -> &Seed {
+        &self.seed
     }
 
     fn verify(
@@ -263,12 +270,7 @@ impl super::KeyPair for Ed25519KeyPair {
 impl Ed25519KeyPair {
     /// Generate random keypair
     pub fn generate_random() -> Self {
-        // generate random seed
-        let mut random_seed = Seed::random();
-        // For security, clear automatically random_seed when it's droped
-        let random_seed = ClearOnDrop::new(&mut random_seed);
-        // Generate and return keypair from seed
-        KeyPairFromSeedGenerator::generate(&random_seed)
+        KeyPairFromSeedGenerator::generate(Seed::random())
     }
 }
 
@@ -281,13 +283,12 @@ impl KeyPairFromSeedGenerator {
     ///
     /// The [`PublicKey`](struct.PublicKey.html) will be able to verify messaged signed with
     /// the [`PrivateKey`](struct.PrivateKey.html).
-    pub fn generate(seed: &Seed) -> Ed25519KeyPair {
+    pub fn generate(seed: Seed) -> Ed25519KeyPair {
         let ring_key_pair = RingKeyPair::from_seed_unchecked(seed.as_ref())
             .expect("dev error: fail to generate ed25519 keypair.");
-
         Ed25519KeyPair {
             pubkey: get_ring_ed25519_pubkey(&ring_key_pair),
-            seed: *seed,
+            seed,
         }
     }
 }
@@ -340,11 +341,9 @@ impl KeyPairFromSaltedPasswordGenerator {
     /// the [`PrivateKey`](struct.PrivateKey.html).
     pub fn generate(&self, password: &[u8], salt: &[u8]) -> Ed25519KeyPair {
         // Generate seed from tuple (password + salt)
-        let mut seed = self.generate_seed(password, salt);
-        // For security, clear automatically seed when it's droped
-        let seed = ClearOnDrop::new(&mut seed);
+        let seed = self.generate_seed(password, salt);
         // Generate keypair from seed
-        KeyPairFromSeedGenerator::generate(&seed)
+        KeyPairFromSeedGenerator::generate(seed)
     }
 }
 
@@ -577,7 +576,7 @@ UniqueID: tic
 Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 ";
 
-        let signator = KeyPairFromSeedGenerator::generate(&seed)
+        let signator = KeyPairFromSeedGenerator::generate(seed)
             .generate_signator()
             .expect("fail to generate signator !");
         let pubkey = signator.public_key();
@@ -620,7 +619,7 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 
         // Test key_pair equality
         let same_key_pair = key_pair2.clone();
-        let other_key_pair = KeyPairFromSeedGenerator::generate(&Seed::new([
+        let other_key_pair = KeyPairFromSeedGenerator::generate(Seed::new([
             0u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0,
         ]));
diff --git a/lib/crypto/src/keys/mod.rs b/lib/crypto/src/keys/mod.rs
index 090d5f00..c4ab3fd6 100644
--- a/lib/crypto/src/keys/mod.rs
+++ b/lib/crypto/src/keys/mod.rs
@@ -326,7 +326,7 @@ pub trait KeyPair: Clone + Display + Debug + PartialEq + Eq {
     fn public_key(&self) -> <Self::Signator as Signator>::PublicKey;
 
     /// Get `Seed`
-    fn seed(&self) -> Seed;
+    fn seed(&self) -> &Seed;
 
     /// Verify a signature with public key.
     fn verify(
@@ -351,7 +351,7 @@ pub trait Signator: Debug {
 }
 
 /// Store a cryptographic key pair.
-#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+#[derive(Clone, Debug, Eq, PartialEq)]
 pub enum KeyPairEnum {
     /// Store a ed25519 key pair.
     Ed25519(ed25519::Ed25519KeyPair),
@@ -370,8 +370,8 @@ impl GetKeysAlgo for KeyPairEnum {
 
 impl Display for KeyPairEnum {
     fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
-        match *self {
-            KeyPairEnum::Ed25519(ed25519_keypair) => {
+        match self {
+            KeyPairEnum::Ed25519(ref ed25519_keypair) => {
                 write!(f, "({}, hidden)", ed25519_keypair.pubkey.to_base58())
             }
             KeyPairEnum::Schnorr() => fatal_error!("Schnorr algo not yet supported !"),
@@ -383,28 +383,30 @@ impl KeyPair for KeyPairEnum {
     type Signator = SignatorEnum;
 
     fn generate_signator(&self) -> Result<Self::Signator, SignError> {
-        match *self {
-            KeyPairEnum::Ed25519(ed25519_keypair) => {
+        match self {
+            KeyPairEnum::Ed25519(ref ed25519_keypair) => {
                 Ok(SignatorEnum::Ed25519(ed25519_keypair.generate_signator()?))
             }
             KeyPairEnum::Schnorr() => fatal_error!("Schnorr algo not yet supported !"),
         }
     }
     fn public_key(&self) -> <Self::Signator as Signator>::PublicKey {
-        match *self {
-            KeyPairEnum::Ed25519(ed25519_keypair) => PubKey::Ed25519(ed25519_keypair.public_key()),
+        match self {
+            KeyPairEnum::Ed25519(ref ed25519_keypair) => {
+                PubKey::Ed25519(ed25519_keypair.public_key())
+            }
             KeyPairEnum::Schnorr() => fatal_error!("Schnorr algo not yet supported !"),
         }
     }
-    fn seed(&self) -> Seed {
+    fn seed(&self) -> &Seed {
         match *self {
-            KeyPairEnum::Ed25519(ed25519_keypair) => ed25519_keypair.seed(),
+            KeyPairEnum::Ed25519(ref ed25519_keypair) => &ed25519_keypair.seed(),
             KeyPairEnum::Schnorr() => fatal_error!("Schnorr algo not yet supported !"),
         }
     }
     fn verify(&self, message: &[u8], signature: &Sig) -> Result<(), SigError> {
-        match *self {
-            KeyPairEnum::Ed25519(ed25519_keypair) => {
+        match self {
+            KeyPairEnum::Ed25519(ref ed25519_keypair) => {
                 if let Sig::Ed25519(ed25519_sig) = signature {
                     ed25519_keypair.verify(message, ed25519_sig)
                 } else {
@@ -456,7 +458,7 @@ mod tests {
     use ring::{agreement, rand};
 
     pub fn valid_key_pair_1() -> KeyPairEnum {
-        KeyPairEnum::Ed25519(ed25519::KeyPairFromSeedGenerator::generate(&Seed::new([
+        KeyPairEnum::Ed25519(ed25519::KeyPairFromSeedGenerator::generate(Seed::new([
             59u8, 106, 39, 188, 206, 182, 164, 45, 98, 163, 168, 208, 42, 111, 13, 115, 101, 50,
             21, 119, 29, 226, 67, 166, 58, 192, 72, 161, 139, 89, 218, 41,
         ])))
@@ -544,7 +546,7 @@ mod tests {
     }
 
     fn false_key_pair_ed25519() -> ed25519::Ed25519KeyPair {
-        ed25519::KeyPairFromSeedGenerator::generate(&Seed::new([
+        ed25519::KeyPairFromSeedGenerator::generate(Seed::new([
             0u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
             0, 0, 0, 0,
         ]))
@@ -553,7 +555,7 @@ mod tests {
     #[test]
     fn key_pair() {
         let false_key_pair_ed25519 = false_key_pair_ed25519();
-        let false_key_pair = KeyPairEnum::Ed25519(false_key_pair_ed25519);
+        let false_key_pair = KeyPairEnum::Ed25519(false_key_pair_ed25519.clone());
 
         assert_eq!(KeysAlgo::Ed25519, false_key_pair.algo());
         assert_eq!(KeysAlgo::Schnorr, KeyPairEnum::Schnorr().algo());
@@ -565,7 +567,7 @@ mod tests {
             PubKey::Ed25519(false_key_pair_ed25519.pubkey),
             false_key_pair.public_key()
         );
-        assert_eq!(false_key_pair_ed25519.seed, false_key_pair.seed());
+        assert_eq!(false_key_pair_ed25519.seed, false_key_pair.seed().clone());
         assert_eq!(
             Err(SigError::InvalidSig),
             false_key_pair.verify(
diff --git a/lib/crypto/src/keys/seed.rs b/lib/crypto/src/keys/seed.rs
index 34facb3b..bb56fc05 100644
--- a/lib/crypto/src/keys/seed.rs
+++ b/lib/crypto/src/keys/seed.rs
@@ -23,7 +23,7 @@ use ring::rand;
 use std::fmt::{self, Debug, Display, Formatter};
 
 /// Store a 32 bytes seed used to generate keys.
-#[derive(Copy, Clone, Default, Deserialize, PartialEq, Eq, Hash, Serialize)]
+#[derive(Clone, Copy, Default, Deserialize, PartialEq, Eq, Hash, Serialize)]
 pub struct Seed([u8; 32]);
 
 impl AsRef<[u8]> for Seed {
@@ -60,15 +60,26 @@ impl Seed {
     #[inline]
     /// Create seed from base58 str
     pub fn from_base58(base58_str: &str) -> Result<Self, BaseConvertionError> {
-        Ok(Seed(b58::str_base58_to_32bytes(base58_str)?))
+        Ok(Seed::new(b58::str_base58_to_32bytes(base58_str)?))
     }
     #[inline]
     /// Generate random seed
     pub fn random() -> Seed {
         if let Ok(random_bytes) = rand::generate::<[u8; 32]>(&rand::SystemRandom::new()) {
-            Seed(random_bytes.expose())
+            Seed::new(random_bytes.expose())
         } else {
             fatal_error!("System error: fail to generate random seed !")
         }
     }
 }
+
+#[cfg(test)]
+mod tests {
+
+    use super::*;
+
+    #[test]
+    fn test_gen_random_seed() {
+        assert_ne!(Seed::random(), Seed::random());
+    }
+}
diff --git a/lib/crypto/src/lib.rs b/lib/crypto/src/lib.rs
index 33ac9c5c..3a02fca5 100644
--- a/lib/crypto/src/lib.rs
+++ b/lib/crypto/src/lib.rs
@@ -40,39 +40,3 @@ pub mod bases;
 pub mod hashs;
 pub mod keys;
 pub mod rand;
-
-#[cfg(test)]
-mod tests {
-
-    use super::*;
-    use crate::keys::Seed;
-    use ring::signature::Ed25519KeyPair;
-    use ring::signature::KeyPair;
-
-    #[test]
-    fn test_ring_gen_keypair() {
-        let seed = Seed::new([
-            61u8, 245, 136, 162, 155, 50, 205, 43, 116, 15, 45, 84, 138, 54, 114, 214, 71, 213, 11,
-            251, 135, 182, 202, 131, 48, 91, 166, 226, 40, 255, 251, 172,
-        ]);
-
-        let legacy_key_pair = keys::ed25519::KeyPairFromSeedGenerator::generate(&seed);
-
-        let ring_key_pair: Ed25519KeyPair =
-            Ed25519KeyPair::from_seed_and_public_key(seed.as_ref(), &legacy_key_pair.pubkey.0)
-                .expect("fail to generate ring key pair !");
-
-        let ring_pubkey: <Ed25519KeyPair as KeyPair>::PublicKey = *ring_key_pair.public_key();
-        let mut ring_pubkey_bytes: [u8; 32] = [0u8; 32];
-        ring_pubkey_bytes.copy_from_slice(ring_pubkey.as_ref());
-
-        assert_eq!(legacy_key_pair.pubkey.0, ring_pubkey_bytes);
-
-        println!(
-            "ring pubkey={}",
-            keys::ed25519::PublicKey(ring_pubkey_bytes)
-        );
-
-        //panic!()
-    }
-}
diff --git a/lib/dubp/common-doc/Cargo.toml b/lib/dubp/common-doc/Cargo.toml
index 77106f7d..bd8df1a5 100644
--- a/lib/dubp/common-doc/Cargo.toml
+++ b/lib/dubp/common-doc/Cargo.toml
@@ -19,8 +19,7 @@ failure = "0.1.5"
 json-pest-parser = { path = "../../tools/json-pest-parser", version = "0.2.0" }
 pest = "2.1.0"
 pest_derive = "2.1.0"
-serde = "1.0.*"
-serde_derive = "1.0.*"
+serde = { version = "1.0.*", features = ["derive"] }
 serde_json = "1.0.*"
 shrinkwraprs = "0.2.*"
 log = "0.4.*"
diff --git a/lib/dubp/user-docs/src/documents/certification/v10.rs b/lib/dubp/user-docs/src/documents/certification/v10.rs
index d21a823c..797f20d7 100644
--- a/lib/dubp/user-docs/src/documents/certification/v10.rs
+++ b/lib/dubp/user-docs/src/documents/certification/v10.rs
@@ -338,10 +338,9 @@ mod tests {
     use dup_crypto::keys::{PublicKey, Signature};
 
     #[test]
-    fn generate_real_document() {
-        let keypair = ed25519::KeyPairFromSeedGenerator::generate(
-            &Seed::from_base58("4tNQ7d9pj2Da5wUVoW9mFn7JjuPoowF977au8DdhEjVR").unwrap(),
-        );
+    fn generate_real_certification_document() {
+        let seed = Seed::from_base58("4tNQ7d9pj2Da5wUVoW9mFn7JjuPoowF977au8DdhEjVR").unwrap();
+        let keypair = ed25519::KeyPairFromSeedGenerator::generate(seed);
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
             SignatorEnum::Ed25519(keypair.generate_signator().expect("fail to gen signator"));
diff --git a/lib/dubp/user-docs/src/documents/identity/v10.rs b/lib/dubp/user-docs/src/documents/identity/v10.rs
index 82741e9b..e0b3b734 100644
--- a/lib/dubp/user-docs/src/documents/identity/v10.rs
+++ b/lib/dubp/user-docs/src/documents/identity/v10.rs
@@ -273,7 +273,7 @@ mod tests {
     #[test]
     fn generate_real_document() {
         let keypair = ed25519::KeyPairFromSeedGenerator::generate(
-            &Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
+            Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
         );
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
diff --git a/lib/dubp/user-docs/src/documents/membership/v10.rs b/lib/dubp/user-docs/src/documents/membership/v10.rs
index 966c9f66..da31a8b3 100644
--- a/lib/dubp/user-docs/src/documents/membership/v10.rs
+++ b/lib/dubp/user-docs/src/documents/membership/v10.rs
@@ -336,7 +336,7 @@ mod tests {
     #[test]
     fn generate_real_document() {
         let keypair = ed25519::KeyPairFromSeedGenerator::generate(
-            &Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
+            Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
         );
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
diff --git a/lib/dubp/user-docs/src/documents/revocation/v10.rs b/lib/dubp/user-docs/src/documents/revocation/v10.rs
index daf0539e..f222c982 100644
--- a/lib/dubp/user-docs/src/documents/revocation/v10.rs
+++ b/lib/dubp/user-docs/src/documents/revocation/v10.rs
@@ -304,7 +304,7 @@ mod tests {
     #[test]
     fn generate_real_document() {
         let keypair = ed25519::KeyPairFromSeedGenerator::generate(
-            &Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
+            Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
         );
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
@@ -331,14 +331,14 @@ mod tests {
             identity_sig: &identity_sig,
         };
 
-        /*println!(
+        println!(
             "Signatures = {:?}",
             builder
                 .build_and_sign(vec![SignatorEnum::Ed25519(
                     keypair.generate_signator().expect("fail to gen signator")
                 )])
                 .signatures()
-        );*/
+        );
 
         assert!(builder
             .build_with_signature(vec![sig])
diff --git a/lib/dubp/user-docs/src/documents/transaction.rs b/lib/dubp/user-docs/src/documents/transaction.rs
index 38bf5a7e..23d579b3 100644
--- a/lib/dubp/user-docs/src/documents/transaction.rs
+++ b/lib/dubp/user-docs/src/documents/transaction.rs
@@ -952,7 +952,7 @@ mod tests {
     #[test]
     fn generate_real_document() {
         let keypair = ed25519::KeyPairFromSeedGenerator::generate(
-            &Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
+            Seed::from_base58("DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV").unwrap(),
         );
         let pubkey = PubKey::Ed25519(keypair.public_key());
         let signator =
diff --git a/lib/dunp/network-documents/src/lib.rs b/lib/dunp/network-documents/src/lib.rs
index 573c1acf..2cd0d00f 100644
--- a/lib/dunp/network-documents/src/lib.rs
+++ b/lib/dunp/network-documents/src/lib.rs
@@ -164,7 +164,7 @@ mod tests {
             61u8, 245, 136, 162, 155, 50, 205, 43, 116, 15, 45, 84, 138, 54, 114, 214, 71, 213, 11,
             251, 135, 182, 202, 131, 48, 91, 166, 226, 40, 255, 251, 172,
         ]);
-        ed25519::KeyPairFromSeedGenerator::generate(&seed)
+        ed25519::KeyPairFromSeedGenerator::generate(seed)
     }
 
     #[test]
diff --git a/lib/modules/ws2p-v1-legacy/src/lib.rs b/lib/modules/ws2p-v1-legacy/src/lib.rs
index 2463631b..d2e5ee1e 100644
--- a/lib/modules/ws2p-v1-legacy/src/lib.rs
+++ b/lib/modules/ws2p-v1-legacy/src/lib.rs
@@ -280,6 +280,12 @@ impl WS2Pv1Module {
         key_pair: KeyPairEnum,
         router_sender: mpsc::Sender<RouterThreadMessage<DursMsg>>,
     ) -> WS2Pv1Module {
+        let my_signator = if let Ok(signator) = key_pair.generate_signator() {
+            signator
+        } else {
+            fatal_error!("Your key pair is corrupted, please recreate it !");
+        };
+
         WS2Pv1Module {
             router_sender,
             key_pair,
@@ -298,11 +304,7 @@ impl WS2Pv1Module {
             requests_awaiting_response: HashMap::new(),
             heads_cache: HashMap::new(),
             my_head: None,
-            my_signator: if let Ok(signator) = key_pair.generate_signator() {
-                signator
-            } else {
-                fatal_error!("Your key pair is corrupted, please recreate it !");
-            },
+            my_signator,
             uids_cache: HashMap::new(),
             count_dal_requests: 0,
         }
diff --git a/lib/modules/ws2p-v1-legacy/src/ws_connections/mod.rs b/lib/modules/ws2p-v1-legacy/src/ws_connections/mod.rs
index 3be33dda..13068473 100644
--- a/lib/modules/ws2p-v1-legacy/src/ws_connections/mod.rs
+++ b/lib/modules/ws2p-v1-legacy/src/ws_connections/mod.rs
@@ -134,7 +134,7 @@ pub fn connect_to_without_checking_quotas(
     let endpoint_copy = endpoint.ep.clone();
     let conductor_sender_copy = ws2p_module.main_thread_channel.0.clone();
     let currency_copy = ws2p_module.conf.currency.clone();
-    let key_pair_copy = ws2p_module.key_pair;
+    let key_pair_copy = ws2p_module.key_pair.clone();
     thread::spawn(move || {
         let _result = crate::ws_connections::handler::connect_to_ws2p_endpoint(
             &endpoint_copy,
diff --git a/lib/modules/ws2p/ws2p-messages/lib.rs b/lib/modules/ws2p/ws2p-messages/lib.rs
index 8b5d399a..76669500 100644
--- a/lib/modules/ws2p/ws2p-messages/lib.rs
+++ b/lib/modules/ws2p/ws2p-messages/lib.rs
@@ -179,7 +179,7 @@ mod tests {
             228, 125, 124, 120, 57, 212, 246, 250, 139, 246, 62, 26, 56, 241, 175, 123, 151, 209,
             5, 106, 2, 148, 43, 101, 118, 160, 233, 7, 112, 222, 0, 169,
         ]);
-        ed25519::KeyPairFromSeedGenerator::generate(&seed)
+        ed25519::KeyPairFromSeedGenerator::generate(seed)
     }
 
     pub fn create_endpoint_v11() -> EndpointV2 {
diff --git a/lib/modules/ws2p/ws2p-protocol/src/controller/meta_datas.rs b/lib/modules/ws2p/ws2p-protocol/src/controller/meta_datas.rs
index 0164d0a6..34f9b267 100644
--- a/lib/modules/ws2p/ws2p-protocol/src/controller/meta_datas.rs
+++ b/lib/modules/ws2p/ws2p-protocol/src/controller/meta_datas.rs
@@ -70,6 +70,12 @@ impl WS2PControllerMetaDatas {
         currency: CurrencyName,
         local_node: MySelfWs2pNode,
     ) -> Self {
+        let signator = if let Ok(signator) = local_node.my_key_pair.generate_signator() {
+            signator
+        } else {
+            fatal_error!("Your keypair is corrupted, please recreate it !");
+        };
+
         WS2PControllerMetaDatas {
             challenge,
             connect_type,
@@ -81,11 +87,7 @@ impl WS2PControllerMetaDatas {
             local_node,
             remote_connect_type: None,
             remote_node: None,
-            signator: if let Ok(signator) = local_node.my_key_pair.generate_signator() {
-                signator
-            } else {
-                fatal_error!("Your keypair is corrupted, please recreate it !");
-            },
+            signator,
             spam_interval: false,
             spam_counter: 0,
             state: WS2PConnectionState::TryToOpenWS,
diff --git a/lib/modules/ws2p/ws2p-protocol/src/lib.rs b/lib/modules/ws2p/ws2p-protocol/src/lib.rs
index 2e79c206..2f0a9399 100644
--- a/lib/modules/ws2p/ws2p-protocol/src/lib.rs
+++ b/lib/modules/ws2p/ws2p-protocol/src/lib.rs
@@ -39,7 +39,7 @@ use durs_network_documents::{NodeFullId, NodeId};
 use durs_ws2p_messages::v2::api_features::WS2PFeatures;
 
 /// Store self WS2P properties
-#[derive(Debug, Clone, Copy, PartialEq)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct MySelfWs2pNode {
     /// Local node id
     pub my_node_id: NodeId,
diff --git a/lib/modules/ws2p/ws2p/src/controllers/incoming_connections.rs b/lib/modules/ws2p/ws2p/src/controllers/incoming_connections.rs
index 041af740..d3e306d1 100644
--- a/lib/modules/ws2p/ws2p/src/controllers/incoming_connections.rs
+++ b/lib/modules/ws2p/ws2p/src/controllers/incoming_connections.rs
@@ -46,7 +46,7 @@ pub fn listen_on_ws2p_v2_endpoint<A: ToSocketAddrs + Debug>(
                 Hash::random(),
                 WS2Pv2ConnectType::Incoming,
                 currency.clone(),
-                *self_node,
+                self_node.clone(),
             ),
             orchestrator_sender.clone(),
         ) {
diff --git a/lib/modules/ws2p/ws2p/src/controllers/outgoing_connections.rs b/lib/modules/ws2p/ws2p/src/controllers/outgoing_connections.rs
index 3c492f07..dcabd55e 100644
--- a/lib/modules/ws2p/ws2p/src/controllers/outgoing_connections.rs
+++ b/lib/modules/ws2p/ws2p/src/controllers/outgoing_connections.rs
@@ -56,7 +56,7 @@ pub fn connect_to_ws2p_v2_endpoint(
                 Hash::random(),
                 WS2Pv2ConnectType::OutgoingServer,
                 currency.clone(),
-                *self_node,
+                self_node.clone(),
             ),
             orchestrator_sender.clone(),
         ) {
diff --git a/lib/modules/ws2p/ws2p/src/services/mod.rs b/lib/modules/ws2p/ws2p/src/services/mod.rs
index 34ac134a..cbd379be 100644
--- a/lib/modules/ws2p/ws2p/src/services/mod.rs
+++ b/lib/modules/ws2p/ws2p/src/services/mod.rs
@@ -29,7 +29,7 @@ pub enum WsError {
 }
 
 /// Store self WS2P properties
-#[derive(Debug, Clone, Copy, PartialEq)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct MySelfWs2pNode {
     /// Local node id
     pub my_node_id: NodeId,
diff --git a/lib/modules/ws2p/ws2p/tests/connection_negociation.rs b/lib/modules/ws2p/ws2p/tests/connection_negociation.rs
index ae944334..0d7f5d74 100644
--- a/lib/modules/ws2p/ws2p/tests/connection_negociation.rs
+++ b/lib/modules/ws2p/ws2p/tests/connection_negociation.rs
@@ -44,7 +44,7 @@ pub fn keypair1() -> ed25519::Ed25519KeyPair {
         61u8, 245, 136, 162, 155, 50, 205, 43, 116, 15, 45, 84, 138, 54, 114, 214, 71, 213, 11,
         251, 135, 182, 202, 131, 48, 91, 166, 226, 40, 255, 251, 172,
     ]);
-    ed25519::KeyPairFromSeedGenerator::generate(&seed)
+    ed25519::KeyPairFromSeedGenerator::generate(seed)
 }
 
 pub fn keypair2() -> ed25519::Ed25519KeyPair {
@@ -52,7 +52,7 @@ pub fn keypair2() -> ed25519::Ed25519KeyPair {
         228, 125, 124, 120, 57, 212, 246, 250, 139, 246, 62, 26, 56, 241, 175, 123, 151, 209, 5,
         106, 2, 148, 43, 101, 118, 160, 233, 7, 112, 222, 0, 169,
     ]);
-    ed25519::KeyPairFromSeedGenerator::generate(&seed)
+    ed25519::KeyPairFromSeedGenerator::generate(seed)
 }
 
 fn server_node() -> MySelfWs2pNode {
-- 
GitLab