pylint: global_platform/__init__.py

pySim/global_platform/__init__.py:468:4: W0221: Number of parameters was 2 in 'CardFile.decode_select_response' and is now 1 in overriding 'ADF_SD.decode_select_response' method (arguments-differ)
pySim/global_platform/__init__.py:473:8: W0246: Useless parent or super() delegation in method '__init__' (useless-parent-delegation)
pySim/global_platform/__init__.py:491:19: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:528:22: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:559:12: C0200: Consider using enumerate instead of iterating with range and len (consider-using-enumerate)
pySim/global_platform/__init__.py:587:18: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:617:20: W0612: Unused variable 'dec' (unused-variable)
pySim/global_platform/__init__.py:645:12: W0612: Unused variable 'data' (unused-variable)
pySim/global_platform/__init__.py:645:18: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:746:15: C0121: Comparison 'opts.key_id == None' should be 'opts.key_id is None' (singleton-comparison)
pySim/global_platform/__init__.py:746:39: C0121: Comparison 'opts.key_ver == None' should be 'opts.key_ver is None' (singleton-comparison)
pySim/global_platform/__init__.py:750:15: C0121: Comparison 'opts.key_id != None' should be 'opts.key_id is not None' (singleton-comparison)
pySim/global_platform/__init__.py:752:15: C0121: Comparison 'opts.key_ver != None' should be 'opts.key_ver is not None' (singleton-comparison)
pySim/global_platform/__init__.py:787:16: W0612: Unused variable 'rsp_hex' (unused-variable)
pySim/global_platform/__init__.py:787:25: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:836:30: W0612: Unused variable 'sw' (unused-variable)
pySim/global_platform/__init__.py:839:12: W0612: Unused variable 'ext_auth_resp' (unused-variable)
pySim/global_platform/__init__.py:846:33: W0613: Unused argument 'opts' (unused-argument)
pySim/global_platform/__init__.py:878:15: R1716: Simplify chained comparison between the operands (chained-comparison)
pySim/global_platform/__init__.py:886:29: W0613: Unused argument 'kvn' (unused-argument)
pySim/global_platform/__init__.py:893:0: C0413: Import "from Cryptodome.Cipher import DES, DES3, AES" should be placed at the top of the module (wrong-import-position)
pySim/global_platform/__init__.py:23:0: C0411: standard import "from typing import Optional, List, Dict, Tuple" should be placed before "from construct import Optional as COptional" (wrong-import-order)
pySim/global_platform/__init__.py:24:0: C0411: standard import "from copy import deepcopy" should be placed before "from construct import Optional as COptional" (wrong-import-order)
pySim/global_platform/__init__.py:893:0: C0411: third party import "from Cryptodome.Cipher import DES, DES3, AES" should be placed before "from pySim.global_platform.scp import SCP02, SCP03" (wrong-import-order)
pySim/global_platform/__init__.py:893:0: C0412: Imports from package Cryptodome are not grouped (ungrouped-imports)

Change-Id: Iea6afb5e72e035637e761bb25535f48fd4bc99f4
diff --git a/pySim/global_platform/__init__.py b/pySim/global_platform/__init__.py
index 6f72bdc..c7ea0be 100644
--- a/pySim/global_platform/__init__.py
+++ b/pySim/global_platform/__init__.py
@@ -17,12 +17,12 @@
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
+from copy import deepcopy
+from typing import Optional, List, Dict, Tuple
 from construct import Optional as COptional
 from construct import Struct, GreedyRange, FlagsEnum, Int16ub, Int24ub, Padding, Bit, Const
-from typing import Optional, List, Dict, Tuple
-from copy import deepcopy
-from bidict import bidict
 from Cryptodome.Random import get_random_bytes
+from Cryptodome.Cipher import DES, DES3, AES
 from pySim.global_platform.scp import SCP02, SCP03
 from pySim.construct import *
 from pySim.utils import *
@@ -446,15 +446,11 @@
         super().__init__(aid=aid, fid=None, sfid=None, name=name, desc=desc)
         self.shell_commands += [self.AddlShellCommands()]
 
-    @staticmethod
-    def decode_select_response(res_hex: str) -> object:
-        return decode_select_response(res_hex)
+    def decode_select_response(self, data_hex: str) -> object:
+        return decode_select_response(data_hex)
 
     @with_default_category('Application-Specific Commands')
     class AddlShellCommands(CommandSet):
-        def __init__(self):
-            super().__init__()
-
         get_data_parser = argparse.ArgumentParser()
         get_data_parser.add_argument('data_object_name', type=str,
             help='Name of the data object to be retrieved from the card')
@@ -470,7 +466,7 @@
                 self._cmd.poutput('Unknown data object "%s", available options: %s' % (tlv_cls_name,
                                                                                        do_names))
                 return
-            (data, sw) = self._cmd.lchan.scc.get_data(cla=0x80, tag=tlv_cls.tag)
+            (data, _sw) = self._cmd.lchan.scc.get_data(cla=0x80, tag=tlv_cls.tag)
             ie = tlv_cls()
             ie.from_tlv(h2b(data))
             self._cmd.poutput_json(ie.to_dict())
@@ -507,7 +503,7 @@
                                       {'last_block': len(remainder) == 0, 'encryption': encryption,
                                        'structure': structure, 'response': response_permitted})
                 hdr = "80E2%02x%02x%02x" % (p1b[0], block_nr, len(chunk))
-                data, sw = self._cmd.lchan.scc.send_apdu_checksw(hdr + b2h(chunk))
+                data, _sw = self._cmd.lchan.scc.send_apdu_checksw(hdr + b2h(chunk))
                 block_nr += 1
                 response += data
             return data
@@ -566,7 +562,7 @@
             See GlobalPlatform CardSpecification v2.3 Section 11.8 for details."""
             key_data = kvn.to_bytes(1, 'big') + build_construct(ADF_SD.AddlShellCommands.KeyDataBasic, key_dict)
             hdr = "80D8%02x%02x%02x" % (old_kvn, kid, len(key_data))
-            data, sw = self._cmd.lchan.scc.send_apdu_checksw(hdr + b2h(key_data))
+            data, _sw = self._cmd.lchan.scc.send_apdu_checksw(hdr + b2h(key_data))
             return data
 
         get_status_parser = argparse.ArgumentParser()
@@ -596,7 +592,7 @@
                 while len(remainder):
                     # tlv sequence, each element is one GpRegistryRelatedData()
                     grd = GpRegistryRelatedData()
-                    dec, remainder = grd.from_tlv(remainder)
+                    _dec, remainder = grd.from_tlv(remainder)
                     grd_list.append(grd)
                 if sw != '6310':
                     return grd_list
@@ -624,7 +620,7 @@
                                'scope'/SetStatusScope, 'status'/CLifeCycleState,
                                'aid'/HexAdapter(Prefixed(Int8ub, COptional(GreedyBytes))))
             apdu = build_construct(SetStatus, {'scope':scope, 'status':status, 'aid':aid})
-            data, sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(apdu))
+            _data, _sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(apdu))
 
         inst_perso_parser = argparse.ArgumentParser()
         inst_perso_parser.add_argument('application-aid', type=is_hexstr, help='Application AID')
@@ -700,13 +696,13 @@
             """Perform GlobalPlaform DELETE (Key) command.
             If both KID and KVN are specified, exactly one key is deleted. If only either of the two is
             specified, multiple matching keys may be deleted."""
-            if opts.key_id == None and opts.key_ver == None:
+            if opts.key_id is None and opts.key_ver is None:
                 raise ValueError('At least one of KID or KVN must be specified')
             p2 = 0x80 if opts.delete_related_objects else 0x00
             cmd = ""
-            if opts.key_id != None:
+            if opts.key_id is not None:
                 cmd += "d001%02x" % opts.key_id
-            if opts.key_ver != None:
+            if opts.key_ver is not None:
                 cmd += "d201%02x" % opts.key_ver
             self.delete(0x00, p2, cmd)
 
@@ -759,17 +755,17 @@
         def _establish_scp(self, scp, host_challenge, security_level):
             # perform the common functionality shared by SCP02 and SCP03 establishment
             init_update_apdu = scp.gen_init_update_apdu(host_challenge=host_challenge)
-            init_update_resp, sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(init_update_apdu))
+            init_update_resp, _sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(init_update_apdu))
             scp.parse_init_update_resp(h2b(init_update_resp))
             ext_auth_apdu = scp.gen_ext_auth_apdu(security_level)
-            ext_auth_resp, sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(ext_auth_apdu))
+            _ext_auth_resp, _sw = self._cmd.lchan.scc.send_apdu_checksw(b2h(ext_auth_apdu))
             self._cmd.poutput("Successfully established a %s secure channel" % str(scp))
             # store a reference to the SCP instance
             self._cmd.lchan.scc.scp = scp
             self._cmd.update_prompt()
 
 
-        def do_release_scp(self, opts):
+        def do_release_scp(self, _opts):
             """Release a previously establiehed secure channel."""
             if not self._cmd.lchan.scc.scp:
                 self._cmd.poutput("Cannot release SCP as none is established")
@@ -801,7 +797,7 @@
 class GpCardKeyset:
     """A single set of GlobalPlatform card keys and the associated KVN."""
     def __init__(self, kvn: int, enc: bytes, mac: bytes, dek: bytes):
-        assert kvn >= 0 and kvn < 256
+        assert 0 < kvn < 256
         assert len(enc) == len(mac) == len(dek)
         self.kvn = kvn
         self.enc = enc
@@ -810,13 +806,12 @@
 
     @classmethod
     def from_single_key(cls, kvn: int, base_key: bytes) -> 'GpCardKeyset':
-        return cls(int, base_key, base_key, base_key)
+        return cls(kvn, base_key, base_key, base_key)
 
     def __str__(self):
         return "%s(KVN=%u, ENC=%s, MAC=%s, DEK=%s)" % (self.__class__.__name__,
                 self.kvn, b2h(self.enc), b2h(self.mac), b2h(self.dek))
 
-from Cryptodome.Cipher import DES, DES3, AES
 
 def compute_kcv_des(key:bytes) -> bytes:
     # GP Card Spec B.6: For a DES key, the key check value is computed by encrypting 8 bytes, each with