From 23bfe99d000ae6004a541d1f67a5452abcdab6fa Mon Sep 17 00:00:00 2001
From: Pavel Uhanov <pavel.uhanov@demlabs.net>
Date: Mon, 10 Jul 2023 13:31:16 +0700
Subject: [PATCH] [*] add checking hex digits in hash string in wallet restore

---
 dap-sdk                              |  2 +-
 modules/net/dap_chain_node_cli_cmd.c | 18 ++++++++++++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index a620492c6b..c7b6e75b90 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit a620492c6b5908345c55167618ab2802431cfdb9
+Subproject commit c7b6e75b903529d767159b7fecb7a7b32a7d272c
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index cb47e1ee7d..a1b363302d 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -1993,7 +1993,7 @@ char    l_buf[1024];
         case CMD_WALLET_NEW: {
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-password", &l_pass_str);
             dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-sign", &l_sign_type_str);
-            dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-restore", &l_restore_str);
+            int l_restore_opt = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-restore", &l_restore_str);
             // rewrite existing wallet
             int l_is_force = dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-force", NULL);
 
@@ -2038,9 +2038,23 @@ char    l_buf[1024];
             if (l_sign_type.type == SIG_TYPE_TESLA)
                 return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Tesla algorithm is no longer supported, please, use another variant"), -1;
 
+            uint8_t *l_seed = NULL;
+            size_t l_seed_size = 0, l_restore_str_size = dap_strlen(l_restore_str);
+
+            if(l_restore_opt) {
+                if (l_restore_str_size > 3 && !dap_strncmp(l_restore_str, "0x", 2) && !dap_is_hex_string(l_restore_str + 2, l_restore_str_size - 2)) {
+                    l_seed_size = (l_restore_str_size - 2) / 2;
+                    l_seed = DAP_NEW_SIZE(uint8_t, l_seed_size);
+                    dap_hex2bin(l_seed, l_restore_str + 2, l_restore_str_size - 2);
+                } else {
+                    dap_cli_server_cmd_set_reply_text(a_str_reply, "Restored hash is invalid or too short, wallet is not created. Please use -restore 0x<hex value>");
+                    return -1;
+                }
+            }
+
             // Creates new wallet
             dap_chain_wallet_t *l_wallet = dap_chain_wallet_create_with_seed(l_wallet_name, c_wallets_path, l_sign_type,
-                    l_restore_str, dap_strlen(l_restore_str), l_pass_str);
+                    l_seed, l_seed_size, l_pass_str);
 
             if (!l_wallet)
                 return  dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet is not created because of internal error"), -1;
-- 
GitLab