From b5e5ee025651b76e2c01610c77b52f5cdae1f422 Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Tue, 1 Sep 2020 17:37:04 +0200
Subject: [PATCH] [fix] fix tests & add seed random feature

---
 Cargo.toml     |  6 +++---
 src/crypto.rs  | 10 +++++++++-
 src/parsers.rs |  8 ++++----
 tests/web.rs   | 32 +++++++++++++++++++++++---------
 4 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index a32f983..b5215f6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "dup-tools-wasm"
-version = "0.3.0"
+version = "0.3.1"
 authors = ["librelois <elois@duniter.org>"]
 description = "Tools for DUP Protocol."
 repository = "https://git.duniter.org/tools/dup-tools-wasm"
@@ -15,8 +15,8 @@ default = ["console_error_panic_hook"]
 
 [dependencies]
 cfg-if = "0.1.10"
-dubp-documents = { version = "0.20.0", features = ["crypto_scrypt"] }
-dubp-documents-parser = { version = "0.5.1", features = ["crypto_scrypt"] }
+dubp-documents = { version = "0.21.0", features = ["crypto_rand", "crypto_scrypt"] }
+dubp-documents-parser = { version = "0.6.0", features = ["crypto_rand", "crypto_scrypt"] }
 #durs-network-documents = "0.3.1"
 serde_derive = "1.0.*"
 wasm-bindgen = "0.2.67"
diff --git a/src/crypto.rs b/src/crypto.rs
index 61c24d5..8e6f6fe 100644
--- a/src/crypto.rs
+++ b/src/crypto.rs
@@ -29,6 +29,14 @@ pub fn verify(datas: &str, pubkey: &str, signature: &str) -> bool {
     pubkey.verify(datas.as_bytes(), &sig).is_ok()
 }
 
+#[wasm_bindgen]
+pub fn generate_random_seed() -> String {
+    match Seed32::random() {
+        Ok(seed) => seed.to_base58(),
+        Err(_) => "fail to generate random seed".to_owned(),
+    }
+}
+
 #[wasm_bindgen]
 pub fn generate_ed25519_pubkey(salt: String, password: String) -> String {
     let keypair = ed25519::KeyPairFromSaltedPasswordGenerator::with_default_parameters()
@@ -40,7 +48,7 @@ pub fn generate_ed25519_pubkey(salt: String, password: String) -> String {
 #[wasm_bindgen]
 pub fn generate_seed_from_salted_password(salt: String, password: String) -> String {
     let seed = ed25519::KeyPairFromSaltedPasswordGenerator::with_default_parameters()
-        .generate_seed(salt.as_bytes(), password.as_bytes());
+        .generate_seed(password.as_bytes(), salt.as_bytes());
 
     seed.to_base58()
 }
diff --git a/src/parsers.rs b/src/parsers.rs
index 3bef0d7..7194623 100644
--- a/src/parsers.rs
+++ b/src/parsers.rs
@@ -78,7 +78,7 @@ pub fn parse_doc_into_json(doc: &str, doc_type: DocumentType) -> String {
                 DubpDocument::Transaction(ref tx_box) => {
                     let tx = tx_box.deref().clone();
                     tx.compute_hash();
-                    DubpDocument::to_json_string_pretty(&DubpDocument::Transaction(Box::new(tx)))
+                    DubpDocument::to_json_string_pretty(&DubpDocument::Transaction(tx))
                         .unwrap_or_else(|_| "Fail to jsonifie document.".to_owned())
                 }
                 _ => DubpDocument::to_json_string_pretty(&blockchain_document)
@@ -122,7 +122,7 @@ fn parse_doc(doc: &str, doc_type: DocumentType) -> Result<Document_, RawTextPars
             }
         //},
         DocumentType::TxV10 => Ok(Document_::DubpDocument(DubpDocument::Transaction(
-            Box::new(TransactionDocument::parse_from_raw_text(doc)?),
+            TransactionDocument::parse_from_raw_text(doc)?,
         ))),
         DocumentType::IdentityV10 => Ok(Document_::DubpDocument(DubpDocument::Identity(
             IdentityDocument::parse_from_raw_text(doc)?,
@@ -131,10 +131,10 @@ fn parse_doc(doc: &str, doc_type: DocumentType) -> Result<Document_, RawTextPars
             MembershipDocument::parse_from_raw_text(doc)?,
         ))),
         DocumentType::CertificationV10 => Ok(Document_::DubpDocument(DubpDocument::Certification(
-            Box::new(CertificationDocument::parse_from_raw_text(doc)?),
+            CertificationDocument::parse_from_raw_text(doc)?,
         ))),
         DocumentType::RevocationV10 => Ok(Document_::DubpDocument(DubpDocument::Revocation(
-            Box::new(RevocationDocument::parse_from_raw_text(doc)?),
+            RevocationDocument::parse_from_raw_text(doc)?,
         ))),
         /*DocumentType::PeerV11 => Ok(Document_::NetworkDocument(NetworkDocument::Peer(Box::new(
             PeerCard::V11(PeerCardV11::parse(doc)?),
diff --git a/tests/web.rs b/tests/web.rs
index c174a84..033b6c9 100644
--- a/tests/web.rs
+++ b/tests/web.rs
@@ -3,18 +3,25 @@
 #![cfg(target_arch = "wasm32")]
 
 extern crate dup_tools_wasm;
-#[macro_use]
-extern crate pretty_assertions;
 extern crate wasm_bindgen_test;
 
 use dup_tools_wasm::crypto::*;
 use dup_tools_wasm::examples::*;
 use dup_tools_wasm::parsers::*;
 use dup_tools_wasm::*;
+//use pretty_assertions::assert_eq;
 use wasm_bindgen_test::*;
 
 wasm_bindgen_test_configure!(run_in_browser);
 
+#[wasm_bindgen_test]
+fn test_generate_random_seed() {
+    let seed1 = generate_random_seed();
+    let seed2 = generate_random_seed();
+
+    assert_ne!(seed1, seed2);
+}
+
 #[wasm_bindgen_test]
 fn test_generate_ed25519_keypair() {
     let pubkey = generate_ed25519_pubkey(
@@ -29,13 +36,20 @@ fn test_generate_ed25519_keypair() {
 }
 
 #[wasm_bindgen_test]
-fn test_generate_ed25519_keypair_from_seed() {
+fn test_generate_seed_from_salted_password() {
     let seed_b58 = generate_seed_from_salted_password(
         "JhxtHB7UcsDbA9wMSyMKXUzBZUQvqVyB32KwzS9SWoLkjrUhHV".to_owned(),
         "JhxtHB7UcsDbA9wMSyMKXUzBZUQvqVyB32KwzS9SWoLkjrUhHV_".to_owned(),
     );
 
-    let pubkey_from_seed_b58 = generate_ed25519_pubkey_from_seed(&seed_b58, 58);
+    assert_eq!(seed_b58, "AhCNguKBPxaG6yZAcX53c12kybubCXn3fjbR5LnCkrQu");
+}
+
+#[wasm_bindgen_test]
+fn test_generate_ed25519_keypair_from_seed() {
+    let seed_b58 = "AhCNguKBPxaG6yZAcX53c12kybubCXn3fjbR5LnCkrQu";
+
+    let pubkey_from_seed_b58 = generate_ed25519_pubkey_from_seed(seed_b58, 58);
 
     assert_eq!(
         pubkey_from_seed_b58.as_str(),
@@ -49,7 +63,7 @@ fn test_parse_and_verify_example_idty_v10() {
 
     assert_eq!(
         parse_doc_into_json(&doc, DocumentType::Any),
-        "{\n  \"Identity\": {\n    \"currency\": \"duniter_unit_test_currency\",\n    \"username\": \"tic\",\n    \"blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n    \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n    \"signature\": \"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==\"\n  }\n}".to_owned()
+        "{\n  \"Identity\": {\n    \"V10\": {\n      \"currency\": \"duniter_unit_test_currency\",\n      \"username\": \"tic\",\n      \"blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n      \"signature\": \"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==\"\n    }\n  }\n}".to_owned()
     );
     assert_eq!(
         parse_doc_and_verify(&doc, DocumentType::Any),
@@ -63,7 +77,7 @@ fn test_parse_and_verify_example_membership_v10() {
 
     assert_eq!(
         parse_doc_into_json(&doc, DocumentType::Any),
-        "{\n  \"Membership\": {\n    \"currency\": \"duniter_unit_test_currency\",\n    \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n    \"blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n    \"membership\": \"IN\",\n    \"username\": \"tic\",\n    \"identity_blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n    \"signature\": \"s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==\"\n  }\n}".to_owned()
+        "{\n  \"Membership\": {\n    \"V10\": {\n      \"currency\": \"duniter_unit_test_currency\",\n      \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n      \"blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"membership\": \"IN\",\n      \"username\": \"tic\",\n      \"identity_blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"signature\": \"s2hUbokkibTAWGEwErw6hyXSWlWFQ2UWs2PWx8d/kkElAyuuWaQq4Tsonuweh1xn4AC1TVWt4yMR3WrDdkhnAw==\"\n    }\n  }\n}".to_owned()
     );
     assert_eq!(
         parse_doc_and_verify(&doc, DocumentType::Any),
@@ -77,7 +91,7 @@ fn test_parse_and_verify_example_cert_v10() {
 
     assert_eq!(
         parse_doc_into_json(&doc, DocumentType::Any),
-        "{\n  \"Certification\": {\n    \"currency\": \"g1-test\",\n    \"issuer\": \"5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\",\n    \"target\": \"mMPioknj2MQCX9KyKykdw8qMRxYR2w1u3UpdiEJHgXg\",\n    \"identity_username\": \"mmpio\",\n    \"identity_blockstamp\": \"7543-000044410C5370DE8DBA911A358F318096B7A269CFC2BB93272E397CC513EA0A\",\n    \"identity_sig\": \"SmSweUD4lEMwiZfY8ux9maBjrQQDkC85oMNsin6oSQCPdXG8sFCZ4FisUaWqKsfOlZVb/HNa+TKzD2t0Yte+DA==\",\n    \"blockstamp\": \"167884-0001DFCA28002A8C96575E53B8CEF8317453A7B0BA255542CCF0EC8AB5E99038\",\n    \"signature\": \"wqZxPEGxLrHGv8VdEIfUGvUcf+tDdNTMXjLzVRCQ4UhlhDRahOMjfcbP7byNYr5OfIl83S1MBxF7VJgu8YasCA==\"\n  }\n}".to_owned()
+        "{\n  \"Certification\": {\n    \"V10\": {\n      \"currency\": \"g1-test\",\n      \"issuer\": \"5B8iMAzq1dNmFe3ZxFTBQkqhq4fsztg1gZvxHXCk1XYH\",\n      \"target\": \"mMPioknj2MQCX9KyKykdw8qMRxYR2w1u3UpdiEJHgXg\",\n      \"identity_username\": \"mmpio\",\n      \"identity_blockstamp\": \"7543-000044410C5370DE8DBA911A358F318096B7A269CFC2BB93272E397CC513EA0A\",\n      \"identity_sig\": \"SmSweUD4lEMwiZfY8ux9maBjrQQDkC85oMNsin6oSQCPdXG8sFCZ4FisUaWqKsfOlZVb/HNa+TKzD2t0Yte+DA==\",\n      \"blockstamp\": \"167884-0001DFCA28002A8C96575E53B8CEF8317453A7B0BA255542CCF0EC8AB5E99038\",\n      \"signature\": \"wqZxPEGxLrHGv8VdEIfUGvUcf+tDdNTMXjLzVRCQ4UhlhDRahOMjfcbP7byNYr5OfIl83S1MBxF7VJgu8YasCA==\"\n    }\n  }\n}".to_owned()
     );
     assert_eq!(
         parse_doc_and_verify(&doc, DocumentType::Any),
@@ -91,7 +105,7 @@ fn test_parse_and_verify_example_revoc_v10() {
 
     assert_eq!(
         parse_doc_into_json(&doc, DocumentType::Any),
-        "{\n  \"Revocation\": {\n    \"currency\": \"g1\",\n    \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n    \"identity_username\": \"tic\",\n    \"identity_blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n    \"identity_sig\": \"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==\",\n    \"signature\": \"XXOgI++6qpY9O31ml/FcfbXCE6aixIrgkT5jL7kBle3YOMr+8wrp7Rt+z9hDVjrNfYX2gpeJsuMNfG4T/fzVDQ==\"\n  }\n}".to_owned()
+        "{\n  \"Revocation\": {\n    \"V10\": {\n      \"currency\": \"g1\",\n      \"issuer\": \"DNann1Lh55eZMEDXeYt59bzHbA3NJR46DeQYCS2qQdLV\",\n      \"identity_username\": \"tic\",\n      \"identity_blockstamp\": \"0-E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\",\n      \"identity_sig\": \"1eubHHbuNfilHMM0G2bI30iZzebQ2cQ1PC7uPAw08FGMMmQCRerlF/3pc4sAcsnexsxBseA/3lY03KlONqJBAg==\",\n      \"signature\": \"XXOgI++6qpY9O31ml/FcfbXCE6aixIrgkT5jL7kBle3YOMr+8wrp7Rt+z9hDVjrNfYX2gpeJsuMNfG4T/fzVDQ==\"\n    }\n  }\n}".to_owned()
     );
     assert_eq!(
         parse_doc_and_verify(&doc, DocumentType::Any),
@@ -105,7 +119,7 @@ fn test_parse_and_verify_example_tx_v10() {
 
     assert_eq!(
         parse_doc_into_json(&doc, DocumentType::Any),
-        "{\n  \"Transaction\": {\n    \"currency\": \"g1\",\n    \"blockstamp\": \"107702-0000017CDBE974DC9A46B89EE7DC2BEE4017C43A005359E0853026C21FB6A084\",\n    \"locktime\": 0,\n    \"issuers\": [\n      \"Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC\"\n    ],\n    \"inputs\": [\n      \"1002:0:D:Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC:104937\",\n      \"1002:0:D:Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC:105214\"\n    ],\n    \"unlocks\": [\n      \"0:SIG(0)\",\n      \"1:SIG(0)\"\n    ],\n    \"outputs\": [\n      \"2004:0:SIG(DTgQ97AuJ8UgVXcxmNtULAs8Fg1kKC1Wr9SAS96Br9NG)\"\n    ],\n    \"comment\": \"c est pour 2 mois d adhesion ressourcerie\",\n    \"signatures\": [\n      \"lnpuFsIymgz7qhKF/GsZ3n3W8ZauAAfWmT4W0iJQBLKJK2GFkesLWeMj/+GBfjD6kdkjreg9M6VfkwIZH+hCCQ==\"\n    ],\n    \"hash\": \"FB10D45F0146D3461FD25D921D686A350717E5D61024CC0DF61F3F6B0CADF9E0\"\n  }\n}".to_owned()
+        "{\n  \"Transaction\": {\n    \"V10\": {\n      \"currency\": \"g1\",\n      \"blockstamp\": \"107702-0000017CDBE974DC9A46B89EE7DC2BEE4017C43A005359E0853026C21FB6A084\",\n      \"locktime\": 0,\n      \"issuers\": [\n        \"Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC\"\n      ],\n      \"inputs\": [\n        \"1002:0:D:Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC:104937\",\n        \"1002:0:D:Do6Y6nQ2KTo5fB4MXbSwabXVmXHxYRB9UUAaTPKn1XqC:105214\"\n      ],\n      \"unlocks\": [\n        \"0:SIG(0)\",\n        \"1:SIG(0)\"\n      ],\n      \"outputs\": [\n        \"2004:0:SIG(DTgQ97AuJ8UgVXcxmNtULAs8Fg1kKC1Wr9SAS96Br9NG)\"\n      ],\n      \"comment\": \"c est pour 2 mois d adhesion ressourcerie\",\n      \"signatures\": [\n        \"lnpuFsIymgz7qhKF/GsZ3n3W8ZauAAfWmT4W0iJQBLKJK2GFkesLWeMj/+GBfjD6kdkjreg9M6VfkwIZH+hCCQ==\"\n      ],\n      \"hash\": null\n    }\n  }\n}".to_owned()
     );
     assert_eq!(
         parse_doc_and_verify(&doc, DocumentType::Any),
-- 
GitLab