use cryptoy::rsa::codec::Pkcs1V1_5;
use cryptoy::rsa::traits::Codec;
use cryptoy::rsa::{codec, KeyPair, Rsa};
use rand::{thread_rng, RngCore};
pub fn main() {
let prime_bits = 64;
let min_padding: usize = 2;
let mut rng = thread_rng();
let seed = rng.next_u64();
let key_pair = KeyPair::generate(prime_bits, seed).unwrap();
let modulus_bytes = key_pair.private_key.modulus.bits() / 8;
let codec = Pkcs1V1_5::new(
codec::BlockType::Type02,
modulus_bytes,
modulus_bytes - min_padding - 3,
seed,
);
let mut rsa = Rsa::<Pkcs1V1_5> { codec, key_pair };
let plaintext = b"hello, RSA PKCS!";
let ciphertext = rsa.encrypt(plaintext).unwrap();
let decrypted_text = rsa.decrypt(&ciphertext).unwrap();
let encoded_plaintext = rsa.codec.encode(plaintext).unwrap();
let encoded_bytes: Vec<u8> = encoded_plaintext.to_bytes_be();
let ciphertext_bytes: Vec<u8> = ciphertext.to_bytes_be();
println!("plaintext: {:?}", plaintext);
println!(" ({:?})", String::from_utf8_lossy(plaintext));
println!("decrypted_text: {:?}", decrypted_text);
println!(" ({:?})", String::from_utf8_lossy(&decrypted_text));
println!("encoded: {:?}", encoded_bytes);
println!("ciphertext: {:?}", ciphertext_bytes);
assert_eq!(plaintext, decrypted_text.as_slice());
}