use std::error::Error;
use std::fs::{File, OpenOptions, remove_file};
use std::io::Write;
use rgp::{
Components, Decrypt, Encrypt, KemKeyReader, decrypt, encrypt, extract_components_mut,
generate_fingerprint, generate_kem_keys,
};
pub fn main() -> Result<(), Box<dyn Error>> {
let (fingerprint, verifier) = generate_fingerprint();
let (recipient_secret_key, recipient_pub_key) = generate_kem_keys();
let content = vec![0u8; 5_000_000];
let mut pub_keys_file = OpenOptions::new()
.create(true)
.write(true)
.append(true)
.open("example_kem_pub_keys")?;
pub_keys_file.write_all(&recipient_pub_key)?;
pub_keys_file.flush()?;
for _ in 0..50 {
let (_, pub_key) = generate_kem_keys();
pub_keys_file.write_all(&pub_key)?;
pub_keys_file.flush()?;
}
let key_reader = KemKeyReader::new(File::open("example_kem_pub_keys")?);
let (mut encrypted_content, content_key) =
encrypt(fingerprint, content.clone(), Encrypt::Kem(key_reader))?;
if let Components::Kem(encrypted_key, ciphertext, _) =
extract_components_mut(0, &mut encrypted_content)
{
let (decrypted_content, decrypted_content_key) = decrypt(
Some(&verifier),
&encrypted_content,
Decrypt::Kem(
encrypted_key,
ciphertext,
Box::new(recipient_secret_key),
None,
),
)?;
assert_eq!(decrypted_content, content);
assert_eq!(decrypted_content_key, content_key);
};
remove_file("example_kem_pub_keys")?;
Ok(())
}