<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>