diff options
Diffstat (limited to 'pyecsca/sca')
| -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 |
10 files changed, 44 insertions, 20 deletions
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 * |
