def add_clause(self, clause, no_return=True): assert (max(map(abs, clause)) < self.__var) if self.store_clauses: self.__dbg_clauses.append(clause) self.num_clauses += 1 cl = clause.copy() if self.clock_act is not None: cl.append(-self.clock_act) Cadical.add_clause(self, cl, no_return)
# get input output m = solver.get_model() inp = {i: m[net_map[i] - 1] > 0 for i in protected_inputs} s = (len(protected_inputs) - n_eq) / len(protected_inputs) print(f'found input w/ sensitivity {s}') # check input against key if all(inp[f'protected_in_{i}_'] == k for i, k in enumerate(key)): sensitivity = (len(protected_inputs) - n_eq) / len(protected_inputs) print(f'found correct key at sensitivity {sensitivity}') with open( sys.argv[1].replace('locked/', 'break/').replace('.v', '.key'), 'w') as f: f.write(f'{len(key)}b' + ''.join('1' if inp[f'protected_in_{i}_'] else '0' for i, k in enumerate(key))[::-1]) exit() else: solver.add_clause([ net_map[i] if not inp[i] else -net_map[i] for i in protected_inputs ]) else: s = (len(protected_inputs) - n_eq) / len(protected_inputs) print(f'no more inputs w/ sensitivity {s}') n_eq += 1 print('0 sensitivity reached, no key found')
def add_clause(self, clause, no_return=True): assert (max(map(abs, clause)) < self.__var) if self.store_clauses: self.__dbg_clauses.append(clause) self.num_clauses += 1 Cadical.add_clause(self, clause, no_return)