@@ -483,7 +483,7 @@ def _arg_shown(a):
483483 '- Input: single capacitive button (confirm/reject)' ,
484484 '- USB: micro-B, HID + WebUSB transports, HID fallback' ,
485485 '- Storage: BIP-39 seed encrypted in isolated flash region' ,
486- '- Curves: secp256k1, ed25519, NIST P-256 (Pallas/Zcash only on KK_ZCASH_PRIVACY=ON builds) ' ,
486+ '- Curves: secp256k1, ed25519, NIST P-256; regular firmware also includes Pallas/Orchard ' ,
487487 '' ,
488488 'SECURITY MODEL:' ,
489489 '- All private key operations happen on-device, keys never leave' ,
@@ -492,12 +492,13 @@ def _arg_shown(a):
492492 '- BIP-39 passphrase creates hidden wallets (plausible deniability)' ,
493493 '' ,
494494 'FIRMWARE VARIANTS (7.15, PR #282):' ,
495- '- Full multi-chain (default): all coin families; firmware_variant = model name' ,
495+ '- Full multi-chain (default): all coin families including Zcash Orchard privacy;' ,
496+ ' firmware_variant = model name.' ,
496497 '- Bitcoin-only (KK_BITCOIN_ONLY): only Bitcoin + Testnet; all altcoin and' ,
497498 ' shielded-Zcash handlers stripped; firmware_variant = KeepKeyBTC (EmulatorBTC' ,
498499 ' on the emulator). Clients gate multi-chain-only tests on this string.' ,
499- '- Zcash shielded ( KK_ZCASH_PRIVACY): adds the Orchard/Pallas engine; default OFF ' ,
500- ' pending external audit. Mutually exclusive with KK_BITCOIN_ONLY.' ,
500+ '- There is no separate Zcash artifact: KK_ZCASH_PRIVACY is ON for the regular ' ,
501+ ' product and OFF only for KK_BITCOIN_ONLY.' ,
501502 '' ,
502503 'SEED LOCK (7.15, PR #282):' ,
503504 '- A seed created under bitcoin-only firmware is stamped in a reserved storage-' ,
@@ -994,11 +995,11 @@ def _arg_shown(a):
994995 '500 uosmo is 0.000500 OSMO — no integer part and six decimals; it must not collapse '
995996 'to 0 or lose the trailing digits.' ,
996997 ['Sub-unit amount' ]),
997- ('P4' , 'test_msg_osmosis_signtx' , 'test_osmosis_send_non_uosmo_denom_is_refused ' ,
998- 'Direct-wire non-uosmo MsgSend is refused ' ,
999- 'The test bypasses the Python MsgSend fence and sends OsmosisMsgAck directly. Firmware '
1000- 'rejects uatom before review or hashing, so the hardcoded uosmo serializer cannot be '
1001- 'reached under a different displayed asset .' ,
998+ ('P4' , 'test_msg_osmosis_signtx' , 'test_osmosis_send_denom_is_committed_to_the_signature ' ,
999+ 'Direct-wire denomination is committed ' ,
1000+ 'Two otherwise-identical raw MsgSend requests using uosmo and uatom produce different '
1001+ 'signatures, proving the reviewed denomination is part of the signed payload rather '
1002+ 'than a hardcoded display-only label .' ,
10021003 []),
10031004 ('P5' , 'test_msg_osmosis_signtx' , 'test_osmosis_send_rejects_noncanonical_wire_amounts' ,
10041005 'Noncanonical and overflowing uosmo are refused' ,
@@ -1767,9 +1768,9 @@ def _arg_shown(a):
17671768 ('Y' , 'Zcash Transparent' , '7.0.0' ,
17681769 'Transparent t-address Zcash (send/receive) over the generic Bitcoin UTXO signing path with '
17691770 'Overwinter/Sapling-v4 branch handling. This is the Zcash functionality that ships ENABLED on '
1770- 'the default 7.15.0 build -- t1.../t3... addresses sign like Bitcoin (SECP256K1) with a '
1771+ 'the regular 7.15.0 build -- t1.../t3... addresses sign like Bitcoin (SECP256K1) with a '
17711772 'FeeOverThreshold guard. No shielded/Orchard engine is involved; contrast with section Z '
1772- '(shielded), which is withheld behind KK_ZCASH_PRIVACY .' ,
1773+ '(shielded), which also ships in the regular product and is stripped from bitcoin-only .' ,
17731774 [
17741775 'INPUT: TxInputType over the Zcash coin (t-address, SECP256K1)' ,
17751776 'METADATA: version_group_id + branch_id for the target upgrade' ,
@@ -1799,13 +1800,11 @@ def _arg_shown(a):
17991800
18001801 ('Z' , 'Zcash Shielded (Orchard)' , '7.14.0' ,
18011802 'Shielded Orchard (PCZT streaming, Full Viewing Key export, unified-address display with an '
1802- 'on-device ZIP-32 Sec 6.1 seed-fingerprint attestation) is WITHHELD on the default 7.15.0 build. '
1803- 'It is compile-gated behind the KK_ZCASH_PRIVACY build flag, which is DEFAULT-OFF pending an '
1804- 'external audit of the Orchard/Pallas engine. On this build the firmware does not register the '
1805- 'Zcash* shielded messages, so every test in this section SKIPS BY DESIGN (the requires_message '
1806- 'probe returns Failure_UnexpectedMessage) -- this is a deliberate policy hold, NOT missing or '
1807- 'broken support. To exercise these, build the KK_ZCASH_PRIVACY=ON variant. Transparent t-address '
1808- 'Zcash IS live and shipping -- see section Y (Zcash Transparent).' ,
1803+ 'on-device ZIP-32 Sec 6.1 seed-fingerprint attestation) ships in the regular 7.15.0 product. '
1804+ 'KK_ZCASH_PRIVACY is enabled for the regular build and disabled only for bitcoin-only. This '
1805+ 'report covers device FVK/address behavior and the Python PCZT streaming contract. Mainnet '
1806+ 'proof construction and the physical shield, deshield, and Orchard-to-Orchard matrix are '
1807+ 'recorded separately in the RC18 release evidence.' ,
18091808 [
18101809 'FVK: Derive ak, nk, rivk components via ZIP-32 Orchard path' ,
18111810 'ADDRESS: Device derives its own unified address + shows it; optional seed-fingerprint pin' ,
@@ -1821,60 +1820,92 @@ def _arg_shown(a):
18211820 'FVK deterministic' , 'Same account always produces same FVK.' , []),
18221821 ('Z4' , 'test_msg_zcash_orchard' , 'test_fvk_different_accounts' ,
18231822 'FVK different accounts' , 'Different accounts produce different FVKs.' , []),
1824- ('Z5' , 'test_msg_zcash_sign_pczt' , 'test_single_action_legacy_sighash' ,
1825- 'Sign single Orchard action' , 'One shielded action, device shows amount + fee.' , ['Shielded confirm' ]),
1826- ('Z6' , 'test_msg_zcash_sign_pczt' , 'test_multi_action_legacy_sighash' ,
1827- 'Sign multiple actions' , 'Multiple Orchard actions in one transaction.' , []),
1828- ('Z7' , 'test_msg_zcash_sign_pczt' , 'test_signatures_are_64_bytes' ,
1829- 'Signature format' , 'Orchard signatures must be exactly 64 bytes (RedPallas).' , []),
1830- ('Z8' , 'test_msg_zcash_sign_pczt' , 'test_transparent_shielding_single_input' ,
1831- 'Transparent to shielded' , 'Transparent BTC-like input shielded into Orchard pool.' , ['Shielding confirm' ]),
1832- ('Z9' , 'test_msg_zcash_sign_pczt' , 'test_transparent_shielding_multiple_inputs' ,
1833- 'Multi-input shielding' , 'Multiple transparent inputs shielded in one tx.' , []),
1834- ('Z10' , 'test_msg_zcash_display_address' , 'test_zcash_display_address_basic' ,
1823+ ('Z5' , 'test_msg_zcash_orchard' , 'test_fvk_abandon_mnemonic' ,
1824+ 'FVK abandon-mnemonic vector' ,
1825+ 'FVK derivation matches the Orchard reference vector for the standard abandon mnemonic.' ,
1826+ []),
1827+ ('Z6' , 'test_msg_zcash_display_address' , 'test_zcash_display_address_basic' ,
18351828 'Display unified address' ,
18361829 'Device derives its OWN Orchard unified address (u1...) from the ZIP-32 path, shows it '
18371830 'on the OLED for confirmation, and returns it with the device seed fingerprint. The host '
18381831 'does not supply the address — this defends against a compromised host showing a fake UA.' ,
18391832 ['Unified address (u1...)' ]),
1840- ('Z11 ' , 'test_msg_zcash_display_address' , 'test_zcash_display_address_bad_path_rejected' ,
1833+ ('Z7 ' , 'test_msg_zcash_display_address' , 'test_zcash_display_address_bad_path_rejected' ,
18411834 'Reject malformed address path' ,
18421835 'A path that is neither m/32\' /133\' /account\' nor an explicit account is rejected with a '
18431836 'SyntaxError, so no wrong-account address is ever derived silently.' ,
18441837 []),
1845- ('Z12 ' , 'test_msg_zcash_seed_fingerprint' , 'test_get_orchard_fvk_returns_seed_fingerprint' ,
1838+ ('Z8 ' , 'test_msg_zcash_seed_fingerprint' , 'test_get_orchard_fvk_returns_seed_fingerprint' ,
18461839 'FVK carries seed fingerprint' ,
18471840 'ZcashGetOrchardFVK returns a 32-byte ZIP-32 §6.1 seed fingerprint alongside the FVK.' ,
18481841 []),
1849- ('Z13 ' , 'test_msg_zcash_seed_fingerprint' , 'test_fingerprint_stable_across_accounts' ,
1842+ ('Z9 ' , 'test_msg_zcash_seed_fingerprint' , 'test_fingerprint_stable_across_accounts' ,
18501843 'Fingerprint bound to seed not account' ,
18511844 'The seed fingerprint is identical across account indices — it identifies the device seed.' ,
18521845 []),
1853- ('Z14 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_accepts_matching_fingerprint' ,
1846+ ('Z10 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_accepts_matching_fingerprint' ,
18541847 'Address display accepts matching fingerprint' ,
18551848 'When the host supplies expected_seed_fingerprint and it matches, the device derives and '
18561849 'displays the address and echoes the fingerprint.' ,
18571850 ['Unified address (u1...)' ]),
1858- ('Z15 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_rejects_wrong_fingerprint' ,
1851+ ('Z11 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_rejects_wrong_fingerprint' ,
18591852 'Address display rejects wrong fingerprint' ,
18601853 'A mismatched expected_seed_fingerprint is rejected before any derivation — the host '
18611854 'cannot get an attestation from the wrong device.' ,
18621855 []),
1863- ('Z16 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_backward_compat' ,
1856+ ('Z12 ' , 'test_msg_zcash_seed_fingerprint' , 'test_display_address_helper_backward_compat' ,
18641857 'Address display without fingerprint' ,
18651858 'Omitting expected_seed_fingerprint still works; the device populates the fingerprint on '
18661859 'the response regardless.' ,
18671860 []),
1868- ('Z17 ' , 'test_msg_zcash_seed_fingerprint' , 'test_device_fingerprint_matches_python_helper' ,
1861+ ('Z13 ' , 'test_msg_zcash_seed_fingerprint' , 'test_device_fingerprint_matches_python_helper' ,
18691862 'Fingerprint matches host computation' ,
18701863 'The device-derived fingerprint equals calculate_seed_fingerprint(seed) — firmware C and '
18711864 'the python helper agree byte-for-byte for the all-all-all seed.' ,
18721865 []),
1873- ('Z18 ' , 'test_msg_zcash_seed_fingerprint' , 'test_sign_pczt_helper_rejects_wrong_fingerprint' ,
1866+ ('Z14 ' , 'test_msg_zcash_seed_fingerprint' , 'test_sign_pczt_helper_rejects_wrong_fingerprint' ,
18741867 'PCZT signing rejects wrong fingerprint' ,
18751868 'A wrong expected_seed_fingerprint on a PCZT signing request is rejected before any '
18761869 'signing crypto runs.' ,
18771870 []),
1871+ ('Z15' , 'test_msg_zcash_sign_pczt' ,
1872+ 'test_all_dummy_shield_streams_outputs_inputs_and_no_orchard_sigs' ,
1873+ 'Shield streams dummy actions without device signatures' ,
1874+ 'The client streams transparent inputs/outputs and both dummy Orchard actions, preserves '
1875+ 'their finalized PCZT signatures, and expects no compact device Orchard signatures.' ,
1876+ []),
1877+ ('Z16' , 'test_msg_zcash_sign_pczt' ,
1878+ 'test_mixed_deshield_returns_only_real_spend_signature' ,
1879+ 'Deshield returns only real-spend signatures' ,
1880+ 'A mixed real/dummy Orchard action set returns one compact signature for the real spend.' ,
1881+ []),
1882+ ('Z17' , 'test_msg_zcash_sign_pczt' ,
1883+ 'test_private_send_preserves_compact_real_spend_order' ,
1884+ 'Private send preserves real-spend signature order' ,
1885+ 'Compact device signatures remain ordered by the real-spend actions when dummy actions '
1886+ 'are interleaved.' ,
1887+ []),
1888+ ('Z18' , 'test_msg_zcash_sign_pczt' ,
1889+ 'test_missing_is_spend_is_rejected_before_device_call' ,
1890+ 'Missing spend classification rejected' ,
1891+ 'Every action must explicitly declare is_spend before any device call is made.' ,
1892+ []),
1893+ ('Z19' , 'test_msg_zcash_sign_pczt' ,
1894+ 'test_host_transparent_sighash_is_rejected_before_device_call' ,
1895+ 'Host transparent sighash rejected' ,
1896+ 'The client refuses a host-provided transparent sighash instead of forwarding it as '
1897+ 'trusted device input.' ,
1898+ []),
1899+ ('Z20' , 'test_msg_zcash_sign_pczt' ,
1900+ 'test_signature_count_must_match_real_spends' ,
1901+ 'Signature count bound to real spends' ,
1902+ 'The returned compact signature count must equal the number of real-spend actions.' ,
1903+ []),
1904+ ('Z21' , 'test_msg_zcash_sign_pczt' ,
1905+ 'test_duplicate_action_request_is_rejected' ,
1906+ 'Duplicate action requests rejected' ,
1907+ 'A repeated device request for the same action index aborts the streaming session.' ,
1908+ []),
18781909 ]),
18791910
18801911 ('D' , 'BIP-85 Child Derivation' , '7.14.0' ,
0 commit comments