diff options
| author | J08nY | 2025-03-28 10:08:17 +0100 |
|---|---|---|
| committer | J08nY | 2025-03-28 10:08:17 +0100 |
| commit | 7afddf743cfdadbaff1a3bf2581c039c6e0816bb (patch) | |
| tree | 5d912f55679428f31ac620b009b94d82ecd5a40f | |
| parent | 1e72c45f317103bee20e00e66eff473ade40e33d (diff) | |
| download | pyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.tar.gz pyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.tar.zst pyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.zip | |
| -rw-r--r-- | pyecsca/ec/mult/naf.py | 10 | ||||
| -rw-r--r-- | test/sca/test_rpa.py | 9 |
2 files changed, 15 insertions, 4 deletions
diff --git a/pyecsca/ec/mult/naf.py b/pyecsca/ec/mult/naf.py index 6d3e566..a9ad1a1 100644 --- a/pyecsca/ec/mult/naf.py +++ b/pyecsca/ec/mult/naf.py @@ -101,31 +101,33 @@ class BinaryNAFMultiplier(AccumulatorMultiplier, PrecompMultiplier, ScalarMultip q = copy(self._params.curve.neutral) for val in scalar_naf: q = self._dbl(q) + orig = q if val == 1: q = self._accumulate(q, self._point) if self.always: - self._accumulate(q, self._point_neg) + self._accumulate(orig, self._point_neg) elif val == -1: # TODO: Whether this negation is precomputed can be a parameter q = self._accumulate(q, self._point_neg) if self.always: - self._accumulate(q, self._point) + self._accumulate(orig, self._point) return q def _rtl(self, scalar_naf: List[int]) -> Point: q = self._point r = copy(self._params.curve.neutral) for val in reversed(scalar_naf): + orig = r if val == 1: r = self._accumulate(r, q) if self.always: neg = self._neg(q) - self._accumulate(r, neg) + self._accumulate(orig, neg) elif val == -1: neg = self._neg(q) r = self._accumulate(r, neg) if self.always: - self._accumulate(r, q) + self._accumulate(orig, q) q = self._dbl(q) return r diff --git a/test/sca/test_rpa.py b/test/sca/test_rpa.py index 8be35f1..3bcf987 100644 --- a/test/sca/test_rpa.py +++ b/test/sca/test_rpa.py @@ -84,6 +84,15 @@ def test_multiples(rpa_params): assert 0 not in multiples +def test_multiples_bnaf(rpa_params): + mult_partial = partial(BinaryNAFMultiplier, always=True, direction=ProcessingDirection.LTR) + multiples = multiples_computed( + 199, rpa_params, BinaryNAFMultiplier, mult_partial, True, True, + kind="all" + ) + assert 23 in multiples + + def test_multiples_kind(rpa_params): multiples_all = multiples_computed( 17, rpa_params, RTLMultiplier, RTLMultiplier, True, True, |
