<p>herlesupreeth has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/16949">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Added support for MSISDN programming plus check for SPN length<br><br>Change-Id: I4399aa10a266fff0432cddfe33937b8b96ca0758<br>---<br>M pySim-prog.py<br>M pySim-read.py<br>M pySim/cards.py<br>3 files changed, 38 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/49/16949/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 739c7b1..14ea11d 100755</span><br><span>--- a/pySim-prog.py</span><br><span>+++ b/pySim-prog.py</span><br><span>@@ -266,21 +266,21 @@</span><br><span>      # Digitize MCC/MNC (5 or 6 digits)</span><br><span>   plmn_digits = _mcc_mnc_digits(mcc, mnc)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     if opts.name is not None and len(opts.name) > 16:</span><br><span style="color: hsl(0, 100%, 40%);">-            raise ValueError('Service Provider Name must max 16 characters!');</span><br><span style="color: hsl(120, 100%, 40%);">+    name = None</span><br><span style="color: hsl(120, 100%, 40%);">+   if opts.name is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+             if len(opts.name) > 16:</span><br><span style="color: hsl(120, 100%, 40%);">+                    raise ValueError('Service Provider Name must max 16 characters!');</span><br><span>           name = opts.name</span><br><span style="color: hsl(0, 100%, 40%);">-        else:</span><br><span style="color: hsl(0, 100%, 40%);">-           name = None</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       msisdn = None</span><br><span>        if opts.msisdn is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-             if not _isnum(opts.msisdn):</span><br><span style="color: hsl(0, 100%, 40%);">-                     raise ValueError('MSISDN must be digits only!');</span><br><span>             if len(opts.msisdn) > 10*2:</span><br><span style="color: hsl(0, 100%, 40%);">-                  # Need to support MSISDN of length > 20</span><br><span style="color: hsl(120, 100%, 40%);">+                    # ToDo: Support MSISDN of length > 20 (10 Bytes)</span><br><span>                  raise ValueError('For now support for MSISDN of length <= 20 digits!');</span><br><span style="color: hsl(120, 100%, 40%);">+            if (len(opts.msisdn) % 2) != 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       # ToDo: Support odd number of MSISDN digits</span><br><span style="color: hsl(120, 100%, 40%);">+                   raise ValueError('For now support for only even number of MSISDN digits!');</span><br><span>          msisdn = opts.msisdn</span><br><span style="color: hsl(0, 100%, 40%);">-    else:</span><br><span style="color: hsl(0, 100%, 40%);">-           msisdn = None</span><br><span> </span><br><span>    # ICCID (19 digits, E.118), though some phase1 vendors use 20 :(</span><br><span>     if opts.iccid is not None:</span><br><span>diff --git a/pySim-read.py b/pySim-read.py</span><br><span>index 9e3d2f0..ff27b90 100755</span><br><span>--- a/pySim-read.py</span><br><span>+++ b/pySim-read.py</span><br><span>@@ -208,10 +208,14 @@</span><br><span>  try:</span><br><span>         #       print(scc.record_size(['3f00', '7f10', '6f40']))</span><br><span>             (res, sw) = scc.read_record(['3f00', '7f10', '6f40'], 1)</span><br><span style="color: hsl(120, 100%, 40%);">+              #print res</span><br><span>           if sw == '9000':</span><br><span>                     x_bytes = (len(res)/2) - 14</span><br><span style="color: hsl(120, 100%, 40%);">+                   #print res[(x_bytes * 2):]</span><br><span>                   bcd_len = res[(x_bytes * 2):(x_bytes * 2) + 2]</span><br><span style="color: hsl(120, 100%, 40%);">+                        #print bcd_len</span><br><span>                       ton_npi = res[(x_bytes * 2) + 2:(x_bytes * 2) + 4]</span><br><span style="color: hsl(120, 100%, 40%);">+                    #print ton_npi</span><br><span>                       dial_num = res[(x_bytes * 2) + 4:(x_bytes * 2) + 24]</span><br><span>                         # Refer 3GPP TS 24.008 Called party BCD number information element</span><br><span>                   print("MSISDN: %s" % (swap_nibbles(dial_num).rstrip('f')))</span><br><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index ff9c9b1..a7aa72c 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -588,8 +588,9 @@</span><br><span>              data, sw = self._scc.update_binary('00F7', content)</span><br><span> </span><br><span>              # set Service Provider Name</span><br><span style="color: hsl(0, 100%, 40%);">-             content = enc_spn(p['name'], True, True)</span><br><span style="color: hsl(0, 100%, 40%);">-                data, sw = self._scc.update_binary('6F46', rpad(content, 32))</span><br><span style="color: hsl(120, 100%, 40%);">+         if p.get('name') is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                 content = enc_spn(p['name'], True, True)</span><br><span style="color: hsl(120, 100%, 40%);">+                      data, sw = self._scc.update_binary('6F46', rpad(content, 32))</span><br><span> </span><br><span>            # write EF.IMSI</span><br><span>              data, sw = self._scc.update_binary('6f07', enc_imsi(p['imsi']))</span><br><span>@@ -628,6 +629,28 @@</span><br><span>               r = self._scc.select_file(['3f00', '7f10'])</span><br><span>          data, sw = self._scc.update_record('6f42', 1, lpad(p['smsp'], 104), force_len=True)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               # EF.MSISDN</span><br><span style="color: hsl(120, 100%, 40%);">+           if p.get('msisdn') is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                       msisdn = p['msisdn']</span><br><span style="color: hsl(120, 100%, 40%);">+                  ton = "81"</span><br><span style="color: hsl(120, 100%, 40%);">+                  if msisdn[0] == '+':</span><br><span style="color: hsl(120, 100%, 40%);">+                          ton = "91"</span><br><span style="color: hsl(120, 100%, 40%);">+                          msisdn = msisdn[1:]</span><br><span style="color: hsl(120, 100%, 40%);">+                   l = -1</span><br><span style="color: hsl(120, 100%, 40%);">+                        if not (msisdn.isdigit() and ((l== -1) or (len(msisdn) == l))):</span><br><span style="color: hsl(120, 100%, 40%);">+                               raise ValueError('MSISDN must be digits only!\n \</span><br><span style="color: hsl(120, 100%, 40%);">+                                 Start with \'+\' for international numbers')</span><br><span style="color: hsl(120, 100%, 40%);">+                      even_dig = ((len(msisdn) % 2) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   if even_dig:</span><br><span style="color: hsl(120, 100%, 40%);">+                          msisdn = '%02d' % ((len(msisdn)/2)+1,) + ton + swap_nibbles(rpad(msisdn, 24))</span><br><span style="color: hsl(120, 100%, 40%);">+                 else:</span><br><span style="color: hsl(120, 100%, 40%);">+                         raise ValueError('MSISDN with even number of digits are supported for now!')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        msisdn = (('ff' * 20) + msisdn)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     r = self._scc.select_file(['3f00', '7f10'])</span><br><span style="color: hsl(120, 100%, 40%);">+                   data, sw = self._scc.update_record('6F40', 1, msisdn, force_len=True)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      def erase(self):</span><br><span>             return</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/16949">change 16949</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/+/16949"/><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: I4399aa10a266fff0432cddfe33937b8b96ca0758 </div>
<div style="display:none"> Gerrit-Change-Number: 16949 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: herlesupreeth <herlesupreeth@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>