<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/23698">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">shell: Add 'apdu_trace' settable parameter for hex-dumping APDUs<br><br>Change-Id: I0c957c0b86473413f31e4bd8bc4e633fc1470222<br>---<br>M docs/shell.rst<br>M pySim-shell.py<br>M pySim/transport/__init__.py<br>3 files changed, 39 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/98/23698/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/docs/shell.rst b/docs/shell.rst</span><br><span>index 3ea6c56..dab9f56 100644</span><br><span>--- a/docs/shell.rst</span><br><span>+++ b/docs/shell.rst</span><br><span>@@ -332,6 +332,11 @@</span><br><span> </span><br><span> If enabled, full python back-traces will be displayed in case of exceptions</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+apdu_trace</span><br><span style="color: hsl(120, 100%, 40%);">+~~~~~~~~~~</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Boolean variable that determines if a hex-dump of the command + response APDU shall be printed.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> numeric_path</span><br><span> ~~~~~~~~~~~~</span><br><span> </span><br><span>diff --git a/pySim-shell.py b/pySim-shell.py</span><br><span>index 3059f3f..21d611b 100755</span><br><span>--- a/pySim-shell.py</span><br><span>+++ b/pySim-shell.py</span><br><span>@@ -37,7 +37,7 @@</span><br><span> </span><br><span> from pySim.exceptions import *</span><br><span> from pySim.commands import SimCardCommands</span><br><span style="color: hsl(0, 100%, 40%);">-from pySim.transport import init_reader</span><br><span style="color: hsl(120, 100%, 40%);">+from pySim.transport import init_reader, ApduTracer</span><br><span> from pySim.cards import card_detect, Card</span><br><span> from pySim.utils import h2b, swap_nibbles, rpad, h2s</span><br><span> from pySim.utils import dec_st, sanitize_pin_adm, tabulate_str_list, is_hex</span><br><span>@@ -74,6 +74,9 @@</span><br><span>                self.update_prompt()</span><br><span>                 self.json_pretty_print = True</span><br><span>                self.add_settable(cmd2.Settable('json_pretty_print', bool, 'Pretty-Print JSON output'))</span><br><span style="color: hsl(120, 100%, 40%);">+               self.apdu_trace = False</span><br><span style="color: hsl(120, 100%, 40%);">+               self.add_settable(cmd2.Settable('apdu_trace', bool, 'Trace and display APDUs exchanged with card',</span><br><span style="color: hsl(120, 100%, 40%);">+                                              onchange_cb=self._onchange_apdu_trace))</span><br><span> </span><br><span>        def poutput_json(self, data, force_no_pretty = False):</span><br><span>               """line cmd2.putput() but for a json serializable dict."""</span><br><span>@@ -89,6 +92,20 @@</span><br><span>        def _onchange_conserve_write(self, param_name, old, new):</span><br><span>            self.rs.conserve_write = new</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      def _onchange_apdu_trace(self, param_name, old, new):</span><br><span style="color: hsl(120, 100%, 40%);">+         if new == True:</span><br><span style="color: hsl(120, 100%, 40%);">+                       self.card._scc._tp.apdu_tracer = self.Cmd2ApduTracer(self)</span><br><span style="color: hsl(120, 100%, 40%);">+            else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 self.card._scc._tp.apdu_tracer = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       class Cmd2ApduTracer(ApduTracer):</span><br><span style="color: hsl(120, 100%, 40%);">+             def __init__(self, cmd2_app):</span><br><span style="color: hsl(120, 100%, 40%);">+                 self.cmd2 = app</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             def trace_response(self, cmd, sw, resp):</span><br><span style="color: hsl(120, 100%, 40%);">+                      self.cmd2.poutput("-> %s %s" % (cmd[:10], cmd[10:]))</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.cmd2.poutput("<- %s: %s" % (sw, resp))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   def update_prompt(self):</span><br><span>             path_list = self.rs.selected_file.fully_qualified_path(not self.numeric_path)</span><br><span>                self.prompt = 'pySIM-shell (%s)> ' % ('/'.join(path_list))</span><br><span>diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py</span><br><span>index c176f8a..96ad974 100644</span><br><span>--- a/pySim/transport/__init__.py</span><br><span>+++ b/pySim/transport/__init__.py</span><br><span>@@ -25,11 +25,20 @@</span><br><span> # along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span> #</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+class ApduTracer:</span><br><span style="color: hsl(120, 100%, 40%);">+     def trace_command(self, cmd):</span><br><span style="color: hsl(120, 100%, 40%);">+         pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def trace_response(self, cmd, sw, resp):</span><br><span style="color: hsl(120, 100%, 40%);">+              pass</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class LinkBase(object):</span><br><span>  """Base class for link/transport to card."""</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  def __init__(self, sw_interpreter=None):</span><br><span style="color: hsl(120, 100%, 40%);">+      def __init__(self, sw_interpreter=None, apdu_tracer=None):</span><br><span>           self.sw_interpreter = sw_interpreter</span><br><span style="color: hsl(120, 100%, 40%);">+          self.apdu_tracer = apdu_tracer</span><br><span> </span><br><span>   def set_sw_interpreter(self, interp):</span><br><span>                """Set an (optional) status word interpreter."""</span><br><span>@@ -69,7 +78,12 @@</span><br><span>                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span>                                 sw   : string (in hex) of status word (ex. "9000")</span><br><span>                 """</span><br><span style="color: hsl(0, 100%, 40%);">-              return self._send_apdu_raw(pdu)</span><br><span style="color: hsl(120, 100%, 40%);">+               if self.apdu_tracer:</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.apdu_tracer.trace_command(pdu)</span><br><span style="color: hsl(120, 100%, 40%);">+           (data, sw) = self._send_apdu_raw(pdu)</span><br><span style="color: hsl(120, 100%, 40%);">+         if self.apdu_tracer:</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.apdu_tracer.trace_response(pdu, sw, data)</span><br><span style="color: hsl(120, 100%, 40%);">+                return (data, sw)</span><br><span> </span><br><span>        def send_apdu(self, pdu):</span><br><span>            """Sends an APDU and auto fetch response data</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/23698">change 23698</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/pysim/+/23698"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: pysim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0c957c0b86473413f31e4bd8bc4e633fc1470222 </div>
<div style="display:none"> Gerrit-Change-Number: 23698 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>