diff options
| author | vojtechsu | 2023-11-23 16:24:51 +0100 |
|---|---|---|
| committer | J08nY | 2023-12-05 14:06:07 +0100 |
| commit | 08df28ff26b659c8fbc1de11b1201a4ea1711454 (patch) | |
| tree | 3e937e697e306fbde5f583d427b4820eaa755338 /pyecsca/ec | |
| parent | cab6cf16e55910cb95fe79aa12c826997bb82da3 (diff) | |
| download | pyecsca-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.py | 15 |
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: |
