base on Firmware code of the BitBox02 hardware wallet <img src="./doc/BB02_logo_github.svg" width="345px"/> ![CI](https://github.com/BitBoxSwiss/bitbox02-firmware/workflows/ci/badge.svg?branch=master) The BitBox02 is a hardware wallet that simplifies secure handling of crypto coins through storing private keys and signing transactions. The content of this repository is the bootloader and firmware used on the device. The BitBox02 is meant to be used primarily with the [BitBoxApp](https://github.com/BitBoxSwiss/bitbox-wallet-app), although third party integration is possible through the BitBox02 API. The main functionality of the firmware is the following: * Safely receive and send coins. * Interacting with the user through touch sliders and a display. * Back up the seed to a microSD card. * Back up the seed by displaying the BIP39 mnemonic encoding on the screen. * Import 12, 18 or 24 word BIP39 mnemonics * Generate a random seed from multiple strong sources of entropy. * Protect the seed from attackers. * Derive keys from the seed according to BIP39 and BIP32. * Return the extended public key for a keypath so that the app can find all unspent transaction outputs. * Display the receive address for the keypath, coin and script/address type. * Display the receive address, transaction amount and network fee and sign each input after confirmation. ## Architecture <p align="center"><img src="./doc/bb02-firmware-arch.svg" width="80%" /></p> The main chip on the device is the microcontroller from Microchip (ATSAMD51J20A). This chip is used for communication to the BitBoxApp via USB, to the user via the sliders and to the secure element (ATECC608B) via I2C. ### Sliders The sliders along the edges of the device are used for user input. There are three input gestures: * Tap * Slide * Hold to confirm <p align="center"><img src="./doc/bb02PwEntry.gif" /></p> ### USB The USB communication is implemented using the request-response pattern with encrypted protobuf messages. The encryption protocol used is Noise with out-of-band authentication. ### Hardware docs [PCB schematics v2.1](./doc/bb02_v2.10_schematics.pdf) [PCB bill of materials (BOM) v2.1](./doc/bb02_bom_v2.10.pdf) [PCB x-ray v2.1](./doc/bb02_xray_v2.10_top_pcb.png) ## Contributing The instructions for setting up a development environment can be found in [BUILD.md](BUILD.md). Please also read our [CONTRIBUTING.md](CONTRIBUTING.md) before filing issues and pull requests. ### Simulator To test without hardware there are two kinds of simulators. One with GUI and one without. See more details in [BUILD.md](BUILD.md#build-the-simulator). <p align="center"><img src="./doc/bb02-simulator-graphical.png" /></p> ## Installing/upgrading firmware There are two main ways to install or upgrade firmware on a BitBox02: 1. by running the [BitBoxApp](https://github.com/BitBoxSwiss/bitbox-wallet-app/) 2. by running [./py/load_firmware.py](./py/load_firmware.py) after installing the [bitbox02](./py) Python package, e.g. `./py/load_firmware.py firmware-btc.v9.12.0.signed.bin`. ## Reporting a vulnerability See our [security policy](SECURITY.md). ", Assign "at most 3 tags" to the expected json: {"id":"11242","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"