aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/sca
diff options
context:
space:
mode:
Diffstat (limited to 'pyecsca/sca')
-rw-r--r--pyecsca/sca/__init__.py2
-rw-r--r--pyecsca/sca/scope/__init__.py4
-rw-r--r--pyecsca/sca/scope/chipwhisperer.py31
-rw-r--r--pyecsca/sca/scope/picoscope_sdk.py14
-rw-r--r--pyecsca/sca/target/__init__.py1
-rw-r--r--pyecsca/sca/trace/__init__.py4
-rw-r--r--pyecsca/sca/trace/align.py1
-rw-r--r--pyecsca/sca/trace/match.py1
-rw-r--r--pyecsca/sca/trace/test.py2
-rw-r--r--pyecsca/sca/trace_set/__init__.py4
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 *