use keyhog_core::decode_standard_base64;
#[test]
fn data_after_embedded_padding_is_rejected_not_truncated() {
let err = decode_standard_base64("QUI=Q0Q=")
.expect_err("embedded '=' followed by data must be rejected");
assert_eq!(
err, "invalid base64: data after padding '=' (padding may only appear at the end)",
"embedded-padding rejection message regressed"
);
}
#[test]
fn leading_padding_is_rejected() {
let err = decode_standard_base64("=QUJD").expect_err("leading '=' must be rejected");
assert_eq!(err, "invalid base64: padding '=' with no preceding data");
}
#[test]
fn padding_in_the_middle_of_a_quad_is_rejected() {
let err = decode_standard_base64("AB=C").expect_err("mid-quad '=' before data must reject");
assert_eq!(
err,
"invalid base64: data after padding '=' (padding may only appear at the end)"
);
}
#[test]
fn rem1_padding_is_rejected_as_unalignable() {
let err = decode_standard_base64("QUJDQ=").expect_err("rem-1 + padding is unalignable");
assert!(
err.starts_with("invalid base64: 1 padding char(s) do not align"),
"unexpected message for unalignable padding: {err}"
);
}
#[test]
fn three_padding_chars_after_a_full_quad_is_rejected() {
let err = decode_standard_base64("QUJD===").expect_err("3 trailing '=' is malformed");
assert!(
err.starts_with("invalid base64: 3 padding char(s) do not align"),
"unexpected message for over-long padding: {err}"
);
}
#[test]
fn legitimate_trailing_padding_still_decodes_exact_bytes() {
assert_eq!(decode_standard_base64("QQ==").expect("QQ=="), b"A");
assert_eq!(decode_standard_base64("QUI=").expect("QUI="), b"AB");
assert_eq!(decode_standard_base64("QUJD").expect("QUJD"), b"ABC");
assert_eq!(decode_standard_base64("QUJD==").expect("QUJD=="), b"ABC");
assert_eq!(
decode_standard_base64("SGVsbG8").expect("SGVsbG8"),
b"Hello"
);
assert_eq!(
decode_standard_base64("SGVsbG8=").expect("SGVsbG8="),
b"Hello"
);
assert_eq!(decode_standard_base64("").expect("empty"), b"");
}
#[test]
fn credential_b64_input_is_not_silently_corrupted() {
assert!(
decode_standard_base64("QUI=Q0Q=").is_err(),
"interior '=' must fail closed, never decode to a truncated credential"
);
}