fastinit: escalate soft reset to physical on SW mismatch; retry/fallback
A probe can leave a card in a context where CLA-00 file access returns 6d00, so the software MF select fails (stock pysim init survives only because it resets physically after probing). Fast init now recovers the same way, on demand: - FastRuntimeState.reset() falls back to hard_reset() on SwMatchError/ProtocolError (logged as FAST-RESET) - init_card_fast() retries once after sl.reset_card() (FAST-INIT) - __main__ falls back to stock pysim init once and skips TERMINAL PROFILE/drain when no card was initialized (no more 6d00/6985 noise after a failed init) - do_equip_fast() no longer pre-unregisters command sets; PysimApp.equip does that after a successful init, so a failed equip keeps the previous card/rs instead of leaving the app unequipped Tests for the escalation, the retry and failed-equip state retention. No card-model special cases.
This commit is contained in:
@@ -98,7 +98,12 @@ def main():
|
||||
scc._tp.proactive_handler = _DefaultProactiveHandler()
|
||||
t_phase = time.time()
|
||||
if opts.fast_init:
|
||||
rs, card = fastinit.init_card_fast(sl, opts.skip_card_init, wait=True)
|
||||
try:
|
||||
rs, card = fastinit.init_card_fast(sl, opts.skip_card_init, wait=True)
|
||||
except Exception:
|
||||
print("Warning: fast card initialization failed, falling back to pysim init:", file=sys.stderr)
|
||||
traceback.print_exc()
|
||||
rs, card = mod.init_card(sl, opts.skip_card_init)
|
||||
else:
|
||||
sl.wait_for_card(3)
|
||||
rs, card = mod.init_card(sl, opts.skip_card_init)
|
||||
@@ -118,7 +123,7 @@ def main():
|
||||
_tlog('pysim_app: %.0fms' % ((time.time() - t_phase) * 1000))
|
||||
if app is not None and opts.fast_init:
|
||||
fastinit.install(app)
|
||||
if scc and hasattr(scc, '_tp'):
|
||||
if scc and card is not None and hasattr(scc, '_tp'):
|
||||
scc._tp.apdu_tracer = _LoggingApduTracer()
|
||||
try:
|
||||
_init_proactive_session()
|
||||
@@ -137,6 +142,8 @@ def main():
|
||||
_tlog('terminal_profile_drain: %.0fms' % ((time.time() - t_phase) * 1000))
|
||||
except Exception:
|
||||
traceback.print_exc(file=sys.stderr)
|
||||
elif scc is not None:
|
||||
sys.stderr.write('INIT: card not initialized — use Equip once the card is readable\n')
|
||||
if app is not None and opts.apdu_trace:
|
||||
# PysimApp.__init__ routes PySimLogger through app.poutput() (app.stdout)
|
||||
# and drops the root level to INFO. Re-route pysim's own APDU trace logging
|
||||
|
||||
Reference in New Issue
Block a user