aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2025-03-28 10:08:17 +0100
committerJ08nY2025-03-28 10:08:17 +0100
commit7afddf743cfdadbaff1a3bf2581c039c6e0816bb (patch)
tree5d912f55679428f31ac620b009b94d82ecd5a40f
parent1e72c45f317103bee20e00e66eff473ade40e33d (diff)
downloadpyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.tar.gz
pyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.tar.zst
pyecsca-7afddf743cfdadbaff1a3bf2581c039c6e0816bb.zip
-rw-r--r--pyecsca/ec/mult/naf.py10
-rw-r--r--test/sca/test_rpa.py9
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,