diff options
| author | J08nY | 2020-07-10 16:19:18 +0200 |
|---|---|---|
| committer | J08nY | 2020-07-10 16:19:18 +0200 |
| commit | 3975d2c8da225201bde9747b0438a317369a5e6c (patch) | |
| tree | bbd28019fad77aedcb799e7cb42a2f726a756fc4 | |
| parent | e6024e21abc7db5306cafe843a74b28c9610a04e (diff) | |
| download | pyecsca-3975d2c8da225201bde9747b0438a317369a5e6c.tar.gz pyecsca-3975d2c8da225201bde9747b0438a317369a5e6c.tar.zst pyecsca-3975d2c8da225201bde9747b0438a317369a5e6c.zip | |
Minor fixes: formula handling in context, welch_ttest, HDF5TraceSet filename.
| -rw-r--r-- | pyecsca/ec/formula.py | 12 | ||||
| -rw-r--r-- | pyecsca/sca/trace/test.py | 10 | ||||
| -rw-r--r-- | pyecsca/sca/trace_set/hdf5.py | 7 |
3 files changed, 16 insertions, 13 deletions
diff --git a/pyecsca/ec/formula.py b/pyecsca/ec/formula.py index f3fdc4a..dd30605 100644 --- a/pyecsca/ec/formula.py +++ b/pyecsca/ec/formula.py @@ -40,12 +40,11 @@ class FormulaAction(ResultAction): formula: "Formula" inputs: MutableMapping[str, Mod] input_points: List[Any] - intermediates: MutableMapping[str, OpResult] + intermediates: MutableMapping[str, List[OpResult]] outputs: MutableMapping[str, OpResult] output_points: List[Any] - def __init__(self, formula: "Formula", *points: Any, - **inputs: Mod): + def __init__(self, formula: "Formula", *points: Any, **inputs: Mod): super().__init__() self.formula = formula self.inputs = inputs @@ -60,16 +59,17 @@ class FormulaAction(ResultAction): parents: List[Union[Mod, OpResult]] = [] for parent in {*op.variables, *op.parameters}: if parent in self.intermediates: - parents.append(self.intermediates[parent]) + parents.append(self.intermediates[parent][-1]) elif parent in self.inputs: parents.append(self.inputs[parent]) - self.intermediates[op.result] = OpResult(op.result, value, op.operator, *parents) + l = self.intermediates.setdefault(op.result, list()) + l.append(OpResult(op.result, value, op.operator, *parents)) def add_result(self, point: Any, **outputs: Mod): if isinstance(getcontext(), NullContext): return for k in outputs: - self.outputs[k] = self.intermediates[k] + self.outputs[k] = self.intermediates[k][-1] self.output_points.append(point) def __str__(self): diff --git a/pyecsca/sca/trace/test.py b/pyecsca/sca/trace/test.py index cc00e22..247e658 100644 --- a/pyecsca/sca/trace/test.py +++ b/pyecsca/sca/trace/test.py @@ -1,4 +1,4 @@ -from typing import Sequence, Optional, Union, Tuple +from typing import Sequence, Optional, Tuple import numpy as np from public import public @@ -20,7 +20,7 @@ def ttest_func(first_set: Sequence[Trace], second_set: Sequence[Trace], @public -def welch_ttest(first_set: Sequence[Trace], second_set: Sequence[Trace], dof: bool = False, p_value: bool = False) -> Optional[Union[CombinedTrace, Tuple[CombinedTrace, CombinedTrace], Tuple[CombinedTrace, CombinedTrace, CombinedTrace]]]: +def welch_ttest(first_set: Sequence[Trace], second_set: Sequence[Trace], dof: bool = False, p_value: bool = False) -> Optional[Tuple[CombinedTrace, ...]]: """ Perform the Welch's t-test sample wise on two sets of traces `first_set` and `second_set`. Useful for Test Vector Leakage Analysis (TVLA). @@ -46,19 +46,19 @@ def welch_ttest(first_set: Sequence[Trace], second_set: Sequence[Trace], dof: bo varn_0 = var_0.samples / n0 varn_1 = var_1.samples / n1 tval = (mean_0.samples - mean_1.samples) / np.sqrt(varn_0 + varn_1) - result = [tval] + result = [CombinedTrace(tval)] if dof or p_value: top = (varn_0 + varn_1)**2 bot = (varn_0**2 / (n0 - 1)) + (varn_1**2 / (n1 - 1)) df = top / bot del top del bot - result.append(df) + result.append(CombinedTrace(df)) if p_value: atval = np.abs(tval) p = 2 * t.sf(atval, df) del atval - result.append(p) + result.append(CombinedTrace(p)) return tuple(result) diff --git a/pyecsca/sca/trace_set/hdf5.py b/pyecsca/sca/trace_set/hdf5.py index cf5dd46..7eeeaf9 100644 --- a/pyecsca/sca/trace_set/hdf5.py +++ b/pyecsca/sca/trace_set/hdf5.py @@ -170,7 +170,10 @@ class HDF5TraceSet(TraceSet): fname = "" status = "" if self._file is not None: - fname = self._file.filename - status = " (opened)" if self._file.id.valid else " (closed)" + if self._file.id.valid: + status = " (opened)" + fname = self._file.filename + else: + status = "(closed)" args = ", ".join([f"{key}={getattr(self, key)!r}" for key in self._keys if not key.startswith("_")]) return f"HDF5TraceSet('{fname}'{status}, {args})" |
