more scanning

This commit is contained in:
Peter D. Gray 2023-12-06 09:47:25 -05:00
parent 32a39e530a
commit 6dccaa5841
No known key found for this signature in database
GPG Key ID: A2DCD558C2BE5D7C
5 changed files with 54 additions and 18 deletions

View File

@ -127,17 +127,17 @@ We will summarize transaction outputs as "change" back into same wallet, however
- key derivatation paths must be 12 or less in depth (`MAX_PATH_DEPTH`)
# NFC Feature (Mk4)
# NFC Feature
- can share up to 8000 bytes of PSBT or signed transaction data.
- NFC-V (ISO-15693) radio/modulation is common on mobile phones but very rare on desktops
# Fast Wipe (Mk4)
# Fast Wipe
- each use of "fast wipe" feature consumes a MCU key slot, of which there are 256.
- use _Advanced > Danger Zone > MCU Key Slots_ to view usage
# Trick Pins (Mk4)
# Trick Pins
- "deltamode" PIN must be same length as true pin, and differ only in final 4 positions.
- there are 14 trick "slots", but we avoid slot 10, so 13 available.
@ -148,9 +148,24 @@ We will summarize transaction outputs as "change" back into same wallet, however
is not compatible, the deltamode trick PIN is dropped and not restored
- duress wallets are supported when derived from 24- or 12-word seed phrases
# Debug Serial Port (Mk4)
# Debug Serial Port
- virtual USB serial port disabled completely by default, and even if enabled
in Danger Zone, only echos output, and does not accept any input
- use hardware serial port for interactive REPL access (3.3v TTL levels)
# BBQr Scanning (Q)
- files up to 2MiB in size can be accepted
- when 14 or less parts, displays status of each part, above that, just percent complete
# QR Scanning (Q)
- if not BBQr (or sent as unicode inside BBQr) we auto detect these data types:
- PSBT in Base64 or hex
- Wire Transaction in Base64 or hex
- XPRV, XPUB, bare payment addresses, BIP-21 invoices
- seed words (truncated, or full)
- SeedQR (but not Compact SeedQR)
- for Base58, Bech32 encoded values, if checksum is wrong then shown as text

View File

@ -5,7 +5,7 @@
import utime, uzlib
import uasyncio as asyncio
from struct import pack, unpack
from utils import B2A
from utils import B2A, problem_file_line
from imptask import IMPT
from queues import Queue
from exceptions import QRDecodeExplained
@ -98,7 +98,10 @@ class BBQrState:
# - updates UX to show the progress
from glob import dis
hdr = BBQrHeader(scan)
try:
hdr = BBQrHeader(scan)
except Exception as exc:
raise QRDecodeExplained("Bad header: %s" % problem_file_line(exc))
#print("Got %r have %r" % (hdr, self.parts))
@ -106,6 +109,7 @@ class BBQrState:
# New or incompatible header, they might have changed their
# minds and are now trying to scan something else; recover
self.reset()
self.storage.reset()
self.hdr = hdr
if hdr.which not in self.parts:
@ -154,6 +158,9 @@ class BBQrStorage:
# override this on other projects... which don't have enough ram for whole thing
def __init__(self):
self.reset()
def reset(self):
self.buf = None
self.hdr = None # could be any header in series
self.runt_size = None

View File

@ -99,7 +99,7 @@ def decode_qr_result(got, expect_secret=False):
pass
else:
msg = TYPE_LABELS.get(ty, 'Unknown Type')
msg = TYPE_LABELS.get(ty, 'Unknown FileType')
raise QRDecodeExplained("Sorry, %s not useful." % msg)
# First can we decode a master secret of some type?

View File

@ -594,12 +594,26 @@ class Display:
# - lots of data so we can show nice animation
# - hdr:BBQrHeader instance
count = len(got_parts)
if hdr.num_parts < (CHARS_W // 4):
pat = [('-' if i not in got_parts else str(i+1)) for i in range(hdr.num_parts)]
if corrupt:
pat[hdr.which] = 'X'
pat = (' ' if hdr.num_parts < (CHARS_W//2) else ' ').join(pat)
self.text(None, -3, pat)
if hdr.num_parts < (CHARS_W // 2):
# if not too many parts, show - or 3 as they arrive
pat = []
for i in range(hdr.num_parts):
if i in got_parts:
pat.append(str(i+1))
else:
wl = 1 if i < 9 else 2
if corrupt and i == hdr.which:
pat.append('X'*wl)
else:
pat.append('-'*wl)
pat = (' ' if hdr.num_parts <= 8 else ' ').join(pat)
if len(pat) > CHARS_W:
pat = ''
else:
pat = '' # clear line
self.text(None, -3, pat)
self.text(None, -2, 'Keep scanning more...' if count < hdr.num_parts else 'Got all parts!')
self.text(None, -1, '%s: %d of %d parts' % (hdr.file_label(), count, hdr.num_parts),

View File

@ -650,12 +650,12 @@ class QRScannerInteraction:
prompt = 'Scan any QR code, or CANCEL' if not expect_secret else \
'Scan XPRV or Seed Words, or CANCEL'
got = await self.scan(prompt, line2=problem)
if got is None:
return
# Figure out what we got.
try:
got = await self.scan(prompt, line2=problem)
if got is None:
return
# Figure out what we got.
what, vals = decode_qr_result(got, expect_secret=expect_secret)
except QRDecodeExplained as exc:
problem = str(exc)