mirror of https://gerrit.osmocom.org/pysim
shell: Add 'apdu_trace' settable parameter for hex-dumping APDUs
Change-Id: I0c957c0b86473413f31e4bd8bc4e633fc1470222
This commit is contained in:
parent
eb05b2f60e
commit
7829d8a357
|
@ -328,6 +328,11 @@ debug
|
||||||
|
|
||||||
If enabled, full python back-traces will be displayed in case of exceptions
|
If enabled, full python back-traces will be displayed in case of exceptions
|
||||||
|
|
||||||
|
apdu_trace
|
||||||
|
~~~~~~~~~~
|
||||||
|
|
||||||
|
Boolean variable that determines if a hex-dump of the command + response APDU shall be printed.
|
||||||
|
|
||||||
numeric_path
|
numeric_path
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ from pySim.ts_31_103 import EF_IST_map, EF_ISIM_ADF_map
|
||||||
|
|
||||||
from pySim.exceptions import *
|
from pySim.exceptions import *
|
||||||
from pySim.commands import SimCardCommands
|
from pySim.commands import SimCardCommands
|
||||||
from pySim.transport import init_reader
|
from pySim.transport import init_reader, ApduTracer
|
||||||
from pySim.cards import card_detect, Card
|
from pySim.cards import card_detect, Card
|
||||||
from pySim.utils import h2b, swap_nibbles, rpad, h2s
|
from pySim.utils import h2b, swap_nibbles, rpad, h2s
|
||||||
from pySim.utils import dec_st, sanitize_pin_adm, tabulate_str_list, is_hex
|
from pySim.utils import dec_st, sanitize_pin_adm, tabulate_str_list, is_hex
|
||||||
|
@ -74,6 +74,9 @@ class PysimApp(cmd2.Cmd):
|
||||||
self.update_prompt()
|
self.update_prompt()
|
||||||
self.json_pretty_print = True
|
self.json_pretty_print = True
|
||||||
self.add_settable(cmd2.Settable('json_pretty_print', bool, 'Pretty-Print JSON output'))
|
self.add_settable(cmd2.Settable('json_pretty_print', bool, 'Pretty-Print JSON output'))
|
||||||
|
self.apdu_trace = False
|
||||||
|
self.add_settable(cmd2.Settable('apdu_trace', bool, 'Trace and display APDUs exchanged with card',
|
||||||
|
onchange_cb=self._onchange_apdu_trace))
|
||||||
|
|
||||||
def poutput_json(self, data, force_no_pretty = False):
|
def poutput_json(self, data, force_no_pretty = False):
|
||||||
"""line cmd2.putput() but for a json serializable dict."""
|
"""line cmd2.putput() but for a json serializable dict."""
|
||||||
|
@ -89,6 +92,20 @@ class PysimApp(cmd2.Cmd):
|
||||||
def _onchange_conserve_write(self, param_name, old, new):
|
def _onchange_conserve_write(self, param_name, old, new):
|
||||||
self.rs.conserve_write = new
|
self.rs.conserve_write = new
|
||||||
|
|
||||||
|
def _onchange_apdu_trace(self, param_name, old, new):
|
||||||
|
if new == True:
|
||||||
|
self.card._scc._tp.apdu_tracer = self.Cmd2ApduTracer(self)
|
||||||
|
else:
|
||||||
|
self.card._scc._tp.apdu_tracer = None
|
||||||
|
|
||||||
|
class Cmd2ApduTracer(ApduTracer):
|
||||||
|
def __init__(self, cmd2_app):
|
||||||
|
self.cmd2 = app
|
||||||
|
|
||||||
|
def trace_response(self, cmd, sw, resp):
|
||||||
|
self.cmd2.poutput("-> %s %s" % (cmd[:10], cmd[10:]))
|
||||||
|
self.cmd2.poutput("<- %s: %s" % (sw, resp))
|
||||||
|
|
||||||
def update_prompt(self):
|
def update_prompt(self):
|
||||||
path_list = self.rs.selected_file.fully_qualified_path(not self.numeric_path)
|
path_list = self.rs.selected_file.fully_qualified_path(not self.numeric_path)
|
||||||
self.prompt = 'pySIM-shell (%s)> ' % ('/'.join(path_list))
|
self.prompt = 'pySIM-shell (%s)> ' % ('/'.join(path_list))
|
||||||
|
|
|
@ -25,11 +25,20 @@ from pySim.utils import sw_match
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
class ApduTracer:
|
||||||
|
def trace_command(self, cmd):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def trace_response(self, cmd, sw, resp):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class LinkBase(object):
|
class LinkBase(object):
|
||||||
"""Base class for link/transport to card."""
|
"""Base class for link/transport to card."""
|
||||||
|
|
||||||
def __init__(self, sw_interpreter=None):
|
def __init__(self, sw_interpreter=None, apdu_tracer=None):
|
||||||
self.sw_interpreter = sw_interpreter
|
self.sw_interpreter = sw_interpreter
|
||||||
|
self.apdu_tracer = apdu_tracer
|
||||||
|
|
||||||
def set_sw_interpreter(self, interp):
|
def set_sw_interpreter(self, interp):
|
||||||
"""Set an (optional) status word interpreter."""
|
"""Set an (optional) status word interpreter."""
|
||||||
|
@ -69,7 +78,12 @@ class LinkBase(object):
|
||||||
data : string (in hex) of returned data (ex. "074F4EFFFF")
|
data : string (in hex) of returned data (ex. "074F4EFFFF")
|
||||||
sw : string (in hex) of status word (ex. "9000")
|
sw : string (in hex) of status word (ex. "9000")
|
||||||
"""
|
"""
|
||||||
return self._send_apdu_raw(pdu)
|
if self.apdu_tracer:
|
||||||
|
self.apdu_tracer.trace_command(pdu)
|
||||||
|
(data, sw) = self._send_apdu_raw(pdu)
|
||||||
|
if self.apdu_tracer:
|
||||||
|
self.apdu_tracer.trace_response(pdu, sw, data)
|
||||||
|
return (data, sw)
|
||||||
|
|
||||||
def send_apdu(self, pdu):
|
def send_apdu(self, pdu):
|
||||||
"""Sends an APDU and auto fetch response data
|
"""Sends an APDU and auto fetch response data
|
||||||
|
|
Loading…
Reference in New Issue