laforge has uploaded this change for review. (
https://gerrit.osmocom.org/c/pysim/+/35852?usp=email )
Change subject: pylint: global_platform/__init__.py
......................................................................
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
---
M pySim/global_platform/__init__.py
1 file changed, 53 insertions(+), 23 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/52/35852/1
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
--
To view, visit
https://gerrit.osmocom.org/c/pysim/+/35852?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: Iea6afb5e72e035637e761bb25535f48fd4bc99f4
Gerrit-Change-Number: 35852
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: newchange