diff options
Diffstat (limited to 'pyecsca')
| -rw-r--r-- | pyecsca/ec/__init__.py | 1 | ||||
| -rw-r--r-- | pyecsca/ec/coordinates.py | 2 | ||||
| -rw-r--r-- | pyecsca/ec/curves.py | 2 | ||||
| -rw-r--r-- | pyecsca/ec/formula.py | 7 | ||||
| -rw-r--r-- | pyecsca/ec/model.py | 4 | ||||
| -rw-r--r-- | pyecsca/ec/mult.py | 2 | ||||
| -rw-r--r-- | pyecsca/ec/point.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/__init__.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/scope/__init__.py | 4 | ||||
| -rw-r--r-- | pyecsca/sca/scope/chipwhisperer.py | 31 | ||||
| -rw-r--r-- | pyecsca/sca/scope/picoscope_sdk.py | 14 | ||||
| -rw-r--r-- | pyecsca/sca/target/__init__.py | 1 | ||||
| -rw-r--r-- | pyecsca/sca/trace/__init__.py | 4 | ||||
| -rw-r--r-- | pyecsca/sca/trace/align.py | 1 | ||||
| -rw-r--r-- | pyecsca/sca/trace/match.py | 1 | ||||
| -rw-r--r-- | pyecsca/sca/trace/test.py | 2 | ||||
| -rw-r--r-- | pyecsca/sca/trace_set/__init__.py | 4 |
17 files changed, 56 insertions, 28 deletions
diff --git a/pyecsca/ec/__init__.py b/pyecsca/ec/__init__.py index e69de29..a1fa2ce 100644 --- a/pyecsca/ec/__init__.py +++ b/pyecsca/ec/__init__.py @@ -0,0 +1 @@ +"""Package for handling Elliptic Curves.""" diff --git a/pyecsca/ec/coordinates.py b/pyecsca/ec/coordinates.py index e082a41..89452c9 100644 --- a/pyecsca/ec/coordinates.py +++ b/pyecsca/ec/coordinates.py @@ -88,7 +88,7 @@ class EFDCoordinateModel(CoordinateModel): code = parse(line[11:].replace("^", "**"), mode="exec") self.satisfying.append(code) except SyntaxError: - #code = parse(line[11:].replace("=", "==").replace("^", "**"), mode="eval") + # code = parse(line[11:].replace("=", "==").replace("^", "**"), mode="eval") pass elif line.startswith("parameter"): self.parameters.append(line[10:]) diff --git a/pyecsca/ec/curves.py b/pyecsca/ec/curves.py index de919b8..7fcfcbd 100644 --- a/pyecsca/ec/curves.py +++ b/pyecsca/ec/curves.py @@ -85,7 +85,7 @@ SHORT_WEIERSTRASS: Mapping[str, Mapping[str, Any]] = { "g": (0x7b6aa5d85e572983e6fb32a7cdebc140, 0x27b6916a894d3aee7106fe805fc34b44), "n": 0x3fffffff7fffffffbe0024720613b5a3, - "h":0x4}, + "h": 0x4}, "secp160k1": { "p": 0xfffffffffffffffffffffffffffffffeffffac73, "a": 0x0000000000000000000000000000000000000000, diff --git a/pyecsca/ec/formula.py b/pyecsca/ec/formula.py index 2da6ad5..aeed4a6 100644 --- a/pyecsca/ec/formula.py +++ b/pyecsca/ec/formula.py @@ -1,6 +1,6 @@ from ast import parse, Expression, Mult, Add, Sub, Pow, Div -from typing import List, Set, Any, ClassVar, MutableMapping from itertools import product +from typing import List, Set, Any, ClassVar, MutableMapping from pkg_resources import resource_stream from public import public @@ -68,6 +68,7 @@ class Formula(object): """Number of additions and subtractions.""" return len(list(filter(lambda op: isinstance(op.operator, (Add, Sub)), self.code))) + class EFDFormula(Formula): def __init__(self, path: str, name: str, coordinate_model: Any): @@ -116,7 +117,8 @@ class EFDFormula(Formula): @property def outputs(self): return set(var + str(i) for var, i in product(self.coordinate_model.variables, - range(self.output_index, self.output_index + self.num_outputs))) + range(self.output_index, + self.output_index + self.num_outputs))) def __eq__(self, other): if not isinstance(other, EFDFormula): @@ -126,6 +128,7 @@ class EFDFormula(Formula): def __hash__(self): return hash(self.name) + hash(self.coordinate_model) + @public class AdditionFormula(Formula): shortname = "add" diff --git a/pyecsca/ec/model.py b/pyecsca/ec/model.py index c8a9b46..a313a00 100644 --- a/pyecsca/ec/model.py +++ b/pyecsca/ec/model.py @@ -20,8 +20,8 @@ class CurveModel(object): to_weierstrass: List[Module] from_weierstrass: List[Module] - #TODO: move the base_formulas into methods, operatin on affine points? - # Also to_weierstrass anf from_weierstrass. + # TODO: move the base_formulas into methods, operatin on affine points? + # Also to_weierstrass anf from_weierstrass. # TODO: __eq__ diff --git a/pyecsca/ec/mult.py b/pyecsca/ec/mult.py index ef74bc8..5a76a18 100644 --- a/pyecsca/ec/mult.py +++ b/pyecsca/ec/mult.py @@ -32,7 +32,7 @@ class ScalarMultiplier(object): formula is not None)) != 1: raise ValueError self.short_circuit = short_circuit - self.formulas = {k:v for k, v in formulas.items() if v is not None} + self.formulas = {k: v for k, v in formulas.items() if v is not None} def _add(self, one: Point, other: Point) -> Point: if "add" not in self.formulas: diff --git a/pyecsca/ec/point.py b/pyecsca/ec/point.py index 368dd0d..b5ba10b 100644 --- a/pyecsca/ec/point.py +++ b/pyecsca/ec/point.py @@ -35,7 +35,7 @@ class Point(object): for s in self.coordinate_model.satisfying: try: ops.add(CodeOp(s)) - except: + except Exception: pass affine_model = AffineCoordinateModel(self.coordinate_model.curve_model) result_variables = set(map(lambda x: x.result, ops)) diff --git a/pyecsca/sca/__init__.py b/pyecsca/sca/__init__.py index 4e5c985..3117331 100644 --- a/pyecsca/sca/__init__.py +++ b/pyecsca/sca/__init__.py @@ -1,3 +1,5 @@ +"""Package for Side-Channel Analysis.""" + from .scope import * from .target import * from .trace import * diff --git a/pyecsca/sca/scope/__init__.py b/pyecsca/sca/scope/__init__.py index d11ed82..b609e94 100644 --- a/pyecsca/sca/scope/__init__.py +++ b/pyecsca/sca/scope/__init__.py @@ -1,3 +1,5 @@ +"""Package for handling oscilloscopes for measurement of power/EM traces.""" + from typing import Type from .base import * @@ -30,9 +32,11 @@ except ImportError: PicoScope: Type[Scope] if has_picoscope: from .picoscope_alt import * + PicoScope = PicoScopeAlt elif has_picosdk: from .picoscope_sdk import * + PicoScope = PicoScopeSdk if has_chipwhisperer: diff --git a/pyecsca/sca/scope/chipwhisperer.py b/pyecsca/sca/scope/chipwhisperer.py index 60fe7cf..8f5590d 100644 --- a/pyecsca/sca/scope/chipwhisperer.py +++ b/pyecsca/sca/scope/chipwhisperer.py @@ -1,47 +1,56 @@ -from typing import Optional, Tuple, Sequence +from typing import Optional, Tuple, Sequence, Set import numpy as np -from chipwhisperer.capture.scopes.base import ScopeTemplate +from chipwhisperer.capture.scopes.OpenADC import OpenADC from public import public from .base import Scope + @public -class ChipWhispererScope(Scope): +class ChipWhispererScope(Scope): # pragma: no cover """A ChipWhisperer based scope.""" - def __init__(self, scope: ScopeTemplate): + def __init__(self, scope: OpenADC): self.scope = scope + self.triggers: Set[str] = set() def open(self) -> None: self.scope.con() @property def channels(self) -> Sequence[str]: - return ["tio1", "tio2", "tio3", "tio4"] + return [] def setup_frequency(self, frequency: int, samples: int) -> Tuple[int, int]: - pass + self.scope.clock.clkgen_freq = frequency + self.scope.samples = samples + return self.scope.clock.freq_ctr, self.scope.samples def setup_channel(self, channel: str, coupling: str, range: float, enable: bool) -> None: pass def setup_trigger(self, channel: str, threshold: float, direction: str, delay: int, timeout: int, enable: bool) -> None: - pass + if enable: + self.triggers.add(channel) + elif channel in self.triggers: + self.triggers.remove(channel) + self.scope.adc.basic_mode = direction + self.scope.trigger.triggers = " OR ".join(self.triggers) def setup_capture(self, channel: str, enable: bool) -> None: pass def arm(self) -> None: - pass + self.scope.arm() def capture(self, channel: str, timeout: Optional[int] = None) -> Optional[np.ndarray]: - pass + self.scope.capture() + return self.scope.get_last_trace() def stop(self) -> None: pass def close(self) -> None: - pass - + self.scope.dis() diff --git a/pyecsca/sca/scope/picoscope_sdk.py b/pyecsca/sca/scope/picoscope_sdk.py index d44d8c8..e552188 100644 --- a/pyecsca/sca/scope/picoscope_sdk.py +++ b/pyecsca/sca/scope/picoscope_sdk.py @@ -1,6 +1,6 @@ import ctypes -from time import time_ns, sleep from math import log2, floor +from time import time_ns, sleep from typing import Mapping, Optional, MutableMapping, Union, Tuple import numpy as np @@ -22,7 +22,7 @@ def adc2volt(adc: Union[np.ndarray, ctypes.c_int16], def volt2adc(volt: Union[np.ndarray, float], volt_range: float, adc_minmax: int) -> Union[ - np.ndarray, ctypes.c_int16]: # pragma: no cover + np.ndarray, ctypes.c_int16]: # pragma: no cover if isinstance(volt, float): return ctypes.c_int16(int((volt / volt_range) * adc_minmax)) return (volt / volt_range) * adc_minmax @@ -130,12 +130,14 @@ class PicoScopeSdk(Scope): # pragma: no cover if channel in self.buffers: del self.buffers[channel] buffer = (ctypes.c_int16 * self.samples)() - assert_pico_ok(self.__dispatch_call("SetDataBuffer", self.handle, self.CHANNELS[channel], - ctypes.byref(buffer), self.samples)) + assert_pico_ok( + self.__dispatch_call("SetDataBuffer", self.handle, self.CHANNELS[channel], + ctypes.byref(buffer), self.samples)) self.buffers[channel] = buffer else: - assert_pico_ok(self.__dispatch_call("SetDataBuffer", self.handle, self.CHANNELS[channel], - None, self.samples)) + assert_pico_ok( + self.__dispatch_call("SetDataBuffer", self.handle, self.CHANNELS[channel], + None, self.samples)) del self.buffers[channel] def arm(self): diff --git a/pyecsca/sca/target/__init__.py b/pyecsca/sca/target/__init__.py index e69de29..750f885 100644 --- a/pyecsca/sca/target/__init__.py +++ b/pyecsca/sca/target/__init__.py @@ -0,0 +1 @@ +"""Package for communicating with targets of measurement.""" diff --git a/pyecsca/sca/trace/__init__.py b/pyecsca/sca/trace/__init__.py index 62f2864..696e387 100644 --- a/pyecsca/sca/trace/__init__.py +++ b/pyecsca/sca/trace/__init__.py @@ -1,3 +1,5 @@ +"""Package for manipulating traces.""" + from .align import * from .combine import * from .edit import * @@ -6,4 +8,4 @@ from .match import * from .process import * from .sampling import * from .test import * -from .trace import *
\ No newline at end of file +from .trace import * diff --git a/pyecsca/sca/trace/align.py b/pyecsca/sca/trace/align.py index ff586ab..643efcf 100644 --- a/pyecsca/sca/trace/align.py +++ b/pyecsca/sca/trace/align.py @@ -121,6 +121,7 @@ def align_offset(reference: Trace, *traces: Trace, :return: """ reference_part = reference.samples[reference_offset: reference_offset + reference_length] + def align_func(trace): length = len(trace.samples) best_distance = 0 diff --git a/pyecsca/sca/trace/match.py b/pyecsca/sca/trace/match.py index ba69026..3b4daed 100644 --- a/pyecsca/sca/trace/match.py +++ b/pyecsca/sca/trace/match.py @@ -32,6 +32,7 @@ def match_pattern(trace: Trace, pattern: Trace, threshold: float = 0.8) -> List[ filtered_peaks.append(peak - half) return filtered_peaks + @public def match_part(trace: Trace, offset: int, length: int) -> List[int]: return match_pattern(trace, trim(trace, offset, offset + length)) diff --git a/pyecsca/sca/trace/test.py b/pyecsca/sca/trace/test.py index 92cda68..f2cfb33 100644 --- a/pyecsca/sca/trace/test.py +++ b/pyecsca/sca/trace/test.py @@ -32,7 +32,7 @@ def welch_ttest(first_set: Sequence[Trace], second_set: Sequence[Trace]) -> Opti @public def student_ttest(first_set: Sequence[Trace], second_set: Sequence[Trace]) -> Optional[ - CombinedTrace]: + CombinedTrace]: """ Perform the Students's t-test sample wise on two sets of traces `first_set` and `second_set`. Useful for Test Vector Leakage Analysis (TVLA). diff --git a/pyecsca/sca/trace_set/__init__.py b/pyecsca/sca/trace_set/__init__.py index 517b3b7..cdede67 100644 --- a/pyecsca/sca/trace_set/__init__.py +++ b/pyecsca/sca/trace_set/__init__.py @@ -1,3 +1,5 @@ +"""Package for manipulating, reading and writing trace sets.""" + from .base import * from .inspector import * -from .chipwhisperer import *
\ No newline at end of file +from .chipwhisperer import * |
