Please login or register.

Experimental trezor firmware testing


I worked on a trezor firmware which supports XMR awhile back but stopped development around August last year. I want to "complete" the firmware soon and then release the source to github when it's somewhat stable. I'm releasing the binary since I need help testing the current version.

While there are user interaction limitations, the firmware is fully functional and can be used to sync accounts as well as transfer XMR from active accounts. Only simplewallet is supported at the moment and from my testing, windows is fairly stable while linux needs some work [FIXED].

The firmware is compatible with BTC and does not remove any functionality available in the official firmware. The source is upstream compatible and can be merged to the official source (if they want to). XMR uses the same seed as BTC so you can restore your old seed anytime and regain your old account.

There are important points to note:

  • The viewkey is sent to the client. A bad client could potentially store these keys and see all incoming transactions to your account, privacy is then compromised.
  • The client has no access to the sendkey and can only request the device to generate key images or sign transactions. Your funds are safe.
  • It takes about 40ms to generate each key image. For large wallets, re-sync is going to take a while, so keep the wallet bin files.
  • [FIXED] The send confirmation prompt is incomplete. It will be fixed in subsequent versions.
  • [FIXED] There is no reconnect/retry implemented in simplewallet at the moment.
  • Max mix level is 9

V0925: trezor_xmr_test_firmware_0925

  • Updated to trezor source v1.4.0

V0313: trezor_xmr_test_firmware_0313_win64

V0313: trezor_xmr_test_firmware_0313_linux64

V0313: trezor_xmr_test_firmware_0313_osx64

  • Fixed Bus: 10 error


  • Added reconnect handler when trezor is unplugged while simplewallet is active
  • Added tx_seckey storage support to firmware
  • Added support for 'address' simplewallet command
  • Fixed support for entering passwords when trezor is initialized/recovered with password protection enabled


  • Added binaries for linux-64 and osx-64
  • Fixed usb transport bug in linux/osx
  • Updated source to master b96147030cf06b7adacafebff196bc23a4b19199
  • Added trezorctl to wipe, reset, recover the trezor
  • Added trezorctl option to recover the monero mnemonic from the trezor seed given a specific address index


  • Added send prompts when transferring xmr with multi destination support.
  • Fix: added error handler when mixin level is > 9
  • Fix: added error handler when sending to > 10 addresses in a single transaction.


  • Test release

Upgrade instructions:

  1. Disconnect the trezor from the USB cable.
  2. Press both buttons on the trezor then connect the USB cable.
  3. Run upload.bat. Wait until new firmware upload is completed.
  4. Verify firmware fingerprint (from fingerprint.txt)
  5. Disconnect then reconnect trezor to USB.
  6. Go to (using CHROME) and initialize your device. (You have the option to restore your SEED words if you want to keep using the trezor with your current BTC (etc.) account.
  7. Close CHROME. Otherwise, it will not release the trezor USB device and simplewallet will not find it.
  8. Run simplewallet.exe --hardware-wallet n (n can be any reasonable number eg. --hardware-wallet 0)

PIN Entering:


Replies: 58
tatt88 posted 5 months ago Replies: 1 | Weight: 150 | Link [ - ]

It seems like the github repo is gone now. Has it been relocated somewhere? Also version 0925 link is dead.

Reply to: tatt88
skaht posted 5 months ago Replies: 1 | Weight: 150 | Link [ - ]

See Would not surprise me if the V0925 link is dead.

Reply to: skaht tatt88
tatt88 posted 5 months ago Weight: 150 | Link [ - ]

Thank you, I was able to find the code via the reddit threads. Much appreciated. Too bad to see that the project appears dead for the time being :/

skaht posted 7 months ago Replies: 2 | Weight: 51 | Link [ - ]

With neither the V313 nor V0925 firmware it is not possible to use trezorctl recover_mnemonic index passphrase language BIP39_word_list to recreate Wallet address: when there is a password. However, if the password is left as an empty string, the recover_mnemonic will cause trezorctl to synthesize the proper 25 Electrum seed words (used for traditional wallet recovery) and associated Monero address for both firmware versions. Wondering if the password recovery issue is somewhere after section of code opposed to inside the firmware?

Reply to: skaht
throughnothing edited 2 months ago Weight: 338 | Link [ - ]

Thanks for all the info you've provided on this skaht. Is there any information around how to either a) transfer XMR stored in a V0313 Trezor wallet WITH password to a new wallet, or b) retrieve the propery 24/25 word mnemonic or otherwise get the original key into a monero-wallet-cli somehow?

Edit: Also curious if someone has a fork of the original source code before it was taken down that they'd be willing to share (publicly or privately).

Reply to: skaht
NoodleDoodle posted 7 months ago Weight: 52 | Link [ - ]

It should be fixed here You need to clone monero then issue a submodule update before compiling.

skaht posted 7 months ago Weight: 50 | Link [ - ]

Tried a migration from the V313 firmware to V0925 firmware. Loaded okay and noticed the naming convention of the file was the firmware's fingerprint. However, I had to wipe and reset seed, PIN and password. I could access funds for prior account with no password. However, the funds for the same account with a password were invisible because a new address resulted from the upgrade. Rolling back to the older firmware. FYSA - If issues were opened up at, this posting would have been made there.

skaht posted 8 months ago Weight: 41 | Link [ - ]

Confirmed interoperability with a couple transaction tests during the Hydrogen Helix to Wolfram Warptangent transistion. v0313's simplewallet, a fork of Hydrogen Helix (v0.9.4), and the trezor.bin firmware appears to function with a freshly compiled Wolfram Warptangent (v0.10.0) node. Still no luck getting the v0313 trezorctl's recover_mnemonic to function on a Mac Yosemite platform.

Excited this HD wallet technology might be another immediate counter measure to the CSRF vulnerability. However, in the interim while this code is still considered to be experimental, there is a strong need for key recovery Plan B where one can take their Trezor BIP 39 seed words and the integer associated with the --hardware-wallet argument and create a list of 25 Electrum words that a non-HD monero-wallet-cli application uses to reconstitute a wallet using --restore-deterministic-wallet.

If this recovery capability existed, more people will start using this technology because people will have comfort in knowing they can recover their funds if a major bug is discovered in Monero HD implementation(s) or if future ungraceful Monero transaction or protocol changes occur.

skaht posted 8 months ago Weight: 38 | Link [ - ]

Confirmed that both a Trezor PIN and a password works with simplewallet. Had no luck getting trezorctl's recover_mnemonic functionality to work.

Sources to compile appear to be: 1. simplewallet 2. trezor.bin 3. trezorctl

My monero Hydrogen Helix (v0.9.4) bitmonerod node keeps giving me warnings upgrade. Any word about when Wolfram Warptangent (v0.10.0) monero-wallet-cli will be supported? (Not yet smart enough to get the sources above to compile.)

skaht posted 8 months ago Weight: 32 | Link [ - ]

Had a serious issue installing V0313 OSX64 using: % ./trezorctl update trezor.bin.

The message generated by a Trezor device with prior production Trezor firmware v.1.4.0 installed was: Firmware installation aborted. You need to repeat the procedure with the correct firmware.

Effectively, the V0313 supplied "notes.txt" file really needs a step 0 for those not installing the Monero firmware on Trezor device "straight out of its tamper proof box".

The solution was to wipe the Trezor device before the loading Monero firmware. Ended up using the package that has a Python implementation of trezorctl that can be easily inspected for how to apply, e.g. "python-trezor/trezorctl -h".

% python-trezor/trezorctl wipe_device <- Wiped the Trezor device to put it into a ground state prior to a 3-finger "bootloader" mode

% python-trezor/trezorctl firmware_update -f trezor.bin <- Is executed around 5 seconds after a Trezor device is connected into a USB port (to ensure a Trezor has hit steady state) with a Trezor 3-finger "bootloader" death grip prior to releasing the death grip.

From experimentation, I noticed uploading production Trezor firmware had no sensitivity to being previously wiped, for example following worked flawlessly:

% python-trezor/trezorctl firmware_update -u

If Trezor firmware files were downloaded locally using a command such as:

% curl -vL -o trezor-X.Y.Z.bin

It was a requirement to first wipe a functional Trezor device prior to uploading a local firmware file with a command of this form:

% python-trezor/trezorctl firmware_update -f trezor-X.Y.Z.bin

Fingerprints can be verified using piped commands to bitcoin-explorer (bx) *.bin Trezor firmware files, for example:

% tail -c +257 trezor.bin | bx base16-encode | bx sha256


Production Trezor firmware fingerprints are located here for those desiring rollback to production firmware.

Most everything else proceeded as expected. The number of wallet files decreased, no *.keys exist when an external HD device is used. The infamous "refresh" takes around 20 minutes.

However, I have an issue spending funds managed by a Trezor when I have a "password" in addition to my PIN. The wallet seems to think I have no funds to transfer when the balance shows otherwise.

If one is to compile Monero, what passed "make" arguments will cause the resulting "./build/release/bin/monero-wallet-cli" to support the "--hardware-wallet" input option? Not sure if my assumption that the "master" branch is currently the official fork prior to a Trezor merge into monero-project/monero?

Also, are there any details as to were the source to compile the Monero V0313 ./trezor.bin that is a fork of

allegro posted 8 months ago Weight: 31 | Link [ - ]

Since simplewallet has been renamed in 0.10 will you have to make a new release of your firmware for compatibility?

mmortal03 posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

"The viewkey is sent to the client. A bad client could potentially store these keys and see all incoming transactions to your account, privacy is then compromised."

A bad client, meaning only if simplewallet itself has been swapped out for something malicious on the machine, or is the communication channel that is passing the viewkey between the Trezor and simplewallet potentially insecure?

Reply to: mmortal03
NoodleDoodle edited 1 year ago Weight: 0 | Link [ + ]

A "bad client" refers to any software that communicates with the trezor, including a malicious simplewallet like you stated. The future GUI wallet, even a web based wallet like mymonero (in the future) can be used with the trezor, so this weakness has to be kept in mind.

The communications channel can be sniffed either through hardware or software. In order to mitigate this, a client first has to establish a "session" with the trezor, aftewards, all communication is encrypted. While this is not foolproof, it makes it harder to sniff data like viewkeys etc, using the usb interface. In contrast, the BTC part of the trezor never passes anything similar to a viewkey to a client, hence, there is no need to protect the raw information being passed. Technically, we can also introduce a similar mode with trezor (I'll call it the paranoid mode), in theory though, instead of taking about 3-5 minutes for the initial wallet sync, it would probably take days to do it (just a guesstimate, but it would be quite slow nonetheless).

NUKE1989 posted 1 year ago Weight: 0 | Link [ + ]

Not wanting to be pushy or something but are there any updates on it? I would really love to use my new trezor with monero. In fact i bought it especially for when xmr can be stored on it (loved it and i should have bought one earlier).

Are there any problems or simply not enough time?

leotreasure edited 1 year ago Weight: 0 | Link [ + ]

I'm on a mac (El Capitan) and stuck at this step:

Run simplewallet.exe --hardware-wallet n (n can be any reasonable number eg. --hardware-wallet 0)

Leos-MacBook-Pro:monero0-9-4-0 ./simplewallet --hardware-wallet 0

Failed to parse arguments: unrecognised option '--hardware-wallet'

Edit: Solved, just needed to run the simplewallet included in the firmware download.

leotreasure edited 1 year ago Weight: 0 | Link [ + ]

Got it working - this is really neat!! Thanks! I sent a small donation the other day. Any chance you or someone from the Trezor team can help us make an easier way to enter the pin similar to the way works?

ferretinjapan posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

I tried loading the firmware usng your instructions onto a completely new Trezor, loaded the firmware and initialised without a hitch. However, on running simplewallet, it returns the error that the library libdb_cxx-6.0.dll could not be found. I'm running a win7 64 bit machine.

Reply to: ferretinjapan
NoodleDoodle posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

I've updated the archive with the missing dll's, hopefully this fixes the problem.

Reply to: NoodleDoodle ferretinjapan
ferretinjapan posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

Thanks, that did the trick! It runs, but I have no idea how to input the pin properly when it is requested. How does that work on the command line?

Reply to: ferretinjapan NoodleDoodle ferretinjapan
NoodleDoodle edited 1 year ago Replies: 2 | Weight: 0 | Link [ + ]

Please use the numeric keypad to input the corresponding box.

Reply to: NoodleDoodle ferretinjapan NoodleDoodle ferretinjapan
ferretinjapan posted 1 year ago Weight: 0 | Link [ + ]

Ta. It looks pretty good so far. Wallet loads up after initialisation in chrome on, loaded up with simplewallet no problem, made a watching wallet from the viewkey which is synched on the 9.1 version of simplewallet. Looks like the watchonly wallet see all the transactions it is supposed to. Sent a Monero to the Trezor address and recognised the transaction on the network. Once it unlocked I sent some of it back after confirming it on the Trezor. Recognised by the network no problem. So far so good! Fantastic work getting this up and going BTW, I thought we'd be waiting more than a year for something even close to a Monero hardware wallet.

Reply to: NoodleDoodle ferretinjapan NoodleDoodle ferretinjapan
wedgy2k posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

I've only got the stoopid little MAC wireless keyboard :-( I'll nip off and dig my other one out

Reply to: wedgy2k NoodleDoodle ferretinjapan NoodleDoodle ferretinjapan
NoodleDoodle posted 1 year ago Replies: 1 | Weight: 0 | Link [ + ]

Use your imagination and lay out the normal num keys in a 3x3 matrix. :P

Reply to: NoodleDoodle wedgy2k NoodleDoodle ferretinjapan NoodleDoodle
wedgy2k posted 1 year ago Weight: 0 | Link [ + ]

LOL - you knew if it works for me it'll be fine for anyone.....

Works a treat, I plugged in old "BIG" Keyboard and have a hardware wallet address for XMR - thank you

I'm going to play with it via my remote RPi2 Node and send 1 or 2 back an forwards from / to Polo.

I'll even try and work out my 3x3 square..... :-D (Happy to do an idiots guide, by an idiot if you like?)