aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pyecsca/ec/curve.py5
-rw-r--r--pyecsca/ec/mod/base.py14
-rw-r--r--pyecsca/ec/params.py5
-rwxr-xr-xtest/ec/perf_formula.py24
-rwxr-xr-xtest/ec/perf_mod.py48
-rwxr-xr-xtest/ec/perf_mult.py4
-rw-r--r--test/sca/perf_combine.py8
-rw-r--r--test/sca/perf_zvp.py9
-rw-r--r--test/utils.py4
9 files changed, 93 insertions, 28 deletions
diff --git a/pyecsca/ec/curve.py b/pyecsca/ec/curve.py
index fc48215..8a3c726 100644
--- a/pyecsca/ec/curve.py
+++ b/pyecsca/ec/curve.py
@@ -93,9 +93,10 @@ class EllipticCurve:
if isinstance(value, Mod):
if value.n != prime:
raise ValueError(f"Parameter {name} has wrong modulus.")
+ val = value
else:
- value = mod(value, prime)
- self.parameters[name] = value
+ val = mod(value, prime)
+ self.parameters[name] = val
self.neutral = neutral
self.__validate_coord_assumptions()
diff --git a/pyecsca/ec/mod/base.py b/pyecsca/ec/mod/base.py
index 7d21f27..67e2b97 100644
--- a/pyecsca/ec/mod/base.py
+++ b/pyecsca/ec/mod/base.py
@@ -164,8 +164,7 @@ class Mod:
__slots__ = ("x", "n")
def __init__(self, x, n):
- self.x = x
- self.n = n
+ raise TypeError("Abstract")
@_check
def __add__(self, other) -> "Mod":
@@ -273,7 +272,6 @@ class Undefined(Mod):
__slots__ = ("x", "n")
def __init__(self):
- super().__init__(None, None)
self.x = None
self.n = None
@@ -348,7 +346,15 @@ class Undefined(Mod):
@public
-def mod(x, n) -> Mod:
+def mod(x: int, n: int) -> Mod:
+ """
+ Construct a :py:class:`Mod`.
+
+ :param x: The value.
+ :param n: The modulus.
+ :return: A selected Mod implementation object.
+ :raises: ValueError in case a working Mod implementation cannot be found.
+ """
if not _mod_classes:
raise ValueError("Cannot find any working Mod class.")
selected_class = getconfig().ec.mod_implementation
diff --git a/pyecsca/ec/params.py b/pyecsca/ec/params.py
index 7dfaab8..2e437a2 100644
--- a/pyecsca/ec/params.py
+++ b/pyecsca/ec/params.py
@@ -258,8 +258,9 @@ def _create_params(curve, coords, infty):
)
value = ilocals[coordinate]
if isinstance(value, int):
- value = mod(value, field)
- infinity_coords[coordinate] = value
+ infinity_coords[coordinate] = mod(value, field)
+ else:
+ infinity_coords[coordinate] = value
infinity = Point(coord_model, **infinity_coords)
elliptic_curve = EllipticCurve(model, coord_model, field, infinity, params) # type: ignore[arg-type]
if "generator" not in curve:
diff --git a/test/ec/perf_formula.py b/test/ec/perf_formula.py
index 782631c..1092ab5 100755
--- a/test/ec/perf_formula.py
+++ b/test/ec/perf_formula.py
@@ -9,12 +9,19 @@ from test.utils import Profiler
@click.command()
-@click.option("-p", "--profiler", type=click.Choice(("py", "c", "raw")), default="py")
+@click.option(
+ "-p",
+ "--profiler",
+ type=click.Choice(("py", "c", "raw")),
+ default="py",
+ envvar="PROF",
+)
@click.option(
"-m",
"--mod",
type=click.Choice(("python", "gmp", "flint")),
default="flint" if has_flint else "gmp" if has_gmp else "python",
+ envvar="MOD",
)
@click.option("-o", "--operations", type=click.INT, default=5000)
@click.option(
@@ -36,7 +43,10 @@ def main(profiler, mod, operations, directory):
)
one_point = p256.generator
with Profiler(
- profiler, directory, f"formula_dbl2016rcb_p256_{operations}_{mod}"
+ profiler,
+ directory,
+ f"formula_dbl2016rcb_p256_{operations}_{mod}",
+ operations,
):
for _ in range(operations):
one_point = dbl(p256.curve.prime, one_point, **p256.curve.parameters)[0]
@@ -45,7 +55,10 @@ def main(profiler, mod, operations, directory):
)
other_point = p256.generator
with Profiler(
- profiler, directory, f"formula_add2016rcb_p256_{operations}_{mod}"
+ profiler,
+ directory,
+ f"formula_add2016rcb_p256_{operations}_{mod}",
+ operations,
):
for _ in range(operations):
one_point = add(
@@ -59,7 +72,10 @@ def main(profiler, mod, operations, directory):
)
eone_point = ed25519.generator
with Profiler(
- profiler, directory, f"formula_mdbl2008hwcd_ed25519_{operations}_{mod}"
+ profiler,
+ directory,
+ f"formula_mdbl2008hwcd_ed25519_{operations}_{mod}",
+ operations,
):
for _ in range(operations):
dblg(ed25519.curve.prime, eone_point, **ed25519.curve.parameters)
diff --git a/test/ec/perf_mod.py b/test/ec/perf_mod.py
index a0d6577..7783f09 100755
--- a/test/ec/perf_mod.py
+++ b/test/ec/perf_mod.py
@@ -9,12 +9,19 @@ from test.utils import Profiler
@click.command()
-@click.option("-p", "--profiler", type=click.Choice(("py", "c", "raw")), default="py")
+@click.option(
+ "-p",
+ "--profiler",
+ type=click.Choice(("py", "c", "raw")),
+ default="py",
+ envvar="PROF",
+)
@click.option(
"-m",
"--mod",
type=click.Choice(("python", "gmp", "flint")),
default="flint" if has_flint else "gmp" if has_gmp else "python",
+ envvar="MOD",
)
@click.option("-o", "--operations", type=click.INT, default=100000)
@click.option(
@@ -31,18 +38,24 @@ def main(profiler, mod, operations, directory):
a = make_mod(0x11111111111111111111111111111111, n)
b = make_mod(0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, n)
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular inverse...")
- with Profiler(profiler, directory, f"mod_256b_inverse_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_inverse_{operations}_{mod}", operations
+ ):
for _ in range(operations):
a.inverse()
click.echo(
f"Profiling {operations} {n.bit_length()}-bit modular square root..."
)
- with Profiler(profiler, directory, f"mod_256b_sqrt_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_sqrt_{operations}_{mod}", operations
+ ):
for _ in range(operations):
a.sqrt()
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular multiply...")
c = a
- with Profiler(profiler, directory, f"mod_256b_multiply_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_multiply_{operations}_{mod}", operations
+ ):
for _ in range(operations):
c = c * b
click.echo(
@@ -50,33 +63,46 @@ def main(profiler, mod, operations, directory):
)
c = a
with Profiler(
- profiler, directory, f"mod_256b_constmultiply_{operations}_{mod}"
+ profiler,
+ directory,
+ f"mod_256b_constmultiply_{operations}_{mod}",
+ operations,
):
for _ in range(operations):
c = c * 48006
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular square...")
c = a
- with Profiler(profiler, directory, f"mod_256b_square_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_square_{operations}_{mod}", operations
+ ):
for _ in range(operations):
- c = c ** 2
+ c = c**2
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular add...")
c = a
- with Profiler(profiler, directory, f"mod_256b_add_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_add_{operations}_{mod}", operations
+ ):
for _ in range(operations):
c = c + b
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular subtract...")
c = a
- with Profiler(profiler, directory, f"mod_256b_subtract_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_subtract_{operations}_{mod}", operations
+ ):
for _ in range(operations):
c = c - b
click.echo(
f"Profiling {operations} {n.bit_length()}-bit modular quadratic residue checks..."
)
- with Profiler(profiler, directory, f"mod_256b_isresidue_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_isresidue_{operations}_{mod}", operations
+ ):
for _ in range(operations):
a.is_residue()
click.echo(f"Profiling {operations} {n.bit_length()}-bit modular random...")
- with Profiler(profiler, directory, f"mod_256b_random_{operations}_{mod}"):
+ with Profiler(
+ profiler, directory, f"mod_256b_random_{operations}_{mod}", operations
+ ):
for _ in range(operations):
Mod.random(n)
diff --git a/test/ec/perf_mult.py b/test/ec/perf_mult.py
index 82d2976..402aa26 100755
--- a/test/ec/perf_mult.py
+++ b/test/ec/perf_mult.py
@@ -41,7 +41,7 @@ def main(profiler, mod, operations, directory):
f"Profiling {operations} {p256.curve.prime.bit_length()}-bit scalar multiplication executions..."
)
one_point = p256.generator
- with Profiler(profiler, directory, f"mult_ltr_rcb_p256_{operations}_{mod}"):
+ with Profiler(profiler, directory, f"mult_ltr_rcb_p256_{operations}_{mod}", operations):
for _ in range(operations):
mult.init(p256, one_point)
one_point = mult.multiply(
@@ -52,7 +52,7 @@ def main(profiler, mod, operations, directory):
)
with local(DefaultContext()):
one_point = p256.generator
- with Profiler(profiler, directory, f"mult_ltr_rcb_p256_wtrace_{operations}_{mod}"):
+ with Profiler(profiler, directory, f"mult_ltr_rcb_p256_wtrace_{operations}_{mod}", operations):
for _ in range(operations):
mult.init(p256, one_point)
one_point = mult.multiply(
diff --git a/test/sca/perf_combine.py b/test/sca/perf_combine.py
index bd5db59..8ac274c 100644
--- a/test/sca/perf_combine.py
+++ b/test/sca/perf_combine.py
@@ -16,7 +16,13 @@ from pyecsca.sca import (
@click.command()
-@click.option("-p", "--profiler", type=click.Choice(("py", "c", "raw")), default="py")
+@click.option(
+ "-p",
+ "--profiler",
+ type=click.Choice(("py", "c", "raw")),
+ default="py",
+ envvar="PROF",
+)
@click.option("-o", "--operations", type=click.INT, default=100)
@click.option(
"-d",
diff --git a/test/sca/perf_zvp.py b/test/sca/perf_zvp.py
index 7a04dd6..34090df 100644
--- a/test/sca/perf_zvp.py
+++ b/test/sca/perf_zvp.py
@@ -11,12 +11,19 @@ from test.utils import Profiler
@click.command()
-@click.option("-p", "--profiler", type=click.Choice(("py", "c", "raw")), default="py")
+@click.option(
+ "-p",
+ "--profiler",
+ type=click.Choice(("py", "c", "raw")),
+ default="py",
+ envvar="PROF",
+)
@click.option(
"-m",
"--mod",
type=click.Choice(("python", "gmp", "flint")),
default="flint" if has_flint else "gmp" if has_gmp else "python",
+ envvar="MOD",
)
@click.option("-o", "--operations", type=click.INT, default=1)
@click.option(
diff --git a/test/utils.py b/test/utils.py
index 5d1e80f..1276ad6 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -29,6 +29,7 @@ class Profiler:
prof_type: Union[Literal["py"], Literal["c"], Literal["raw"]],
output_directory: str,
benchmark_name: str,
+ operations: int = 0
):
self._prof: Union[PyProfiler, cProfiler, RawTimer] = {
"py": PyProfiler,
@@ -40,6 +41,7 @@ class Profiler:
self._state = "out"
self._output_directory = output_directory
self._benchmark_name = benchmark_name
+ self._operations = operations
def __enter__(self):
self._prof.__enter__()
@@ -90,7 +92,7 @@ class Profiler:
elif self._prof_type == "c":
self._prof.print_stats("cumtime") # type: ignore
elif self._prof_type == "raw":
- print(f"{self._prof.duration:.4} s") # type: ignore
+ print(f"{self._prof.duration:.4f}s {(self._operations/self._prof.duration) if self._operations else '-':.1f}op/s") # type: ignore
def get_time(self) -> float:
if self._state != "out":