From 2492465d4643f24519939a197e203a82aec50f1d Mon Sep 17 00:00:00 2001 From: librelois Date: Mon, 4 Jan 2021 17:08:43 +0100 Subject: [PATCH] ref(dubp): bind an array of string directly and use it in signSeveral --- native/dubp_rs/src/dewif.rs | 4 +-- native/dubp_rs/src/lib.rs | 13 ++++++--- packages/dubp_rs/ios/Classes/binding.h | 48 +++++++++++++++++++++++++++------- packages/dubp_rs/lib/dubp.dart | 13 ++++++++- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs index 0244a16..372db6e 100644 --- a/native/dubp_rs/src/dewif.rs +++ b/native/dubp_rs/src/dewif.rs @@ -106,7 +106,7 @@ pub(super) fn sign_several( currency: &str, dewif: &str, pin: &str, - msgs: &str, + msgs: &[&str], ) -> Result, DubpError> { let currency = parse_currency(currency)?; let mut keypairs = dup_crypto::dewif::read_dewif_file_content( @@ -118,7 +118,7 @@ pub(super) fn sign_several( if let Some(KeyPairEnum::Ed25519(keypair)) = keypairs.next() { let signator = keypair.generate_signator(); Ok(msgs - .split("\n\t\n") + .iter() .map(|msg| signator.sign(msg.as_bytes()).to_base64()) .collect()) } else { diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs index f83f48f..ae1a4a7 100644 --- a/native/dubp_rs/src/lib.rs +++ b/native/dubp_rs/src/lib.rs @@ -204,17 +204,24 @@ pub extern "C" fn sign_several( currency: *const raw::c_char, dewif: *const raw::c_char, pin: *const raw::c_char, - msgs: *const raw::c_char, + msgs_len: usize, + msgs: *const *const raw::c_char, ) -> i32 { let currency = cstr!(currency); let dewif = cstr!(dewif); let pin = cstr!(pin); - let msgs = cstr!(msgs); + + let msgs_slice: &[*const raw::c_char] = unsafe { std::slice::from_raw_parts(msgs, msgs_len) }; + let mut vec = Vec::with_capacity(msgs_len); + for ptr_c_char in msgs_slice { + vec.push(cstr!(*ptr_c_char)); + } + Isolate::new(port).post(error!(dewif::sign_several( currency, dewif, &pin.to_ascii_uppercase(), - msgs + &vec ))); 1 } diff --git a/packages/dubp_rs/ios/Classes/binding.h b/packages/dubp_rs/ios/Classes/binding.h index b0207d7..d2daa9d 100644 --- a/packages/dubp_rs/ios/Classes/binding.h +++ b/packages/dubp_rs/ios/Classes/binding.h @@ -161,21 +161,49 @@ extern "C" { #endif // __cplusplus - /** - * Destroy the Tokio Runtime, and return 1 if everything is okay - */ - int32_t destroy_runtime(RuntimePtr runtime); - int32_t error_message_utf8(char *buf, int32_t length); int32_t last_error_length(void); - int32_t load_page(RuntimePtr runtime, const char *url, DartPort port_id); + int32_t change_dewif_pin(int64_t port, + const char *currency, + const char *dewif, + const char *old_pin, + const char *new_pin); - /** - * Setup a new Tokio Runtime and return a pointer to it so it could be used later to run tasks - */ - RuntimePtr setup_runtime(DartPostCObjectFnPtr post_cobject); + int32_t error_message_utf8(char *buf, int32_t length); + + int32_t gen_dewif(int64_t port, + const char *currency, + uint32_t language, + const char *mnemonic, + const char *pin); + + int32_t gen_mnemonic(int64_t port, uint32_t language); + + int32_t gen_pin10(int64_t port); + + int32_t gen_pin6(int64_t port); + + int32_t gen_pin8(int64_t port); + + int32_t get_dewif_pubkey(int64_t port, const char *currency, const char *dewif, const char *pin); + + int32_t last_error_length(void); + + int32_t mnemonic_to_pubkey(int64_t port, uint32_t language, const char *mnemonic_phrase); + + int32_t sign(int64_t port, + const char *currency, + const char *dewif, + const char *pin, + const char *msg); + + int32_t sign_several(int64_t port, + const char *currency, + const char *dewif, + const char *pin, + const char *msgs); #ifdef __cplusplus } // extern "C" diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart index f0d2336..0d96d5b 100644 --- a/packages/dubp_rs/lib/dubp.dart +++ b/packages/dubp_rs/lib/dubp.dart @@ -242,12 +242,14 @@ class DubpRust { List messages}) { final completer = Completer>(); final sendPort = singleCompletePort, List>(completer); + final res = native.sign_several( sendPort.nativePort, Utf8.toUtf8(currency), Utf8.toUtf8(dewif), Utf8.toUtf8(pin), - Utf8.toUtf8(messages.join('\n\t\n')), + messages.length, + _listStringToPtr(messages), ); if (res != 1) { _throwError(); @@ -255,6 +257,15 @@ class DubpRust { return completer.future; } + static Pointer> _listStringToPtr(List list) { + final listUtf8 = list.map(Utf8.toUtf8).toList(); + final Pointer> ptr = allocate(count: listUtf8.length); + for (var i = 0; i < listUtf8.length; i++) { + ptr[i] = listUtf8[i]; + } + return ptr; + } + static void _throwError() { final length = native.last_error_length(); final Pointer message = allocate(count: length);