From 279f35d6c47d2e3d9815f30cc46d71b7ffabc8d1 Mon Sep 17 00:00:00 2001 From: librelois Date: Sat, 27 Mar 2021 23:36:39 +0100 Subject: [PATCH] =?UTF-8?q?feat(dubp):=C2=A0impl=20simple=20payment=20from?= =?UTF-8?q?=20transparent=20account?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1097 ++++++++++++++++++++++++++- native/dubp_rs/Cargo.toml | 2 + native/dubp_rs/src/dewif.rs | 30 +- native/dubp_rs/src/dewif/bip32.rs | 82 +- native/dubp_rs/src/dewif/classic.rs | 4 +- native/dubp_rs/src/error.rs | 7 + native/dubp_rs/src/inputs.rs | 14 + native/dubp_rs/src/legacy.rs | 5 +- native/dubp_rs/src/lib.rs | 59 +- native/dubp_rs/src/mnemonic.rs | 2 +- native/dubp_rs/src/payment.rs | 66 ++ native/dubp_rs/src/secret_code.rs | 4 +- packages/dubp_rs/lib/dubp.dart | 29 + 13 files changed, 1343 insertions(+), 58 deletions(-) create mode 100644 native/dubp_rs/src/payment.rs diff --git a/Cargo.lock b/Cargo.lock index fcdb077..80986fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,20 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aes" version = "0.6.0" @@ -18,7 +33,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" dependencies = [ "cipher", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] @@ -28,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" dependencies = [ "cipher", - "opaque-debug", + "opaque-debug 0.3.0", ] [[package]] @@ -57,6 +72,15 @@ name = "arrayvec" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +dependencies = [ + "serde", +] + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "assert_matches" @@ -64,6 +88,19 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-compression" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72c1f1154e234325b50864a349b9c8e56939e266a4c307c0f159812df2f9537" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-oneshot" version = "0.4.2" @@ -90,12 +127,42 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "backtrace" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +dependencies = [ + "addr2line", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "beef" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6736e2428df2ca2848d846c43e88745121a6654696e349ce0054a420815a7409" + +[[package]] +name = "bincode" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +dependencies = [ + "byteorder", + "serde", +] + [[package]] name = "bitflags" version = "1.2.1" @@ -114,7 +181,28 @@ dependencies = [ "cfg-if 0.1.10", "constant_time_eq", "crypto-mac", - "digest", + "digest 0.9.0", +] + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", ] [[package]] @@ -129,12 +217,24 @@ version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + [[package]] name = "byteorder" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" +[[package]] +name = "bytes" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" + [[package]] name = "cbindgen" version = "0.14.3" @@ -186,7 +286,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" dependencies = [ - "generic-array", + "generic-array 0.14.4", ] [[package]] @@ -224,19 +324,41 @@ dependencies = [ "vec_map", ] +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "crc32fast" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "crypto-mac" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array", + "generic-array 0.14.4", "subtle", ] @@ -257,13 +379,112 @@ dependencies = [ "thiserror", ] +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.4", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dubp" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1669c61ccfe0d3fc7be8fe3175ebd401b9c879f638425f31e92777c73b32ea86" +dependencies = [ + "dubp-common", + "dubp-documents", + "dubp-documents-parser", + "dubp-wallet", + "dup-crypto 0.50.0", +] + +[[package]] +name = "dubp-client" +version = "0.1.0" +source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#a690f9b1bb029495c6aaf957c31d528dd282b49c" +dependencies = [ + "bincode", + "dubp", + "duniter-bca-types", + "graphql_client", + "maybe-async", + "reqwest", + "serde", + "static_assertions", + "thiserror", +] + +[[package]] +name = "dubp-common" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "515fb09166a50b4543a99c42359fc4afa5a4c7af118c6f9627575c2760f3fef8" +dependencies = [ + "dup-crypto 0.50.0", + "serde", + "serde_json", + "thiserror", + "zerocopy", +] + +[[package]] +name = "dubp-documents" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccc9327c62778ee4fd060c0efbe32c6cfda5e317c4a2eb4ddee8293fbd278904" +dependencies = [ + "beef", + "dubp-wallet", + "log", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "dubp-documents-parser" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271ce4a6bebfdfdaefb0e51f57c9bb04976fce5fbe2744dd60c1dcf857c60c20" +dependencies = [ + "dubp-documents", + "json-pest-parser", + "pest", + "pest_derive", + "serde_json", + "thiserror", +] + +[[package]] +name = "dubp-wallet" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e65a121fa6745038e903ed3d1eb6a97f9658c6c6e2bfbf7e9ffdaf34161d23" +dependencies = [ + "byteorder", + "dubp-common", + "serde", + "smallvec", + "thiserror", + "zerocopy", ] [[package]] @@ -274,7 +495,8 @@ dependencies = [ "assert_matches", "cbindgen", "dart-bindgen", - "dup-crypto", + "dubp-client", + "dup-crypto 0.46.0", "fast-threadpool", "once_cell", "parking_lot", @@ -282,6 +504,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "duniter-bca-types" +version = "0.1.0" +source = "git+https://git.duniter.org/nodes/typescript/duniter?branch=dev#591f334185151a200a7dbb06b32ff434a19b0885" +dependencies = [ + "arrayvec", + "bincode", + "dubp", + "serde", + "smallvec", + "thiserror", +] + [[package]] name = "dup-crypto" version = "0.46.0" @@ -305,6 +540,29 @@ dependencies = [ "zeroize", ] +[[package]] +name = "dup-crypto" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3032421000ca2cdd372bd72f4c548be7f1386d357abb0936291890064d3072e8" +dependencies = [ + "aes", + "arrayvec", + "base64", + "blake3", + "bs58", + "byteorder", + "cryptoxide", + "ed25519-bip32", + "getrandom", + "once_cell", + "ring", + "serde", + "thiserror", + "zerocopy", + "zeroize", +] + [[package]] name = "ed25519-bip32" version = "0.3.2" @@ -314,6 +572,21 @@ dependencies = [ "cryptoxide", ] +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "encoding_rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +dependencies = [ + "cfg-if 1.0.0", +] + [[package]] name = "envmnt" version = "0.8.4" @@ -324,6 +597,34 @@ dependencies = [ "indexmap", ] +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + [[package]] name = "fast-threadpool" version = "0.3.0" @@ -335,6 +636,18 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "flate2" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" +dependencies = [ + "cfg-if 1.0.0", + "crc32fast", + "libc", + "miniz_oxide", +] + [[package]] name = "flume" version = "0.10.1" @@ -344,18 +657,106 @@ dependencies = [ "spinning_top", ] +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "fsio" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fd087255f739f4f1aeea69f11b72f8080e9c2e7645cd06955dad4a178a49e3" +[[package]] +name = "futures-channel" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" + +[[package]] +name = "futures-io" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" + +[[package]] +name = "futures-macro" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-micro" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61e9325be55c5581082cd110294fa988c1f920bc573ec370ef201e33c469a95a" +[[package]] +name = "futures-sink" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" + +[[package]] +name = "futures-task" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" + +[[package]] +name = "futures-util" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + [[package]] name = "generic-array" version = "0.14.4" @@ -386,12 +787,98 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" + [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "graphql-introspection-query" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610aac641dbd2a457ad4cef34aa2827dae3f035fd214cb38c2d62d8543f3973f" +dependencies = [ + "serde", +] + +[[package]] +name = "graphql-parser" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5613c31f18676f164112732202124f373bb2103ff017b3b85ca954ea6a66ada" +dependencies = [ + "combine", + "failure", +] + +[[package]] +name = "graphql_client" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bb4f09181e4f80018d01c612125b07e0156f3753bfac37055fe2a25e031ca8" +dependencies = [ + "doc-comment", + "graphql_query_derive", + "serde", + "serde_json", +] + +[[package]] +name = "graphql_client_codegen" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e304c223c809b3bff4614018f8e6d9edb176b31d64ed9ea48b6ae8b1a03abb9" +dependencies = [ + "failure", + "graphql-introspection-query", + "graphql-parser", + "heck", + "lazy_static", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", +] + +[[package]] +name = "graphql_query_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1f6b14d5ce549227aa9e649cd9d36d008b91021275a8e0a67d71cef815adc2f" +dependencies = [ + "failure", + "graphql_client_codegen", + "proc-macro2", + "syn", +] + +[[package]] +name = "h2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc018e188373e2777d0ef2467ebff62a08e66c3f5857b23c8fbec3018210dc00" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.9.1" @@ -416,6 +903,90 @@ dependencies = [ "libc", ] +[[package]] +name = "http" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" + +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + +[[package]] +name = "hyper" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +dependencies = [ + "futures-util", + "hyper", + "log", + "rustls", + "tokio", + "tokio-rustls", + "webpki", +] + +[[package]] +name = "idna" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" version = "1.6.2" @@ -435,6 +1006,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "ipnet" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" + [[package]] name = "itoa" version = "0.4.7" @@ -450,6 +1027,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-pest-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bc5c84a2bceeda1ce3bd58497bde2d8cba61ca0b45873ef502401f0ff2ae8ed" +dependencies = [ + "pest", + "pest_derive", + "thiserror", + "unwrap", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -480,12 +1069,88 @@ dependencies = [ "cfg-if 0.1.10", ] +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "maybe-async" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb8e1fec4e9a343755fdcd6adc9394c0ac0bb764eb36b3aecfdf151a44e8c83" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50ae3f04d169fcc9bde0b547d1c205219b7157e07ded9c5aff03e0637cb3ed7" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + [[package]] name = "nias" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0" +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + [[package]] name = "num_cpus" version = "1.13.0" @@ -496,12 +1161,24 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" + [[package]] name = "once_cell" version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + [[package]] name = "opaque-debug" version = "0.3.0" @@ -533,12 +1210,105 @@ dependencies = [ "winapi", ] +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1", +] + +[[package]] +name = "pin-project" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "ppv-lite86" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + [[package]] name = "proc-macro2" version = "1.0.24" @@ -615,6 +1385,44 @@ dependencies = [ "winapi", ] +[[package]] +name = "reqwest" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4" +dependencies = [ + "async-compression", + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "rustls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-rustls", + "tokio-util", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + [[package]] name = "ring" version = "0.16.20" @@ -630,6 +1438,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustc-demangle" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" + +[[package]] +name = "rustls" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + [[package]] name = "rusty-hook" version = "0.11.2" @@ -654,6 +1481,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "serde" version = "1.0.123" @@ -685,11 +1522,55 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + [[package]] name = "smallvec" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi", +] [[package]] name = "spin" @@ -706,6 +1587,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.8.0" @@ -784,6 +1671,61 @@ dependencies = [ "syn", ] +[[package]] +name = "tinyvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", +] + +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-util" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.8" @@ -793,12 +1735,68 @@ dependencies = [ "serde", ] +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" +dependencies = [ + "cfg-if 1.0.0", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "typenum" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -817,12 +1815,39 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "unwrap" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e33648dd74328e622c7be51f3b40a303c63f93e6fa5f08778b6203a4c25c20f" + +[[package]] +name = "url" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + [[package]] name = "vec_map" version = "0.8.2" @@ -835,6 +1860,22 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" @@ -848,6 +1889,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" dependencies = [ "cfg-if 1.0.0", + "serde", + "serde_json", "wasm-bindgen-macro", ] @@ -866,6 +1909,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.70" @@ -905,6 +1960,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376" +dependencies = [ + "webpki", +] + [[package]] name = "winapi" version = "0.3.9" @@ -927,6 +2001,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + [[package]] name = "zerocopy" version = "0.3.0" diff --git a/native/dubp_rs/Cargo.toml b/native/dubp_rs/Cargo.toml index 180f0c5..0208e51 100644 --- a/native/dubp_rs/Cargo.toml +++ b/native/dubp_rs/Cargo.toml @@ -11,6 +11,8 @@ crate-type = ["rlib"] [dependencies] allo-isolate = "0.1.6" +dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking"], default-features = false } +#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"], default-features = false } dup-crypto = { version = "0.46.0", features = ["bip32-ed25519", "dewif", "mnemonic", "mnemonic_french", "scrypt"] } fast-threadpool = { version = "0.3.0", default-features = false } once_cell = { version = "1.3.1", default-features = false, features = ["std"] } diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 63252a3..4d4a530 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -28,9 +28,12 @@ pub(super) fn change_secret_code( let new_log_n = log_n(system_memory); let new_secret_code = gen_secret_code(member_wallet, secret_code_type, new_log_n)?; - let new_dewif = - dup_crypto::dewif::change_dewif_passphrase(dewif, old_secret_code, &new_secret_code) - .map_err(DubpError::DewifReadError)?; + let new_dewif = dubp_client::crypto::dewif::change_dewif_passphrase( + dewif, + old_secret_code, + &new_secret_code, + ) + .map_err(DubpError::DewifReadError)?; Ok(vec![new_dewif, new_secret_code]) } @@ -46,15 +49,20 @@ pub(super) fn gen_dewif( let currency = parse_currency(currency)?; let mnemonic = Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?; - let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic); + let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic); let log_n = log_n(system_memory); let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; - let keypair = dup_crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone()); + let keypair = dubp_client::crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone()); let pubkey = keypair.public_key(); - let dewif = - dup_crypto::dewif::write_dewif_v4_content(currency, log_n, &secret_code, &pubkey, seed); + let dewif = dubp_client::crypto::dewif::write_dewif_v4_content( + currency, + log_n, + &secret_code, + &pubkey, + seed, + ); Ok(vec![dewif, secret_code]) } @@ -64,11 +72,11 @@ pub(super) fn get_dewif_meta( member_wallet: bool, secret_code_type: SecretCodeType, ) -> Result, DubpError> { - let dup_crypto::dewif::DewifMeta { + let dubp_client::crypto::dewif::DewifMeta { currency, log_n, version, - } = dup_crypto::dewif::read_dewif_meta(dewif).map_err(DubpError::DewifReadError)?; + } = dubp_client::crypto::dewif::read_dewif_meta(dewif).map_err(DubpError::DewifReadError)?; let secret_code_len = crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?; @@ -98,7 +106,7 @@ pub(super) fn get_pubkey( secret_code, ) } else if address_index_opt.is_none() && external_opt.is_none() { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -125,7 +133,7 @@ pub(super) fn get_secret_code_len( let member_wallet = member_wallet != 0; let secret_code_type = SecretCodeType::from(secret_code_type); - let log_n = dup_crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif) + let log_n = dubp_client::crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif) .map_err(DubpError::DewifReadError)?; Ok(crate::secret_code::compute_secret_code_len( diff --git a/native/dubp_rs/src/dewif/bip32.rs b/native/dubp_rs/src/dewif/bip32.rs index e539285..2f692ec 100644 --- a/native/dubp_rs/src/dewif/bip32.rs +++ b/native/dubp_rs/src/dewif/bip32.rs @@ -34,7 +34,7 @@ pub(crate) fn get_accounts_pubkeys( if accounts_indexs.contains(&U31::new(0)?) { verify_member_secret_code(currency, dewif, secret_code)?; } - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -53,15 +53,15 @@ pub(crate) fn get_accounts_pubkeys( } } -pub(crate) fn get_bip32_pubkey( +pub(crate) fn get_bip32_keypair( account_index: u32, address_index_opt: Option, currency: Currency, dewif: &str, external_opt: Option, secret_code: &str, -) -> Result { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( +) -> Result { + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -73,12 +73,44 @@ pub(crate) fn get_bip32_pubkey( } match keypairs.next() { - Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => get_bip32_pubkey_inner( - account_index, - address_index_opt, - external_opt, - master_keypair, - ), + Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => { + Ok(KeyPairEnum::Bip32Ed25519(master_keypair.derive( + z_get_derivation_path(account_index, address_index_opt, external_opt)?, + ))) + } + Some(_) => Err(DubpError::NotHdWallet), + None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), + } +} + +pub(crate) fn get_bip32_pubkey( + account_index: u32, + address_index_opt: Option, + currency: Currency, + dewif: &str, + external_opt: Option, + secret_code: &str, +) -> Result { + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( + ExpectedCurrency::Specific(currency), + dewif, + &secret_code.to_ascii_uppercase(), + ) + .map_err(DubpError::DewifReadError)?; + + if account_index == 0 { + verify_member_secret_code(currency, dewif, secret_code)?; + } + + match keypairs.next() { + Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(master_keypair + .derive(z_get_derivation_path( + account_index, + address_index_opt, + external_opt, + )?) + .public_key() + .to_base58()), Some(_) => Err(DubpError::NotHdWallet), None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)), } @@ -111,7 +143,7 @@ pub(crate) fn load_opaque_bip32_accounts( dewif: &str, secret_code: &str, ) -> Result<(), DubpError> { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -147,7 +179,7 @@ pub(crate) fn sign_bip32( secret_code: &str, msg: &str, ) -> Result { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -180,7 +212,7 @@ pub(crate) fn sign_several_bip32( secret_code: &str, msgs: &[&str], ) -> Result, DubpError> { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -204,22 +236,6 @@ pub(crate) fn sign_several_bip32( } } -fn get_bip32_pubkey_inner( - account_index: u32, - address_index_opt: Option, - external_opt: Option, - master_keypair: KeyPair, -) -> Result { - Ok(master_keypair - .derive(z_get_derivation_path( - account_index, - address_index_opt, - external_opt, - )?) - .public_key() - .to_base58()) -} - fn sign_bip32_inner( account_index: u32, address_index_opt: Option, @@ -265,9 +281,11 @@ fn verify_member_secret_code( secret_code: &str, ) -> Result<(), DubpError> { if crate::secret_code::is_ascii_letters(secret_code) { - let log_n = - dup_crypto::dewif::read_dewif_log_n(ExpectedCurrency::Specific(currency), dewif) - .map_err(DubpError::DewifReadError)?; + let log_n = dubp_client::crypto::dewif::read_dewif_log_n( + ExpectedCurrency::Specific(currency), + dewif, + ) + .map_err(DubpError::DewifReadError)?; let expected_secret_code_len = crate::secret_code::compute_secret_code_len(true, SecretCodeType::Letters, log_n)?; diff --git a/native/dubp_rs/src/dewif/classic.rs b/native/dubp_rs/src/dewif/classic.rs index a0e23f8..e6fe1c3 100644 --- a/native/dubp_rs/src/dewif/classic.rs +++ b/native/dubp_rs/src/dewif/classic.rs @@ -21,7 +21,7 @@ pub(crate) fn sign( secret_code: &str, msg: &str, ) -> Result { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), @@ -40,7 +40,7 @@ pub(crate) fn sign_several( secret_code: &str, msgs: &[&str], ) -> Result, DubpError> { - let mut keypairs = dup_crypto::dewif::read_dewif_file_content( + let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content( ExpectedCurrency::Specific(currency), dewif, &secret_code.to_ascii_uppercase(), diff --git a/native/dubp_rs/src/error.rs b/native/dubp_rs/src/error.rs index 0448156..e68957d 100644 --- a/native/dubp_rs/src/error.rs +++ b/native/dubp_rs/src/error.rs @@ -16,6 +16,7 @@ use crate::*; /// Dubp error +#[allow(clippy::large_enum_variant)] #[derive(Debug, Error)] pub(crate) enum DubpError { #[error("{0}")] @@ -26,6 +27,8 @@ pub(crate) enum DubpError { GetMasterPubkeyOfHdWallet, #[error("Give external bool or address index for legacy wallet.")] GiveExternalBoolOrAddressIndexForLegacyWallet, + #[error("{0}")] + GvaClientError(dubp_client::GvaClientError), #[error("I/O error: {0}")] IoErr(io::Error), #[error("{0}")] @@ -33,6 +36,8 @@ pub(crate) enum DubpError { #[error("{0}")] InvalidPubkey(PublicKeyFromStrErr), #[error("{0}")] + InvalidScript(dubp_client::documents_parser::TextParseError), + #[error("{0}")] InvalidU31(U31Error), #[error("Invalid secret code type")] InvalidSecretCodeType, @@ -44,6 +49,8 @@ pub(crate) enum DubpError { NullParamErr, #[error("Opaque account not loaded")] OpaqueAccountNotLoaded, + #[error("Payment error: {0}")] + PaymentError(String), #[error("Secret code too short: please change your secret code")] SecretCodeTooShort, #[error("The chaining address cannot be used to sign with opaque account")] diff --git a/native/dubp_rs/src/inputs.rs b/native/dubp_rs/src/inputs.rs index 4aeaee9..bd6fcc9 100644 --- a/native/dubp_rs/src/inputs.rs +++ b/native/dubp_rs/src/inputs.rs @@ -52,6 +52,20 @@ pub(crate) fn char_ptr_to_str<'a>(c_char_ptr: *const raw::c_char) -> Result<&'a } } +pub(crate) fn char_ptr_to_opt_string( + c_char_ptr: *const raw::c_char, +) -> Result, DubpError> { + Ok(if c_char_ptr.is_null() { + None + } else { + Some( + unsafe { CStr::from_ptr(c_char_ptr).to_str() } + .map_err(DubpError::Utf8Error)? + .to_owned(), + ) + }) +} + pub(crate) fn char_ptr_prt_to_vec_u31( u32_ptr: *const u32, len: u32, diff --git a/native/dubp_rs/src/legacy.rs b/native/dubp_rs/src/legacy.rs index 92bb737..d1831ec 100644 --- a/native/dubp_rs/src/legacy.rs +++ b/native/dubp_rs/src/legacy.rs @@ -14,7 +14,7 @@ // along with this program. If not, see . use crate::*; -use dup_crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword}; +use dubp_client::crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword}; pub(super) fn gen_dewif_from_legacy( currency: &str, @@ -30,7 +30,8 @@ pub(super) fn gen_dewif_from_legacy( let log_n = crate::dewif::log_n(system_memory); let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?; - let dewif = dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code); + let dewif = + dubp_client::crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code); let pubkey = keypair.public_key().to_base58(); Ok(vec![dewif, secret_code, pubkey]) } diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index 37cd38e..f6ba745 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -21,6 +21,7 @@ mod error; mod inputs; mod legacy; mod mnemonic; +mod payment; mod pubkey; mod secret_code; @@ -29,7 +30,7 @@ use crate::inputs::*; use crate::r#async::exec_async; use crate::secret_code::gen_secret_code; use allo_isolate::{IntoDart, Isolate}; -use dup_crypto::{ +use dubp_client::crypto::{ bases::b58::ToBase58, dewif::{Currency, DewifReadError, ExpectedCurrency, G1_CURRENCY, G1_TEST_CURRENCY}, keys::{ @@ -459,3 +460,59 @@ pub extern "C" fn sign_several( }, ) } + +#[no_mangle] +pub extern "C" fn simple_payment_bip32( + port: i64, + account_index: u32, + amount: f64, + currency: *const raw::c_char, + dewif: *const raw::c_char, + gva_endpoint: *const raw::c_char, + recipient: *const raw::c_char, + secret_code: *const raw::c_char, + tx_comment: *const raw::c_char, +) { + exec_async( + port, + || { + let currency = parse_currency(char_ptr_to_str(currency)?)?; + let dewif = char_ptr_to_str(dewif)?; + let gva_endpoint = char_ptr_to_str(gva_endpoint)?; + let recipient = char_ptr_to_str(recipient)?; + let secret_code = char_ptr_to_str(secret_code)?; + let tx_comment = char_ptr_to_opt_string(tx_comment)?; + Ok(( + account_index, + amount, + currency, + dewif, + gva_endpoint, + secret_code, + recipient, + tx_comment, + )) + }, + |( + account_index, + amount, + currency, + dewif, + gva_endpoint, + secret_code, + recipient, + tx_comment, + )| { + payment::simple_payment( + account_index, + amount, + currency, + dewif, + gva_endpoint, + secret_code, + recipient, + tx_comment, + ) + }, + ) +} diff --git a/native/dubp_rs/src/mnemonic.rs b/native/dubp_rs/src/mnemonic.rs index b9148e0..0b9849a 100644 --- a/native/dubp_rs/src/mnemonic.rs +++ b/native/dubp_rs/src/mnemonic.rs @@ -24,7 +24,7 @@ pub(super) fn gen_mnemonic(language: Language) -> Result { pub(super) fn mnemonic_to_pubkey(language: Language, mnemonic: &str) -> Result { let mnemonic = Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?; - let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic); + let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic); let keypair = KeyPairFromSeed32Generator::generate(seed); Ok(keypair.public_key().to_base58()) } diff --git a/native/dubp_rs/src/payment.rs b/native/dubp_rs/src/payment.rs new file mode 100644 index 0000000..b4c4a5f --- /dev/null +++ b/native/dubp_rs/src/payment.rs @@ -0,0 +1,66 @@ +// Copyright (C) 2020 Éloïs SANCHEZ. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +use crate::*; +use dubp_client::wallet::prelude::*; +use dubp_client::{GvaClient, NaiveGvaClient}; + +#[allow(clippy::too_many_arguments)] +pub(super) fn simple_payment( + account_index: u32, + amount: f64, + currency: Currency, + dewif: &str, + gva_endpoint: &str, + secret_code: &str, + recipient: &str, + tx_comment: Option, +) -> Result<(), DubpError> { + let keypair = crate::dewif::bip32::get_bip32_keypair( + account_index, + None, + currency, + dewif, + None, + secret_code, + )?; + + let gva_client = NaiveGvaClient::new(gva_endpoint).expect("invalid' endpoint"); + + let amount = dubp_client::Amount::Uds(amount); + + let recipient = if let Ok(pubkey) = PublicKey::from_base58(recipient) { + WalletScriptV10::single_sig(pubkey) + } else { + dubp_client::documents_parser::wallet_script_from_str(recipient) + .map_err(DubpError::InvalidScript)? + }; + + let res = match keypair.generate_signator() { + dubp_client::crypto::keys::SignatorEnum::Ed25519(signator) => gva_client + .simple_payment(amount, &signator, recipient, tx_comment, None) + .map_err(DubpError::GvaClientError)?, + dubp_client::crypto::keys::SignatorEnum::Schnorr() => unreachable!(), + dubp_client::crypto::keys::SignatorEnum::Bip32Ed25519(signator) => gva_client + .simple_payment(amount, &signator, recipient, tx_comment, None) + .map_err(DubpError::GvaClientError)?, + }; + + if let dubp_client::PaymentResult::Errors(errors) = res { + Err(DubpError::PaymentError(format!("{:?}", errors))) + } else { + Ok(()) + } +} diff --git a/native/dubp_rs/src/secret_code.rs b/native/dubp_rs/src/secret_code.rs index ae42d23..ab6efc1 100644 --- a/native/dubp_rs/src/secret_code.rs +++ b/native/dubp_rs/src/secret_code.rs @@ -67,7 +67,7 @@ pub(crate) fn is_ascii_letters(secret_code: &str) -> bool { } fn gen_random_digits(n: usize) -> Result { - let mut digits_string = dup_crypto::rand::gen_u32() + let mut digits_string = dubp_client::crypto::rand::gen_u32() .map_err(|_| DubpError::RandErr)? .to_string(); digits_string.truncate(n); @@ -97,7 +97,7 @@ fn gen_random_letters(mut n: usize) -> Result { } fn gen_random_letters_inner(n: usize) -> Result { - let mut i = dup_crypto::rand::gen_u32().map_err(|_| DubpError::RandErr)?; + let mut i = dubp_client::crypto::rand::gen_u32().map_err(|_| DubpError::RandErr)?; let mut letters = String::new(); for _ in 0..n { diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index 7000348..dbceb82 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -399,6 +399,35 @@ class DubpRust { return completer.future; } + /// Make a simple payment from a transparent account + static Future simplePaymentFromTransparentAccount( + {int accountIndex, + double amount, + String currency = "g1", + String dewif, + String gvaEndpoint, + String recipient, + String secretCode, + String txComment}) { + final completer = Completer(); + final sendPort = + singleCompletePort(completer, callback: _handleErrVoid); + + native.simple_payment_bip32( + sendPort.nativePort, + accountIndex, + amount, + StringUtf8Pointer(currency).toNativeUtf8(), + StringUtf8Pointer(dewif).toNativeUtf8(), + StringUtf8Pointer(gvaEndpoint).toNativeUtf8(), + StringUtf8Pointer(recipient).toNativeUtf8(), + StringUtf8Pointer(secretCode).toNativeUtf8(), + StringUtf8Pointer(txComment).toNativeUtf8(), + ); + + return completer.future; + } + static Pointer _listIntToPtrUint32(List list) { final listUint32 = list.map((i) => i.toUnsigned(31)).toList(); final Pointer ptr = malloc.allocate(listUint32.length);