Skip to content

Commit

Permalink
Dev v1.0.7 (#57)
Browse files Browse the repository at this point in the history
* PASS1-133: Modify cosign file naming for fully signed binaries. (#34)

* PASS1-133: Modify cosign file naming for fully signed binaries.

* Remove all USE_CRYPTO, it is not used anymore

Also remove function that is not needed.

* Added use of firmware version from header, also fixed a seg fault

* PASS1-135: Fix sticky up or down key (#33)

* PASS1-135: Fix sticky up or down key

* Add comment for input.reset function

* PASS1-128: Add support back for Bitcoin testnet (#29)

* Fixes part of PASS-91

Show address and index of the address being verified

* Second half of fix for ENV1-91

Add better messaging for address range searching
Fix a bug when saving next_addrs (was comparing dicts by ref)

* Fixes PASS1-122

Check change addresses in addition to receive address in "Verify Address"

* Fix comment punctuation

* Show backup filename to user after successful backup (#18)

Fix PASS1-92

* Auto-truncate multisig config names (#19)

Fix PASS1-101

* PASS1-101: Auto-truncate multisig config names (#19)

Fix PASS1-101

* Remove unnecessary comments

* PASS1-92 (#20)

* Show backup filename to user after successful backup

Fix PASS1-92

* Add missing 'card' parameter to `get_backups_folder_path()` calls

* Revert path function changes since 'card' is not available

* PASS1-102: Fix backwards microSD issue

Found that `ErrorCode` in `SD_HandleTypeDef` was not reset after a failure.
Updated `HAL_SD_Init()` to reset it before attempting initialization.

* PASS1-102: Fix backwards microSD issue (#21)

Found that `ErrorCode` in `SD_HandleTypeDef` was not reset after a failure.
Updated `HAL_SD_Init()` to reset it before attempting initialization.

* PASS1-102_b (#22)

* PASS1-102: Fix backwards microSD issue

Found that `ErrorCode` in `SD_HandleTypeDef` was not reset after a failure.
Updated `HAL_SD_Init()` to reset it before attempting initialization.

* Switch back to hard-coded path for now

* PASS1-122_b (#23)

* PASS1-102: Fix backwards microSD issue

Found that `ErrorCode` in `SD_HandleTypeDef` was not reset after a failure.
Updated `HAL_SD_Init()` to reset it before attempting initialization.

* Update user messaging for found/not found case of Verify Address

Fix bug with trailing space at end of line in `word_wrap()`

* Strip ever time through the loop

* PASS1-125: Add Git commit-msg hook to check for Linear ID (#24)

* PASS1-125: Add Git commit-msg hook to check for Linear ID

* Update .githooks/commit-msg

Co-authored-by: Jean Pierre Dudey <[email protected]>

Co-authored-by: Jean Pierre Dudey <[email protected]>

* PASS1-122: Minor updates to text (#27)

* PASS1-127: Fix `reuse lint` issues in the repo (#26)

* PASS1-113: Give the user a way to clear the developer pubkey slot (#25)

* PASS1-122: Added "Address Verified" text to new wallet pairing (#28)

* PASS1-122: Minor updates to text

* PASS1-122: Added "Address Verified" text to new wallet pairing

* PASS1-128: Add support back for Bitcoin testnet

Co-authored-by: Ken Carpenter <[email protected]>
Co-authored-by: Ken Carpenter <[email protected]>
Co-authored-by: Jean Pierre Dudey <[email protected]>

* PASS1-56: Use XFP in backups filename and don't save `backup_num` (#32)

* PASS1-34: Refactor find address code so there is only one copy (#37)

* PASS1-94: Prevent installing user-signed firmware if no user-key installed (#38)

* PASS1-94: Prevent installing user-signed firmware if no user signing key installed

* Fixed case where user pubkey was removed manually

* Fixed text to match other areas where text is used

* Update text message for developer pubkey

* Hard coded user signed field to false

Co-authored-by: Ken Carpenter <[email protected]>

* PASS1-55: Add menu to switch to a different Passphrase without rebooting (#35)

* PASS1-55: Add menu to switch to a different Passphrase without rebooting

* Changed order of menu items in Passphrase menu

* Modified menu titles and removed "a" from inconsistent text

* PASS1-137: Add Justfile support to Gen 1 repo (#36)

* PASS1-137: Add Justfile support to Gen 1 repo

First pass - not all expected commands are added yet

* Update Justfile with fmt command

Add py and c/h formatting
Need to finalize .clang-format file before doing a full reformatting PR

* Refactor Justfiles to separate them out

Also add graphics build commands

* Update Justfiles a bit

Fix formatting of graphics header files in preparation for automatic code formatting

* PASS1-139: Implement code to allow OCD to capture a screenshot over JTAG (#42)

* PASS1-139: Implement code to allow OCD to capture a screenshot over JTAG

* Update sram4.py

* PASS1-132: Remove duplicate file compilation (#39)

* PASS1-78: In display.text_input, split lines based on pixel widths (#41)

* PASS1-78: In display.text_input, split lines based on pixel widths

* Check for StringIO object before calling split_by_char_size

* PASS1-89: Show exported filename when exporting wallet to microSD (#43)

* PASS1-89: Show exported filename when exporting wallet to microSD

* Deleted/commented unnecessary lines

* PASS1-136: Add Specter wallet back once they fix UR issues (#44)

* PASS1-136: Add Specter wallet back once they fix UR issues

* Rebase onto dev-v1.0.7

* Remove passport from export filename

* Remove flag from all wallets besides Specter wallet

* Removed flag from unnecessary field and renamed flag to import

* Renamed multisig_import function

* PASS1-112: Passphrase input dialog improvements (#48)

* PASS1-112: Passphrase input dialog improvements

The passphrase is limited to 64 characters. The line spacing was reduced to make room for 7 lines. 63 capital W's will fill all 7 lines (+1 over), otherwise 64 characters usually takes about 4 lines.

* Add constant for max message length

* TOOL-3: Setup Docker infra for Gen 1 Development (#45)

* Add Dockerfile for building the firmware

Setting up a local environment for building the firmware can be a
painful process. This wraps that process up in a Dockerfile containing
all the deps needed which is then used in the justfile to build the
firmware.

* Add just targets for signing and cleaning

* Change sha target to take a sha and verify it directly

* Add docs for verifying the firmware SHA sum

* Add version param to sign just target

* Update verify-sha output to be more explicit

* PASS1-67: Change unit to sats in settings (#46)

* PASS1-67: Change unit to sats in settings

* Added warnings for Testnet and made the setting volatile

* Added 'chain' removal to schema_evolution and moved Units menu to top

* Moved Units below Change Pin in menu

* TOOL-4: Implement CI for Passport Gen 1 build (#49)

* TOOL-4: Create CI for firmware build

* TOOL-4: Improve handling of git describe output

* TOOL-4: Rename Justfile to match others in repo

* TOOL-4: Add caching and separated Docker building in CI

* TOOL-4: Update CI to push image to local registry service

* TOOL-4: Update CI to allow customizing of D_BASE

* TOOL-4: Change clang format action

* TOOL-4: User correct clang format version

* TOOL-4: YAML :(

* TOOL-4: Update to clang-format-10.0

* TOOL-4: Updaet to 10

* TOOL-4: Build and export the bootloader

* TOOL-4: Add D_BASE to bootload build step

* TOOL-4: Correctly pass D_BASE to bootloader job

* TOOL-4: Update bootloader make path in Justfile

* TOOL-4: Update CI to output tools

* PASS1-140: Add Justfile commands to DEVELOPMENT.md (#51)

* PASS1-140: Add Justfile commands to DEVELOPMENT.md

* Update DEVELOPMENT.md

* Update DEVELOPMENT.md

Co-authored-by: Ken Carpenter <[email protected]>

* PASS1-148: Fix missing address prefixes for testnet (#53)

* PASS1-148: Fix missing address prefixes for testnet

* Add comma separations to sats values

* Casa support added

* Added testnet prefix check to Verify Address process

* PASS1-150: Fixed missing argument in `import_from_psbt()` call (#55)

* PASS1-150: Fixed missing argument in `import_from_psbt()` call

Also fixed typo in function description.

* Added a space between value and label of BTC/sats

* Disable Casa Support

Casa has not approved the support for Passport yet, until then Casa is disabled temporarily.

Co-authored-by: Corey Lakey <[email protected]>
Co-authored-by: Jean Pierre Dudey <[email protected]>
Co-authored-by: Alex Sears <[email protected]>
  • Loading branch information
4 people authored Sep 20, 2021
1 parent a31d0bd commit 428a1f0
Show file tree
Hide file tree
Showing 64 changed files with 1,119 additions and 313 deletions.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
cosign
7 changes: 3 additions & 4 deletions .githooks/commit-msg
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
# SPDX-FileCopyrightText: 2021 Foundation Devices, Inc. <[email protected]>
# SPDX-License-Identifier: GPL-3.0-or-later

TEAM_PREFIX='PASS1'
commit_regex="^($TEAM_PREFIX-[0-9]+:\ )"
commit_regex="^([A-Z]+[0-9]*-[0-9]+:\ )"

if ! `grep -iqE "$commit_regex" "$1"`; then
if ! grep -iqE "$commit_regex" "$1"; then
echo "=========================================================================================" >&2
echo "Aborting commit. Your commit message must start with a Linear issue ID, colon then space." >&2
echo "Example: '$TEAM_PREFIX-123: ' (To commit anyway, use the --no-verify option)" >&2
echo "Example: 'PASS1-123: ' (To commit anyway, use the --no-verify option)" >&2
echo "=========================================================================================" >&2
exit 1
fi
126 changes: 126 additions & 0 deletions .github/workflows/validate_and_build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Validate and Build
on: [push]
jobs:
lint-py:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pycodestyle
- name: Setup just
uses: extractions/setup-just@aa5d15c144db4585980a44ebfdd2cf337c4f14cb
- name: Analysing the code
run: just ports/stm32/lint-py
continue-on-error: true

lint-c:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Analysing the code
uses: jidicula/clang-format-action@7f6b4bf5a7eb211c0872364ccd8072ff8a77ac44
with:
clang-format-version: '10'
check-path: ./ports/stm32
exclude-regex: trezor-firmware
continue-on-error: true

build-firmware:
runs-on: ubuntu-18.04
needs: [lint-py, lint-c]
services:
registry:
image: registry:2
ports:
- 5000:5000
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
with:
driver-opts: network=host

- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build the dependency Docker image
uses: docker/build-push-action@v2
with:
push: true
tags: localhost:5000/foundation-devices/firmware-builder:${{ github.sha }}
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache

- name: Setup just
uses: extractions/setup-just@aa5d15c144db4585980a44ebfdd2cf337c4f14cb

- name: Build the firmware
run: |
echo "$SIGNING_KEY" > signing_key.pem
version=$(git describe --all --match *dev* | awk '{print $NF}' | cut -d '-' -f 2)
just DOCKER_REGISTRY_BASE="$D_BASE" sign signing_key.pem "${version#?}"
env:
SIGNING_KEY: ${{ secrets.UserSigningKey }}
D_BASE: localhost:5000/

- name: Build the bootloader
run: just DOCKER_REGISTRY_BASE="$D_BASE" bootloader-build
env:
D_BASE: localhost:5000/

- name: Build and make tools available
run: just DOCKER_REGISTRY_BASE="$D_BASE" tools
env:
D_BASE: localhost:5000/

- name: Upload built firmware file
uses: actions/upload-artifact@v2
with:
name: firmware.bin
path: ports/stm32/build-Passport/firmware.bin

- name: Upload signed firmware file
uses: actions/upload-artifact@v2
with:
name: firmware-key-user.bin
path: ports/stm32/build-Passport/firmware-key-user.bin

- name: Upload bootloader
uses: actions/upload-artifact@v2
with:
name: bootloader.bin
path: ports/stm32/boards/Passport/bootloader/arm/release/bootloader.bin

- name: Upload cosign
uses: actions/upload-artifact@v2
with:
name: cosign
path: cosign

- name: Upload add-secrets
uses: actions/upload-artifact@v2
with:
name: add-secrets
path: ports/stm32/boards/Passport/tools/add-secrets/x86/release/add-secrets

- name: Upload word_list_gen
uses: actions/upload-artifact@v2
with:
name: word_list_gen
path: ports/stm32/boards/Passport/tools/word_list_gen/word_list_gen
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,7 @@ ports/stm32/secrets*
ports/stm32/boards/Passport/bootloader/version_info.c

ports/stm32/boards/Passport/bootloader/secrets*

*.pem
.vscode
cosign
31 changes: 31 additions & 0 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,21 @@ Several tools are required for building and debugging Passport.
sudo apt install python3-pip
sudo pip3 install rshell # (this should install rshell in /usr/local/)

### Using Justfile commands
To use Just for running commands, first follow the instructions here: https://github.com/casey/just#installation to install Just. Note that `Pillow` must be updated to `8.3.1` for all commands to work properly.

Once Just has been installed, the developer can use `just` commands to perform actions such as building, flashing, resetting and even taking screenshots of the displays screen.

Note that all `just` commands must be run from `ports/stm32/` directory.

Here are some of the most common `just` commands and their usages:

just flash {version} - Builds if necessary, signs with a user key and then flashes the device with the firmware binary created under `build-Passport/`
just reset - Resets the device
just screenshot {filename} - Screenshots the device and saves to the desired filename

See the `Justfile` included in our source for the full list of `just` commands.

## Building
### Open Shell Windows/Tabs
You will need several shell windows or tabs open to interact with the various tools.
Expand All @@ -67,6 +82,10 @@ You should see it building various `.c` files and freezing `.py` files. Once co
GEN build-Passport/firmware.dfu
GEN build-Passport/firmware.hex

If you are using `just` commands, then building the firmware can be done by running the following command:

just build

#### Code Signing
In order to load the files onto the device, they need to first be signed by two separate keys.
The `cosign` program performs this task, and it needs to be called twice with two separate
Expand All @@ -91,6 +110,12 @@ You can also dump the contents of the firmware header with the following command

cosign -f build-Passport/firmware-signed-signed.bin -x

If you are using `just` commands, then signing the firmware can be done by running the following command with the desired version:

just sign 1.0.7

It will build the firmware first if necessary.

#### Building the Bootloader
To build the bootloader do the following:

Expand Down Expand Up @@ -148,6 +173,12 @@ These commands do the following:
- Write the firmware to flash at address 0x8000000
- Reset the MCU and start executing code at address 0x8000000

If you are using `just` commands, ocd and telnet steps are not required and instead, flashing the firmware can be done using the following command with the desired version number:

just flash 1.0.7

It will build and sign the firmware first if necessary.

### RShell Window
We use `rshell` to connect to the MicroPython device over USB serial. Open another shell and run:

Expand Down
33 changes: 33 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
FROM ubuntu:18.04 AS cross_build
RUN apt-get update && \
apt-get install -y git make gcc-arm-none-eabi python3 gcc && \
rm -rf /var/lib/apt/lists/*
COPY drivers /workspace/passport-firmware/drivers
COPY docs /workspace/passport-firmware/docs
COPY extmod /workspace/passport-firmware/extmod
COPY lib /workspace/passport-firmware/lib
COPY mpy-cross /workspace/passport-firmware/mpy-cross
COPY py /workspace/passport-firmware/py
WORKDIR /workspace/passport-firmware/mpy-cross
RUN make

FROM ubuntu:18.04 AS cosign_build
WORKDIR /workspace
RUN apt-get update && \
apt-get install -y git make libssl-dev gcc && \
rm -rf /var/lib/apt/lists/*
COPY ports/stm32/boards/Passport/tools/cosign /workspace/passport-firmware/ports/stm32/boards/Passport/tools/cosign
COPY ports/stm32/boards/Passport/include /workspace/passport-firmware/ports/stm32/boards/Passport/include
COPY lib /workspace/passport-firmware/lib
COPY ports/stm32/boards/Passport/common /workspace/passport-firmware/ports/stm32/boards/Passport/common
WORKDIR /workspace/passport-firmware/ports/stm32/boards/Passport/tools/cosign
RUN make

FROM ubuntu:18.04 AS firmware_builder
COPY --from=cosign_build \
/workspace/passport-firmware/ports/stm32/boards/Passport/tools/cosign/x86/release/cosign /usr/bin/cosign
COPY --from=cross_build \
/workspace/passport-firmware/mpy-cross/mpy-cross /usr/bin/mpy-cross
RUN apt-get update && \
apt-get install -y make gcc-arm-none-eabi autotools-dev automake libtool python3 && \
rm -rf /var/lib/apt/lists/*
100 changes: 100 additions & 0 deletions Justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
export DOCKER_REGISTRY_BASE := ''

commit_sha := `git rev-parse HEAD`
docker_image := 'foundation-devices/firmware-builder:' + commit_sha
base_path := 'ports/stm32'
firmware_path := base_path + '/build-Passport/firmware.bin'

# build the docker image and then the firmware and bootloader
build: docker-build firmware-build bootloader-build

# build the dependency docker image
docker-build:
#!/usr/bin/env bash
set -exo pipefail
docker build -t ${DOCKER_REGISTRY_BASE}{{ docker_image }} .
# build the firmware inside docker
firmware-build:
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace/{{ base_path }} \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c 'make BOARD=Passport MPY_CROSS=/usr/bin/mpy-cross'
# build the bootloader inside docker
bootloader-build:
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace/{{ base_path }} \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c 'make -C boards/Passport/bootloader'
# build the docker image and get the tools from it
tools: docker-build cosign-tool add-secrets-tool word-list-gen-tool

# get cosign tool from built docker image
cosign-tool:
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c 'cp /usr/bin/cosign cosign'
# get add-secrets tool from built docker image
add-secrets-tool:
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c 'make -C ports/stm32/boards/Passport/tools/add-secrets'
# get word_list_gen tool from built docker image
word-list-gen-tool:
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace/ports/stm32/boards/Passport/tools/word_list_gen \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c 'gcc word_list_gen.c bip39_words.c bytewords_words.c -o word_list_gen'
# run the built firmware through SHA256
verify-sha sha: build
#!/usr/bin/env bash
sha=$(shasum -a 256 {{ firmware_path }} | awk '{print $1}')
echo -e "Expected SHA:\t{{ sha }}"
echo -e "Actual SHA:\t${sha}"
if [ "$sha" = "{{ sha }}" ]; then
echo "Hashes match!"
else
echo "ERROR: Hashes DO NOT match!"
fi

# sign the built firmware using a private key and the cosign tool
sign keypath version filepath=firmware_path: firmware-build
#!/usr/bin/env bash
set -exo pipefail
docker run --rm -v "$PWD":/workspace \
-w /workspace \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c "cosign -f {{ filepath }} -k {{ keypath }} -v {{ version }}"

# clean firmware build
clean:
docker run --rm -v "$PWD":/workspace \
-w /workspace/{{ base_path }} \
--entrypoint bash \
${DOCKER_REGISTRY_BASE}{{ docker_image }} \
-c "make clean BOARD=Passport"
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,14 @@ Code specific to Passport is included in the following folders:

Please see [`DEVELOPMENT.md`](https://github.com/Foundation-Devices/passport/blob/main/DEVELOPMENT.md) for information on developing for Passport.

## Verifying Firmware SHA Sums

To make building and verifying the firmware a simple process, there is a Dockerfile in the project that builds an image to be used to build the firmware. Using [`just`](https://github.com/casey/just), the following command can be used to verify the reproducability of the firmware. Make sure to substitute `<the sha sum>` for the SHA string to verify.

```shell
just verify-sha <the-sha-sum>
```

## Open Source Components

Passport's firmware incorporates open-source software from several third-party projects, as well as other first-party work we open-sourced.
Expand Down
Loading

0 comments on commit 428a1f0

Please sign in to comment.