use sealy::{
CKKSEncoder, CKKSEncryptionParametersBuilder, CKKSEvaluator, CoefficientModulusFactory,
Context, Decryptor, DegreeType, EncryptionParameters, Encryptor, Error, Evaluator,
KeyGenerator, SecurityLevel,
};
fn main() -> Result<(), Error> {
let degree = DegreeType::D8192;
let security_level = SecurityLevel::TC128;
let bit_sizes = [60, 40, 40, 60];
let expand_mod_chain = false;
let modulus_chain = CoefficientModulusFactory::build(degree, bit_sizes.as_slice())?;
let encryption_parameters: EncryptionParameters = CKKSEncryptionParametersBuilder::new()
.set_poly_modulus_degree(degree)
.set_coefficient_modulus(modulus_chain.clone())
.build()?;
let ctx = Context::new(&encryption_parameters, expand_mod_chain, security_level)?;
let key_gen = KeyGenerator::new(&ctx)?;
let encoder = CKKSEncoder::new(&ctx, 2.0f64.powi(40))?;
let public_key = key_gen.create_public_key();
let private_key = key_gen.secret_key();
let encryptor = Encryptor::with_public_and_secret_key(&ctx, &public_key, &private_key)?;
let decryptor = Decryptor::new(&ctx, &private_key)?;
let evaluator = CKKSEvaluator::new(&ctx)?;
let x = 5.2;
let y = 3.3;
let x_encoded = encoder.encode_f64(&[x])?;
let y_encoded = encoder.encode_f64(&[y])?;
let x_enc = encryptor.encrypt(&x_encoded)?;
let y_enc = encryptor.encrypt(&y_encoded)?;
let sum = evaluator.add(&x_enc, &y_enc)?;
let sum_dec = decryptor.decrypt(&sum)?;
let sum_dec = encoder.decode_f64(&sum_dec)?;
let truth = x + y;
let result = sum_dec.first().unwrap();
assert!((result - truth).abs() < 1e-6);
println!("truth: {:?}", truth);
println!("sum: {:?}", result);
Ok(())
}