<p>herlesupreeth has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/pysim/+/16945">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fixed messy indentation and added ability to write HPLMN_ACT in Sysmocom Card<br><br>Change-Id: I35848059d6082c379246c8d695cb094c20780d15<br>---<br>M pySim/cards.py<br>1 file changed, 60 insertions(+), 52 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/45/16945/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pySim/cards.py b/pySim/cards.py</span><br><span>index 5d4d4f3..ff9c9b1 100644</span><br><span>--- a/pySim/cards.py</span><br><span>+++ b/pySim/cards.py</span><br><span>@@ -76,8 +76,10 @@</span><br><span> access_tech = 'FFFF' # All technologues selected, even Reserved for Future Use ones</span><br><span> """</span><br><span> # get size and write EF.HPLMNwAcT</span><br><span style="color: hsl(0, 100%, 40%);">- r = self._scc.select_file(EF['HPLMNwAcT'])</span><br><span style="color: hsl(0, 100%, 40%);">- size = int(r[-1][4:8], 16)</span><br><span style="color: hsl(120, 100%, 40%);">+ #r = self._scc.select_file(EF['HPLMNwAcT'])</span><br><span style="color: hsl(120, 100%, 40%);">+ #size = int(r[-1][4:8], 16)</span><br><span style="color: hsl(120, 100%, 40%);">+ data = self._scc.read_binary(EF['HPLMNwAcT'], 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['HPLMNwAcT'], content + 'ffffff0000' * (size/5-1))</span><br><span>@@ -85,11 +87,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 +99,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 +121,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>@@ -151,7 +153,7 @@</span><br><span> each possible provider uses a specific record number in each EF. The</span><br><span> indexes used are ( where N is the number of providers supported ) :</span><br><span> - [2 .. N+1] for the operator name</span><br><span style="color: hsl(0, 100%, 40%);">- - [1 .. N] for the programable EFs</span><br><span style="color: hsl(120, 100%, 40%);">+ - [1 .. N] for the programable EFs</span><br><span> </span><br><span> * 3f00/7f4d/8f0c : Operator Name</span><br><span> </span><br><span>@@ -425,7 +427,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>@@ -593,25 +595,31 @@</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(0, 100%, 40%);">- print("Programming PLMNsel failed with code %s"%sw)</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 style="color: hsl(120, 100%, 40%);">+ rint("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.HPLMNwAcT</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_hplmn_act(p['mcc'], p['mnc'])</span><br><span style="color: hsl(120, 100%, 40%);">+ if sw != '9000':</span><br><span style="color: hsl(120, 100%, 40%);">+ print("Programming HPLMNwAcT failed with code %s"%sw)</span><br><span style="color: hsl(120, 100%, 40%);">+</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 +856,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 +890,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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/pysim/+/16945">change 16945</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/+/16945"/><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: I35848059d6082c379246c8d695cb094c20780d15 </div>
<div style="display:none"> Gerrit-Change-Number: 16945 </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>