<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/15505">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  neels: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">python3 conversion: fix tabs and spaces inconsistency<br><br>Without that fix we have:<br>  $ python3 pySim-read.py<br>    File "pySim-read.py", line 135<br>      try:<br>         ^<br>  TabError: inconsistent use of tabs and spaces in indentation<br><br>The following command was used to do the conversion:<br>  sed 's#        #\t#g' -i $(find -name "*.py")<br><br>Then the remaining spaces spotted during the review were<br>addressed manually.<br><br>Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org><br>Change-Id: I83f76a8e9b6e36098f16552a0135a8c22dde545f<br>---<br>M pySim-prog.py<br>M pySim-read.py<br>M pySim/cards.py<br>M pySim/commands.py<br>M pySim/transport/__init__.py<br>5 files changed, 108 insertions(+), 109 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim-prog.py b/pySim-prog.py</span><br><span>index 990fe15..b070c5e 100755</span><br><span>--- a/pySim-prog.py</span><br><span>+++ b/pySim-prog.py</span><br><span>@@ -130,7 +130,7 @@</span><br><span>          )</span><br><span>    parser.add_option("--acc", dest="acc",</span><br><span>                   help="Set ACC bits (Access Control Code). not all card types are supported",</span><br><span style="color: hsl(0, 100%, 40%);">-                )</span><br><span style="color: hsl(120, 100%, 40%);">+               )</span><br><span>    parser.add_option("--read-imsi", dest="read_imsi", action="store_true",</span><br><span>                        help="Read the IMSI from the CARD", default=False</span><br><span>          )</span><br><span>@@ -176,8 +176,8 @@</span><br><span>                      print kls.name</span><br><span>               sys.exit(0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if options.probe:</span><br><span style="color: hsl(0, 100%, 40%);">-                return options</span><br><span style="color: hsl(120, 100%, 40%);">+        if options.probe:</span><br><span style="color: hsl(120, 100%, 40%);">+             return options</span><br><span> </span><br><span>   if options.source == 'csv':</span><br><span>          if (options.imsi is None) and (options.batch_mode is False) and (options.read_imsi is False) and (options.read_iccid is False):</span><br><span>@@ -287,7 +287,7 @@</span><br><span>                iccid = (</span><br><span>                    '89' +                  # Common prefix (telecom)</span><br><span>                    cc_digits +             # Country Code on 2/3 digits</span><br><span style="color: hsl(0, 100%, 40%);">-                    plmn_digits     # MCC/MNC on 5/6 digits</span><br><span style="color: hsl(120, 100%, 40%);">+                       plmn_digits             # MCC/MNC on 5/6 digits</span><br><span>              )</span><br><span> </span><br><span>                ml = 18 - len(iccid)</span><br><span>@@ -399,14 +399,14 @@</span><br><span>                 else:</span><br><span>                        raise ValueError("PIN-ADM needs to be <=8 digits (ascii)")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if opts.pin_adm_hex is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+   if opts.pin_adm_hex is not None:</span><br><span>             if len(opts.pin_adm_hex) == 16:</span><br><span>                      pin_adm = opts.pin_adm_hex</span><br><span>                   # Ensure that it's hex-encoded</span><br><span>                   try:</span><br><span>                                 try_encode = h2b(pin_adm)</span><br><span>                    except ValueError:</span><br><span style="color: hsl(0, 100%, 40%);">-                          raise ValueError("PIN-ADM needs to be hex encoded using this option")</span><br><span style="color: hsl(120, 100%, 40%);">+                           raise ValueError("PIN-ADM needs to be hex encoded using this option")</span><br><span>              else:</span><br><span>                        raise ValueError("PIN-ADM needs to be exactly 16 digits (hex encoded)")</span><br><span> </span><br><span>@@ -462,8 +462,8 @@</span><br><span>  cr.fieldnames = [ field.lower() for field in cr.fieldnames ]</span><br><span> </span><br><span>     i = 0</span><br><span style="color: hsl(0, 100%, 40%);">-        if not 'iccid' in cr.fieldnames:</span><br><span style="color: hsl(0, 100%, 40%);">-            raise Exception("CSV file in wrong format!")</span><br><span style="color: hsl(120, 100%, 40%);">+       if not 'iccid' in cr.fieldnames:</span><br><span style="color: hsl(120, 100%, 40%);">+              raise Exception("CSV file in wrong format!")</span><br><span>       for row in cr:</span><br><span>               if opts.num is not None and opts.read_iccid is False and opts.read_imsi is False:</span><br><span>                    if opts.num == i:</span><br><span>@@ -726,7 +726,7 @@</span><br><span> </span><br><span>  if opts.card_handler:</span><br><span>                card_handler = card_handler_auto(sl, opts.card_handler)</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(120, 100%, 40%);">+  else:</span><br><span>                card_handler = card_handler(sl)</span><br><span> </span><br><span>  # Iterate</span><br><span>@@ -762,4 +762,3 @@</span><br><span>                      sys.exit(rc)</span><br><span> </span><br><span>             first = False</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/pySim-read.py b/pySim-read.py</span><br><span>index 17fce61..4bfa900 100755</span><br><span>--- a/pySim-read.py</span><br><span>+++ b/pySim-read.py</span><br><span>@@ -123,41 +123,41 @@</span><br><span> </span><br><span>   # EF.PLMNsel</span><br><span>         try:</span><br><span style="color: hsl(0, 100%, 40%);">-            (res, sw) = scc.read_binary(EF['PLMNsel'])</span><br><span style="color: hsl(0, 100%, 40%);">-              if sw == '9000':</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("PLMNsel: %s" % (res))</span><br><span style="color: hsl(0, 100%, 40%);">-          else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("PLMNsel: Can't read, response code = %s" % (sw,))</span><br><span style="color: hsl(120, 100%, 40%);">+                (res, sw) = scc.read_binary(EF['PLMNsel'])</span><br><span style="color: hsl(120, 100%, 40%);">+            if sw == '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("PLMNsel: %s" % (res))</span><br><span style="color: hsl(120, 100%, 40%);">+                else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 print("PLMNsel: Can't read, response code = %s" % (sw,))</span><br><span>       except Exception as e:</span><br><span>               print "HPLMNAcT: Can't read file -- " + str(e)</span><br><span> </span><br><span>     # EF.PLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-        try:</span><br><span style="color: hsl(0, 100%, 40%);">-               (res, sw) = scc.read_binary(EF['PLMNwAcT'])</span><br><span style="color: hsl(0, 100%, 40%);">-             if sw == '9000':</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("PLMNwAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(0, 100%, 40%);">-            else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("PLMNwAcT: Can't read, response code = %s" % (sw,))</span><br><span style="color: hsl(120, 100%, 40%);">+       try:</span><br><span style="color: hsl(120, 100%, 40%);">+          (res, sw) = scc.read_binary(EF['PLMNwAcT'])</span><br><span style="color: hsl(120, 100%, 40%);">+           if sw == '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("PLMNwAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(120, 100%, 40%);">+          else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 print("PLMNwAcT: Can't read, response code = %s" % (sw,))</span><br><span>      except Exception as e:</span><br><span>               print "PLMNwAcT: Can't read file -- " + str(e)</span><br><span> </span><br><span>     # EF.OPLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-        try:</span><br><span style="color: hsl(0, 100%, 40%);">-              (res, sw) = scc.read_binary(EF['OPLMNwAcT'])</span><br><span style="color: hsl(0, 100%, 40%);">-            if sw == '9000':</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("OPLMNwAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(0, 100%, 40%);">-           else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("OPLMNwAcT: Can't read, response code = %s" % (sw,))</span><br><span style="color: hsl(120, 100%, 40%);">+      try:</span><br><span style="color: hsl(120, 100%, 40%);">+          (res, sw) = scc.read_binary(EF['OPLMNwAcT'])</span><br><span style="color: hsl(120, 100%, 40%);">+          if sw == '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("OPLMNwAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(120, 100%, 40%);">+         else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 print("OPLMNwAcT: Can't read, response code = %s" % (sw,))</span><br><span>     except Exception as e:</span><br><span>               print "OPLMNwAcT: Can't read file -- " + str(e)</span><br><span> </span><br><span>    # EF.HPLMNAcT</span><br><span style="color: hsl(0, 100%, 40%);">-        try:</span><br><span style="color: hsl(0, 100%, 40%);">-               (res, sw) = scc.read_binary(EF['HPLMNAcT'])</span><br><span style="color: hsl(0, 100%, 40%);">-             if sw == '9000':</span><br><span style="color: hsl(0, 100%, 40%);">-                        print("HPLMNAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(0, 100%, 40%);">-            else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   print("HPLMNAcT: Can't read, response code = %s" % (sw,))</span><br><span style="color: hsl(120, 100%, 40%);">+       try:</span><br><span style="color: hsl(120, 100%, 40%);">+          (res, sw) = scc.read_binary(EF['HPLMNAcT'])</span><br><span style="color: hsl(120, 100%, 40%);">+           if sw == '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("HPLMNAcT:\n%s" % (format_xplmn_w_act(res)))</span><br><span style="color: hsl(120, 100%, 40%);">+          else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 print("HPLMNAcT: Can't read, response code = %s" % (sw,))</span><br><span>      except Exception as e:</span><br><span>               print "HPLMNAcT: Can't read file -- " + str(e)</span><br><span> </span><br><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index cda337a..41723c4 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -85,11 +85,11 @@</span><br><span> </span><br><span>      def update_oplmn_act(self, mcc, mnc, access_tech='FFFF'):</span><br><span>            """</span><br><span style="color: hsl(0, 100%, 40%);">-                See note in update_hplmn_act()</span><br><span style="color: hsl(120, 100%, 40%);">+              See note in update_hplmn_act()</span><br><span>               """</span><br><span>           # get size and write EF.OPLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-               data = self._scc.read_binary(EF['OPLMNwAcT'], length=None, offset=0)</span><br><span style="color: hsl(0, 100%, 40%);">-                size = len(data[0])/2</span><br><span style="color: hsl(120, 100%, 40%);">+             data = self._scc.read_binary(EF['OPLMNwAcT'], length=None, offset=0)</span><br><span style="color: hsl(120, 100%, 40%);">+          size = len(data[0])/2</span><br><span>                hplmn = enc_plmn(mcc, mnc)</span><br><span>           content = hplmn + access_tech</span><br><span>                data, sw = self._scc.update_binary(EF['OPLMNwAcT'], content + 'ffffff0000' * (size/5-1))</span><br><span>@@ -97,19 +97,19 @@</span><br><span> </span><br><span>   def update_plmn_act(self, mcc, mnc, access_tech='FFFF'):</span><br><span>             """</span><br><span style="color: hsl(0, 100%, 40%);">-                See note in update_hplmn_act()</span><br><span style="color: hsl(120, 100%, 40%);">+              See note in update_hplmn_act()</span><br><span>               """</span><br><span>           # get size and write EF.PLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-                data = self._scc.read_binary(EF['PLMNwAcT'], length=None, offset=0)</span><br><span style="color: hsl(0, 100%, 40%);">-                size = len(data[0])/2</span><br><span style="color: hsl(120, 100%, 40%);">+              data = self._scc.read_binary(EF['PLMNwAcT'], length=None, offset=0)</span><br><span style="color: hsl(120, 100%, 40%);">+           size = len(data[0])/2</span><br><span>                hplmn = enc_plmn(mcc, mnc)</span><br><span>           content = hplmn + access_tech</span><br><span>                data, sw = self._scc.update_binary(EF['PLMNwAcT'], content + 'ffffff0000' * (size/5-1))</span><br><span>              return sw</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        def update_plmnsel(self, mcc, mnc):</span><br><span style="color: hsl(0, 100%, 40%);">-                data = self._scc.read_binary(EF['PLMNsel'], length=None, offset=0)</span><br><span style="color: hsl(0, 100%, 40%);">-                size = len(data[0])/2</span><br><span style="color: hsl(120, 100%, 40%);">+       def update_plmnsel(self, mcc, mnc):</span><br><span style="color: hsl(120, 100%, 40%);">+           data = self._scc.read_binary(EF['PLMNsel'], length=None, offset=0)</span><br><span style="color: hsl(120, 100%, 40%);">+            size = len(data[0])/2</span><br><span>                hplmn = enc_plmn(mcc, mnc)</span><br><span>           data, sw = self._scc.update_binary(EF['PLMNsel'], hplmn + 'ff' * (size-3))</span><br><span>           return sw</span><br><span>@@ -119,16 +119,16 @@</span><br><span>            return sw</span><br><span> </span><br><span>        def update_ad(self, mnc):</span><br><span style="color: hsl(0, 100%, 40%);">-                #See also: 3GPP TS 31.102, chapter 4.2.18</span><br><span style="color: hsl(0, 100%, 40%);">-                mnclen = len(str(mnc))</span><br><span style="color: hsl(0, 100%, 40%);">-                if mnclen == 1:</span><br><span style="color: hsl(0, 100%, 40%);">-                        mnclen = 2</span><br><span style="color: hsl(0, 100%, 40%);">-                if mnclen > 3:</span><br><span style="color: hsl(120, 100%, 40%);">+            #See also: 3GPP TS 31.102, chapter 4.2.18</span><br><span style="color: hsl(120, 100%, 40%);">+             mnclen = len(str(mnc))</span><br><span style="color: hsl(120, 100%, 40%);">+                if mnclen == 1:</span><br><span style="color: hsl(120, 100%, 40%);">+                       mnclen = 2</span><br><span style="color: hsl(120, 100%, 40%);">+            if mnclen > 3:</span><br><span>                    raise RuntimeError('unable to calculate proper mnclen')</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-             data = self._scc.read_binary(EF['AD'], length=None, offset=0)</span><br><span style="color: hsl(0, 100%, 40%);">-                size = len(data[0])/2</span><br><span style="color: hsl(0, 100%, 40%);">-                content = data[0][0:6] + "%02X" % mnclen</span><br><span style="color: hsl(120, 100%, 40%);">+          data = self._scc.read_binary(EF['AD'], length=None, offset=0)</span><br><span style="color: hsl(120, 100%, 40%);">+         size = len(data[0])/2</span><br><span style="color: hsl(120, 100%, 40%);">+         content = data[0][0:6] + "%02X" % mnclen</span><br><span>           data, sw = self._scc.update_binary(EF['AD'], content)</span><br><span>                return sw</span><br><span> </span><br><span>@@ -394,7 +394,7 @@</span><br><span>                  data, sw = self._scc.update_binary('6f78', lpad(p['acc'], 4))</span><br><span> </span><br><span>            # EF.SMSP</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('smsp'):</span><br><span style="color: hsl(120, 100%, 40%);">+            if p.get('smsp'):</span><br><span>                    r = self._scc.select_file(['3f00', '7f10', '6f42'])</span><br><span>                  data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 80))</span><br><span> </span><br><span>@@ -426,7 +426,7 @@</span><br><span>         """</span><br><span>   name = 'sysmosim-gr1'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        @classmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ @classmethod</span><br><span>         def autodetect(kls, scc):</span><br><span>            try:</span><br><span>                         # Look for ATR</span><br><span>@@ -536,7 +536,7 @@</span><br><span>                 r = self._scc.select_file(['3f00', '7f10'])</span><br><span>          </span><br><span>             # write EF.SMSP</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('smsp'):</span><br><span style="color: hsl(120, 100%, 40%);">+              if p.get('smsp'):</span><br><span>                    data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 80))</span><br><span> </span><br><span>       def erase(self):</span><br><span>@@ -592,25 +592,25 @@</span><br><span>             data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))</span><br><span> </span><br><span>          # EF.PLMNsel</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(0, 100%, 40%);">-                        sw = self.update_plmnsel(p['mcc'], p['mnc'])</span><br><span style="color: hsl(0, 100%, 40%);">-                        if sw != '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+             if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+                     sw = self.update_plmnsel(p['mcc'], p['mnc'])</span><br><span style="color: hsl(120, 100%, 40%);">+                  if sw != '9000':</span><br><span>                             print("Programming PLMNsel failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.PLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+               # EF.PLMNwAcT</span><br><span style="color: hsl(120, 100%, 40%);">+         if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_plmn_act(p['mcc'], p['mnc'])</span><br><span>                        if sw != '9000':</span><br><span>                             print("Programming PLMNwAcT failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.OPLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+             # EF.OPLMNwAcT</span><br><span style="color: hsl(120, 100%, 40%);">+                if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_oplmn_act(p['mcc'], p['mnc'])</span><br><span>                       if sw != '9000':</span><br><span>                             print("Programming OPLMNwAcT failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.AD</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+           # EF.AD</span><br><span style="color: hsl(120, 100%, 40%);">+               if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_ad(p['mnc'])</span><br><span>                        if sw != '9000':</span><br><span>                             print("Programming AD failed with code %s"%sw)</span><br><span>@@ -848,28 +848,28 @@</span><br><span>             if sw != '9000':</span><br><span>                     raise RuntimeError('Failed to authenticate with ADM key %s'%(p['pin_adm'],))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.ICCID</span><br><span style="color: hsl(0, 100%, 40%);">-                # TODO: Add programming of the ICCID</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('iccid'):</span><br><span style="color: hsl(120, 100%, 40%);">+              # EF.ICCID</span><br><span style="color: hsl(120, 100%, 40%);">+            # TODO: Add programming of the ICCID</span><br><span style="color: hsl(120, 100%, 40%);">+          if p.get('iccid'):</span><br><span>                   print("Warning: Programming of the ICCID is not implemented for this type of card.")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # KI (Presumably a propritary file)</span><br><span style="color: hsl(0, 100%, 40%);">-                # TODO: Add programming of KI</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('ki'):</span><br><span style="color: hsl(120, 100%, 40%);">+             # KI (Presumably a propritary file)</span><br><span style="color: hsl(120, 100%, 40%);">+           # TODO: Add programming of KI</span><br><span style="color: hsl(120, 100%, 40%);">+         if p.get('ki'):</span><br><span>                      print("Warning: Programming of the KI is not implemented for this type of card.")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # OPc (Presumably a propritary file)</span><br><span style="color: hsl(0, 100%, 40%);">-                # TODO: Add programming of OPc</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('opc'):</span><br><span style="color: hsl(120, 100%, 40%);">+             # OPc (Presumably a propritary file)</span><br><span style="color: hsl(120, 100%, 40%);">+          # TODO: Add programming of OPc</span><br><span style="color: hsl(120, 100%, 40%);">+                if p.get('opc'):</span><br><span>                     print("Warning: Programming of the OPc is not implemented for this type of card.")</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.SMSP</span><br><span style="color: hsl(120, 100%, 40%);">+             # EF.SMSP</span><br><span>            if p.get('smsp'):</span><br><span>                    sw = self.update_smsp(p['smsp'])</span><br><span>                     if sw != '9000':</span><br><span>                             print("Programming SMSP failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.IMSI</span><br><span style="color: hsl(120, 100%, 40%);">+               # EF.IMSI</span><br><span>            if p.get('imsi'):</span><br><span>                    sw = self.update_imsi(p['imsi'])</span><br><span>                     if sw != '9000':</span><br><span>@@ -882,30 +882,30 @@</span><br><span>                             print("Programming ACC failed with code %s"%sw)</span><br><span> </span><br><span>                # EF.PLMNsel</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(0, 100%, 40%);">-                        sw = self.update_plmnsel(p['mcc'], p['mnc'])</span><br><span style="color: hsl(0, 100%, 40%);">-                        if sw != '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+             if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+                     sw = self.update_plmnsel(p['mcc'], p['mnc'])</span><br><span style="color: hsl(120, 100%, 40%);">+                  if sw != '9000':</span><br><span>                             print("Programming PLMNsel failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.PLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+               # EF.PLMNwAcT</span><br><span style="color: hsl(120, 100%, 40%);">+         if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_plmn_act(p['mcc'], p['mnc'])</span><br><span>                        if sw != '9000':</span><br><span>                             print("Programming PLMNwAcT failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.OPLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+             # EF.OPLMNwAcT</span><br><span style="color: hsl(120, 100%, 40%);">+                if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_oplmn_act(p['mcc'], p['mnc'])</span><br><span>                       if sw != '9000':</span><br><span>                             print("Programming OPLMNwAcT failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # EF.AD</span><br><span style="color: hsl(0, 100%, 40%);">-                if p.get('mcc') and p.get('mnc'):</span><br><span style="color: hsl(120, 100%, 40%);">+           # EF.AD</span><br><span style="color: hsl(120, 100%, 40%);">+               if p.get('mcc') and p.get('mnc'):</span><br><span>                    sw = self.update_ad(p['mnc'])</span><br><span>                        if sw != '9000':</span><br><span>                             print("Programming AD failed with code %s"%sw)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                return None</span><br><span style="color: hsl(120, 100%, 40%);">+               return None</span><br><span> </span><br><span>      def erase(self):</span><br><span>             return</span><br><span>diff --git a/pySim/commands.py b/pySim/commands.py</span><br><span>index 3d17903..03540b6 100644</span><br><span>--- a/pySim/commands.py</span><br><span>+++ b/pySim/commands.py</span><br><span>@@ -34,7 +34,7 @@</span><br><span>  def __get_len_from_tlv(self, fcp):</span><br><span>           # see also: ETSI TS 102 221, chapter 11.1.1.3.1 Response for MF,</span><br><span>             # DF or ADF</span><br><span style="color: hsl(0, 100%, 40%);">-                from pytlv.TLV import TLV</span><br><span style="color: hsl(120, 100%, 40%);">+          from pytlv.TLV import TLV</span><br><span>            tlvparser = TLV(['82', '83', '84', 'a5', '8a', '8b', '8c', '80', 'ab', 'c6', '81', '88'])</span><br><span> </span><br><span>                # pytlv is case sensitive!</span><br><span>@@ -62,24 +62,24 @@</span><br><span> </span><br><span>                 return int(tlv_parsed['80'], 16)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        # Tell the length of a record by the card response</span><br><span style="color: hsl(0, 100%, 40%);">-        # USIMs respond with an FCP template, which is different</span><br><span style="color: hsl(0, 100%, 40%);">-        # from what SIMs responds. See also:</span><br><span style="color: hsl(0, 100%, 40%);">-        # USIM: ETSI TS 102 221, chapter 11.1.1.3 Response Data</span><br><span style="color: hsl(0, 100%, 40%);">-        # SIM: GSM 11.11, chapter 9.2.1 SELECT</span><br><span style="color: hsl(120, 100%, 40%);">+       # Tell the length of a record by the card response</span><br><span style="color: hsl(120, 100%, 40%);">+    # USIMs respond with an FCP template, which is different</span><br><span style="color: hsl(120, 100%, 40%);">+      # from what SIMs responds. See also:</span><br><span style="color: hsl(120, 100%, 40%);">+  # USIM: ETSI TS 102 221, chapter 11.1.1.3 Response Data</span><br><span style="color: hsl(120, 100%, 40%);">+       # SIM: GSM 11.11, chapter 9.2.1 SELECT</span><br><span>       def __record_len(self, r):</span><br><span style="color: hsl(0, 100%, 40%);">-                if self.sel_ctrl == "0004":</span><br><span style="color: hsl(0, 100%, 40%);">-                        return self.__get_len_from_tlv(r[-1])</span><br><span style="color: hsl(0, 100%, 40%);">-                else:</span><br><span style="color: hsl(0, 100%, 40%);">-                        return int(r[-1][28:30], 16)</span><br><span style="color: hsl(120, 100%, 40%);">+         if self.sel_ctrl == "0004":</span><br><span style="color: hsl(120, 100%, 40%);">+                 return self.__get_len_from_tlv(r[-1])</span><br><span style="color: hsl(120, 100%, 40%);">+         else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 return int(r[-1][28:30], 16)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        # Tell the length of a binary file. See also comment</span><br><span style="color: hsl(0, 100%, 40%);">-        # above.</span><br><span style="color: hsl(120, 100%, 40%);">+  # Tell the length of a binary file. See also comment</span><br><span style="color: hsl(120, 100%, 40%);">+  # above.</span><br><span>     def __len(self, r):</span><br><span style="color: hsl(0, 100%, 40%);">-                if self.sel_ctrl == "0004":</span><br><span style="color: hsl(0, 100%, 40%);">-                        return self.__get_len_from_tlv(r[-1])</span><br><span style="color: hsl(0, 100%, 40%);">-                else:</span><br><span style="color: hsl(0, 100%, 40%);">-                        return int(r[-1][4:8], 16)</span><br><span style="color: hsl(120, 100%, 40%);">+          if self.sel_ctrl == "0004":</span><br><span style="color: hsl(120, 100%, 40%);">+                 return self.__get_len_from_tlv(r[-1])</span><br><span style="color: hsl(120, 100%, 40%);">+         else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 return int(r[-1][4:8], 16)</span><br><span> </span><br><span>       def get_atr(self):</span><br><span>           return self._tp.get_atr()</span><br><span>diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py</span><br><span>index 4b932cd..69e2fe9 100644</span><br><span>--- a/pySim/transport/__init__.py</span><br><span>+++ b/pySim/transport/__init__.py</span><br><span>@@ -28,7 +28,7 @@</span><br><span> </span><br><span>              timeout     : Maximum wait time (None=no timeout)</span><br><span>                    newcardonly : Should we wait for a new card, or an already</span><br><span style="color: hsl(0, 100%, 40%);">-                            inserted one ?</span><br><span style="color: hsl(120, 100%, 40%);">+                                inserted one ?</span><br><span>              """</span><br><span>           pass</span><br><span> </span><br><span>@@ -52,8 +52,8 @@</span><br><span> </span><br><span>                pdu    : string of hexadecimal characters (ex. "A0A40000023F00")</span><br><span>                   return : tuple(data, sw), where</span><br><span style="color: hsl(0, 100%, 40%);">-                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(0, 100%, 40%);">-                            sw   : string (in hex) of status word (ex. "9000")</span><br><span style="color: hsl(120, 100%, 40%);">+                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(120, 100%, 40%);">+                          sw   : string (in hex) of status word (ex. "9000")</span><br><span>             """</span><br><span>           pass</span><br><span> </span><br><span>@@ -62,8 +62,8 @@</span><br><span> </span><br><span>                pdu    : string of hexadecimal characters (ex. "A0A40000023F00")</span><br><span>                   return : tuple(data, sw), where</span><br><span style="color: hsl(0, 100%, 40%);">-                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(0, 100%, 40%);">-                            sw   : string (in hex) of status word (ex. "9000")</span><br><span style="color: hsl(120, 100%, 40%);">+                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(120, 100%, 40%);">+                          sw   : string (in hex) of status word (ex. "9000")</span><br><span>             """</span><br><span>           data, sw = self.send_apdu_raw(pdu)</span><br><span> </span><br><span>@@ -84,15 +84,15 @@</span><br><span> </span><br><span>                pdu    : string of hexadecimal characters (ex. "A0A40000023F00")</span><br><span>                   sw     : string of 4 hexadecimal characters (ex. "9000"). The</span><br><span style="color: hsl(0, 100%, 40%);">-                          user may mask out certain digits using a '?' to add some</span><br><span style="color: hsl(0, 100%, 40%);">-                        ambiguity if needed.</span><br><span style="color: hsl(120, 100%, 40%);">+                          user may mask out certain digits using a '?' to add some</span><br><span style="color: hsl(120, 100%, 40%);">+                      ambiguity if needed.</span><br><span>                return : tuple(data, sw), where</span><br><span style="color: hsl(0, 100%, 40%);">-                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(0, 100%, 40%);">-                            sw   : string (in hex) of status word (ex. "9000")</span><br><span style="color: hsl(120, 100%, 40%);">+                          data : string (in hex) of returned data (ex. "074F4EFFFF")</span><br><span style="color: hsl(120, 100%, 40%);">+                          sw   : string (in hex) of status word (ex. "9000")</span><br><span>             """</span><br><span>           rv = self.send_apdu(pdu)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                # Create a masked version of the returned status word</span><br><span style="color: hsl(120, 100%, 40%);">+             # Create a masked version of the returned status word</span><br><span>                sw_masked = ""</span><br><span>             for i in range(0, 4):</span><br><span>                        if sw.lower()[i] == '?':</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/15505">change 15505</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/+/15505"/><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: I83f76a8e9b6e36098f16552a0135a8c22dde545f </div>
<div style="display:none"> Gerrit-Change-Number: 15505 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: gnutoo <GNUtoo@cyberdimension.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>