| 378 | |
| 379 | #[test] |
| 380 | fn rerandomize_encryption() { |
| 381 | fn check(chunk_bit_size: u8) { |
| 382 | let mut rng = StdRng::seed_from_u64(0u64); |
| 383 | let gens = EncryptionGens::<Bls12_381>::new_using_rng(&mut rng); |
| 384 | let n = chunks_count::<Fr>(chunk_bit_size); |
| 385 | let msg = Fr::rand(&mut rng); |
| 386 | |
| 387 | let circuit = BitsizeCheckCircuit::new(chunk_bit_size, Some(n), None, true); |
| 388 | let snark_srs = generate_srs::<Bls12_381, _, _>(circuit, &gens, &mut rng).unwrap(); |
| 389 | let pvk = prepare_verifying_key::<Bls12_381>(&snark_srs.pk.vk); |
| 390 | |
| 391 | let g_i = get_gs_for_encryption(&snark_srs.pk.vk); |
| 392 | let (sk, ek, dk) = keygen( |
| 393 | &mut rng, |
| 394 | chunk_bit_size, |
| 395 | &gens, |
| 396 | g_i, |
| 397 | &snark_srs.pk.delta_g1, |
| 398 | &snark_srs.gamma_g1, |
| 399 | ) |
| 400 | .unwrap(); |
| 401 | |
| 402 | let start = Instant::now(); |
| 403 | let (ct, _, proof) = |
| 404 | Encryption::encrypt_with_proof(&mut rng, &msg, &ek, &snark_srs, chunk_bit_size) |
| 405 | .unwrap(); |
| 406 | let enc_time = start.elapsed(); |
| 407 | |
| 408 | Encryption::verify_ciphertext_commitment( |
| 409 | &ct.X_r, |
| 410 | &ct.enc_chunks, |
| 411 | &ct.commitment, |
| 412 | ek.clone(), |
| 413 | gens.clone(), |
| 414 | ) |
| 415 | .unwrap(); |
| 416 | |
| 417 | verify_proof(&pvk, &proof, &ct).unwrap(); |
| 418 | |
| 419 | let (decrypted_message, nu) = ct |
| 420 | .decrypt_given_groth16_vk(&sk, dk.clone(), &snark_srs.pk.vk, chunk_bit_size) |
| 421 | .unwrap(); |
| 422 | assert_eq!(decrypted_message, msg); |
| 423 | ct.verify_decryption_given_groth16_vk( |
| 424 | &decrypted_message, |
| 425 | &nu, |
| 426 | chunk_bit_size, |
| 427 | dk.clone(), |
| 428 | &snark_srs.pk.vk, |
| 429 | gens.clone(), |
| 430 | ) |
| 431 | .unwrap(); |
| 432 | |
| 433 | let start = Instant::now(); |
| 434 | let (ct, _, proof) = Encryption::rerandomize_ciphertext_and_proof( |
| 435 | ct, |
| 436 | proof, |
| 437 | &snark_srs.pk.vk, |