use serde::{Deserialize, Serialize};
use std::collections::HashSet;
use std::hash::{Hash, Hasher};
use subtle::ConstantTimeEq;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ConstantTimeString(String);
impl From<String> for ConstantTimeString {
fn from(s: String) -> Self {
Self(s)
}
}
impl PartialEq for ConstantTimeString {
fn eq(&self, other: &Self) -> bool {
self.0.as_bytes().ct_eq(other.0.as_bytes()).into()
}
}
impl Eq for ConstantTimeString {}
impl Hash for ConstantTimeString {
fn hash<H: Hasher>(&self, state: &mut H) {
self.0.hash(state);
}
}
pub type KeySet = HashSet<ConstantTimeString>;
pub fn validate_bearer_token(keys: &KeySet, token: &str) -> bool {
keys.contains(&ConstantTimeString::from(token.to_string()))
}