summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
Diffstat (limited to 'patches')
-rw-r--r--patches/monero/0015-add-dummy-device-for-ledger.patch494
1 files changed, 494 insertions, 0 deletions
diff --git a/patches/monero/0015-add-dummy-device-for-ledger.patch b/patches/monero/0015-add-dummy-device-for-ledger.patch
new file mode 100644
index 0000000..4797da2
--- /dev/null
+++ b/patches/monero/0015-add-dummy-device-for-ledger.patch
@@ -0,0 +1,494 @@
+From a1bc57a00254ed47216c90edb1752c68e3fd77d3 Mon Sep 17 00:00:00 2001
+From: Czarek Nakamoto <cyjan@mrcyjanek.net>
+Date: Wed, 26 Jun 2024 15:04:38 +0200
+Subject: [PATCH] add dummy device for ledger
+
+---
+ CMakeLists.txt | 6 +-
+ src/device/CMakeLists.txt | 2 +
+ src/device/device.hpp | 2 +-
+ src/device/device_io_dummy.cpp | 132 +++++++++++++++++++++++++++++++++
+ src/device/device_io_dummy.hpp | 69 +++++++++++++++++
+ src/device/device_ledger.cpp | 4 +-
+ src/device/device_ledger.hpp | 5 ++
+ src/wallet/api/wallet.cpp | 92 +++++++++++++++++++++++
+ src/wallet/api/wallet.h | 18 +++++
+ src/wallet/api/wallet2_api.h | 12 +++
+ 10 files changed, 338 insertions(+), 4 deletions(-)
+ create mode 100644 src/device/device_io_dummy.cpp
+ create mode 100644 src/device/device_io_dummy.hpp
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 6028c0961..e7fa90abb 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -694,8 +694,12 @@ include_directories(${LMDB_INCLUDE})
+ include_directories(${LIBUNWIND_INCLUDE})
+ link_directories(${LIBUNWIND_LIBRARY_DIRS})
+
++if (HIDAPI_DUMMY)
++ add_definitions(-DHIDAPI_DUMMY)
++endif()
++
+ # Final setup for hid
+-if (HIDAPI_FOUND)
++if (HIDAPI_FOUND)
+ message(STATUS "Using HIDAPI include dir at ${HIDAPI_INCLUDE_DIR}")
+ add_definitions(-DHAVE_HIDAPI)
+ include_directories(${HIDAPI_INCLUDE_DIR})
+diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt
+index e4f1159b5..1ca016aba 100644
+--- a/src/device/CMakeLists.txt
++++ b/src/device/CMakeLists.txt
+@@ -45,6 +45,7 @@ set(device_headers
+ device_io.hpp
+ device_default.hpp
+ device_cold.hpp
++ device_io_dummy.hpp
+ log.hpp
+ )
+
+@@ -53,6 +54,7 @@ if(HIDAPI_FOUND)
+ ${device_headers}
+ device_ledger.hpp
+ device_io_hid.hpp
++ device_io_dummy.cpp
+ )
+ endif()
+
+diff --git a/src/device/device.hpp b/src/device/device.hpp
+index 392703a24..4368840ab 100644
+--- a/src/device/device.hpp
++++ b/src/device/device.hpp
+@@ -39,7 +39,7 @@
+ #define USE_DEVICE_LEDGER 1
+ #endif
+
+-#if !defined(HAVE_HIDAPI)
++#if !defined(HAVE_HIDAPI) && !defined(HIDAPI_DUMMY)
+ #undef USE_DEVICE_LEDGER
+ #define USE_DEVICE_LEDGER 0
+ #endif
+diff --git a/src/device/device_io_dummy.cpp b/src/device/device_io_dummy.cpp
+new file mode 100644
+index 000000000..1f94480ef
+--- /dev/null
++++ b/src/device/device_io_dummy.cpp
+@@ -0,0 +1,132 @@
++// Copyright (c) 2017-2022, The Monero Project
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without modification, are
++// permitted provided that the following conditions are met:
++//
++// 1. Redistributions of source code must retain the above copyright notice, this list of
++// conditions and the following disclaimer.
++//
++// 2. Redistributions in binary form must reproduce the above copyright notice, this list
++// of conditions and the following disclaimer in the documentation and/or other
++// materials provided with the distribution.
++//
++// 3. Neither the name of the copyright holder nor the names of its contributors may be
++// used to endorse or promote products derived from this software without specific
++// prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
++// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
++// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
++// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
++// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++//
++
++// device_io_dummy
++// Main goal of device_io_dummy is to emulate a hw::io::device_io without the need to actually
++// connect a device.
++// Many operating systems do not support giving raw USB access to a process (android), or don't
++// support that at all (hi iOS), therefore other means of connection can be used, either USB
++// abstraction provided by the OS (monerujo), or BLE (also monerujo).
++// Monerujo implementation is written in Java, which makes it a nice fit for iOS, but makes the
++// code extremely unportable, so for this reason the code in here is written in CPP.
++// Data transport is made available in wallet2_api.h, so wallet developers can easily plug their
++// own USB/BLE/other transport layer.
++
++#ifdef HIDAPI_DUMMY
++#include <boost/scope_exit.hpp>
++#include "log.hpp"
++#include "device_io_dummy.hpp"
++
++
++bool hw::io::device_io_dummy::stateIsConnected = false;
++unsigned char* hw::io::device_io_dummy::sendToDevice = {};
++size_t hw::io::device_io_dummy::sendToDeviceLength = 0;
++unsigned char* hw::io::device_io_dummy::receivedFromDevice = {};
++size_t hw::io::device_io_dummy::receivedFromDeviceLength = 0;
++bool hw::io::device_io_dummy::waitsForDeviceSend = false;
++bool hw::io::device_io_dummy::waitsForDeviceReceive = false;
++
++namespace hw {
++ namespace io {
++
++#undef MONERO_DEFAULT_LOG_CATEGORY
++#define MONERO_DEFAULT_LOG_CATEGORY "device.io_dummy"
++ device_io_dummy::device_io_dummy(int a, int b, int c, int d) {
++ MDEBUG("device_io_dummy(a: " << a << ", b: " << b << ", c: " << c << ", d: " << d <<")");
++ }
++
++ void device_io_dummy::init() {
++ MDEBUG("init()");
++ }
++
++ void device_io_dummy::connect(void *params) {
++ MDEBUG("connect(" << params << ")");
++ stateIsConnected = true;
++ }
++
++ void device_io_dummy::connect(const std::vector<hw::io::hid_conn_params>& known_devices) {
++ MDEBUG("connect([");
++ for (const auto &item: known_devices) {
++ MDEBUG("{ interface_number: " << item.interface_number);
++ MDEBUG(" pid : " << item.pid);
++ MDEBUG(" usage_page : " << item.usage_page);
++ MDEBUG(" vid : " << item.vid << " },");
++ }
++ MDEBUG("])");
++ stateIsConnected = true;
++ }
++
++ bool device_io_dummy::connected() const {
++ MDEBUG("connected()");
++ return stateIsConnected;
++ }
++
++ int device_io_dummy::exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input) {
++ MDEBUG("exchange(): locking mutex");
++ boost::unique_lock<boost::mutex> lock(mutex);
++ sendToDevice = command;
++ sendToDeviceLength = cmd_len;
++ waitsForDeviceSend = true;
++ waitsForDeviceReceive = true;
++ MDEBUG("exchange(): waitsForDeviceSend");
++ // NOTE: waitsForDeviceSend should be changed by external code
++ while (waitsForDeviceSend) {
++ sleep(1);
++ MDEBUG("exchange(): waitsForDeviceSend (still)");
++ }
++
++ MDEBUG("exchange(): waitsForDeviceReceive");
++ while (waitsForDeviceReceive) {
++ sleep(1);
++ MDEBUG("exchange(): waitsForDeviceReceive (still)");
++ }
++
++ if (receivedFromDeviceLength > max_resp_len) {
++ MDEBUG("exchange(): receivedFromDeviceLength ("<<receivedFromDeviceLength<<") is larger than max_resp_len ("<<max_resp_len<<")");
++ return 1;
++ }
++
++ memset(response,0,max_resp_len);
++ memcpy(response, receivedFromDevice, receivedFromDeviceLength);
++ return receivedFromDeviceLength;
++ }
++
++ void device_io_dummy::disconnect() {
++ MDEBUG("disconnect()");
++ }
++
++ void device_io_dummy::release() {
++ MDEBUG("release()");
++ }
++
++
++
++ }
++}
++#endif // HAVE_HIDAPI
+\ No newline at end of file
+diff --git a/src/device/device_io_dummy.hpp b/src/device/device_io_dummy.hpp
+new file mode 100644
+index 000000000..8c486f1d7
+--- /dev/null
++++ b/src/device/device_io_dummy.hpp
+@@ -0,0 +1,69 @@
++// Copyright (c) 2017-2022, The Monero Project
++//
++// All rights reserved.
++//
++// Redistribution and use in source and binary forms, with or without modification, are
++// permitted provided that the following conditions are met:
++//
++// 1. Redistributions of source code must retain the above copyright notice, this list of
++// conditions and the following disclaimer.
++//
++// 2. Redistributions in binary form must reproduce the above copyright notice, this list
++// of conditions and the following disclaimer in the documentation and/or other
++// materials provided with the distribution.
++//
++// 3. Neither the name of the copyright holder nor the names of its contributors may be
++// used to endorse or promote products derived from this software without specific
++// prior written permission.
++//
++// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
++// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
++// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
++// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
++// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
++// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++//
++#ifdef HIDAPI_DUMMY
++
++#pragma once
++
++#include "device_io.hpp"
++#include "device_io_hid.hpp"
++
++namespace hw {
++ namespace io {
++
++ class device_io_dummy : device_io {
++ private:
++ boost::mutex mutex;
++
++ public:
++ static bool stateIsConnected;
++ static unsigned char* sendToDevice;
++ static size_t sendToDeviceLength;
++ static unsigned char* receivedFromDevice;
++ static size_t receivedFromDeviceLength;
++ static bool waitsForDeviceSend;
++ static bool waitsForDeviceReceive;
++
++ device_io_dummy() = default;
++ device_io_dummy(int a, int b, int c, int d);
++ ~device_io_dummy() = default;
++
++ void init();
++ void release();
++
++ void connect(void *parms);
++ void connect(const std::vector<hw::io::hid_conn_params>& known_devices);
++ void disconnect();
++ bool connected() const;
++
++ int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input);
++ };
++ };
++};
++
++#endif // HAVE_HIDAPI
+diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp
+index 90675df11..6aac0a44c 100644
+--- a/src/device/device_ledger.cpp
++++ b/src/device/device_ledger.cpp
+@@ -41,7 +41,7 @@ namespace hw {
+
+ namespace ledger {
+
+- #ifdef WITH_DEVICE_LEDGER
++ #if defined(WITH_DEVICE_LEDGER) || defined(HIDAPI_DUMMY)
+
+ #undef MONERO_DEFAULT_LOG_CATEGORY
+ #define MONERO_DEFAULT_LOG_CATEGORY "device.ledger"
+@@ -299,7 +299,7 @@ namespace hw {
+
+ device_ledger::device_ledger(): hw_device(0x0101, 0x05, 64, 2000) {
+ this->id = device_id++;
+- this->reset_buffer();
++ this->reset_buffer();
+ this->mode = NONE;
+ this->has_view_key = false;
+ this->tx_in_progress = false;
+diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp
+index 03058c4f1..023183e13 100644
+--- a/src/device/device_ledger.hpp
++++ b/src/device/device_ledger.hpp
+@@ -35,6 +35,7 @@
+ #include "device.hpp"
+ #include "log.hpp"
+ #include "device_io_hid.hpp"
++#include "device_io_dummy.hpp"
+ #include <boost/thread/mutex.hpp>
+ #include <boost/thread/recursive_mutex.hpp>
+
+@@ -148,7 +149,11 @@ namespace hw {
+ mutable boost::mutex command_locker;
+
+ //IO
++#ifdef HIDAPI_DUMMY
++ hw::io::device_io_dummy hw_device;
++#else
+ hw::io::device_io_hid hw_device;
++#endif
+ unsigned int length_send;
+ unsigned char buffer_send[BUFFER_SEND_SIZE];
+ unsigned int length_recv;
+diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
+index 8bdd75a5a..c44978a71 100644
+--- a/src/wallet/api/wallet.cpp
++++ b/src/wallet/api/wallet.cpp
+@@ -49,6 +49,9 @@
+ #include <boost/locale.hpp>
+ #include <boost/filesystem.hpp>
+ #include "bc-ur/src/bc-ur.hpp"
++#ifdef HIDAPI_DUMMY
++#include "device/device_io_dummy.hpp"
++#endif
+
+ using namespace std;
+ using namespace cryptonote;
+@@ -3299,4 +3302,93 @@ uint64_t WalletImpl::getBytesSent()
+ return m_wallet->get_bytes_sent();
+ }
+
++
++// HIDAPI_DUMMY
++bool WalletImpl::getStateIsConnected() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return false;
++ #else
++ return hw::io::device_io_dummy::stateIsConnected;
++ #endif
++}
++
++unsigned char* WalletImpl::getSendToDevice() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return {};
++ #else
++ return hw::io::device_io_dummy::sendToDevice;
++ #endif
++}
++
++size_t WalletImpl::getSendToDeviceLength() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return -1;
++ #else
++ return hw::io::device_io_dummy::sendToDeviceLength;
++ #endif
++}
++
++unsigned char* WalletImpl::getReceivedFromDevice() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return {};
++ #else
++ return hw::io::device_io_dummy::receivedFromDevice;
++ #endif
++}
++
++size_t WalletImpl::getReceivedFromDeviceLength() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return -1;
++ #else
++ return hw::io::device_io_dummy::receivedFromDeviceLength;
++ #endif
++}
++
++bool WalletImpl::getWaitsForDeviceSend() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return false;
++ #else
++ return hw::io::device_io_dummy::receivedFromDeviceLength;
++ #endif
++}
++
++bool WalletImpl::getWaitsForDeviceReceive() {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return false;
++ #else
++ return hw::io::device_io_dummy::waitsForDeviceReceive;
++ #endif
++}
++
++void WalletImpl::setDeviceReceivedData(unsigned char* data, size_t len) {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return;
++ #else
++ hw::io::device_io_dummy::receivedFromDevice = static_cast<unsigned char *>(malloc(len));
++ memset(hw::io::device_io_dummy::receivedFromDevice, 0, len);
++ memcpy(hw::io::device_io_dummy::receivedFromDevice, data, len);
++ hw::io::device_io_dummy::waitsForDeviceReceive = false;
++ #endif
++}
++
++void WalletImpl::setDeviceSendData(unsigned char* data, size_t len) {
++ #ifndef HIDAPI_DUMMY
++ setStatusError("MONERO compiled with -DHIDAPI_DUMMY");
++ return;
++ #else
++ hw::io::device_io_dummy::sendToDevice = static_cast<unsigned char *>(malloc(len));
++ memset(hw::io::device_io_dummy::sendToDevice, 0, len);
++ memcpy(hw::io::device_io_dummy::sendToDevice, data, len);
++ hw::io::device_io_dummy::waitsForDeviceSend = false;
++ #endif
++}
++
+ } // namespace
+diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h
+index febc93119..9e1fbb40b 100644
+--- a/src/wallet/api/wallet.h
++++ b/src/wallet/api/wallet.h
+@@ -321,6 +321,24 @@ private:
+ // cache connection status to avoid unnecessary RPC calls
+ mutable std::atomic<bool> m_is_connected;
+ boost::optional<epee::net_utils::http::login> m_daemon_login{};
++
++ bool getStateIsConnected();
++
++ unsigned char *getSendToDevice();
++
++ size_t getSendToDeviceLength();
++
++ unsigned char *getReceivedFromDevice();
++
++ size_t getReceivedFromDeviceLength();
++
++ bool getWaitsForDeviceSend();
++
++ bool getWaitsForDeviceReceive();
++
++ void setDeviceReceivedData(unsigned char *data, size_t len);
++
++ void setDeviceSendData(unsigned char *data, size_t len);
+ };
+
+
+diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h
+index 2bbb32c8b..c8d6bb179 100644
+--- a/src/wallet/api/wallet2_api.h
++++ b/src/wallet/api/wallet2_api.h
+@@ -1204,6 +1204,18 @@ struct Wallet
+
+ //! get bytes sent
+ virtual uint64_t getBytesSent() = 0;
++
++ // HIDAPI_DUMMY
++ virtual bool getStateIsConnected() = 0;
++ virtual unsigned char* getSendToDevice() = 0;
++ virtual size_t getSendToDeviceLength() = 0;
++ virtual unsigned char* getReceivedFromDevice() = 0;
++ virtual size_t getReceivedFromDeviceLength() = 0;
++ virtual bool getWaitsForDeviceSend() = 0;
++ virtual bool getWaitsForDeviceReceive() = 0;
++
++ virtual void setDeviceReceivedData(unsigned char* data, size_t len) = 0;
++ virtual void setDeviceSendData(unsigned char* data, size_t len) = 0;
+ };
+
+ /**
+--
+2.39.2
+