use crate::credential::nonce::NonceCheck;
use crate::credential::request::RequestKind;
use crate::credential::signature::VerifiedIdentity;
use crate::credential::wire::{CredentialError, ERR_STALE_NONCE, ERR_UNAUTHENTICATED};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CredentialMode {
Advisory,
Required,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ServerDecision {
Answer {
identity: Option<VerifiedIdentity>,
},
Challenge {
code: u16,
},
Refuse {
code: u16,
},
}
pub fn decide(
mode: CredentialMode,
kind: &RequestKind<'_>,
nonce: Option<NonceCheck>,
verified: Option<Result<VerifiedIdentity, CredentialError>>,
) -> ServerDecision {
match kind {
RequestKind::Bare => match mode {
CredentialMode::Advisory => ServerDecision::Answer { identity: None }, CredentialMode::Required => ServerDecision::Refuse {
code: ERR_UNAUTHENTICATED, },
},
RequestKind::Identity { .. } => ServerDecision::Challenge {
code: ERR_UNAUTHENTICATED, },
RequestKind::Signed { .. } => match nonce {
Some(NonceCheck::Fresh) => match verified {
Some(Ok(identity)) => ServerDecision::Answer {
identity: Some(identity), },
_ => ServerDecision::Challenge {
code: ERR_UNAUTHENTICATED, },
},
Some(NonceCheck::Stale) => ServerDecision::Challenge {
code: ERR_STALE_NONCE, },
Some(NonceCheck::Invalid) | None => ServerDecision::Challenge {
code: ERR_UNAUTHENTICATED, },
},
}
}