pub mod authenticate;
pub mod challenge;
pub mod refresh;
pub mod store;
pub use authenticate::{handle_authenticate, handle_authenticate_with_aal};
pub use challenge::handle_challenge;
pub use refresh::handle_refresh;
pub use store::KeyspaceSessionStore;
use crate::auth::AuthError;
use crate::auth::session::Session;
pub(crate) fn refresh_amr_acr(session: &Session) -> (Vec<String>, String) {
if session.amr.is_empty() {
(vec!["did".to_string()], "aal1".to_string())
} else {
(session.amr.clone(), session.acr.clone())
}
}
pub(crate) fn check_freshness(
created_time: Option<u64>,
session_created_at: u64,
now: u64,
window: u64,
) -> Result<(), AuthError> {
let Some(ct) = created_time else {
return Ok(());
};
if ct < session_created_at {
return Err(AuthError::StaleMessage);
}
if now.saturating_sub(ct) > window {
return Err(AuthError::StaleMessage);
}
Ok(())
}
pub(crate) fn constant_time_challenge_eq(a: &str, b: &str) -> bool {
let a = a.as_bytes();
let b = b.as_bytes();
if a.len() != b.len() {
return false;
}
let mut diff = 0u8;
for i in 0..a.len() {
diff |= a[i] ^ b[i];
}
diff == 0
}