tests: add green 2of3 recovery signing by recovery key (full path from master key)
What changed, and why it matters
This commit only adds a new test case and updates a description of an existing test. It does not change any production code. The new test documents that when a recovery key is provided with a full derivation path (from the master key), a Blockstream Jade device will still sign the transaction, but a helper function called is_green_multisig_signers() will return false, meaning some extra Green 2of3 validation is skipped. Because no actual signing logic is changed, this commit by itself is not a security fix or vulnerability.
No immediate action is required for this commit. Treat it as a regression test addition. If the behavior it documents—signing succeeds while Green 2of3 validation is bypassed for full-path recovery keys—is unintended, review the signing/validation logic in the production source (not shown here) and decide whether to tighten is_green_multisig_signers() or the caller.
Security signals we found
Test-only change: no production code modified
New test description notes that Green 2of3 validation is skipped when full master-key derivation path is used
Existing test description clarified to distinguish 'last hardened parent' vs 'full path' recovery-key derivation
Evidence from the diff
The diff adds test_data/psbt_tm_green_multisig_2of3_recovery_signing_full_path.json and rewords the description of test_data/psbt_tm_green_multisig_2of3_recovery_signing.json. The new test’s description explicitly states: ‘is_green_multisig_signers() will be false and additional validation for green 2of3 will be skipped.’ No C/C++/Python source files are modified. Therefore, the commit is purely test-data/documentation and cannot directly alter runtime behavior.
Changed components
test_data/psbt_tm_green_multisig_2of3_recovery_signing.jsontest_data/psbt_tm_green_multisig_2of3_recovery_signing_full_path.jsonInspect captured patch +11 / −1
diff --git a/test_data/psbt_tm_green_multisig_2of3_recovery_signing.json b/test_data/psbt_tm_green_multisig_2of3_recovery_signing.json
index 758102f..3cfa825 100644
--- a/test_data/psbt_tm_green_multisig_2of3_recovery_signing.json
+++ b/test_data/psbt_tm_green_multisig_2of3_recovery_signing.json
@@ -1,5 +1,5 @@
{
- "description": "2of3 transaction with recovery key matching Jade mnemonic already signed by a user key, signing produces a 2nd signature so psbt is final",
+ "description": "2of3 transaction with recovery key matching Jade mnemonic, with derivation path and fingerprint from the last hardened parent key (m/3'/<subaccount>') for recovery key, already signed by a user key, signing produces a 2nd signature so psbt is final",
"input": {
"network": "testnet",
"psbt": "cHNidP8BAHICAAAAAZ5baDG0n/tdMUAScn6pw4NoA4nHKQoBMEP+KKKGJ/NKAAAAAAD9////AnAXAAAAAAAAFgAU4Xyz1p1soZLkDMb8kVChkxYqvE1TIgAAAAAAABepFCcCh5rMJBwq3cxA3Pk1HLvQqJawh9D8SAAAAQCWAgAAAAF28/4WJlcQr/qlsIywpcDhufT26DshpJbJgmL1RI3uqgEAAAAjIgAgpF78VL4e8exJ0oCo7EmLp/AexL0g+33QSrdviIU2e7D9////Apg6AAAAAAAAF6kUdD/Fj4TqDLps5kRwT1USHVNlK4OHDxoAAAAAAAAXqRRclVbJ+LwET6NJprBj6DhyEnZ0TofQ/EgAAQEgmDoAAAAAAAAXqRR0P8WPhOoMumzmRHBPVRIdU2Urg4ciAgLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRUcwRAIgHz77FKhXvwppg/UAHZBxYU1khIfytFPNps4n1GC5SUgCIDdp4phVU9FjLVxVOr6FVtKXxmBEcIsg9UKk0RnOQxLaAQEEIgAgtkVzcJ071VHY1sGBTdnxFuXZFs2iI0PH3k9itVqHBYwBBWlSIQM5FauNH0IkqUIETJNm0nCoMIo1yRjqMs2XSrJK5ZRIjiEC8L2ePv47EeSCLfpERYr+B/QUXm9rhLP13pQvcjg/0EUhA1h++i25jFKKeY5QAOOO2XmTVXcN5KUlh65z3tQWdxg0U64iBgM5FauNH0IkqUIETJNm0nCoMIo1yRjqMs2XSrJK5ZRIjpC1KBaWAwAAAOkkAAC/4wAAfTkAAOOCAAAhmgAAoocAAG9OAACXBAAA9J8AAGMeAABITwAAmOUAAL57AAAhyQAAye4AAIKqAAAA2QAA3vAAANkHAAAe5gAA0XYAAC8PAAAM1AAAXuQAAD4VAAB4bwAAWWEAAD2mAAA9SAAA7nEAAEzZAABHRwAAAwAAAAEAAAAiBgLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRRRuGvQGAwAAgAMAAIABAAAAAQAAACIGA1h++i25jFKKeY5QAOOO2XmTVXcN5KUlh65z3tQWdxg0DBqc3BEBAAAAAQAAAAAAIgIDZVMFZoBJC9eN2gv/3MjsDQzp2mqHXlzoMOiM7BepgsqQtSgWlgMAAADpJAAAv+MAAH05AADjggAAIZoAAKKHAABvTgAAlwQAAPSfAABjHgAASE8AAJjlAAC+ewAAIckAAMnuAACCqgAAANkAAN7wAADZBwAAHuYAANF2AAAvDwAADNQAAF7kAAA+FQAAeG8AAFlhAAA9pgAAPUgAAO5xAABM2QAAR0cAAAMAAAACAAAAIgIDp8tE2lypAyRPPR7PtZMCBLgVKdhZ6AvmsaSImbPkLUsUbhr0BgMAAIADAACAAQAAAAIAAAAiAgJtBWJUKVBK0hcI21wq2Q7JLVxnXJTPm6wQKbwGbd6a5wwanNwRAQAAAAIAAAAA"
diff --git a/test_data/psbt_tm_green_multisig_2of3_recovery_signing_full_path.json b/test_data/psbt_tm_green_multisig_2of3_recovery_signing_full_path.json
new file mode 100644
index 0000000..fd1ed56
--- /dev/null
+++ b/test_data/psbt_tm_green_multisig_2of3_recovery_signing_full_path.json
@@ -0,0 +1,10 @@
+{
+ "description": "2of3 transaction with recovery key matching Jade mnemonic, with full derivation path and master fingerprint for recovery key, already signed by a user key, signing produces a 2nd signature so psbt is final. The test is passing as signing is successful, but the is_green_multisig_signers() will be false and additional validation for green 2of3 will be skipped.",
+ "input": {
+ "network": "testnet",
+ "psbt": "cHNidP8BAHICAAAAAZ5baDG0n/tdMUAScn6pw4NoA4nHKQoBMEP+KKKGJ/NKAAAAAAD9////AnAXAAAAAAAAFgAU4Xyz1p1soZLkDMb8kVChkxYqvE1TIgAAAAAAABepFCcCh5rMJBwq3cxA3Pk1HLvQqJawh9D8SAAAAQCWAgAAAAF28/4WJlcQr/qlsIywpcDhufT26DshpJbJgmL1RI3uqgEAAAAjIgAgpF78VL4e8exJ0oCo7EmLp/AexL0g+33QSrdviIU2e7D9////Apg6AAAAAAAAF6kUdD/Fj4TqDLps5kRwT1USHVNlK4OHDxoAAAAAAAAXqRRclVbJ+LwET6NJprBj6DhyEnZ0TofQ/EgAAQEgmDoAAAAAAAAXqRR0P8WPhOoMumzmRHBPVRIdU2Urg4ciAgLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRUcwRAIgHz77FKhXvwppg/UAHZBxYU1khIfytFPNps4n1GC5SUgCIDdp4phVU9FjLVxVOr6FVtKXxmBEcIsg9UKk0RnOQxLaAQEEIgAgtkVzcJ071VHY1sGBTdnxFuXZFs2iI0PH3k9itVqHBYwBBWlSIQM5FauNH0IkqUIETJNm0nCoMIo1yRjqMs2XSrJK5ZRIjiEC8L2ePv47EeSCLfpERYr+B/QUXm9rhLP13pQvcjg/0EUhA1h++i25jFKKeY5QAOOO2XmTVXcN5KUlh65z3tQWdxg0U64iBgM5FauNH0IkqUIETJNm0nCoMIo1yRjqMs2XSrJK5ZRIjpC1KBaWAwAAAOkkAAC/4wAAfTkAAOOCAAAhmgAAoocAAG9OAACXBAAA9J8AAGMeAABITwAAmOUAAL57AAAhyQAAye4AAIKqAAAA2QAA3vAAANkHAAAe5gAA0XYAAC8PAAAM1AAAXuQAAD4VAAB4bwAAWWEAAD2mAAA9SAAA7nEAAEzZAABHRwAAAwAAAAEAAAAiBgLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRRRuGvQGAwAAgAMAAIABAAAAAQAAACIGA1h++i25jFKKeY5QAOOO2XmTVXcN5KUlh65z3tQWdxg0FOPrzHkDAACAAwAAgAEAAAABAAAAAAAiAgNlUwVmgEkL143aC//cyOwNDOnaaodeXOgw6IzsF6mCypC1KBaWAwAAAOkkAAC/4wAAfTkAAOOCAAAhmgAAoocAAG9OAACXBAAA9J8AAGMeAABITwAAmOUAAL57AAAhyQAAye4AAIKqAAAA2QAA3vAAANkHAAAe5gAA0XYAAC8PAAAM1AAAXuQAAD4VAAB4bwAAWWEAAD2mAAA9SAAA7nEAAEzZAABHRwAAAwAAAAIAAAAiAgOny0TaXKkDJE89Hs+1kwIEuBUp2FnoC+axpIiZs+QtSxRuGvQGAwAAgAMAAIABAAAAAgAAACICAm0FYlQpUErSFwjbXCrZDsktXGdclM+brBApvAZt3prnFOPrzHkDAACAAwAAgAEAAAACAAAAAA=="
+ },
+ "expected_output": {
+ "psbt": "cHNidP8BAHICAAAAAZ5baDG0n/tdMUAScn6pw4NoA4nHKQoBMEP+KKKGJ/NKAAAAAAD9////AnAXAAAAAAAAFgAU4Xyz1p1soZLkDMb8kVChkxYqvE1TIgAAAAAAABepFCcCh5rMJBwq3cxA3Pk1HLvQqJawh9D8SAAAAQCWAgAAAAF28/4WJlcQr/qlsIywpcDhufT26DshpJbJgmL1RI3uqgEAAAAjIgAgpF78VL4e8exJ0oCo7EmLp/AexL0g+33QSrdviIU2e7D9////Apg6AAAAAAAAF6kUdD/Fj4TqDLps5kRwT1USHVNlK4OHDxoAAAAAAAAXqRRclVbJ+LwET6NJprBj6DhyEnZ0TofQ/EgAAQEgmDoAAAAAAAAXqRR0P8WPhOoMumzmRHBPVRIdU2Urg4ciAgLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRUcwRAIgHz77FKhXvwppg/UAHZBxYU1khIfytFPNps4n1GC5SUgCIDdp4phVU9FjLVxVOr6FVtKXxmBEcIsg9UKk0RnOQxLaASICA1h++i25jFKKeY5QAOOO2XmTVXcN5KUlh65z3tQWdxg0RzBEAiBlxXvTzvR0/wZVWdGtyQ0Q1A5d9zX8WSR9Xho8QuS6OgIgZIR06R+xFL0Jym3eQpdASUnr+Ycw2/SZIpj8zNCNu1YBAQQiACC2RXNwnTvVUdjWwYFN2fEW5dkWzaIjQ8feT2K1WocFjAEFaVIhAzkVq40fQiSpQgRMk2bScKgwijXJGOoyzZdKskrllEiOIQLwvZ4+/jsR5IIt+kRFiv4H9BReb2uEs/XelC9yOD/QRSEDWH76LbmMUop5jlAA447ZeZNVdw3kpSWHrnPe1BZ3GDRTriIGAzkVq40fQiSpQgRMk2bScKgwijXJGOoyzZdKskrllEiOkLUoFpYDAAAA6SQAAL/jAAB9OQAA44IAACGaAACihwAAb04AAJcEAAD0nwAAYx4AAEhPAACY5QAAvnsAACHJAADJ7gAAgqoAAADZAADe8AAA2QcAAB7mAADRdgAALw8AAAzUAABe5AAAPhUAAHhvAABZYQAAPaYAAD1IAADucQAATNkAAEdHAAADAAAAAQAAACIGAvC9nj7+OxHkgi36REWK/gf0FF5va4Sz9d6UL3I4P9BFFG4a9AYDAACAAwAAgAEAAAABAAAAIgYDWH76LbmMUop5jlAA447ZeZNVdw3kpSWHrnPe1BZ3GDQU4+vMeQMAAIADAACAAQAAAAEAAAAAACICA2VTBWaASQvXjdoL/9zI7A0M6dpqh15c6DDojOwXqYLKkLUoFpYDAAAA6SQAAL/jAAB9OQAA44IAACGaAACihwAAb04AAJcEAAD0nwAAYx4AAEhPAACY5QAAvnsAACHJAADJ7gAAgqoAAADZAADe8AAA2QcAAB7mAADRdgAALw8AAAzUAABe5AAAPhUAAHhvAABZYQAAPaYAAD1IAADucQAATNkAAEdHAAADAAAAAgAAACICA6fLRNpcqQMkTz0ez7WTAgS4FSnYWegL5rGkiJmz5C1LFG4a9AYDAACAAwAAgAEAAAACAAAAIgICbQViVClQStIXCNtcKtkOyS1cZ1yUz5usECm8Bm3emucU4+vMeQMAAIADAACAAQAAAAIAAAAA"
+ }
+}
\ No newline at end of file
Why this scored 5/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.