<p>gnutoo has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/15502">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">python3 conversion: Use braces around print calls<br><br>This is required to run under python3.<br><br>Without it we have errors that looks like that:<br> $ python3 pySim-read.py<br> File "pySim-read.py", line 132<br> print "HPLMNAcT: Can't read file -- " + str(e)<br><br> SyntaxError: invalid syntax<br><br>Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org><br>Change-Id: Ia472baa8c14b87fe917ea52a998d5ccda66d20d1<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>M pySim/transport/serial.py<br>6 files changed, 132 insertions(+), 132 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/02/15502/1</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 8abce0a..bb7160e 100755</span><br><span>--- a/pySim-prog.py</span><br><span>+++ b/pySim-prog.py</span><br><span>@@ -127,7 +127,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>@@ -167,11 +167,11 @@</span><br><span> </span><br><span> if options.type == 'list':</span><br><span> for kls in _cards_classes:</span><br><span style="color: hsl(0, 100%, 40%);">- print kls.name</span><br><span style="color: hsl(120, 100%, 40%);">+ 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>@@ -393,7 +393,7 @@</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>@@ -452,8 +452,8 @@</span><br><span> f = open(opts.read_csv, 'r')</span><br><span> cr = csv.DictReader(f)</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>@@ -534,7 +534,7 @@</span><br><span> </span><br><span> for k in BATCH_INCOMPATIBLE:</span><br><span> if getattr(opts, k):</span><br><span style="color: hsl(0, 100%, 40%);">- print "Incompatible option with batch_state: %s" % (k,)</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Incompatible option with batch_state: %s" % (k,))</span><br><span> sys.exit(-1)</span><br><span> </span><br><span> # Don't load state if there is none ...</span><br><span>@@ -542,7 +542,7 @@</span><br><span> return</span><br><span> </span><br><span> if not os.path.isfile(opts.batch_state):</span><br><span style="color: hsl(0, 100%, 40%);">- print "No state file yet"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("No state file yet")</span><br><span> return</span><br><span> </span><br><span> # Get stored data</span><br><span>@@ -575,12 +575,12 @@</span><br><span> for kls in _cards_classes:</span><br><span> card = kls.autodetect(scc)</span><br><span> if card:</span><br><span style="color: hsl(0, 100%, 40%);">- print "Autodetected card type: %s" % card.name</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Autodetected card type: %s" % card.name)</span><br><span> card.reset()</span><br><span> break</span><br><span> </span><br><span> if card is None:</span><br><span style="color: hsl(0, 100%, 40%);">- print "Autodetection failed"</span><br><span style="color: hsl(120, 100%, 40%);">+ print(Autodetection failed")</span><br><span> return</span><br><span> </span><br><span> if opts.type == "auto_once":</span><br><span>@@ -632,7 +632,7 @@</span><br><span> </span><br><span> if opts.dry_run is False:</span><br><span> # Connect transport</span><br><span style="color: hsl(0, 100%, 40%);">- print "Insert card now (or CTRL-C to cancel)"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Insert card now (or CTRL-C to cancel)")</span><br><span> sl.wait_for_card(newcardonly=not first)</span><br><span> </span><br><span> # Not the first anymore !</span><br><span>@@ -648,13 +648,13 @@</span><br><span> else:</span><br><span> sys.exit(-1)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- # Probe only</span><br><span style="color: hsl(0, 100%, 40%);">- if opts.probe:</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ # Probe only</span><br><span style="color: hsl(120, 100%, 40%);">+ if opts.probe:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span> # Erase if requested</span><br><span> if opts.erase:</span><br><span style="color: hsl(0, 100%, 40%);">- print "Formatting ..."</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Formatting ...")</span><br><span> card.erase()</span><br><span> card.reset()</span><br><span> </span><br><span>@@ -662,20 +662,20 @@</span><br><span> if opts.source == 'cmdline':</span><br><span> cp = gen_parameters(opts)</span><br><span> elif opts.source == 'csv':</span><br><span style="color: hsl(0, 100%, 40%);">- imsi = None</span><br><span style="color: hsl(0, 100%, 40%);">- iccid = None</span><br><span style="color: hsl(120, 100%, 40%);">+ imsi = None</span><br><span style="color: hsl(120, 100%, 40%);">+ iccid = None</span><br><span> if opts.read_iccid:</span><br><span> if opts.dry_run:</span><br><span> # Connect transport</span><br><span style="color: hsl(0, 100%, 40%);">- print "Insert card now (or CTRL-C to cancel)"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Insert card now (or CTRL-C to cancel)")</span><br><span> sl.wait_for_card(newcardonly=not first)</span><br><span> (res,_) = scc.read_binary(['3f00', '2fe2'], length=10)</span><br><span> iccid = dec_iccid(res)</span><br><span style="color: hsl(0, 100%, 40%);">- print iccid</span><br><span style="color: hsl(0, 100%, 40%);">- elif opts.read_imsi:</span><br><span style="color: hsl(120, 100%, 40%);">+ print(iccid)</span><br><span style="color: hsl(120, 100%, 40%);">+ elif opts.read_imsi:</span><br><span> if opts.dry_run:</span><br><span> # Connect transport</span><br><span style="color: hsl(0, 100%, 40%);">- print "Insert card now (or CTRL-C to cancel)"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Insert card now (or CTRL-C to cancel)")</span><br><span> sl.wait_for_card(newcardonly=not first)</span><br><span> (res,_) = scc.read_binary(EF['IMSI'])</span><br><span> imsi = swap_nibbles(res)[3:]</span><br><span>@@ -683,17 +683,17 @@</span><br><span> imsi = opts.imsi</span><br><span> cp = read_params_csv(opts, imsi=imsi, iccid=iccid)</span><br><span> if cp is None:</span><br><span style="color: hsl(0, 100%, 40%);">- print "Error reading parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Error reading parameters\n")</span><br><span> sys.exit(2)</span><br><span> print_parameters(cp)</span><br><span> </span><br><span> if opts.dry_run is False:</span><br><span> # Program the card</span><br><span style="color: hsl(0, 100%, 40%);">- print "Programming ..."</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Programming ...")</span><br><span> if opts.dry_run is not True:</span><br><span> card.program(cp)</span><br><span> else:</span><br><span style="color: hsl(0, 100%, 40%);">- print "Dry Run: NOT PROGRAMMING!"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Dry Run: NOT PROGRAMMING!")</span><br><span> </span><br><span> # Write parameters permanently</span><br><span> write_parameters(opts, cp)</span><br><span>@@ -704,7 +704,7 @@</span><br><span> save_batch(opts)</span><br><span> </span><br><span> # Done for this card and maybe for everything ?</span><br><span style="color: hsl(0, 100%, 40%);">- print "Done !\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Done !\n")</span><br><span> </span><br><span> if not opts.batch_mode:</span><br><span> done = True</span><br><span>diff --git a/pySim-read.py b/pySim-read.py</span><br><span>index 17fce61..6b2fed6 100755</span><br><span>--- a/pySim-read.py</span><br><span>+++ b/pySim-read.py</span><br><span>@@ -123,43 +123,43 @@</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 style="color: hsl(0, 100%, 40%);">- print "HPLMNAcT: Can't read file -- " + str(e)</span><br><span style="color: hsl(120, 100%, 40%);">+ 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 style="color: hsl(0, 100%, 40%);">- print "PLMNwAcT: Can't read file -- " + str(e)</span><br><span style="color: hsl(120, 100%, 40%);">+ 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 style="color: hsl(0, 100%, 40%);">- print "OPLMNwAcT: Can't read file -- " + str(e)</span><br><span style="color: hsl(120, 100%, 40%);">+ 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 style="color: hsl(0, 100%, 40%);">- print "HPLMNAcT: Can't read file -- " + str(e)</span><br><span style="color: hsl(120, 100%, 40%);">+ print("HPLMNAcT: Can't read file -- " + str(e))</span><br><span> </span><br><span> # EF.ACC</span><br><span> (res, sw) = scc.read_binary(['3f00', '7f20', '6f78'])</span><br><span>@@ -180,7 +180,7 @@</span><br><span> else:</span><br><span> print("MSISDN: Can't read, response code = %s" % (sw,))</span><br><span> except Exception as e:</span><br><span style="color: hsl(0, 100%, 40%);">- print "MSISDN: Can't read file -- " + str(e)</span><br><span style="color: hsl(120, 100%, 40%);">+ print("MSISDN: Can't read file -- " + str(e))</span><br><span> </span><br><span> # EF.AD</span><br><span> (res, sw) = scc.read_binary(['3f00', '7f20', '6fad'])</span><br><span>@@ -190,4 +190,4 @@</span><br><span> print("AD: Can't read, response code = %s" % (sw,))</span><br><span> </span><br><span> # Done for this card and maybe for everything ?</span><br><span style="color: hsl(0, 100%, 40%);">- print "Done !\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Done !\n")</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>diff --git a/pySim/transport/serial.py b/pySim/transport/serial.py</span><br><span>index 7a2bfd3..f672be2 100644</span><br><span>--- a/pySim/transport/serial.py</span><br><span>+++ b/pySim/transport/serial.py</span><br><span>@@ -162,7 +162,7 @@</span><br><span> </span><br><span> def _dbg_print(self, s):</span><br><span> if self._debug:</span><br><span style="color: hsl(0, 100%, 40%);">- print s</span><br><span style="color: hsl(120, 100%, 40%);">+ print(s)</span><br><span> </span><br><span> def _tx_byte(self, b):</span><br><span> self._sl.write(b)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/15502">change 15502</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/+/15502"/><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: Ia472baa8c14b87fe917ea52a998d5ccda66d20d1 </div>
<div style="display:none"> Gerrit-Change-Number: 15502 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: gnutoo <GNUtoo@cyberdimension.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>