blob: 22f6f79539f1f2f40dd7ac217e96a14953c43313 (
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
27
28
29
30
31
32
33
34
|
"""
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 typing import List
from sympy import symbols
from ...ec.context import DefaultContext, local
from ...ec.formula import Formula
from ...ec.mod import SymbolicMod
from ...ec.point import Point
from ...misc.cfg import TemporaryConfig
def unroll_formula(formula: Formula, prime: int) -> List[SymbolicMod]:
"""
Unroll a given formula symbolically to obtain symbolic expressions for its intermediate values.
:param formula: Formula to unroll.
:param prime: Field to unroll over.
:return: List of symbolic intermediate values.
"""
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]
|