diff --git a/keys/ed25519.rs b/keys/ed25519.rs
index cbf63730d19b174946661c6a5e90e3fb0d7afa00..7ee3708088a0dcf43bc7bc1555080e468885d831 100644
--- a/keys/ed25519.rs
+++ b/keys/ed25519.rs
@@ -217,7 +217,7 @@ pub struct KeyPair {
     /// Store a Ed25519 public key.
     pub pubkey:PublicKey,
     /// Store a Ed25519 private key.
-    privkey:PrivateKey,
+    pub privkey:PrivateKey,
 }
 
 impl Display for KeyPair {
@@ -236,14 +236,9 @@ impl Eq for KeyPair {}
 
 impl super::KeyPair for KeyPair {
     type Signature = Signature;
-
-    fn new(password: &[u8], salt: &[u8]) -> KeyPair {
+    fn from_passwd_and_salt(password: &[u8], salt: &[u8]) -> KeyPair {
         let generator = self::KeyPairGenerator::with_default_parameters();
-        let (privkey, pubkey) = generator.generate(password, salt);
-        KeyPair {
-            pubkey,
-            privkey
-        }
+        generator.generate(password, salt)
     }
     fn sign(&self, message: &[u8]) -> Signature {
         Signature(crypto::ed25519::signature(message, &self.privkey.0))
@@ -286,7 +281,7 @@ impl KeyPairGenerator {
     ///
     /// The [`PublicKey`](struct.PublicKey.html) will be able to verify messaged signed with
     /// the [`PrivateKey`](struct.PrivateKey.html).
-    pub fn generate(&self, password: &[u8], salt: &[u8]) -> (PrivateKey, PublicKey) {
+    pub fn generate(&self, password: &[u8], salt: &[u8]) -> KeyPair {
         let mut seed = [0u8; 32];
         crypto::scrypt::scrypt(
             password,
@@ -296,7 +291,10 @@ impl KeyPairGenerator {
         );
 
         let (private, public) = crypto::ed25519::keypair(&seed);
-        (PrivateKey(private), PublicKey(public))
+        KeyPair {
+            pubkey: PublicKey(public),
+            privkey: PrivateKey(private),
+        }
     }
 }
 
@@ -436,7 +434,7 @@ Timestamp: 0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
 
     #[test]
     fn keypair_generate_sign_and_verify () {
-        let keypair = super::KeyPair::new("password".as_bytes(), "salt".as_bytes());
+        let keypair = super::KeyPair::from_passwd_and_salt("password".as_bytes(), "salt".as_bytes());
 
         let message = "Version: 10
 Type: Identity
diff --git a/keys/lib.rs b/keys/lib.rs
index f765bc5795e02bfa3940a931e89e1abc92ab86ff..182df7da4022090d345c5fd76b2e51df7d735b94 100644
--- a/keys/lib.rs
+++ b/keys/lib.rs
@@ -21,21 +21,21 @@
 //! # Usage
 //!
 //! ```
-//! use duniter_keys::{Signature, PublicKey, PrivateKey};
+//! use duniter_keys::{Signature, PublicKey, PrivateKey, KeyPair};
 //! use duniter_keys::ed25519::KeyPairGenerator;
 //!
 //! let generator = KeyPairGenerator::with_default_parameters();
 //!
-//! let (private_key, public_key) = generator.generate(
+//! let keypair = generator.generate(
 //!     b"password",
 //!     b"salt"
 //! );
 //!
 //! let message = "Hello, world!";
 //!
-//! let signature = private_key.sign(&message.as_bytes());
+//! let signature = keypair.sign(&message.as_bytes());
 //!
-//! assert!(public_key.verify(&message.as_bytes(), &signature));
+//! assert!(keypair.pubkey.verify(&message.as_bytes(), &signature));
 //! ```
 //!
 //! # Format
@@ -153,8 +153,8 @@ pub trait KeyPair: Clone + Display + Debug + PartialEq + Eq {
     /// Signature type of associated cryptosystem.
     type Signature: Signature;
 
-    /// Create a new KeyPair
-    fn new(password: &[u8], salt: &[u8]) -> Self;
+    /// Generate a new KeyPair from passwd and salt
+    fn from_passwd_and_salt(password: &[u8], salt: &[u8]) -> Self;
 
     /// Sign a message with privkey.
     fn sign(&self, message: &[u8]) -> Self::Signature;