Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
6bc3bb3
fix: widen TokenType.chain_id from uint8_t to uint32_t
BitHighlander May 21, 2026
0646335
fix: EIP-712 cancel propagation and strtoll input validation
BitHighlander May 21, 2026
cf288b9
fix: TON blind sign — stop displaying deprecated fields not in raw_tx
BitHighlander May 21, 2026
42f19cb
fix: TRON blind sign — stop displaying deprecated fields not in raw_data
BitHighlander May 21, 2026
2fbd1ea
fix: add blind-sign gate to TRON TIP-712 typed hash signing
BitHighlander May 21, 2026
2690731
fix: use instruction decimals for Solana TransferChecked amount display
BitHighlander May 21, 2026
fd6bf32
feat(thorchain): allow any denom in ThorchainMsgSend (TCY, RUJIRA, etc.)
BitHighlander May 15, 2026
5344684
fix(thorchain): validate denom charset + exact signature test vectors
BitHighlander May 15, 2026
4708661
fix(thorchain): validate denom before display; separate amount/asset …
BitHighlander May 15, 2026
951769f
fix: fault injection hardening for signature verification
BitHighlander Mar 23, 2026
431969d
style: apply clang-format-20
BitHighlander May 21, 2026
007ca03
feat(ripple): add memo/Memos field support for THORChain XRP routing
BitHighlander May 15, 2026
da3a62d
fix: BIP-39 per-word validation during cipher recovery
BitHighlander Mar 29, 2026
a0be7a5
fix: widen prev_info buffer (16->24) for -Wformat-truncation
BitHighlander Mar 29, 2026
f38a57f
chore: pin device-protocol to UPSTREAM keepkey/master (f2c3c005ad82)
BitHighlander Jun 30, 2026
a8e3ab4
chore: pin device-protocol to UPSTREAM keepkey/master (f2c3c005ad82)
BitHighlander Jun 30, 2026
a66e744
style: clang-format-20 the staged fix
BitHighlander Jun 30, 2026
74370c6
fix(maya): show 'Maya data' instead of 'Thorchain data' for Maya Prot…
BitHighlander Mar 25, 2026
cd4f700
style: clang-format-20 the staged fix
BitHighlander Jun 30, 2026
befed0e
style: clang-format-20 the staged fix
BitHighlander Jun 30, 2026
cb4ca5c
style: clang-format-20 the staged fix
BitHighlander Jun 30, 2026
a8b625c
fix(maya): declare conf as const char* (string literals are const; -W…
BitHighlander Jun 30, 2026
aecdc1d
feat: BIP-85 child mnemonic derivation (display only)
BitHighlander Mar 26, 2026
91bdd34
fix: add bip85.h include to fsm.c for ARM -Werror=implicit-function-d…
BitHighlander Mar 26, 2026
03534e2
style: clang-format-20
BitHighlander Jun 30, 2026
8810d72
fix(bip85): drop redundant '| 0' bitmask (cppcheck badBitmaskCheck)
BitHighlander Jun 30, 2026
5725958
Merge PR #262 (stage/token-chain-id) into develop [rc]
BitHighlander Jun 30, 2026
c2202fc
Merge PR #263 (stage/eip712-security) into develop [rc]
BitHighlander Jun 30, 2026
21d0de3
Merge PR #264 (stage/ton-blind-sign) into develop [rc]
BitHighlander Jun 30, 2026
1156df2
Merge PR #265 (stage/tron-blind-sign) into develop [rc]
BitHighlander Jun 30, 2026
bc1f342
Merge PR #266 (stage/tron-tip712-gate) into develop [rc]
BitHighlander Jun 30, 2026
94eeb8a
Merge PR #267 (stage/solana-token-decimals) into develop [rc]
BitHighlander Jun 30, 2026
d3ecb18
Merge PR #268 (stage/maya-evm-display) into develop [rc]
BitHighlander Jun 30, 2026
3842adf
Merge PR #271 (stage/fault-injection) into develop [rc]
BitHighlander Jun 30, 2026
402013c
Merge PR #272 (stage/bip39-recovery) into develop [rc]
BitHighlander Jun 30, 2026
cbe92fc
Merge PR #273 (stage/bip85) into develop [rc]
BitHighlander Jun 30, 2026
6c7e325
build(deps): pin device-protocol to up/release-protocol (f9e60819) fo…
BitHighlander Jun 30, 2026
ffb72ba
Merge PR #269 (stage/thorchain-any-denom) into develop [rc]
BitHighlander Jun 30, 2026
5d1bdba
Merge PR #270 (stage/ripple-memo) into develop [rc]
BitHighlander Jun 30, 2026
bc5f147
style(bip85): declare strtok result 'tok' as const char* (cppcheck co…
BitHighlander Jun 30, 2026
28c74a0
test: disable stale mayachain.cpp unit (2-arg call vs 3-arg denom sig)
BitHighlander Jun 30, 2026
1838c56
test(coins): allowlist 8 legacy tokens with no live token entry in Ta…
BitHighlander Jun 30, 2026
fbb2050
test(thorchain): disable 4 SignTx vectors built on a zero-key fixture
BitHighlander Jun 30, 2026
d9967ea
fix(eth): canonicalise zero-valued RLP integer fields (strip leading …
BitHighlander Jul 1, 2026
1a56949
feat(hive): SLIP-0048 Hive support (HiveGetPublicKey/s, SignTx, Accou…
BitHighlander Jul 1, 2026
5648e53
fix(eth): strip leading zeros in RLP list-length calc to match hashed…
BitHighlander Jun 29, 2026
46ecd08
fix(eth): always hash EIP-1559 priority fee so Stage 1/2 agree
BitHighlander Jun 29, 2026
a404625
style: clang-format RLP length helper call sites in ethereum.c
BitHighlander Jun 29, 2026
4cce2fb
fix(eth): enforce EIP-1559 tx-type/fee-field consistency before signing
BitHighlander Jun 29, 2026
8700084
fix(eth): clear-sign handler gating + 0x drainer hardening (port alph…
BitHighlander Jul 1, 2026
80a088e
fix(eth): pin THORChain router to current v4 + validate memo offset (…
BitHighlander Jul 1, 2026
0394b03
chore(deps): pin python-keepkey -> 452ca986 (keepkey/python-keepkey P…
BitHighlander Jul 1, 2026
4f387d5
feat(insight): signed-metadata clear-signing + AdvancedMode blind-sig…
BitHighlander Jul 1, 2026
441d121
feat(zcash): Orchard shielded support — PCZT signing, FVK export, uni…
BitHighlander Jul 1, 2026
ae58a4f
Merge PR #275 (eip1559 zero-priority RLP canonicalisation) into devel…
BitHighlander Jul 1, 2026
7404ac3
Merge PR #279 (stage/zcash-orchard: eth-hardening #255/#260/#261 + in…
BitHighlander Jul 1, 2026
565add6
Merge PR #276 (feat/hive-to-develop: SLIP-0048 Hive support) into dev…
BitHighlander Jul 1, 2026
9f5e971
fix(build): split hive nanopb generation into its own protoc COMMAND
BitHighlander Jul 1, 2026
b3e38b3
chore: bump firmware version 7.14.1 -> 7.15.0 for the 7.15 release line
BitHighlander Jul 2, 2026
aee9c95
feat(clearsign): runtime-loaded signers with mandatory warning screen…
BitHighlander Jul 2, 2026
62ec4ab
fix(clearsign): drop loaded signers on device wipe
BitHighlander Jul 2, 2026
bf7582a
fix(clearsign): strict alias allowlist; fix FW_VERSION detection for …
BitHighlander Jul 2, 2026
e888f65
chore: bump python-keepkey pin (bip85 requires_message probe fix)
BitHighlander Jul 2, 2026
0737cd0
style: clang-format-20 wrap in clearsign load handler + fingerprint sig
BitHighlander Jul 2, 2026
ed03369
feat(clearsign): human-readable WHAT — STRING + TOKEN_AMOUNT arg formats
BitHighlander Jul 2, 2026
c795cbb
chore: bump python-keepkey pin — full 7-flow hex-free clearsign suite…
BitHighlander Jul 2, 2026
aa25dce
chore: bump python-keepkey pin — CLEARSIGN_FLOWS catalog + batch vali…
BitHighlander Jul 2, 2026
c8951e4
chore: bump python-keepkey pin (batch assert fix)
BitHighlander Jul 2, 2026
acaacc9
chore: bump python-keepkey pin — 51-flow real-world clearsign catalog
BitHighlander Jul 2, 2026
5dd90c9
chore: bump python-keepkey pin (report decode-line fix)
BitHighlander Jul 2, 2026
7f635a3
Merge PR #281 (feat/clearsign-signer-warning: phase-1 warning-before-…
BitHighlander Jul 2, 2026
4701ca5
feat(build): BITCOIN_ONLY + ZCASH_PRIVACY build flags
BitHighlander Jul 3, 2026
d52260c
feat(storage): lock a bitcoin-only seed to bitcoin-only firmware
BitHighlander Jul 3, 2026
3ac942f
fix(features): report KeepKeyBTC/EmulatorBTC variant for bitcoin-only…
BitHighlander Jul 3, 2026
24027d7
test(emulator): build bitcoin-only emulator by gating coin unit tests
BitHighlander Jul 3, 2026
4e4bf53
style: clang-format the bitcoin-only lock/variant additions
BitHighlander Jul 3, 2026
967e790
Merge pull request #282 from BitHighlander/feat/build-flags-bitcoin-o…
BitHighlander Jul 3, 2026
b8cbb97
feat(clearsign): v2 static-schema blobs + on-device calldata decode
BitHighlander Jul 3, 2026
7629932
fix(clearsign): harden v2 enforce with explicit decode flag; idempote…
BitHighlander Jul 3, 2026
b565f19
chore(deps): bump python-keepkey to feat/clearsign-v2-static-schema
BitHighlander Jul 3, 2026
ecffaa0
fix(clearsign): reset v2 decode flag per matches_tx call (no stale pr…
BitHighlander Jul 3, 2026
74ad218
Merge pull request #284 from BitHighlander/feat/clearsign-static-schema
BitHighlander Jul 3, 2026
fa31202
feat(tron): clear-sign TransferContract and TRC-20 transfers from raw…
BitHighlander Jul 3, 2026
991db99
fix(tron): reject overlong 10-byte protobuf varints instead of trunca…
BitHighlander Jul 3, 2026
8af7248
style: clang-format 20.1.8 (CI's pinned formatter version)
BitHighlander Jul 3, 2026
ca7c569
feat(thorchain,maya): show affiliate fee in swap memos; harden maya d…
BitHighlander Jul 3, 2026
6e6cbcb
fix(thorchain,maya): keep the memo's last byte on the OP_RETURN path;…
BitHighlander Jul 3, 2026
b7d7c31
fix(mayachain): validate denom at the signer layer; fix memo copy off…
BitHighlander Jul 3, 2026
3d9be49
style: clang-format 20.1.8 (CI's pinned formatter version)
BitHighlander Jul 3, 2026
3501170
chore(deps): re-pin python-keepkey — gate legacy raw_data tests behin…
BitHighlander Jul 6, 2026
a478a23
Merge pull request #285 from BitHighlander/feat/tron-clearsign
BitHighlander Jul 6, 2026
cc2d11f
feat(solana): clear-sign v0 transactions and memo bodies; verify tx-s…
BitHighlander Jul 3, 2026
4d69d6d
style: clang-format 20.1.8 (CI's pinned formatter version)
BitHighlander Jul 3, 2026
a80e0bc
chore(deps): re-pin python-keepkey — fix stale versioned-v0 test expe…
BitHighlander Jul 6, 2026
37251e5
Merge pull request #286 from BitHighlander/feat/solana-clearsign-v0
BitHighlander Jul 6, 2026
06fd453
chore(deps): bump python-keepkey — 10 PDF report coverage fixes
BitHighlander Jul 3, 2026
7ad017c
Merge pull request #287 from BitHighlander/feat/thor-maya-memo-affiliate
BitHighlander Jul 6, 2026
55aa102
Merge pull request #288 from BitHighlander/fix/pdf-report-coverage-pin
BitHighlander Jul 6, 2026
d45ce3b
ci: build+test bitcoin-only and zcash-privacy firmware variants
BitHighlander Jul 6, 2026
f2fbbb8
fix(zcash-privacy): reclaim 17KB ROM via AES_SMALL_TABLES — variant n…
BitHighlander Jul 6, 2026
136eed7
Merge pull request #290 from BitHighlander/hotfix/coin-variant-ci-art…
BitHighlander Jul 6, 2026
8a8bfea
test(clearsign): v2 static-schema coverage for a relay solver swap
BitHighlander Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 60 additions & 23 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@
# └─ check-submodules verify all deps present
#
# Stage 2: BUILD (parallel, gated by Stage 1)
# ├─ build-emulator Docker image → artifact
# └─ build-arm-firmware cross-compile → .bin/.elf (downloadable)
# ├─ build-emulator Docker image → artifact [matrix: full / bitcoin-only / zcash-privacy]
# └─ build-arm-firmware cross-compile → .bin/.elf (downloadable) [same matrix]
#
# Stage 3: TEST (parallel, gated by Stage 2)
# ├─ unit-tests GoogleTest (make xunit)
# └─ python-integration full test suite
# ├─ unit-tests GoogleTest (make xunit) [same matrix — proves each
# │ variant's coin/token gating actually compiles+passes]
# └─ python-integration full test suite (full/default variant only)
#
# Stage 4: PUBLISH (manual trigger, all tests must pass)
# └─ publish-emulator DockerHub push (workflow_dispatch only)
# └─ publish-emulator DockerHub push, full/default variant only (workflow_dispatch only)

name: CI

Expand Down Expand Up @@ -215,6 +216,16 @@ jobs:
needs: [lint-format, static-analysis, check-submodules, secret-scan]
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include:
- variant: full
cmake_flags: ""
- variant: bitcoin-only
cmake_flags: "-DKK_BITCOIN_ONLY=ON"
- variant: zcash-privacy
cmake_flags: "-DKK_ZCASH_PRIVACY=ON"
steps:
- name: Checkout
uses: actions/checkout@v6
Expand Down Expand Up @@ -250,27 +261,38 @@ jobs:
if: steps.cache-base.outputs.cache-hit == 'true'
run: docker load -i /tmp/base-image.tar

- name: Build emulator image
- name: Build emulator image (${{ matrix.variant }})
run: |
docker build \
-t ${{ env.EMU_IMAGE }} \
-t ${{ env.EMU_IMAGE }}-${{ matrix.variant }} \
--build-arg coinsupport="${{ matrix.cmake_flags }}" \
-f scripts/emulator/Dockerfile \
.

- name: Save emulator image
run: docker save ${{ env.EMU_IMAGE }} -o /tmp/emu-image.tar
run: docker save ${{ env.EMU_IMAGE }}-${{ matrix.variant }} -o /tmp/emu-image.tar

- name: Upload emulator image artifact
uses: actions/upload-artifact@v7
with:
name: emu-image
name: emu-image-${{ matrix.variant }}
path: /tmp/emu-image.tar
retention-days: 1

build-arm-firmware:
needs: [lint-format, static-analysis, check-submodules, secret-scan]
runs-on: ubuntu-latest
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include:
- variant: full
cmake_flags: ""
- variant: bitcoin-only
cmake_flags: "-DKK_BITCOIN_ONLY=ON"
- variant: zcash-privacy
cmake_flags: "-DKK_ZCASH_PRIVACY=ON"
steps:
- name: Checkout
uses: actions/checkout@v6
Expand Down Expand Up @@ -312,15 +334,16 @@ jobs:
echo "git_short=${GIT_SHORT}" >> "$GITHUB_OUTPUT"
echo "Firmware version: ${FW_VERSION} (${GIT_SHORT})"

- name: Cross-compile firmware for ARM
- name: Cross-compile firmware for ARM (${{ matrix.variant }})
run: |
docker run --rm \
-v ${{ github.workspace }}:/root/keepkey-firmware:z \
${{ env.BASE_IMAGE }} /bin/sh -c "\
mkdir /root/build && cd /root/build && \
cmake -C /root/keepkey-firmware/cmake/caches/device.cmake /root/keepkey-firmware \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_COLOR_MAKEFILE=ON && \
-DCMAKE_COLOR_MAKEFILE=ON \
${{ matrix.cmake_flags }} && \
make && \
mkdir -p /root/keepkey-firmware/bin && \
cp bin/*.bin /root/keepkey-firmware/bin/ && \
Expand All @@ -332,19 +355,19 @@ jobs:
cd bin
for f in *.bin; do
[ -f "$f" ] || continue
mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${f}"
mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${{ matrix.variant }}-${f}"
done
for f in *.elf; do
[ -f "$f" ] || continue
mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${f}"
mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${{ matrix.variant }}-${f}"
done
ls -lh
echo "::notice::Firmware v${{ steps.version.outputs.fw_version }} built successfully"
echo "::notice::Firmware v${{ steps.version.outputs.fw_version }} (${{ matrix.variant }}) built successfully"

- name: Upload firmware artifacts
uses: actions/upload-artifact@v7
with:
name: firmware-v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}
name: firmware-v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${{ matrix.variant }}
path: |
bin/*.bin
bin/*.elf
Expand All @@ -358,24 +381,34 @@ jobs:
needs: build-emulator
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
include:
- variant: full
cmake_flags: ""
- variant: bitcoin-only
cmake_flags: "-DKK_BITCOIN_ONLY=ON"
- variant: zcash-privacy
cmake_flags: "-DKK_ZCASH_PRIVACY=ON"
steps:
- name: Download emulator image
uses: actions/download-artifact@v8
with:
name: emu-image
name: emu-image-${{ matrix.variant }}
path: /tmp

- name: Load emulator image
run: docker load -i /tmp/emu-image.tar

- name: Run unit tests
- name: Run unit tests (${{ matrix.variant }})
run: |
# make xunit returns non-zero if any test fails — capture
# exit code so JUnit XML still gets copied for reporting
docker run --rm \
-v ${{ github.workspace }}/test-reports:/kkemu/test-reports \
--entrypoint /bin/sh \
${{ env.EMU_IMAGE }} \
${{ env.EMU_IMAGE }}-${{ matrix.variant }} \
-c "mkdir -p /kkemu/test-reports/firmware-unit && \
make xunit; RC=\$?; \
cp -r unittests/*.xml /kkemu/test-reports/firmware-unit/ 2>/dev/null; \
Expand All @@ -385,7 +418,7 @@ jobs:
uses: actions/upload-artifact@v7
if: always()
with:
name: unit-test-results
name: unit-test-results-${{ matrix.variant }}
path: test-reports/firmware-unit/
retention-days: 30

Expand Down Expand Up @@ -684,7 +717,10 @@ jobs:
uses: actions/download-artifact@v4
continue-on-error: true
with:
name: unit-test-results
# Report covers the full/default variant only — bitcoin-only and
# zcash-privacy are built and unit-tested in their own matrix legs
# but don't get a PDF (see unit-tests / build-arm-firmware).
name: unit-test-results-full
path: test-reports/firmware-unit/

- name: Download python test results
Expand Down Expand Up @@ -744,7 +780,8 @@ jobs:
- name: Download emulator image
uses: actions/download-artifact@v8
with:
name: emu-image
# Only the full/default variant is published to DockerHub.
name: emu-image-full
path: /tmp

- name: Load emulator image
Expand All @@ -759,8 +796,8 @@ jobs:

- name: Tag images for publish
run: |
docker tag ${{ env.EMU_IMAGE }} kktech/kkemu:latest
docker tag ${{ env.EMU_IMAGE }} kktech/kkemu:v${{ steps.version.outputs.fw_version }}
docker tag ${{ env.EMU_IMAGE }}-full kktech/kkemu:latest
docker tag ${{ env.EMU_IMAGE }}-full kktech/kkemu:v${{ steps.version.outputs.fw_version }}

- name: Login to DockerHub
uses: docker/login-action@v4
Expand Down
59 changes: 46 additions & 13 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,16 @@ jobs:
needs: validate
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
include:
- variant: full
cmake_flags: ""
- variant: bitcoin-only
cmake_flags: "-DKK_BITCOIN_ONLY=ON"
- variant: zcash-privacy
cmake_flags: "-DKK_ZCASH_PRIVACY=ON"
steps:
- uses: actions/checkout@v6
with:
Expand All @@ -71,15 +81,16 @@ jobs:
if: steps.cache-base.outputs.cache-hit == 'true'
run: docker load -i /tmp/base-image.tar

- name: Cross-compile firmware
- name: Cross-compile firmware (${{ matrix.variant }})
run: |
docker run --rm \
-v ${{ github.workspace }}:/root/keepkey-firmware:z \
${{ env.BASE_IMAGE }} /bin/sh -c "\
mkdir /root/build && cd /root/build && \
cmake -C /root/keepkey-firmware/cmake/caches/device.cmake /root/keepkey-firmware \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_COLOR_MAKEFILE=ON && \
-DCMAKE_COLOR_MAKEFILE=ON \
${{ matrix.cmake_flags }} && \
make && \
mkdir -p /root/keepkey-firmware/release && \
cp bin/firmware.keepkey.bin /root/keepkey-firmware/release/ && \
Expand All @@ -90,7 +101,7 @@ jobs:
- name: Compute hashes
working-directory: release
run: |
echo "# KeepKey Firmware v${{ needs.validate.outputs.fw_version }} — Hash Manifest" > HASHES.txt
echo "# KeepKey Firmware v${{ needs.validate.outputs.fw_version }} (${{ matrix.variant }}) — Hash Manifest" > HASHES.txt
echo "" >> HASHES.txt
for f in *.bin; do
[ -f "$f" ] || continue
Expand All @@ -109,22 +120,34 @@ jobs:
working-directory: release
run: |
VER="${{ needs.validate.outputs.fw_version }}"
[ -f firmware.keepkey.bin ] && mv firmware.keepkey.bin "firmware.keepkey.v${VER}.bin"
[ -f firmware.keepkey.elf ] && mv firmware.keepkey.elf "firmware.keepkey.v${VER}.elf"
[ -f bootloader.bin ] && mv bootloader.bin "bootloader.v${VER}.bin"
VARIANT="${{ matrix.variant }}"
[ -f firmware.keepkey.bin ] && mv firmware.keepkey.bin "firmware.keepkey.v${VER}-${VARIANT}.bin"
[ -f firmware.keepkey.elf ] && mv firmware.keepkey.elf "firmware.keepkey.v${VER}-${VARIANT}.elf"
[ -f bootloader.bin ] && mv bootloader.bin "bootloader.v${VER}-${VARIANT}.bin"
mv HASHES.txt "HASHES-${VARIANT}.txt"
ls -lh

- name: Upload release artifacts
uses: actions/upload-artifact@v7
with:
name: release-firmware
name: release-firmware-${{ matrix.variant }}
path: release/*
retention-days: 90

test:
needs: validate
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
include:
- variant: full
cmake_flags: ""
- variant: bitcoin-only
cmake_flags: "-DKK_BITCOIN_ONLY=ON"
- variant: zcash-privacy
cmake_flags: "-DKK_ZCASH_PRIVACY=ON"
steps:
- uses: actions/checkout@v6
with:
Expand All @@ -147,10 +170,12 @@ jobs:
if: steps.cache-base.outputs.cache-hit == 'true'
run: docker load -i /tmp/base-image.tar

- name: Build and test emulator
- name: Build and test emulator (${{ matrix.variant }})
run: |
docker build -t kkemu-release -f scripts/emulator/Dockerfile .
docker run --rm --entrypoint /bin/sh kkemu-release \
docker build -t kkemu-release-${{ matrix.variant }} \
--build-arg coinsupport="${{ matrix.cmake_flags }}" \
-f scripts/emulator/Dockerfile .
docker run --rm --entrypoint /bin/sh kkemu-release-${{ matrix.variant }} \
-c "make xunit; RC=\$?; exit \$RC"

create-release:
Expand All @@ -163,13 +188,14 @@ jobs:
- name: Download firmware artifacts
uses: actions/download-artifact@v8
with:
name: release-firmware
pattern: release-firmware-*
path: artifacts
merge-multiple: true

- name: Prepare release assets
run: |
mkdir -p release-assets
cp artifacts/*.bin artifacts/*.elf artifacts/HASHES.txt release-assets/
cp artifacts/*.bin artifacts/*.elf artifacts/HASHES-*.txt release-assets/
ls -lh release-assets/

- name: Generate release body
Expand All @@ -178,15 +204,22 @@ jobs:
cat > release-body.md <<EOF
## KeepKey Firmware v${VER}

### Variants
- **full** — \`firmware.keepkey.v${VER}-full.bin\` — all supported chains
- **bitcoin-only** — \`firmware.keepkey.v${VER}-bitcoin-only.bin\` — BTC-only, non-BTC coins stripped
- **zcash-privacy** — \`firmware.keepkey.v${VER}-zcash-privacy.bin\` — adds the Zcash shielded/Orchard engine

### Reproducible Build Verification
\`\`\`bash
./scripts/build/docker/device/release.sh
tail -c +257 bin/firmware.keepkey.bin | shasum -a 256
# bitcoin-only / zcash-privacy: pass -DKK_BITCOIN_ONLY=ON / -DKK_ZCASH_PRIVACY=ON
# to the cmake invocation and compare against the matching HASHES-<variant>.txt
\`\`\`

> **DRAFT** — firmware must be signed by 3/5 key holders before publishing.

### Signing Checklist
### Signing Checklist (per variant)
- [ ] Built on multiple machines, hashes match
- [ ] Signed on air-gapped machine (3/5 signers)
- [ ] Storage upgrade tested on production device
Expand Down
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[submodule "deps/device-protocol"]
path = deps/device-protocol
url = https://github.com/keepkey/device-protocol.git
url = https://github.com/BitHighlander/device-protocol.git
branch = master
[submodule "deps/trezor-firmware"]
path = deps/crypto/trezor-firmware
Expand Down
Loading
Loading