aboutsummaryrefslogtreecommitdiffhomepage
path: root/pyecsca/ec
diff options
context:
space:
mode:
authorvojtechsu2023-11-23 16:24:51 +0100
committerJ08nY2023-12-05 14:06:07 +0100
commit08df28ff26b659c8fbc1de11b1201a4ea1711454 (patch)
tree3e937e697e306fbde5f583d427b4820eaa755338 /pyecsca/ec
parentcab6cf16e55910cb95fe79aa12c826997bb82da3 (diff)
downloadpyecsca-08df28ff26b659c8fbc1de11b1201a4ea1711454.tar.gz
pyecsca-08df28ff26b659c8fbc1de11b1201a4ea1711454.tar.zst
pyecsca-08df28ff26b659c8fbc1de11b1201a4ea1711454.zip
Add exception for modified coordinates
Diffstat (limited to 'pyecsca/ec')
-rw-r--r--pyecsca/ec/formula_gen/switch_sign.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/pyecsca/ec/formula_gen/switch_sign.py b/pyecsca/ec/formula_gen/switch_sign.py
index fe6f39a..76c1077 100644
--- a/pyecsca/ec/formula_gen/switch_sign.py
+++ b/pyecsca/ec/formula_gen/switch_sign.py
@@ -9,7 +9,7 @@ from itertools import chain, combinations
def best_switch(formula, metric):
best_formula = formula
best_measure = metric(formula)
- for switched_formula in generate_switched_formulas(formula):
+ for _,switched_formula in generate_switched_formulas(formula):
new_measure = metric(switched_formula)
if new_measure > best_measure:
best_formula = switched_formula
@@ -17,15 +17,15 @@ def best_switch(formula, metric):
return best_formula
-def generate_switched_formulas(formula):
+def generate_switched_formulas(formula, rename = True):
Gr = EFDFormulaGraph()
- Gr.construct_graph(formula)
- subs = filter(lambda x: not x in Gr.roots and x.is_sub, Gr.nodes)
+ Gr.construct_graph(formula, rename)
+ subs = filter(lambda x: x not in Gr.roots and x.is_sub, Gr.nodes)
for node_combination in list(powerset(subs)):
try:
new_f = switch_sign(Gr, node_combination).to_EFDFormula()
# print("node_comb:",node_combination)
- yield new_f
+ yield node_combination,new_f
except BadSignSwitch:
continue
@@ -59,6 +59,11 @@ def switch_sign(Gr, node_combination):
output_signs = {out[0]: sign for out, sign in output_signs.items()}
X, Y, Z = (output_signs[var] for var in ["X", "Y", "Z"])
correct_output = X / (Z**2) == 1 and Y / (Z**3) == 1
+ elif Gr._formula.coordinate_model.name.startswith("modified"):
+ output_signs = {out[0]: sign for out, sign in output_signs.items()}
+ X, Y, Z, T = (output_signs[var] for var in ["X", "Y", "Z", "T"])
+ correct_output = X / (Z**2) == 1 and Y / (Z**3) == 1
+ correct_output&= (T==1)
else:
correct_output = len(set(output_signs.values())) == 1
if not correct_output: