laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/pysim/+/35813?usp=email )
Change subject: pylint: ota.py ......................................................................
pylint: ota.py
pySim/ota.py:21:0: W0401: Wildcard import construct (wildcard-import) pySim/ota.py:129:8: R1705: Unnecessary "elif" after "return", remove the leading "el" from "elif" (no-else-return) pySim/ota.py:150:8: W0107: Unnecessary pass statement (unnecessary-pass) pySim/ota.py:192:8: W0612: Unused variable 'padded_data' (unused-variable) pySim/ota.py:202:8: W0107: Unnecessary pass statement (unnecessary-pass) pySim/ota.py:207:8: W0107: Unnecessary pass statement (unnecessary-pass) pySim/ota.py:210:4: C0103: Method name "fromKeyset" doesn't conform to snake_case naming style (invalid-name) pySim/ota.py:239:8: W0107: Unnecessary pass statement (unnecessary-pass) pySim/ota.py:242:4: C0103: Method name "fromKeyset" doesn't conform to snake_case naming style (invalid-name) pySim/ota.py:328:4: W0221: Number of parameters was 4 in 'OtaDialect.encode_cmd' and is now 5 in overriding 'OtaDialectSms.encode_cmd' method (arguments-differ) pySim/ota.py:392:4: W0221: Number of parameters was 3 in 'OtaDialect.decode_resp' and is now 4 in overriding 'OtaDialectSms.decode_resp' method (arguments-differ)
Change-Id: Icb8d690e541dbaf1406085a8446a0c67641fefff --- M pySim/ota.py 1 file changed, 37 insertions(+), 18 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/pysim refs/changes/13/35813/1
diff --git a/pySim/ota.py b/pySim/ota.py index 5955a08..14bad56 100644 --- a/pySim/ota.py +++ b/pySim/ota.py @@ -15,14 +15,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/.
-from pySim.construct import * -from pySim.utils import b2h -from pySim.sms import UserDataHeader -from construct import * import zlib import abc import struct from typing import Optional +from construct import Enum, Int8ub, Int16ub, Struct, Bytes, GreedyBytes, BitsInteger, BitStruct +from construct import Flag, Padding, Switch, this + +from pySim.construct import * +from pySim.utils import b2h +from pySim.sms import UserDataHeader
# ETS TS 102 225 gives the general command structure and the dialects for CAT_TP, TCP/IP and HTTPS # 3GPP TS 31.115 gives the dialects for SMS-PP, SMS-CB, USSD and HTTP @@ -112,12 +114,12 @@ @property def auth(self): """Return an instance of the matching OtaAlgoAuth.""" - return OtaAlgoAuth.fromKeyset(self) + return OtaAlgoAuth.from_keyset(self)
@property def crypt(self): """Return an instance of the matching OtaAlgoCrypt.""" - return OtaAlgoCrypt.fromKeyset(self) + return OtaAlgoCrypt.from_keyset(self)
class OtaCheckError(Exception): pass @@ -128,26 +130,24 @@ def _compute_sig_len(self, spi:SPI): if spi['rc_cc_ds'] == 'no_rc_cc_ds': return 0 - elif spi['rc_cc_ds'] == 'rc': # CRC-32 + if spi['rc_cc_ds'] == 'rc': # CRC-32 return 4 - elif spi['rc_cc_ds'] == 'cc': # Cryptographic Checksum (CC) + if spi['rc_cc_ds'] == 'cc': # Cryptographic Checksum (CC) # TODO: this is not entirely correct, as in AES case it could be 4 or 8 return 8 - else: - raise ValueError("Invalid rc_cc_ds: %s" % spi['rc_cc_ds']) + raise ValueError("Invalid rc_cc_ds: %s" % spi['rc_cc_ds'])
@abc.abstractmethod - def encode_cmd(self, otak: OtaKeyset, tar: bytes, apdu: bytes) -> bytes: + def encode_cmd(self, otak: OtaKeyset, tar: bytes, spi: dict, apdu: bytes) -> bytes: pass
@abc.abstractmethod - def decode_resp(self, otak: OtaKeyset, apdu: bytes) -> (object, Optional["CompactRemoteResp"]): + def decode_resp(self, otak: OtaKeyset, spi: dict, apdu: bytes) -> (object, Optional["CompactRemoteResp"]): """Decode a response into a response packet and, if indicted (by a response status of `"por_ok"`) a decoded response.
The response packet's common characteristics are not fully determined, and (so far) completely proprietary per dialect.""" - pass
from Cryptodome.Cipher import DES, DES3, AES @@ -190,7 +190,7 @@ def encrypt(self, data:bytes) -> bytes: """Encrypt given input bytes using the key material given in constructor.""" padded_data = self.pad_to_blocksize(data) - return self._encrypt(data) + return self._encrypt(padded_data)
def decrypt(self, data:bytes) -> bytes: """Decrypt given input bytes using the key material given in constructor.""" @@ -199,15 +199,13 @@ @abc.abstractmethod def _encrypt(self, data:bytes) -> bytes: """Actual implementation, to be implemented by derived class.""" - pass
@abc.abstractmethod def _decrypt(self, data:bytes) -> bytes: """Actual implementation, to be implemented by derived class.""" - pass
@classmethod - def fromKeyset(cls, otak: OtaKeyset) -> 'OtaAlgoCrypt': + def from_keyset(cls, otak: OtaKeyset) -> 'OtaAlgoCrypt': """Resolve the class for the encryption algorithm of otak and instantiate it.""" for subc in cls.__subclasses__(): if subc.enum_name == otak.algo_crypt: @@ -239,7 +237,7 @@ pass
@classmethod - def fromKeyset(cls, otak: OtaKeyset) -> 'OtaAlgoAuth': + def from_keyset(cls, otak: OtaKeyset) -> 'OtaAlgoAuth': """Resolve the class for the authentication algorithm of otak and instantiate it.""" for subc in cls.__subclasses__(): if subc.enum_name == otak.algo_auth: