aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2020-07-10 16:19:18 +0200
committerJ08nY2020-07-10 16:19:18 +0200
commit3975d2c8da225201bde9747b0438a317369a5e6c (patch)
treebbd28019fad77aedcb799e7cb42a2f726a756fc4
parente6024e21abc7db5306cafe843a74b28c9610a04e (diff)
downloadpyecsca-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.py12
-rw-r--r--pyecsca/sca/trace/test.py10
-rw-r--r--pyecsca/sca/trace_set/hdf5.py7
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})"