Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ede466a
test(7.15): opt signing fixtures into AdvancedMode
BitHighlander Sep 20, 2026
3c91ee3
merge: carry 7.15 AdvancedMode fixtures into canonical tests
BitHighlander Sep 20, 2026
f104918
feat(clearsign): LoadClearsignSigner trust path + release-protocol pr…
BitHighlander Jul 2, 2026
fc4ae03
test(7.15): enable policy after loading test wallets
BitHighlander Sep 20, 2026
59a1fa8
merge: carry complete 7.15 policy fixtures into canonical tests
BitHighlander Sep 20, 2026
889cbd7
fix(bindings): keep unrelated protocol modules pinned
BitHighlander Sep 20, 2026
a1ad2ab
merge: carry scoped 7.15 runtime bindings into canonical tests
BitHighlander Sep 20, 2026
ed04369
test(7.15): preserve negative policy fixtures
BitHighlander Sep 20, 2026
74efbb4
Merge commit 'ed04369' into reconcile/upstream-sync-followup
BitHighlander Sep 20, 2026
2c5af34
test(7.15): isolate disabled-policy Solana cases
BitHighlander Sep 20, 2026
c53f910
Merge commit '2c5af34' into reconcile/upstream-sync-isolation
BitHighlander Sep 20, 2026
262c6b5
test(solana): exercise the opaque v0 lookup path
BitHighlander Sep 20, 2026
bdd7d3e
Merge commit '262c6b5' into reconcile/upstream-sync-alt
BitHighlander Sep 20, 2026
5ffe64b
test(evm): require chain_id, and stop asserting pre-EIP-155 signatures
BitHighlander Aug 17, 2026
224e660
test(7.15): align legacy EVM fixtures with release policy
BitHighlander Sep 20, 2026
3c627b7
Merge 7.15 release security fixtures into canonical ancestry
BitHighlander Sep 20, 2026
d1ce1fd
test(7.15): assert canonical blind-sign refusal
BitHighlander Sep 20, 2026
a9af996
Merge canonical blind-sign refusal fixture into upstream sync
BitHighlander Sep 20, 2026
1346b6c
test(solana): gate plain text at its 7.15 capability
BitHighlander Sep 20, 2026
ede7ecb
ci: restore canonical CircleCI smoke gate
BitHighlander Sep 20, 2026
b80e128
ci: clone canonical branch over HTTPS
BitHighlander Sep 20, 2026
b3836f9
ci: install canonical smoke dependencies
BitHighlander Sep 20, 2026
7d03f24
Merge canonical multi-release EOS and Solana gates (#226)
BitHighlander Sep 20, 2026
db11405
test(solana): gate LUT attestations by device capability
BitHighlander Sep 21, 2026
f44b566
test(ethereum): require safe Uniswap removal recipient
BitHighlander Sep 21, 2026
ffc085b
test(solana): isolate AdvancedMode policy cases
BitHighlander Sep 21, 2026
14c9fa5
test(report): document unsafe Uniswap removal refusal
BitHighlander Sep 21, 2026
cc32de9
test(release): align canonical wire and OLED evidence
BitHighlander Sep 21, 2026
7989ff7
test(ethereum): terminate maximum-amount reviews cleanly
BitHighlander Sep 21, 2026
1bd628b
test(ci): gate incomplete stacked release capabilities
BitHighlander Sep 21, 2026
8beae3a
test: gate capabilities absent from foundation slice
BitHighlander Sep 21, 2026
3c15344
test: gate later Hive and session convergence
BitHighlander Sep 21, 2026
caf13c0
test: gate remaining staged release capabilities
BitHighlander Sep 21, 2026
7418c30
test: gate protected prompt workflow unwind
BitHighlander Sep 21, 2026
e277ad6
test: gate staged ERC-7730 review assertions
BitHighlander Sep 21, 2026
0da42e8
report: activate seed hardening at 7.15
BitHighlander Sep 21, 2026
2f7f5a1
test(release): exercise 7.15 security and runtime gates
BitHighlander Sep 21, 2026
2ba86c1
test(release): enforce 7.15 persistence and recovery gates
BitHighlander Sep 21, 2026
3358cbc
ci: pin canonical release compatibility targets
BitHighlander Sep 22, 2026
f1a2c1c
test(release): gate later staged EVM review vectors
BitHighlander Sep 22, 2026
d19c2da
test: bind staged reports to explicit capabilities
BitHighlander Sep 22, 2026
49d537c
test(storage): validate declared downgrade policy
BitHighlander Sep 22, 2026
b745562
test(ripple): assert canonical MemoData field and length boundaries
BitHighlander Sep 23, 2026
1d42a1f
fix(report): describe immediate unlimited-approval refusal
BitHighlander Sep 24, 2026
e97672c
test(eip712): check streamed array digests against an independent enc…
BitHighlander Sep 25, 2026
546dcb0
test(clearsign): assert the device's unlimited-approval refusal on th…
BitHighlander Sep 25, 2026
0aa3c1a
test(erc7730): never pass firmware/registry conformance without its i…
BitHighlander Sep 25, 2026
d64749c
test(eip712): cover the final sign screen, domain-only, permits and l…
BitHighlander Sep 25, 2026
4f80b08
fix(erc7730): compile only programs the device verifier accepts
BitHighlander Sep 25, 2026
e97f625
test(eip712): assert the typed-data response reports the signing address
BitHighlander Sep 25, 2026
9cea0ad
fix(erc7730): refuse paths deeper than device captures accept
BitHighlander Sep 25, 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
27 changes: 27 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
version: 2.1

# The authoritative multi-release emulator matrix lives in GitHub Actions.
# Keep this smoke job while the legacy CircleCI project remains connected so
# its required status verifies the checkout instead of failing at config load.
jobs:
canonical-smoke:
docker:
- image: cimg/python:3.11
steps:
- run:
name: Checkout current branch over HTTPS
command: |
git clone --depth 1 -b "$CIRCLE_BRANCH" \
https://github.com/keepkey/python-keepkey.git .
git submodule update --init --recursive
- run:
name: Validate canonical Python and EOS vector contracts
command: |
python -m py_compile keepkeylib/*.py tests/test_msg_solana_signtx.py
python -m pip install --quiet pytest requests
python -m pytest -q tests/unit/test_eos_updateauth_vector.py

workflows:
canonical:
jobs:
- canonical-smoke
37 changes: 10 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,24 +119,15 @@ jobs:
submodules: recursive
path: python-keepkey

# Immutable fork 7.15 candidate. Once canonical Python merges, the
# firmware branch is repinned to that one upstream commit and rerun.
# Immutable firmware 7.15 code head validated by the release stack.
- name: Checkout firmware
uses: actions/checkout@v4
with:
repository: BitHighlander/keepkey-firmware
# PINNED, not `alpha`. A moving branch means a firmware push can
# change this PR's result with no Python commit, which makes a green
# run unciteable. This SHA is alpha at the time of pinning.
#
# NOTE: this is the exact staged 7.16.0 candidate, NOT
# 7.15.0/RC18. The suite needs firmware
# that only exists after RC18 -- variant_getName() returning
# "EmulatorBTC" (required by requires_bitcoinOnly, so by the whole
# integration-btc job) and the Ironwood known-answer vectors. So this
# job validates 7.16.0; it does not validate the RC18 dependency
# graph. Bump deliberately, and re-read that claim when you do.
ref: 651f2a462b8e71ffb37995094dbe1e9298bc802f
# PINNED, not a moving branch, so a green result remains citeable.
# This is the code/workflow head beneath the handoff-only commit on
# firmware PR #843.
ref: a6effd7205b480c4fb314a1714831ffd863e2a48
path: keepkey-firmware

# NOT `submodules: recursive`. trezor-firmware carries a micropython
Expand Down Expand Up @@ -564,7 +555,7 @@ jobs:
firmware_ref: 4125e1c7409b1cb7b08ba595bc408e3128fc24ca
min_fw: "7.14.3"
- release: "7.15"
firmware_ref: d33f1711c3b2b205f64c5dc35fdec02926a6dc63
firmware_ref: a6effd7205b480c4fb314a1714831ffd863e2a48
min_fw: "7.15.0"

# KK_BITCOIN_ONLY=ON is a second shipping product, not a build flavour:
Expand All @@ -590,18 +581,10 @@ jobs:
uses: actions/checkout@v4
with:
repository: BitHighlander/keepkey-firmware
# PINNED, not `alpha`. A moving branch means a firmware push can
# change this PR's result with no Python commit, which makes a green
# run unciteable. This SHA is alpha at the time of pinning.
#
# NOTE: this is the exact staged 7.16.0 candidate, NOT
# 7.15.0/RC18. The suite needs firmware
# that only exists after RC18 -- variant_getName() returning
# "EmulatorBTC" (required by requires_bitcoinOnly, so by the whole
# integration-btc job) and the Ironwood known-answer vectors. So this
# job validates 7.16.0; it does not validate the RC18 dependency
# graph. Bump deliberately, and re-read that claim when you do.
ref: 651f2a462b8e71ffb37995094dbe1e9298bc802f
# Each matrix row is an immutable shipping candidate. Do not replace
# this with a common alpha SHA: that would make both labels test the
# same firmware and silently discard cross-release compatibility.
ref: ${{ matrix.firmware_ref }}
path: keepkey-firmware

# Same non-recursive init as the regular job: trezor-firmware's
Expand Down
2 changes: 1 addition & 1 deletion device-protocol
20 changes: 20 additions & 0 deletions keepkeylib/erc7730_compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -670,6 +670,11 @@ def intern_path(steps):
"threshold", "message", "chainId", "chainIdPath")):
raise ValueError(
"unknown token amount cannot use token metadata parameters")
else:
# No token is named, so the device can only show the raw
# integer. Its verifier refuses a tokenAmount without a
# token argument, so compile the raw formatter it runs.
kind = 1
if "threshold" in params:
threshold = descriptor_value(params["threshold"])
if isinstance(threshold, str) and threshold.startswith("0x"):
Expand Down Expand Up @@ -847,6 +852,11 @@ def depth(node):
return 1 + (max(depth(child) for child in node.children)
if node.children else 0)
max_depth = depth(root)
# The device's ABI verifier counts the root as depth 1, as depth()
# does, and refuses a node deeper than ERC7730_ABI_MAX_DEPTH (8).
if max_depth > 8:
raise ValueError(
"ERC-7730 ABI nests deeper than the device supports")
for node, first, count in flat:
array_length = node.array_length if node.kind == 9 else 0
payload += bytes([node.kind]) + _u16(node.size) + _u16(first) + _u16(count) + _u16(array_length or 0)
Expand All @@ -859,6 +869,16 @@ def depth(node):
if steps and steps[0][0] == "container":
payload += bytes([2, 0]) + _u16(steps[0][1])
continue
# Device captures descend one ABI level per step and refuse
# ERC7730_ABI_MAX_DEPTH (8) or more steps.
if len(steps) >= 8:
raise ValueError(
"ERC-7730 path nests deeper than the device supports")
# The device iterates at most one array per path ("[]" step).
if sum(1 for step in steps if step[0] == 2) > 1:
raise ValueError(
"ERC-7730 path iterates more than one array; the device "
"supports one")
payload += bytes([1, len(steps)]) + _u16(ABSENT)
for step in steps:
if step[0] == 1:
Expand Down
287 changes: 147 additions & 140 deletions keepkeylib/messages_pb2.py

Large diffs are not rendered by default.

Loading
Loading