<p>Ludovic Rousseau has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sim-auth/+/20901">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">USIM.py: convert to Python3 using 2to3<br><br>Change-Id: I334e14ed3035a110101708618fd154850bb70ca2<br>---<br>M card/USIM.py<br>1 file changed, 40 insertions(+), 40 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sim-auth refs/changes/01/20901/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/card/USIM.py b/card/USIM.py</span><br><span>index a5adc5b..fa20d1a 100644</span><br><span>--- a/card/USIM.py</span><br><span>+++ b/card/USIM.py</span><br><span>@@ -53,20 +53,20 @@</span><br><span> ISO7816.__init__(self, CLA=0x00)</span><br><span> self.AID = []</span><br><span> if self.dbg:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] type definition: %s' % type(self)</span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] CLA definition: %s' % hex(self.CLA)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] type definition: %s' % type(self))</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] CLA definition: %s' % hex(self.CLA))</span><br><span> </span><br><span> # USIM selection from AID</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] UICC AID found:'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] UICC AID found:')</span><br><span> self.get_AID()</span><br><span> for aid in self.AID:</span><br><span> if tuple(aid[0:5]) == (0xA0, 0x00, 0x00, 0x00, 0x87) \</span><br><span> and tuple(aid[5:7]) == (0x10, 0x02) :</span><br><span> usim = self.select( Data=aid, typ='aid')</span><br><span> if usim is None: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] USIM AID selection failed'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] USIM AID selection failed')</span><br><span> else: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] USIM AID selection succeeded\n'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] USIM AID selection succeeded\n')</span><br><span> </span><br><span> def get_imsi(self):</span><br><span> '''</span><br><span>@@ -80,12 +80,12 @@</span><br><span> if imsi is None: </span><br><span> return None</span><br><span> # and parse the received data into the IMSI structure</span><br><span style="color: hsl(0, 100%, 40%);">- if 'Data' in imsi.keys() and len(imsi['Data']) == 9:</span><br><span style="color: hsl(120, 100%, 40%);">+ if 'Data' in list(imsi.keys()) and len(imsi['Data']) == 9:</span><br><span> return decode_BCD(imsi['Data'])[3:]</span><br><span> </span><br><span> # if issue with the content of the DF_IMSI file</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] %s' % self.coms()</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] %s' % self.coms())</span><br><span> return None</span><br><span> </span><br><span> def get_CS_keys(self):</span><br><span>@@ -103,7 +103,7 @@</span><br><span> KSI, CK, IK = ( EF_KEYS['Data'][0:1],</span><br><span> EF_KEYS['Data'][1:17],</span><br><span> EF_KEYS['Data'][17:33])</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful CS keys selection: Get [KSI, CK, IK]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful CS keys selection: Get [KSI, CK, IK]')</span><br><span> return [KSI, CK, IK]</span><br><span> else: </span><br><span> return EF_KEYS</span><br><span>@@ -124,7 +124,7 @@</span><br><span> KSI, CK, IK = ( EF_KEYSPS['Data'][0:1], </span><br><span> EF_KEYSPS['Data'][1:17], </span><br><span> EF_KEYSPS['Data'][17:33] )</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful PS keys selection: Get [KSI, CK, IK]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful PS keys selection: Get [KSI, CK, IK]')</span><br><span> return [KSI, CK, IK]</span><br><span> else: </span><br><span> return EF_KEYSPS</span><br><span>@@ -145,8 +145,8 @@</span><br><span> if self.coms()[2] == (0x90, 0x00):</span><br><span> if len(EF_GBABP['Data']) > 2:</span><br><span> #RAND, B_TID, Lifetime = LV_parser( EF_GBABP['Data'] )</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful GBA_BP selection: Get list of ' \</span><br><span style="color: hsl(0, 100%, 40%);">- '[RAND, B-TID, KeyLifetime]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful GBA_BP selection: Get list of ' \</span><br><span style="color: hsl(120, 100%, 40%);">+ '[RAND, B-TID, KeyLifetime]')</span><br><span> #return (RAND, B_TID, Lifetime)</span><br><span> return LV_parser( EF_GBABP['Data'] )</span><br><span> else: </span><br><span>@@ -167,22 +167,22 @@</span><br><span> GBA_BP = self.get_GBA_BP()</span><br><span> for i in GBA_BP:</span><br><span> if i == RAND:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] RAND found in GBA_BP'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] RAND found in GBA_BP')</span><br><span> # update transparent file with B_TID and key lifetime</span><br><span> self.coms.push( self.UPDATE_BINARY( P2=len(RAND)+1,</span><br><span> Data=[len(B_TID)] + B_TID + \</span><br><span> [len(key_lifetime)] + key_lifetime ))</span><br><span> if self.dbg > 1: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] %s' % self.coms()</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] %s' % self.coms())</span><br><span> if self.coms()[2] == 0x90 and self.dbg:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful GBA_BP update with B-TID ' \</span><br><span style="color: hsl(0, 100%, 40%);">- 'and key lifetime'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful GBA_BP update with B-TID ' \</span><br><span style="color: hsl(120, 100%, 40%);">+ 'and key lifetime')</span><br><span> if self.dbg > 2: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] new value of EF_GBA_BP:\n%s' \</span><br><span style="color: hsl(0, 100%, 40%);">- % self.get_GBA_BP()</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] new value of EF_GBA_BP:\n%s' \</span><br><span style="color: hsl(120, 100%, 40%);">+ % self.get_GBA_BP())</span><br><span> else:</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] RAND not found in GBA_BP'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] RAND not found in GBA_BP')</span><br><span> return GBA_BP</span><br><span> </span><br><span> def get_GBA_NL(self):</span><br><span>@@ -215,8 +215,8 @@</span><br><span> B_TID = tlv[2]</span><br><span> values.append( [NAF_ID, B_TID] )</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful GBA_NL selection: ' \</span><br><span style="color: hsl(0, 100%, 40%);">- 'Get list of [NAF_ID, B-TID]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful GBA_NL selection: ' \</span><br><span style="color: hsl(120, 100%, 40%);">+ 'Get list of [NAF_ID, B-TID]')</span><br><span> #return (NAF_ID, B_TID)</span><br><span> return values</span><br><span> else: </span><br><span>@@ -242,7 +242,7 @@</span><br><span> # prepare input data for authentication</span><br><span> if ctx in ('3G', 'VGCS', 'GBA', 'MBMS') and len(RAND) != 16 \</span><br><span> and len(AUTN) != 16: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[ERR] missing parameters or wrong length'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[ERR] missing parameters or wrong length')</span><br><span> return None</span><br><span> </span><br><span> inp = []</span><br><span>@@ -250,10 +250,10 @@</span><br><span> P2 = 0x81</span><br><span> elif ctx == 'VGCS':</span><br><span> P2 = 0x82</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Not implemented. Exit.'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Not implemented. Exit.')</span><br><span> return None</span><br><span> elif ctx == 'MBMS':</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Not implemented. Exit.'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Not implemented. Exit.')</span><br><span> return None</span><br><span> elif ctx == 'GBA': </span><br><span> P2 = 0x84</span><br><span>@@ -264,7 +264,7 @@</span><br><span> # to avoid desynchronizing our USIM counter</span><br><span> P2 = 0x80</span><br><span> if len(RAND) != 16: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[ERR] RAND has wrong length (%d, should be 16)' % len(RAND)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[ERR] RAND has wrong length (%d, should be 16)' % len(RAND))</span><br><span> return None</span><br><span> # override input value for 2G authent</span><br><span> inp = [len(RAND)] + RAND</span><br><span>@@ -276,7 +276,7 @@</span><br><span> val = self.coms()[3]</span><br><span> if P2 == 0x80:</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful 2G authentication. Get [RES, Kc]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful 2G authentication. Get [RES, Kc]')</span><br><span> values = LV_parser(val)</span><br><span> # returned values are (RES, Kc)</span><br><span> return values</span><br><span>@@ -284,25 +284,25 @@</span><br><span> if val[0] == 0xDB:</span><br><span> if self.dbg:</span><br><span> if P2 == 0x81:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful 3G authentication. ' \</span><br><span style="color: hsl(0, 100%, 40%);">- 'Get [RES, CK, IK(, Kc)]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful 3G authentication. ' \</span><br><span style="color: hsl(120, 100%, 40%);">+ 'Get [RES, CK, IK(, Kc)]')</span><br><span> elif P2 == 0x84:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful GBA authentication. Get [RES]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful GBA authentication. Get [RES]')</span><br><span> else:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] response: %s' % hex(val)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] response: %s' % hex(val))</span><br><span> values = LV_parser(val[1:])</span><br><span> # returned values can be (RES, CK, IK) or (RES, CK, IK, Kc)</span><br><span> return values</span><br><span> elif val[0] == 0xDC:</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Synchronization failure. Get [AUTS]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Synchronization failure. Get [AUTS]')</span><br><span> values = LV_parser(val[1:])</span><br><span> return values</span><br><span> elif self.dbg:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] response: %s' % hex(val)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] response: %s' % hex(val))</span><br><span> #else:</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] authentication error: %s' % self.coms()</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] authentication error: %s' % self.coms())</span><br><span> return None</span><br><span> </span><br><span> def GBA_derivation(self, NAF_ID=[], IMPI=[]):</span><br><span>@@ -337,11 +337,11 @@</span><br><span> val = self.coms()[3]</span><br><span> if val[0] == 0xDB: # not adapted to 2G context with Kc, RES</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] Successful GBA derivation. Get [Ks_EXT_NAF]'</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] Successful GBA derivation. Get [Ks_EXT_NAF]')</span><br><span> values = LV_parser(val[1:])</span><br><span> return values</span><br><span> if self.dbg: </span><br><span style="color: hsl(0, 100%, 40%);">- print '[DBG] authentication failure: %s' % self.coms()</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[DBG] authentication failure: %s' % self.coms())</span><br><span> return None</span><br><span> </span><br><span> def bf_FS_from_init( self, filename='bf_USIM', file_dict=USIM_app_FS, </span><br><span>@@ -368,11 +368,11 @@</span><br><span> # if file characteristics is readable</span><br><span> if fil is not None:</span><br><span> if self.dbg:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] USIM file found at address %s %s' % (i, j)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] USIM file found at address %s %s' % (i, j))</span><br><span> # warning when working with DF recursivity</span><br><span style="color: hsl(0, 100%, 40%);">- if (i, j) in file_dict.keys():</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i, j) in list(file_dict.keys()):</span><br><span> fil['name'] = file_dict[(i, j)][0]</span><br><span style="color: hsl(0, 100%, 40%);">- k = fil.keys()</span><br><span style="color: hsl(120, 100%, 40%);">+ k = list(fil.keys())</span><br><span> k.sort()</span><br><span> fd.write('\n')</span><br><span> for key in k:</span><br><span>@@ -380,16 +380,16 @@</span><br><span> # if file exists but special conditions are returned</span><br><span> if self.coms()[2] not in ((0x6A, 0x82), (0x90, 0x00)):</span><br><span> if self.dbg:</span><br><span style="color: hsl(0, 100%, 40%);">- print '[+] special condition %s when selecting' \</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[+] special condition %s when selecting' \</span><br><span> ' / reading USIM file at address %s %s' \</span><br><span style="color: hsl(0, 100%, 40%);">- % ( self.coms()[2], i, j )</span><br><span style="color: hsl(120, 100%, 40%);">+ % ( self.coms()[2], i, j ))</span><br><span> fd.write('\n')</span><br><span> fd.write('file exists at address: %s %s\n' \</span><br><span> % (hex(i)[2:], hex(j)[2:]))</span><br><span> fd.write('%s\n' % self.coms()[1])</span><br><span> </span><br><span> if self.dbg and (i % 0x10 == 0 and j % 0x40 == 0): </span><br><span style="color: hsl(0, 100%, 40%);">- print '[-] going over address %s %s' % (i, j)</span><br><span style="color: hsl(120, 100%, 40%);">+ print('[-] going over address %s %s' % (i, j))</span><br><span> </span><br><span> fd.write('\n')</span><br><span> fd.close()</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sim-auth/+/20901">change 20901</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/osmo-sim-auth/+/20901"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-sim-auth </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I334e14ed3035a110101708618fd154850bb70ca2 </div>
<div style="display:none"> Gerrit-Change-Number: 20901 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Ludovic Rousseau <ludovic.rousseau+osmocom@free.fr> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>