#![cfg(all(feature = "rsa-direct", wolfssl_rsa))]
use wolfcrypt::rand::WolfRng;
use wolfcrypt::rsa::{NativeRsaKey, RsaDirectType};
#[test]
fn private_encrypt_then_public_decrypt_roundtrip() {
let mut rng = WolfRng::new().expect("RNG init");
let mut key = NativeRsaKey::generate(2048, &mut rng).expect("RSA 2048-bit key generation");
let key_sz = key.encrypt_size().expect("encrypt_size");
assert_eq!(key_sz, 256, "2048-bit key should have 256-byte modulus");
let mut input = vec![0u8; key_sz];
input[0] = 0x00;
input[1] = 0x01;
for i in 2..key_sz {
input[i] = (i & 0xFF) as u8;
}
let encrypted = key
.rsa_direct(&input, RsaDirectType::PrivateEncrypt, &mut rng)
.expect("rsa_direct PrivateEncrypt");
assert_eq!(encrypted.len(), key_sz);
assert_ne!(
encrypted, input,
"encrypted output should differ from input"
);
let recovered = key
.rsa_direct(&encrypted, RsaDirectType::PublicDecrypt, &mut rng)
.expect("rsa_direct PublicDecrypt");
assert_eq!(recovered, input, "round-trip must recover original input");
}
#[test]
fn public_encrypt_then_private_decrypt_roundtrip() {
let mut rng = WolfRng::new().expect("RNG init");
let mut key = NativeRsaKey::generate(2048, &mut rng).expect("RSA 2048-bit key generation");
let key_sz = key.encrypt_size().expect("encrypt_size");
let mut input = vec![0u8; key_sz];
input[0] = 0x00;
input[1] = 0x42;
for i in 2..key_sz {
input[i] = ((key_sz - i) & 0xFF) as u8;
}
let encrypted = key
.rsa_direct(&input, RsaDirectType::PublicEncrypt, &mut rng)
.expect("rsa_direct PublicEncrypt");
assert_eq!(encrypted.len(), key_sz);
let recovered = key
.rsa_direct(&encrypted, RsaDirectType::PrivateDecrypt, &mut rng)
.expect("rsa_direct PrivateDecrypt");
assert_eq!(recovered, input, "round-trip must recover original input");
}
#[test]
fn wrong_input_size_rejected() {
let mut rng = WolfRng::new().expect("RNG init");
let mut key = NativeRsaKey::generate(2048, &mut rng).expect("RSA key generation");
let too_short = vec![0x42u8; 128]; let result = key.rsa_direct(&too_short, RsaDirectType::PublicEncrypt, &mut rng);
assert!(
result.is_err(),
"input shorter than key size should be rejected"
);
}
#[test]
fn encrypt_size_matches_key_bits() {
let mut rng = WolfRng::new().expect("RNG init");
let key_2048 = NativeRsaKey::generate(2048, &mut rng).expect("RSA 2048 key generation");
assert_eq!(key_2048.encrypt_size().unwrap(), 256);
}