61 lines
1.9 KiB
Rust
61 lines
1.9 KiB
Rust
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("<svg"), "SVG output should contain <svg tag");
|
|
assert!(!svg.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn bad_magic_returns_error() {
|
|
let mut bad = [0u8; 109];
|
|
bad[0..4].copy_from_slice(b"NOPE");
|
|
let result = unwrap_recovery_qr_with_params(&bad, "pass", &fast_params());
|
|
assert!(result.is_err());
|
|
}
|