def test_modified_paillier_can_decrypt_encrypted_min_val(self, runtime): paillier = ModifiedPaillier(runtime, Random(554424)) n = runtime.players[runtime.id].pubkey['n'] val = -(n - 1) / 2 encrypted_val = paillier.encrypt(val) decrypted_val = paillier.decrypt(encrypted_val) self.assertEquals(val, decrypted_val)
def test_modified_paillier_with_different_randomness_are_not_equal(self, runtime): random = Random(3423434) n = runtime.players[runtime.id].pubkey['n'] paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) val = 47 random_elm = random.randint(1, long(n)) encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm) encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm) self.assertEquals(encrypted_val_1, encrypted_val_2)
def test_modified_paillier_with_different_randomness_are_not_equal( self, runtime): random = Random(3423434) n = runtime.players[runtime.id].pubkey['n'] paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) val = 47 random_elm = random.randint(1, long(n)) encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm) encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm) self.assertEquals(encrypted_val_1, encrypted_val_2)
def test_modified_paillier_with_same_randomness_are_equal(self, runtime): random = Random(234333) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) n = runtime.players[runtime.id].pubkey['n'] val = 46 random_elm_1 = random.randint(1, long(n)) random_elm_2 = (random_elm_1 + 1) % n encrypted_val_1 = paillier.encrypt(val, random_elm=random_elm_1) encrypted_val_2 = paillier.encrypt(val, random_elm=random_elm_1) self.assertEquals(encrypted_val_1, encrypted_val_2)
def test_modified_paillier_can_encrypt_to_other(self, runtime): paillier = ModifiedPaillier(runtime, Random(57503)) msg = [] for p in runtime.players: msg.append(paillier.encrypt(runtime.id, player_id=p)) received = _send(runtime, msg) def verify(enc): plain = [paillier.decrypt(e) for e in enc] self.assertEquals(range(1, self.num_players + 1), plain) runtime.schedule_callback(received, verify) return received
def test_encrypted_random_shares_decrypt_correctly(self, runtime): random = Random(3423993) modulus = 17 Zp = GF(modulus) paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) shares = self._partial_random_shares(random, runtime, Zp, 7, paillier=paillier) expected_result = [9, 16, 7, 12, 3, 5, 6] for inx, share in enumerate(shares): def decrypt(share, expected_result): decrypted_share = paillier.decrypt( share.enc_shares[runtime.id - 1]) decrypted_shares = _convolute(runtime, decrypted_share) def test_sum(vals, expected_result): v = Zp(sum(vals)) self.assertEquals(expected_result, v) runtime.schedule_callback(decrypted_shares, test_sum, expected_result) runtime.schedule_callback(share, decrypt, expected_result[inx]) return shares
def test_encrypted_random_real_shares_open_correctly(self, runtime): random = Random(3423993) modulus = 17 Zp = GF(modulus) bits_in_p = 5 u_bound = 2**(4 * bits_in_p) alpha = 15 paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) share_random = Random(random.getrandbits(128)) gen = TestShareGenerator(Zp, runtime, share_random, paillier, u_bound, alpha) shares = gen.generate_random_shares(7) expected_result = [9, 16, 7, 12, 3, 5, 6] results = [] for inx, share in enumerate(shares): def check(v, expected_result): self.assertEquals(expected_result, v) r = runtime.open(share) results.append(r) runtime.schedule_callback(r, check, expected_result[inx]) return gather_shares(results)
def test_share_protocol_multi(self, runtime): p, k = 17, 5 Zp = GF(p) random = Random(345453 + runtime.id) elms = [Zp(runtime.id), Zp(runtime.id * 3)] paillier_random = Random(random.getrandbits(128)) zk_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, paillier_random) partial_shares = generate_partial_share_contents( elms, runtime, paillier, k, zk_random) def decrypt(share_contents): self.assertEquals(2, len(share_contents)) decrypted_shares = [ paillier.decrypt(share_contents[i].enc_shares[runtime.id - 1]) for i in range(2) ] decrypted_shares = [ _convolute(runtime, decrypted_shares[i]) for i in range(2) ] def test_sum(vals, should_be): self.assertEquals([Zp(e) for e in should_be], vals) runtime.schedule_callback(decrypted_shares[0], test_sum, [1, 2, 3]) runtime.schedule_callback(decrypted_shares[1], test_sum, [3, 6, 9]) runtime.schedule_callback(partial_shares, decrypt) return partial_shares
def test_add_macs_produces_correct_sharing(self, runtime): # TODO: Here we use the open method of the BeDOZa runtime in # order to verify the macs of the generated full share. In # order to be more unit testish, this test should use its own # way of verifying these. p = 17 Zp = GF(p) secret = 6 random = Random(283883) paillier_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, random) add_macs_random = Random(random.getrandbits(128)) shares_random = Random(random.getrandbits(128)) shares = [] shares.append( partial_share(shares_random, runtime, Zp, secret, paillier=paillier)) shares.append( partial_share(shares_random, runtime, Zp, secret + 1, paillier=paillier)) shares.append( partial_share(shares_random, runtime, Zp, secret + 2, paillier=paillier)) shares.append( partial_share(shares_random, runtime, Zp, secret + 3, paillier=paillier)) bits_in_p = 5 u_bound = 2**(4 * bits_in_p) alpha = 15 zs = add_macs(runtime, Zp, u_bound, alpha, add_macs_random, paillier, shares) def verify(open_shares): inx = secret for open_share in open_shares: self.assertEquals(inx, open_share.value) inx += 1 opened_shares = [] for s in zs: opened_shares.append(runtime.open(s)) d = gather_shares(opened_shares) d.addCallback(verify) return d
def _partial_random_shares(self, random, runtime, Zp, n, paillier=None): if not paillier: paillier_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, paillier_random) share_random = Random(random.getrandbits(128)) gen = TestPartialShareGenerator(Zp, runtime, share_random, paillier) return gen.generate_random_shares(n)
def partial_share(random, runtime, Zp, val, paillier=None): if not paillier: paillier_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, paillier_random) share_random = Random(random.getrandbits(128)) gen = PartialShareGenerator(Zp, runtime, share_random, paillier) return gen.generate_share(Zp(val))
def test_encrypted_real_share_open_correctly(self, runtime): random = Random(3423993) modulus = 17 Zp = GF(modulus) bits_in_p = 5 u_bound = 2**(4 * bits_in_p) alpha = 15 paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) share_random = Random(random.getrandbits(128)) gen = ShareGenerator(Zp, runtime, share_random, paillier, u_bound, alpha) share = gen.generate_share(7) def check(v): self.assertEquals(7, v) r = runtime.open(share) runtime.schedule_callback(r, check) return r
def test_encrypted_shares_decrypt_correctly(self, runtime): random = Random(3423993) modulus = 17 secret = 7 paillier = ModifiedPaillier(runtime, Random(random.getrandbits(128))) share = partial_share(Random(random.getrandbits(128)), runtime, GF(modulus), secret, paillier=paillier) def decrypt(share): decrypted_share = paillier.decrypt(share.enc_shares[runtime.id - 1]) decrypted_shares = _convolute(runtime, decrypted_share) def test_sum(vals): self.assertEquals(secret, sum(vals) % modulus) runtime.schedule_callback(decrypted_shares, test_sum) runtime.schedule_callback(share, decrypt) return share
def test_share_protocol_single(self, runtime): p, k = 17, 5 Zp = GF(p) random = Random(3455433 + runtime.id) elms = [Zp(runtime.id)] paillier_random = Random(random.getrandbits(128)) zk_random = Random(random.getrandbits(128)) paillier = ModifiedPaillier(runtime, paillier_random) partial_shares = generate_partial_share_contents( elms, runtime, paillier, k, zk_random) def decrypt(share_contents): self.assertEquals(1, len(share_contents)) decrypted_share = paillier.decrypt( share_contents[0].enc_shares[runtime.id - 1]) decrypted_shares = _convolute(runtime, decrypted_share) def test_sum(vals): self.assertEquals([Zp(e) for e in [1, 2, 3]], vals) runtime.schedule_callback(decrypted_shares, test_sum) runtime.schedule_callback(partial_shares, decrypt) return partial_shares
def test_encrypting_too_large_number_raises_exception(self, runtime): paillier = ModifiedPaillier(runtime, Random(825604)) n = runtime.players[runtime.id].pubkey['n'] val = 1 + (n - 1) / 2 self.assertRaises(AssertionError, paillier.encrypt, val)
def test_modified_paillier_can_decrypt_encrypted_zero(self, runtime): paillier = ModifiedPaillier(runtime, Random(338301)) val = 0 encrypted_val = paillier.encrypt(val) decrypted_val = paillier.decrypt(encrypted_val) self.assertEquals(val, decrypted_val)
def test_modified_paillier_can_decrypt_encrypted_one(self, runtime): paillier = ModifiedPaillier(runtime, Random(234838)) val = 1 encrypted_val = paillier.encrypt(val) decrypted_val = paillier.decrypt(encrypted_val) self.assertEquals(val, decrypted_val)
def test_modified_paillier_can_decrypt_encrypted_positive(self, runtime): paillier = ModifiedPaillier(runtime, Random(777737)) val = 73423 encrypted_val = paillier.encrypt(val) decrypted_val = paillier.decrypt(encrypted_val) self.assertEquals(val, decrypted_val)
def test_encrypting_too_small_number_raises_exception(self, runtime): paillier = ModifiedPaillier(runtime, Random(554424)) n = runtime.players[runtime.id].pubkey['n'] val = -(n - 1) / 2 - 1 self.assertRaises(AssertionError, paillier.encrypt, val)