From 04fccb8e7b9f95918d9da0473909d740e2e19672 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 11 Apr 2024 10:54:44 +0200 Subject: [PATCH] Implement Verify Message for Monero --- cw_monero/ios/Classes/monero_api.cpp | 7 ++++++- cw_monero/ios/Classes/monero_api.h | 2 ++ cw_monero/lib/api/signatures.dart | 2 ++ cw_monero/lib/api/types.dart | 2 ++ cw_monero/lib/api/wallet.dart | 17 +++++++++++++++++ cw_monero/lib/monero_wallet.dart | 8 ++++++++ cw_monero/macos/Classes/monero_api.cpp | 7 ++++++- cw_monero/macos/Classes/monero_api.h | 2 ++ 8 files changed, 45 insertions(+), 2 deletions(-) diff --git a/cw_monero/ios/Classes/monero_api.cpp b/cw_monero/ios/Classes/monero_api.cpp index 87be785ac..af0e06508 100644 --- a/cw_monero/ios/Classes/monero_api.cpp +++ b/cw_monero/ios/Classes/monero_api.cpp @@ -1022,13 +1022,18 @@ extern "C" m_coins->thaw(index); } - // Sign Messages // + // Sign & Verify Messages // char *sign_message(char *message, char *address = "") { return strdup(get_current_wallet()->signMessage(std::string(message), std::string(address)).c_str()); } + bool verify_message(char *message, char *address, char *signature) + { + return get_current_wallet()->verifySignedMessage(std::string(message), std::string(address), std::string(signature)); + } + #ifdef __cplusplus } #endif diff --git a/cw_monero/ios/Classes/monero_api.h b/cw_monero/ios/Classes/monero_api.h index fa92a038d..9d898bcc2 100644 --- a/cw_monero/ios/Classes/monero_api.h +++ b/cw_monero/ios/Classes/monero_api.h @@ -32,7 +32,9 @@ void store(char *path); void set_trusted_daemon(bool arg); bool trusted_daemon(); + char *sign_message(char *message, char *address); +bool verify_message(char *message, char *address, char *signature); #ifdef __cplusplus } diff --git a/cw_monero/lib/api/signatures.dart b/cw_monero/lib/api/signatures.dart index bc4fc9d38..08c50ce5f 100644 --- a/cw_monero/lib/api/signatures.dart +++ b/cw_monero/lib/api/signatures.dart @@ -151,3 +151,5 @@ typedef freeze_coin = Void Function(Int32 index); typedef thaw_coin = Void Function(Int32 index); typedef sign_message = Pointer Function(Pointer message, Pointer address); + +typedef verify_message = Int8 Function(Pointer message, Pointer address, Pointer signature); diff --git a/cw_monero/lib/api/types.dart b/cw_monero/lib/api/types.dart index 40a1e0321..fa9e4e5eb 100644 --- a/cw_monero/lib/api/types.dart +++ b/cw_monero/lib/api/types.dart @@ -151,3 +151,5 @@ typedef FreezeCoin = void Function(int); typedef ThawCoin = void Function(int); typedef SignMessage = Pointer Function(Pointer, Pointer); + +typedef VerifyMessage = int Function(Pointer, Pointer, Pointer); diff --git a/cw_monero/lib/api/wallet.dart b/cw_monero/lib/api/wallet.dart index ffa5fe13b..292dd6e3e 100644 --- a/cw_monero/lib/api/wallet.dart +++ b/cw_monero/lib/api/wallet.dart @@ -131,6 +131,10 @@ final signMessageNative = moneroApi .lookup>('sign_message') .asFunction(); +final verifyMessageNative = moneroApi + .lookup>('verify_message') + .asFunction(); + int getSyncingHeight() => getSyncingHeightNative(); bool isNeededToRefresh() => isNeededToRefreshNative() != 0; @@ -397,3 +401,16 @@ String signMessage(String message, {String address = ""}) { return signature; } + +bool verifyMessage(String message, String address, String signature) { + final messagePointer = message.toNativeUtf8(); + final addressPointer = address.toNativeUtf8(); + final signaturePointer = address.toNativeUtf8(); + + final isVerified = verifyMessageNative(messagePointer, addressPointer, signaturePointer); + calloc.free(messagePointer); + calloc.free(addressPointer); + calloc.free(signaturePointer); + + return isVerified != 0; +} diff --git a/cw_monero/lib/monero_wallet.dart b/cw_monero/lib/monero_wallet.dart index c270bb113..3e6c85cca 100644 --- a/cw_monero/lib/monero_wallet.dart +++ b/cw_monero/lib/monero_wallet.dart @@ -690,4 +690,12 @@ abstract class MoneroWalletBase final useAddress = address ?? ""; return monero_wallet.signMessage(message, address: useAddress); } + + @override + Future verifyMessage(String message, String signature, {String? address = null}) async { + if (address == null) return false; + + return monero_wallet.verifyMessage(message, address, signature); + } + } diff --git a/cw_monero/macos/Classes/monero_api.cpp b/cw_monero/macos/Classes/monero_api.cpp index fe75dea98..74c82dcd0 100644 --- a/cw_monero/macos/Classes/monero_api.cpp +++ b/cw_monero/macos/Classes/monero_api.cpp @@ -1020,13 +1020,18 @@ extern "C" m_coins->thaw(index); } - // Sign Messages // + // Sign & Verify Messages // char *sign_message(char *message, char *address = "") { return strdup(get_current_wallet()->signMessage(std::string(message), std::string(address)).c_str()); } + bool verify_message(char *message, char *address, char *signature) + { + return get_current_wallet()->verifySignedMessage(std::string(message), std::string(address), std::string(verifySignedMessage)); + } + #ifdef __cplusplus } #endif diff --git a/cw_monero/macos/Classes/monero_api.h b/cw_monero/macos/Classes/monero_api.h index fa92a038d..9d898bcc2 100644 --- a/cw_monero/macos/Classes/monero_api.h +++ b/cw_monero/macos/Classes/monero_api.h @@ -32,7 +32,9 @@ void store(char *path); void set_trusted_daemon(bool arg); bool trusted_daemon(); + char *sign_message(char *message, char *address); +bool verify_message(char *message, char *address, char *signature); #ifdef __cplusplus }