aboutsummaryrefslogtreecommitdiff
path: root/pyecsca/sca/re/zvp.py
blob: 46d4337b5951d854ddad85af9c6e8ed78c6d4afc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"""
Provides functionality inspired by the Zero-value point attack

  Zero-Value Point Attacks on Elliptic Curve Cryptosystem, Toru Akishita & Tsuyoshi Takagi , ISC '03
  `<https://doi.org/10.1007/10958513_17>`_
"""

from sympy import symbols, FF, poly

from pyecsca.ec.context import DefaultContext, local
from pyecsca.ec.formula import Formula
from pyecsca.ec.mod import SymbolicMod
from pyecsca.ec.point import Point
from pyecsca.misc.cfg import TemporaryConfig


def unroll_formula(formula: Formula, prime: int):
    inputs = [Point(formula.coordinate_model,
                    **{var: SymbolicMod(symbols(var + str(i)), prime) for var in formula.coordinate_model.variables})
              for i in
              range(1, 1 + formula.num_inputs)]
    params = {var: SymbolicMod(symbols(var), prime) for var in formula.coordinate_model.curve_model.parameter_names}
    with local(DefaultContext()) as ctx, TemporaryConfig() as cfg:
        cfg.ec.mod_implementation = "symbolic"
        formula(prime, *inputs, **params)
    return [op_result.value for op_result in ctx.actions.get_by_index([0])[0].op_results]