diff --git a/crates/relicario-core/tests/recovery_qr.rs b/crates/relicario-core/tests/recovery_qr.rs new file mode 100644 index 0000000..e1ec7ed --- /dev/null +++ b/crates/relicario-core/tests/recovery_qr.rs @@ -0,0 +1,60 @@ +use relicario_core::{ + crypto::KdfParams, + generate_recovery_qr_with_params, recovery_qr_to_svg, unwrap_recovery_qr_with_params, +}; + +fn fast_params() -> KdfParams { + KdfParams { argon2_m: 256, argon2_t: 1, argon2_p: 1 } +} + +fn test_secret() -> [u8; 32] { + let mut s = [0u8; 32]; + for (i, b) in s.iter_mut().enumerate() { *b = i as u8; } + s +} + +#[test] +fn roundtrip_recovers_image_secret() { + let passphrase = "correct-horse-battery-staple"; + let secret = test_secret(); + let payload = generate_recovery_qr_with_params(passphrase, &secret, &fast_params()) + .expect("generate ok"); + let recovered = unwrap_recovery_qr_with_params(payload.as_bytes(), passphrase, &fast_params()) + .expect("unwrap ok"); + assert_eq!(recovered.as_ref(), &secret); +} + +#[test] +fn wrong_passphrase_fails_decrypt() { + let secret = test_secret(); + let payload = generate_recovery_qr_with_params("right-pass", &secret, &fast_params()) + .expect("generate ok"); + let result = unwrap_recovery_qr_with_params(payload.as_bytes(), "wrong-pass", &fast_params()); + assert!(result.is_err()); +} + +#[test] +fn payload_is_109_bytes() { + let secret = test_secret(); + let payload = generate_recovery_qr_with_params("test", &secret, &fast_params()) + .expect("generate ok"); + assert_eq!(payload.as_bytes().len(), 109); +} + +#[test] +fn svg_output_is_non_empty_xml() { + let secret = test_secret(); + let payload = generate_recovery_qr_with_params("test", &secret, &fast_params()) + .expect("generate ok"); + let svg = recovery_qr_to_svg(&payload); + assert!(svg.contains("