def NOT(self, args, **kwargs): """ Performs a logical NOT on one bit. IN: A """ left_name = args left = self.program.get_variable_data(left_name) result = nufhe.empty_ciphertext(self.thr, self.program.key.params, left.shape) nufhe.gate_not(self.thr, self.program.key, result, left, perf_params=self.pp) self.program.set_variable_data('STATE', result)
def ORYN(self, args, **kwargs): """ Performs a logical OrYN on two bits (A OR NOT(B)) IN: A, B """ left_name, right_name = args left = self.program.get_variable_data(left_name) right = self.program.get_variable_data(right_name) result = nufhe.empty_ciphertext(self.thr, self.program.key.params, left.shape) nufhe.gate_oryn(self.thr, self.program.key, result, left, right, perf_params=self.pp) self.program.set_variable_data('STATE', result)
def ANDNY(self, args, **kwargs): """ Performs a logical AndNY on two bits (NOT(A) AND B) IN: A, B """ left_name, right_name = args left = self.program.get_variable_data(left_name) right = self.program.get_variable_data(right_name) result = nufhe.empty_ciphertext(self.thr, self.program.key.params, left.shape) nufhe.gate_andny(self.thr, self.program.key, result, left, right, perf_params=self.pp) self.program.set_variable_data('STATE', result)
def XOR(self, args, **kwargs): """ Performs a logical XOR on two bits. IN: A, B """ left_name, right_name = args left = self.program.get_variable_data(left_name) right = self.program.get_variable_data(right_name) result = nufhe.empty_ciphertext(self.thr, self.program.key.params, left.shape) nufhe.gate_xor(self.thr, self.program.key, result, left, right, perf_params=self.pp) self.program.set_variable_data('STATE', result) self._merkleize_computation( pickle.dumps((left.a.get(), left.b.get())), pickle.dumps((right.a.get(), right.b.get())), pickle.dumps((result.a.get(), result.b.get())))
import random import numpy import nufhe from reikna.cluda import any_api size = 32 bits1 = [random.choice([False, True]) for i in range(size)] bits2 = [random.choice([False, True]) for i in range(size)] reference = [not (b1 and b2) for b1, b2 in zip(bits1, bits2)] thr = any_api().Thread.create(interactive=True) rng = nufhe.DeterministicRNG() secret_key, cloud_key = nufhe.make_key_pair(thr, rng) ciphertext1 = nufhe.encrypt(thr, rng, secret_key, bits1) ciphertext2 = nufhe.encrypt(thr, rng, secret_key, bits2) result = nufhe.empty_ciphertext(thr, cloud_key.params, ciphertext1.shape) nufhe.gate_nand(thr, cloud_key, result, ciphertext1, ciphertext2) result_bits = nufhe.decrypt(thr, secret_key, result) assert all(result_bits == reference)
import numpy import nufhe from reikna.cluda import any_api thr = any_api().Thread.create(interactive=True) rng = numpy.random.RandomState() private_key, public_key = nufhe.make_key_pair(thr, rng) size = 32 bits1 = rng.randint(0, 2, size=size).astype(numpy.bool) bits2 = rng.randint(0, 2, size=size).astype(numpy.bool) ciphertext1 = nufhe.encrypt(thr, rng, private_key, bits1) ciphertext2 = nufhe.encrypt(thr, rng, private_key, bits2) reference = ~(bits1 * bits2) result = nufhe.empty_ciphertext(thr, public_key.params, ciphertext1.shape) nufhe.gate_nand(thr, public_key, result, ciphertext1, ciphertext2) result_bits = nufhe.decrypt(thr, private_key, result) assert (result_bits == reference).all()