Skip to content

Instantly share code, notes, and snippets.

@RCasatta
Created November 29, 2024 14:31
Show Gist options
  • Save RCasatta/62d87846baa568ed5c51e07838d48f1b to your computer and use it in GitHub Desktop.
Save RCasatta/62d87846baa568ed5c51e07838d48f1b to your computer and use it in GitHub Desktop.
No HWW, no problem!
---
title: No HWW, no problem!
author: Riccardo Casatta
date: 2024
theme: Madrid
colortheme: dolphin
links-as-notes: true
# Sono Riccardo Casatta, ingegnere informatico, ho lavorato nella Consulenza prima di ammalarmi di bitcoin, al che invece di continuare a fare un lavoro becero e accumulare coin ho deciso di fare una startup, Eternity Wall che ha lavorato con Peter Todd per produrre il protocollo OpenTimestamps di cui ancora oggi mantengo uno dei calendar server ufficiali.
# Adesso lavoro in Blockstream, ma come vedete dalla prima slide, non ho messo affiliation a giudicare dal titolo non so se i miei colleghi di Jade sono felici. Non lo so forse dopo questa presentazione potrebbero anche aumentare le vendite, vediamo
# see https://github.com/alexeygumirov/pandoc-beamer-how-to for other fields
---
## How do you make transactions?
<!--
Questa e' l'ipotesi, parliamo solo di chi fa self-custody non di exchange.
- lo stolto e' all'oscuro dei rischi, usa il computer di tutti i giorni, connesso a internet, per fare transazioni bitcoin. Non credo ci siano in realta' questi utenti, se uno e' aware della self-custody in genere e' aware dei rischi informatici
- Normalmente la maggior parte delle persone usa hardware wallet, il chiaro vantaggio e' di avere un dispositivo separato, non connesso direttamente ad internte. Quindi ridotta superficie di attacco .
- La persona di destra si crede smart, lo sara'? Utilizza un software wallet su un vecchio device, la fondamentale differenza rispetto al tonto e' che non c'e' un cavo dii rete.
-->
![Gauss meme](gauss_meme.png)
## General purpose offline signing
![Online offline diagram](online-offline.svg)
<!--
di fatto, bene o male, questo e' il principio degli hww
il topic di questa presentazione e' di usare un device general purpose come offline signer
e ovviamente un watch only, senza chiavi nel device online
-->
## The problem
How to transfer information?
* keyboard ([glacier protocol](https://glacierprotocol.org/), rusty's protocol) <!-- mooolto scomodo -->
* cable (usb/ethernet) <!-- il punto non era non essere connessi -->
* radio (blueetoth/wifi) <!-- ancora peggio -->
* animated QR codes <!-- custom software / infinite bandwith -->
<!-- minimizzare quanto possibile banda, massimizzare user experience -->
## Solution
![General purpose barcode scanner](barcode-scanner.jpeg){height=70%}
<!-- La soluzione ce la da' la cassiera dell'esselunga (Migros) -->
## Comparison
Feature | HWW | GP offline signing
----------------|:----------:|:-----------------:
User experience | \checkmark | <!-- Even though the barcode scanner... :) -->
Cost | | \checkmark <!-- supposing to have spare devices...-->
Accountability | | \checkmark <!-- Meaning a raspberry is not meant for bitcoin, evil maid recognize the hww not the pc -->
Centralization | | \checkmark <!-- Mexican scam of hardware producer, deterministic signing /timing -->
Flexibility | | \checkmark <!-- For example sign a bunch of presigned nlocktimed tx -->
## Tools
- [firma2](https://github.com/RCasatta/firma2) - PSBT signer
- `derive`
- `sign`
- `address`
- [multiqr](https://github.com/RCasatta/multiqr) - QR codes
- [age](https://github.com/FiloSottile/age) - Encryption tool
- [bitcoin core](https://github.com/bitcoin/bitcoin) - Node/Wallet
- [nix](https://nixos.org) - Packaging and more
## Nix
<!-- Nix: immagina un mondo dove ogni dipendenza e' indicizzata per il suo hash -->
<!-- Problemi di una macchina offline e' come installare il software necessario senza internet... -->
### Create image
```
git clone https://github.com/RCasatta/firma2
cd build-raspi4-image
nix build .#image.rpi4
```
### Burn on the key
```
sudo pv result/sd-image/nixos-sd-image-...img \
-Yo /dev/disk/by-id/usb-MXT-USB_Storage_Device_-0:0
```
## Split mnemonic
![Split mnemonic](two-pieces-puzzle-ai-broken.jpeg){height=60%}
<!-- l'immagine non era as intended, pezzi non si incastrano, errori ortografici, bordi non presenti, AI not there yet -->
<!-- perche' separata, per non averla in unico posto, per averla il minor tempo possibile composta -->
<!-- Out of scope come creare la mnemonica, qui ipotizziamo di averla gia'... codex32... -->
Out of scope how to generate the mnemonic, the coolest way is [codex32](https://www.secretcodex32.com/)
---
![MNEMONIC.age](MNEMONIC.age.bmp){height=70%}
<!-- input the mnemonic in clear text, save it encrypted -->
```
cat - | age -e -p -o MNEMONIC.age
cat MNEMONIC.age | base32 | multiqr --bmp MNEMONIC.age.bmp
```
<!-- put the encrypted mnemonic in a QR -->
---
![AGE_PASSPHRASE](AGE_PASSPHRASE.bmp){height=70%}
```
cat - | multiqr --bmp AGE_PASSPHRASE.bmp
```
## Create descriptors (offline)
```sh
vim MNEMONIC.age # scan QR code
vim AGE_PASSPHRASE # scan QR code
export NETWORK=signet
export DESCRIPTOR=$(cat MNNEMONIC.age | age -d | derive | \
jq -r .singlesig.bip86_tr.multipath)
export IMPORT=$(cat MNNEMONIC.age | age -d | derive | \
jq -r .singlesig.bip86_tr.core_import_descriptor)
```
## Bitcoin core (online)
```sh
alias bcli="bitcoin-cli --chain=signet -named"
bcli createwallet wallet_name=lugano blank=true \
disable_private_keys=true
bcli importdescriptors $IMPORT
bcli getnewaddress address_type=bech32m
bcli walletcreatefundedpsbt ...
```
---
![PSBT part 1](psbt_0.bmp){height=70%}
---
![PSBT part 2](psbt_1.bmp){height=70%}
## Sign (offline)
```sh
vim psbt # scan QR code
cat MNEMONIC.age | age -d | sign psbt | jq ...
```
## Broadcast (online)
```sh
vim tx # scan QR code
bitcoin-cli sendrawtransaction $(cat tx)
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment