diff options
| author | J08nY | 2024-06-01 14:15:39 +0200 |
|---|---|---|
| committer | J08nY | 2024-06-01 14:15:39 +0200 |
| commit | 5ddfea8c12b2e76fa7aed8eb146c8c385e2abe60 (patch) | |
| tree | 51edf08a2501553f61c9bbce506b70ac25ec9ef0 /pyecsca/sca/target | |
| parent | e2bb0abbd98c7666b3604499272d1e40a8d3d7b7 (diff) | |
| download | pyecsca-5ddfea8c12b2e76fa7aed8eb146c8c385e2abe60.tar.gz pyecsca-5ddfea8c12b2e76fa7aed8eb146c8c385e2abe60.tar.zst pyecsca-5ddfea8c12b2e76fa7aed8eb146c8c385e2abe60.zip | |
Diffstat (limited to 'pyecsca/sca/target')
| -rw-r--r-- | pyecsca/sca/target/ISO7816.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/target/PCSC.py | 3 | ||||
| -rw-r--r-- | pyecsca/sca/target/binary.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/target/chipwhisperer.py | 4 | ||||
| -rw-r--r-- | pyecsca/sca/target/ectester.py | 136 | ||||
| -rw-r--r-- | pyecsca/sca/target/leakage.py | 28 | ||||
| -rw-r--r-- | pyecsca/sca/target/leia.py | 3 | ||||
| -rw-r--r-- | pyecsca/sca/target/serial.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/target/simpleserial.py | 2 |
9 files changed, 99 insertions, 83 deletions
diff --git a/pyecsca/sca/target/ISO7816.py b/pyecsca/sca/target/ISO7816.py index 63326ca..0af78db 100644 --- a/pyecsca/sca/target/ISO7816.py +++ b/pyecsca/sca/target/ISO7816.py @@ -6,7 +6,7 @@ from typing import Optional from public import public -from .base import Target +from pyecsca.sca.target.base import Target @public diff --git a/pyecsca/sca/target/PCSC.py b/pyecsca/sca/target/PCSC.py index 212651b..cd74149 100644 --- a/pyecsca/sca/target/PCSC.py +++ b/pyecsca/sca/target/PCSC.py @@ -7,7 +7,8 @@ from smartcard.System import readers from smartcard.pcsc.PCSCCardConnection import PCSCCardConnection from smartcard.pcsc.PCSCReader import PCSCReader -from .ISO7816 import ISO7816Target, CommandAPDU, ResponseAPDU, ISO7816, CardProtocol, CardConnectionException +from pyecsca.sca.target.ISO7816 import ISO7816Target, CommandAPDU, ResponseAPDU, ISO7816, CardProtocol, \ + CardConnectionException @public diff --git a/pyecsca/sca/target/binary.py b/pyecsca/sca/target/binary.py index 310b9e2..0dd22d5 100644 --- a/pyecsca/sca/target/binary.py +++ b/pyecsca/sca/target/binary.py @@ -5,7 +5,7 @@ from typing import Optional, Union, List from public import public -from .serial import SerialTarget +from pyecsca.sca.target.serial import SerialTarget @public diff --git a/pyecsca/sca/target/chipwhisperer.py b/pyecsca/sca/target/chipwhisperer.py index 784596a..28a2cb8 100644 --- a/pyecsca/sca/target/chipwhisperer.py +++ b/pyecsca/sca/target/chipwhisperer.py @@ -12,8 +12,8 @@ from chipwhisperer.capture.scopes import ScopeTypes from chipwhisperer.capture.targets.SimpleSerial import SimpleSerial from public import public -from .flash import Flashable -from .simpleserial import SimpleSerialTarget +from pyecsca.sca.target.flash import Flashable +from pyecsca.sca.target.simpleserial import SimpleSerialTarget @public diff --git a/pyecsca/sca/target/ectester.py b/pyecsca/sca/target/ectester.py index 3f6bd57..ec00502 100644 --- a/pyecsca/sca/target/ectester.py +++ b/pyecsca/sca/target/ectester.py @@ -9,11 +9,18 @@ from typing import Optional, Mapping, List, Union from public import public -from .ISO7816 import CommandAPDU, ResponseAPDU, ISO7816, ISO7816Target, CardProtocol, CardConnectionException -from . import has_leia, has_pyscard -from ...ec.model import ShortWeierstrassModel -from ...ec.params import DomainParameters -from ...ec.point import Point +from pyecsca.sca.target.ISO7816 import ( + CommandAPDU, + ResponseAPDU, + ISO7816, + ISO7816Target, + CardProtocol, + CardConnectionException, +) +from pyecsca.sca.target import has_leia, has_pyscard +from pyecsca.ec.model import ShortWeierstrassModel +from pyecsca.ec.params import DomainParameters +from pyecsca.ec.point import Point class ShiftableFlag(IntFlag): # pragma: no cover @@ -248,7 +255,7 @@ class Response(ABC): # pragma: no cover offset = 0 for i in range(num_sw): if len(resp.data) >= offset + 2: - self.sws[i] = int.from_bytes(resp.data[offset: offset + 2], "big") + self.sws[i] = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 if self.sws[i] != ISO7816.SW_NO_ERROR: self.success = False @@ -265,13 +272,13 @@ class Response(ABC): # pragma: no cover self.success = False self.error = True break - param_len = int.from_bytes(resp.data[offset: offset + 2], "big") + param_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 if len(resp.data) < offset + param_len: self.success = False self.error = True break - self.params[i] = resp.data[offset: offset + param_len] + self.params[i] = resp.data[offset : offset + param_len] offset += param_len def __repr__(self): @@ -343,11 +350,11 @@ class ExportResponse(Response): # pragma: no cover parameters: ParameterEnum def __init__( - self, - resp: ResponseAPDU, - keypair: KeypairEnum, - key: KeyEnum, - params: ParameterEnum, + self, + resp: ResponseAPDU, + keypair: KeypairEnum, + key: KeyEnum, + params: ParameterEnum, ): self.keypair = keypair self.key = key @@ -473,31 +480,31 @@ class InfoResponse(Response): # pragma: no cover super().__init__(resp, 1, 0) offset = 2 - version_len = int.from_bytes(resp.data[offset: offset + 2], "big") + version_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 - self.version = resp.data[offset: offset + version_len].decode() + self.version = resp.data[offset : offset + version_len].decode() offset += version_len self.base = AppletBaseEnum( - int.from_bytes(resp.data[offset: offset + 2], "big") + int.from_bytes(resp.data[offset : offset + 2], "big") ) offset += 2 - system_version = int.from_bytes(resp.data[offset: offset + 2], "big") + system_version = int.from_bytes(resp.data[offset : offset + 2], "big") system_major = system_version >> 8 system_minor = system_version & 0xFF minor_size = 1 if system_minor == 0 else ceil(log(system_minor, 10)) self.system_version = system_major + system_minor / (minor_size * 10) offset += 2 self.object_deletion_supported = ( - int.from_bytes(resp.data[offset: offset + 2], "big") == 1 + int.from_bytes(resp.data[offset : offset + 2], "big") == 1 ) offset += 2 - self.buf_len = int.from_bytes(resp.data[offset: offset + 2], "big") + self.buf_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 - self.ram1_len = int.from_bytes(resp.data[offset: offset + 2], "big") + self.ram1_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 - self.ram2_len = int.from_bytes(resp.data[offset: offset + 2], "big") + self.ram2_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 - self.apdu_len = int.from_bytes(resp.data[offset: offset + 2], "big") + self.apdu_len = int.from_bytes(resp.data[offset : offset + 2], "big") offset += 2 def __repr__(self): @@ -538,7 +545,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover chunk_length = 255 if chunk_start + chunk_length > len(data): chunk_length = len(data) - chunk_start - chunk = data[chunk_start: chunk_start + chunk_length] + chunk = data[chunk_start : chunk_start + chunk_length] chunk_apdu = CommandAPDU( self.CLA_ECTESTER, InstructionEnum.INS_BUFFER, 0, 0, chunk ) @@ -554,7 +561,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return resp def select_applet( - self, latest_version: bytes = AID_CURRENT_VERSION, count_back: int = 10 + self, latest_version: bytes = AID_CURRENT_VERSION, count_back: int = 10 ) -> bool: """ Select the *ECTester* applet, with a specified version or older. @@ -565,7 +572,11 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover """ version_bytes = bytearray(latest_version) for _ in range(count_back): - for aid_suffix in (self.AID_SUFFIX_304, self.AID_SUFFIX_222, self.AID_SUFFIX_221): + for aid_suffix in ( + self.AID_SUFFIX_304, + self.AID_SUFFIX_222, + self.AID_SUFFIX_221, + ): aid = self.AID_PREFIX + version_bytes + aid_suffix if self.select(aid): return True @@ -587,7 +598,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover @staticmethod def encode_parameters( - params: ParameterEnum, obj: Union[DomainParameters, Point, int] + params: ParameterEnum, obj: Union[DomainParameters, Point, int] ) -> Mapping[ParameterEnum, bytes]: """Encode values from `obj` into the byte parameters that the **ECTester** applet expects.""" @@ -600,7 +611,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover result = {} if isinstance(obj, DomainParameters) and isinstance( - obj.curve.model, ShortWeierstrassModel + obj.curve.model, ShortWeierstrassModel ): for param in params & ParameterEnum.DOMAIN_FP: if param == ParameterEnum.G: @@ -620,7 +631,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover result[param] = convert_point(obj) elif isinstance(obj, int): for param in params & ( - (ParameterEnum.DOMAIN_FP ^ ParameterEnum.G) | ParameterEnum.S + (ParameterEnum.DOMAIN_FP ^ ParameterEnum.G) | ParameterEnum.S ): result[param] = convert_int(obj) else: @@ -664,11 +675,11 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return AllocateSigResponse(resp) def allocate( - self, - keypair: KeypairEnum, - builder: KeyBuildEnum, - key_length: int, - key_class: KeyClassEnum, + self, + keypair: KeypairEnum, + builder: KeyBuildEnum, + key_length: int, + key_class: KeyClassEnum, ) -> AllocateResponse: """ Send the Allocate KeyPair command. @@ -703,11 +714,11 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ClearResponse(resp, keypair) def set( - self, - keypair: KeypairEnum, - curve: CurveEnum, - params: ParameterEnum, - values: Optional[Mapping[ParameterEnum, bytes]] = None, + self, + keypair: KeypairEnum, + curve: CurveEnum, + params: ParameterEnum, + values: Optional[Mapping[ParameterEnum, bytes]] = None, ) -> SetResponse: """ Send the Set command. @@ -749,11 +760,11 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return SetResponse(resp, keypair) def transform( - self, - keypair: KeypairEnum, - key: KeyEnum, - params: ParameterEnum, - transformation: TransformationEnum, + self, + keypair: KeypairEnum, + key: KeyEnum, + params: ParameterEnum, + transformation: TransformationEnum, ) -> TransformResponse: """ Send the Transform command. @@ -790,7 +801,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return GenerateResponse(resp, keypair) def export( - self, keypair: KeypairEnum, key: KeyEnum, params: ParameterEnum + self, keypair: KeypairEnum, key: KeyEnum, params: ParameterEnum ) -> ExportResponse: """ Send the Export command. @@ -812,12 +823,12 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ExportResponse(resp, keypair, key, params) def ecdh( - self, - pubkey: KeypairEnum, - privkey: KeypairEnum, - export: bool, - transformation: TransformationEnum, - ka_type: KeyAgreementEnum, + self, + pubkey: KeypairEnum, + privkey: KeypairEnum, + export: bool, + transformation: TransformationEnum, + ka_type: KeyAgreementEnum, ) -> ECDHResponse: """ Send the ECDH command. @@ -843,12 +854,12 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ECDHResponse(resp, export) def ecdh_direct( - self, - privkey: KeypairEnum, - export: bool, - transformation: TransformationEnum, - ka_type: KeyAgreementEnum, - pubkey: bytes, + self, + privkey: KeypairEnum, + export: bool, + transformation: TransformationEnum, + ka_type: KeyAgreementEnum, + pubkey: bytes, ) -> ECDHResponse: """ Send the ECDH direct command. @@ -875,7 +886,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ECDHResponse(resp, export) def ecdsa( - self, keypair: KeypairEnum, export: bool, sig_type: SignatureEnum, data: bytes + self, keypair: KeypairEnum, export: bool, sig_type: SignatureEnum, data: bytes ) -> ECDSAResponse: """ Send the ECDSA command. @@ -898,7 +909,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ECDSAResponse(resp, export) def ecdsa_sign( - self, keypair: KeypairEnum, export: bool, sig_type: SignatureEnum, data: bytes + self, keypair: KeypairEnum, export: bool, sig_type: SignatureEnum, data: bytes ) -> ECDSAResponse: """ Send the ECDSA sign command. @@ -921,7 +932,7 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover return ECDSAResponse(resp, export) def ecdsa_verify( - self, keypair: KeypairEnum, sig_type: SignatureEnum, sig: bytes, data: bytes + self, keypair: KeypairEnum, sig_type: SignatureEnum, sig: bytes, data: bytes ) -> ECDSAResponse: """ Send the ECDSA verify command. @@ -984,17 +995,20 @@ class ECTesterTarget(ISO7816Target, ABC): # pragma: no cover if has_pyscard: - from .PCSC import PCSCTarget + from pyecsca.sca.target.PCSC import PCSCTarget @public class ECTesterTargetPCSC(ECTesterTarget, PCSCTarget): """An ECTester-applet-based target that is connected via a PCSC-compatible reader.""" + pass + if has_leia: - from .leia import LEIATarget + from pyecsca.sca.target.leia import LEIATarget @public class ECTesterTargetLEIA(ECTesterTarget, LEIATarget): """An ECTester-applet-based target that is connected via the LEIA board.""" + pass diff --git a/pyecsca/sca/target/leakage.py b/pyecsca/sca/target/leakage.py index 1f6e2b0..c832028 100644 --- a/pyecsca/sca/target/leakage.py +++ b/pyecsca/sca/target/leakage.py @@ -2,20 +2,20 @@ import numpy as np from typing import Optional, Tuple from public import public -from ...ec.coordinates import CoordinateModel -from ...ec.mod import Mod -from ...ec.model import CurveModel -from ...ec.params import DomainParameters -from ...ec.point import Point -from ...ec.mult import ScalarMultiplier -from ...ec.key_generation import KeyGeneration -from ...ec.key_agreement import KeyAgreement -from ...ec.signature import Signature, SignatureResult -from ...ec.formula import FormulaAction -from ...ec.context import DefaultContext, local -from ..attack import LeakageModel -from ..trace import Trace -from .base import Target +from pyecsca.ec.coordinates import CoordinateModel +from pyecsca.ec.mod import Mod +from pyecsca.ec.model import CurveModel +from pyecsca.ec.params import DomainParameters +from pyecsca.ec.point import Point +from pyecsca.ec.mult import ScalarMultiplier +from pyecsca.ec.key_generation import KeyGeneration +from pyecsca.ec.key_agreement import KeyAgreement +from pyecsca.ec.signature import Signature, SignatureResult +from pyecsca.ec.formula import FormulaAction +from pyecsca.ec.context import DefaultContext, local +from pyecsca.sca.attack import LeakageModel +from pyecsca.sca.trace import Trace +from pyecsca.sca.target.base import Target @public diff --git a/pyecsca/sca/target/leia.py b/pyecsca/sca/target/leia.py index f4d5643..8dab7df 100644 --- a/pyecsca/sca/target/leia.py +++ b/pyecsca/sca/target/leia.py @@ -3,7 +3,8 @@ from typing import Optional from smartleia import LEIA, create_APDU_from_bytes, T -from .ISO7816 import ISO7816Target, CommandAPDU, ResponseAPDU, ISO7816, CardProtocol, CardConnectionException +from pyecsca.sca.target.ISO7816 import ISO7816Target, CommandAPDU, ResponseAPDU, ISO7816, CardProtocol, \ + CardConnectionException class LEIATarget(ISO7816Target): # pragma: no cover diff --git a/pyecsca/sca/target/serial.py b/pyecsca/sca/target/serial.py index 3b81851..62dea45 100644 --- a/pyecsca/sca/target/serial.py +++ b/pyecsca/sca/target/serial.py @@ -3,7 +3,7 @@ from abc import abstractmethod from public import public -from .base import Target +from pyecsca.sca.target.base import Target @public diff --git a/pyecsca/sca/target/simpleserial.py b/pyecsca/sca/target/simpleserial.py index edc543e..f13a0a6 100644 --- a/pyecsca/sca/target/simpleserial.py +++ b/pyecsca/sca/target/simpleserial.py @@ -5,7 +5,7 @@ from typing import Mapping, Union from public import public -from .serial import SerialTarget +from pyecsca.sca.target.serial import SerialTarget @public |
