def test_fv_negate_cipher(val): ctx = Context(EncryptionParams(1024, CoeffModulus().create(1024, [30, 30]), 1024)) keys = KeyGenerator(ctx).keygen() encoder = IntegerEncoder(ctx) evaluator = Evaluator(ctx) encryptor = Encryptor(ctx, keys[1]) # keys[1] = public_key decryptor = Decryptor(ctx, keys[0]) # keys[0] = secret_key op = encryptor.encrypt(encoder.encode(val)) assert -val == encoder.decode(decryptor.decrypt(evaluator.negate(op)))
def test_fv_add_plain_plain(int1, int2): ctx = Context(EncryptionParams(64, CoeffModulus().create(64, [30, 30]), 64)) encoder = IntegerEncoder(ctx) evaluator = Evaluator(ctx) op1 = encoder.encode(int1) op2 = encoder.encode(int2) assert (int1 + int2 == encoder.decode(evaluator._add_plain_plain(op1, op2)) == encoder.decode(evaluator.add(op1, op2)) == encoder.decode( evaluator.add(op2, op1)))
def test_fv_mul_cipher_plain(int1, int2): ctx = Context(EncryptionParams(64, CoeffModulus().create(64, [30, 30]), 64)) keys = KeyGenerator(ctx).keygen() encoder = IntegerEncoder(ctx) encryptor = Encryptor(ctx, keys[1]) # keys[1] = public_key decryptor = Decryptor(ctx, keys[0]) # keys[0] = secret_key evaluator = Evaluator(ctx) op1 = encryptor.encrypt(encoder.encode(int1)) op2 = encoder.encode(int2) assert (int1 * int2 == encoder.decode( decryptor.decrypt(evaluator._mul_cipher_plain(op1, op2))) == encoder.decode(decryptor.decrypt(evaluator.mul(op1, op2))) == encoder.decode(decryptor.decrypt(evaluator.mul(op2, op1))))
def test_fv_sub_cipher_cipher(int1, int2): ctx = Context(EncryptionParams(1024, CoeffModulus().create(1024, [30, 30]), 1024)) keys = KeyGenerator(ctx).keygen() encoder = IntegerEncoder(ctx) encryptor = Encryptor(ctx, keys[1]) # keys[1] = public_key decryptor = Decryptor(ctx, keys[0]) # keys[0] = secret_key evaluator = Evaluator(ctx) op1 = encryptor.encrypt(encoder.encode(int1)) op2 = encryptor.encrypt(encoder.encode(int2)) assert ( int1 - int2 == encoder.decode(decryptor.decrypt(evaluator._sub_cipher_cipher(op1, op2))) == encoder.decode(decryptor.decrypt(evaluator.sub(op1, op2))) == -encoder.decode(decryptor.decrypt(evaluator.sub(op2, op1))) )
def test_fv_relin(val1, val2): ctx = Context(EncryptionParams(128, CoeffModulus().create(128, [40, 40]), 64)) keygenerator = KeyGenerator(ctx) keys = keygenerator.keygen() relin_key = keygenerator.get_relin_keys() encoder = IntegerEncoder(ctx) encryptor = Encryptor(ctx, keys[1]) # keys[1] = public_key decryptor = Decryptor(ctx, keys[0]) # keys[0] = secret_key evaluator = Evaluator(ctx) op1 = encryptor.encrypt(encoder.encode(val1)) op2 = encryptor.encrypt(encoder.encode(val2)) temp_prod = evaluator.mul(op1, op2) relin_prod = evaluator.relin(temp_prod, relin_key) assert len(temp_prod.data) - 1 == len(relin_prod.data) assert val1 * val2 == encoder.decode(decryptor.decrypt(relin_prod))
def test_fv_relin_exceptions(val1, val2): ctx = Context(EncryptionParams(128, CoeffModulus().create(128, [40, 40]), 64)) keygenerator = KeyGenerator(ctx) keys = keygenerator.keygen() relin_key = keygenerator.get_relin_keys() encoder = IntegerEncoder(ctx) encryptor = Encryptor(ctx, keys[1]) # keys[1] = public_key evaluator = Evaluator(ctx) op1 = encryptor.encrypt(encoder.encode(val1)) op2 = encryptor.encrypt(encoder.encode(val2)) temp_prod = evaluator.mul(op1, op2) with pytest.raises(Warning): evaluator.relin(op1, relin_key) # Ciphertext size 2 with pytest.raises(Exception): evaluator.relin(evaluator.mul(temp_prod, val1), relin_key) # Ciphertext size 4