Beispiel #1
0
class ArithmeticEvaluationStrategy:
    def __init__(self, client):
        self.client = client
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.is_done = False


    def reset(self):
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.is_done = False

    def evaluate_circuit(self, circuit):
        for gate_id in range(self.cur_gid, len(circuit)):
            gate = circuit[gate_id]
            if gate.type == 'input':
                self.cur_gid = self.cur_gid + 1
            elif gate.type == 'add':
                val_in_l = circuit[gate.wires_in[0]].output_value
                val_in_r = circuit[gate.wires_in[1]].output_value
                gate.output_value = val_in_l + val_in_r
                self.cur_gid = self.cur_gid + 1
            elif gate.type == 'scalar_mult':
                val_in = circuit[gate.wires_in[0]].output_value
                scalar = gate.scalar
                gate.output_value = val_in * scalar
                self.cur_gid = self.cur_gid + 1
            elif gate.type == 'mult':
                val_in_l = circuit[gate.wires_in[0]].output_value
                val_in_r = circuit[gate.wires_in[1]].output_value
                alpha = val_in_l + gate.a
                beta = val_in_r + gate.b
                self.open.request([alpha, beta], "alpha_beta")
                break
            elif gate.type == 'output':
                prev_gate = circuit[self.cur_gid - 1]
                gate.output_value = prev_gate.output_value
                self.cur_gid = self.cur_gid + 1
                result = gate.output_value
                self.open.request(result, "output")
                break

    def handle_protocol_open_answer(self, answer, type, circuit):
        if type == "output":
            self.output.append(answer)
            if self.received_all_outputs(circuit):
                config.result[:] = self.output
                self.is_done = True
            else:
                self.cur_gid = self.cur_gid + 1
                self.evaluate_circuit(circuit)
        elif type == "alpha_beta":
            gate = circuit[self.cur_gid]
            alpha_open = answer[0]
            beta_open = answer[1]
            x = (alpha_open*beta_open - alpha_open*gate.b - beta_open*gate.a + gate.c)
            gate.output_value = x
            self.cur_gid = self.cur_gid + 1
            self.evaluate_circuit(circuit)

    def received_all_outputs(self, circuit):
        for gate in circuit:
            if gate.type == "output":
                if gate.output_value == None:
                    return False
        return True
Beispiel #2
0
class BooleanEvaluationStrategy:
    def __init__(self, client):
        self.client = client
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.is_done = False

    def reset(self):
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.is_done = False

    def evaluate_circuit(self, circuit):
        for gate_id in range(self.cur_gid, len(circuit)):
            gate = circuit[gate_id]
            if gate.type == 'input':
                self.cur_gid = self.cur_gid + 1
            elif gate.type == 'inv':
                val_in = circuit[gate.wires_in[0]].output_value
                gate.output_value = 1 - val_in
                self.cur_gid = self.cur_gid + 1
            elif gate.type == 'and' or gate.type == 'xor':
                val_in_l = circuit[gate.wires_in[0]].output_value
                val_in_r = circuit[gate.wires_in[1]].output_value
                alpha = val_in_l + gate.a
                beta = val_in_r + gate.b
                self.open.request([alpha, beta], gate.type)
                break
            elif gate.type == 'output':
                prev_gate = circuit[self.cur_gid - 1]
                gate.output_value = prev_gate.output_value
                self.cur_gid = self.cur_gid + 1
                result = gate.output_value
                # Client().get_response(self.output, self.circuit, None)
                self.open.request(result, "output")
                break

    def handle_protocol_open_answer(self, answer, type, circuit):
        if type == "output":
            self.output.append(answer)
            if self.received_all_outputs(circuit):
                self.client.get_response(self.output, circuit, None)
                self.is_done = True
                config.result[:] = self.output
                return True
            else:
                self.cur_gid = self.cur_gid + 1
                self.evaluate_circuit(circuit)
        elif type == "and":
            gate = circuit[self.cur_gid]
            alpha_open = answer[0]
            beta_open = answer[1]
            x = (alpha_open * beta_open - alpha_open * gate.b - beta_open * gate.a + gate.c)
            gate.output_value = x
            self.cur_gid = self.cur_gid + 1
            self.evaluate_circuit(circuit)
        elif type == "xor":
            gate = circuit[self.cur_gid]
            alpha_open = answer[0]
            beta_open = answer[1]
            x = (alpha_open * beta_open - alpha_open * gate.b - beta_open * gate.a + gate.c)
            val_in_l = circuit[gate.wires_in[0]].output_value
            val_in_r = circuit[gate.wires_in[1]].output_value
            result = (val_in_l + val_in_r) - 2 * (x)
            gate.output_value = result
            self.cur_gid = self.cur_gid + 1
            self.evaluate_circuit(circuit)
        return False

    def received_all_outputs(self, circuit):
        for gate in circuit:
            if gate.type == "output":
                if gate.output_value == None:
                    return False
        return True
Beispiel #3
0
class BooleanLayerEvaluationStrategy1:
    def __init__(self, client):
        self.client = client
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.cur_layer = 1  # layer 0 is input and they are already taken care of
        self.cur_layer_gates = []
        self.is_done = False

    def reset(self):
        self.cur_gid = 0
        self.output = []
        self.open = Open()
        self.cur_layer = 1
        self.is_done = False
        self.cur_layer_gates = []

    def evaluate_circuit(self, circuit):
        layer_shares = []
        found_gate_in_layer = True
        while found_gate_in_layer:
            found_gate_in_layer = False
            for gate in circuit:
                if gate.layer == self.cur_layer:
                    if gate.type == 'input':
                        found_gate_in_layer = True
                    elif gate.type == 'inv':
                        val_in = circuit[gate.wires_in[0]].output_value
                        gate.output_value = 1 - val_in
                        found_gate_in_layer = True
                    elif gate.type == 'and' or gate.type == 'xor':
                        val_in_l = circuit[gate.wires_in[0]].output_value
                        val_in_r = circuit[gate.wires_in[1]].output_value
                        alpha = val_in_l + gate.a
                        beta = val_in_r + gate.b
                        layer_shares.append([gate.id, gate.type, alpha, beta])
                        self.cur_layer_gates.append(gate)
                        found_gate_in_layer = True
                    elif gate.type == 'output':
                        prev_gate = circuit[gate.wires_in[0]]
                        gate.output_value = prev_gate.output_value
                        layer_shares.append([gate.id, gate.type, gate.output_value, 0])
                        self.cur_layer_gates.append(gate)
                        found_gate_in_layer = True
                    elif gate.type == "or":
                        val_in_l = circuit[gate.wires_in[0]].output_value
                        val_in_r = circuit[gate.wires_in[1]].output_value
                        sum = val_in_l + val_in_r
                        gate.output_value = sum
                        found_gate_in_layer = True
            if layer_shares != []:
                self.open.request(layer_shares, "layer")
                break
            self.cur_layer = self.cur_layer + 1
            if found_gate_in_layer is False:
                self.is_done = True
                print("done:", self.output)
                config.result[:] = self.output

    def handle_protocol_open_answer(self, answer, type, circuit):
        for gate_answer in answer:
            gid = int(gate_answer[0])
            gate = circuit[gid]
            if gate.type == 'output':
                res = gate_answer[2]
                self.output.append(res)
                gate.output_value = gate_answer[2]
            elif gate.type == 'and':
                alpha_open = gate_answer[2]
                beta_open = gate_answer[3]
                x = (alpha_open * beta_open - alpha_open * gate.b - beta_open * gate.a + gate.c)
                gate.output_value = x
            elif gate.type == "xor":
                alpha_open = gate_answer[2]
                beta_open = gate_answer[3]
                x = (alpha_open * beta_open - alpha_open * gate.b - beta_open * gate.a + gate.c)
                val_in_l = circuit[gate.wires_in[0]].output_value
                val_in_r = circuit[gate.wires_in[1]].output_value
                result = (val_in_l + val_in_r) - 2 * (x)
                gate.output_value = result
        if self.received_all_opens_in_layer(circuit):
            self.cur_layer = self.cur_layer + 1
            self.cur_layer_gates = []
            self.evaluate_circuit(circuit)

    def received_all_opens_in_layer(self, circuit):
        for g in self.cur_layer_gates:
            gate = circuit[g.id]
            if gate.layer == self.cur_layer:
                if gate.output_value == None:
                    return False
        return True