From e509ede2aa7263cc49d3378bc8c833a62300211d Mon Sep 17 00:00:00 2001 From: Dusan Klinec Date: Tue, 7 Apr 2020 18:25:25 +0200 Subject: trezor: adapt to new passphrase mechanism - choice where to enter passphrase is now made on the host - use wipeable string in the comm stack - wipe passphrase memory - protocol optimizations, prepare for new firmware version - minor fixes and improvements - tests fixes, HF12 support --- src/wallet/api/wallet.cpp | 6 ++++-- src/wallet/api/wallet2_api.h | 4 ++-- src/wallet/wallet2.cpp | 8 ++++++-- src/wallet/wallet2.h | 6 +++--- 4 files changed, 15 insertions(+), 9 deletions(-) (limited to 'src/wallet') diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 4612b0397..d89261c64 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -267,13 +267,15 @@ struct Wallet2CallbackImpl : public tools::i_wallet2_callback return boost::none; } - virtual boost::optional on_device_passphrase_request(bool on_device) + virtual boost::optional on_device_passphrase_request(bool & on_device) { if (m_listener) { auto passphrase = m_listener->onDevicePassphraseRequest(on_device); - if (!on_device && passphrase) { + if (passphrase) { return boost::make_optional(epee::wipeable_string((*passphrase).data(), (*passphrase).size())); } + } else { + on_device = true; } return boost::none; } diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index 09c64106e..bfaae2733 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -400,8 +400,8 @@ struct WalletListener /** * @brief called by device when passphrase entry is needed */ - virtual optional onDevicePassphraseRequest(bool on_device) { - if (!on_device) throw std::runtime_error("Not supported"); + virtual optional onDevicePassphraseRequest(bool & on_device) { + on_device = true; return optional(); } diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index bc8219c69..5935d954f 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1109,10 +1109,12 @@ boost::optional wallet_device_callback::on_pin_request() return boost::none; } -boost::optional wallet_device_callback::on_passphrase_request(bool on_device) +boost::optional wallet_device_callback::on_passphrase_request(bool & on_device) { if (wallet) return wallet->on_device_passphrase_request(on_device); + else + on_device = true; return boost::none; } @@ -13547,10 +13549,12 @@ boost::optional wallet2::on_device_pin_request() return boost::none; } //---------------------------------------------------------------------------------------------------- -boost::optional wallet2::on_device_passphrase_request(bool on_device) +boost::optional wallet2::on_device_passphrase_request(bool & on_device) { if (nullptr != m_callback) return m_callback->on_device_passphrase_request(on_device); + else + on_device = true; return boost::none; } //---------------------------------------------------------------------------------------------------- diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 7620d09d8..4a0b422ce 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -145,7 +145,7 @@ private: virtual void on_device_button_request(uint64_t code) {} virtual void on_device_button_pressed() {} virtual boost::optional on_device_pin_request() { return boost::none; } - virtual boost::optional on_device_passphrase_request(bool on_device) { return boost::none; } + virtual boost::optional on_device_passphrase_request(bool & on_device) { on_device = true; return boost::none; } virtual void on_device_progress(const hw::device_progress& event) {}; // Common callbacks virtual void on_pool_tx_removed(const crypto::hash &txid) {} @@ -159,7 +159,7 @@ private: void on_button_request(uint64_t code=0) override; void on_button_pressed() override; boost::optional on_pin_request() override; - boost::optional on_passphrase_request(bool on_device) override; + boost::optional on_passphrase_request(bool & on_device) override; void on_progress(const hw::device_progress& event) override; private: wallet2 * wallet; @@ -1487,7 +1487,7 @@ private: void on_device_button_request(uint64_t code); void on_device_button_pressed(); boost::optional on_device_pin_request(); - boost::optional on_device_passphrase_request(bool on_device); + boost::optional on_device_passphrase_request(bool & on_device); void on_device_progress(const hw::device_progress& event); std::string get_rpc_status(const std::string &s) const; -- cgit v1.2.3