def test_export(self, run_eagerly, export_dtype, export_expansion): x = np.array([[12345, 34342]]) context = tf_execution_context(run_eagerly) with context.scope(): ek, dk = paillier.gen_keypair() assert isinstance(ek, paillier.EncryptionKey) assert isinstance(dk, paillier.DecryptionKey) n_exported = ek.export(export_dtype) assert isinstance(n_exported, tf.Tensor) assert n_exported.dtype == export_dtype assert n_exported.shape == (1, 1), n_exported.shape p_exported, q_exported = dk.export(export_dtype) assert isinstance(p_exported, tf.Tensor) assert p_exported.dtype == export_dtype assert p_exported.shape == (1, 1), p_exported.shape assert isinstance(q_exported, tf.Tensor) assert q_exported.dtype == export_dtype assert q_exported.shape == (1, 1), q_exported.shape r = paillier.gen_randomness(ek, shape=x.shape) assert isinstance(r, paillier.Randomness) r_exported = r.export(export_dtype) assert isinstance(r_exported, tf.Tensor) assert r_exported.dtype == export_dtype assert r_exported.shape == x.shape + export_expansion c = paillier.encrypt(ek, x, r) assert isinstance(c, paillier.Ciphertext) c_exported = c.export(export_dtype) assert isinstance(c_exported, tf.Tensor) assert c_exported.dtype == export_dtype assert c_exported.shape == x.shape + export_expansion
def test_add(self, run_eagerly, dtype, x0, x1): expected = x0 + x1 context = tf_execution_context(run_eagerly) with context.scope(): ek, dk = paillier.gen_keypair() r0 = paillier.gen_randomness(ek, shape=x0.shape) c0 = paillier.encrypt(ek, x0, r0) r1 = paillier.gen_randomness(ek, shape=x1.shape) c1 = paillier.encrypt(ek, x1, r1) c = paillier.add(ek, c0, c1) y = paillier.decrypt(dk, c, dtype=dtype) np.testing.assert_equal( context.evaluate(y).astype(np.int32), expected.astype(np.int32))
def test_encrypt_decrypt(self, run_eagerly, x, dtype): context = tf_execution_context(run_eagerly) with context.scope(): ek, dk = paillier.gen_keypair() r = paillier.gen_randomness(ek, shape=x.shape) c = paillier.encrypt(ek, x, r) y = paillier.decrypt(dk, c, dtype=dtype) assert isinstance(y, tf.Tensor) assert y.dtype == dtype np.testing.assert_equal(context.evaluate(y).astype(x.dtype), x)
def test_correctness(self, run_eagerly): p = 100000015333 q = 100000015021 n = p * q nn = n * n g = 1 + n x = 123456789 r = 5083216764521909821749 c = pow(g, x, nn) * pow(r, n, nn) % nn context = tf_execution_context(run_eagerly) with context.scope(): ek = paillier.EncryptionKey(tf.constant([[str(n)]])) plaintext = np.array([[x]]).astype(str) randomness = paillier.Randomness(tf.constant([[str(r)]])) ciphertext = paillier.encrypt(ek, plaintext, randomness) expected = np.array([[c]]).astype(str) actual = ciphertext.export(tf.string) np.testing.assert_equal(context.evaluate(actual).astype(str), expected)
def _encrypt(encryption_key_raw, plaintext): ek = paillier.EncryptionKey(encryption_key_raw) ciphertext = paillier.encrypt(ek, plaintext) return ciphertext.export(dtype=transit_dtype)