Skip to main content

passkey_server/
error.rs

1use std::fmt;
2
3#[derive(Debug)]
4pub enum PasskeyError {
5    DatabaseError(String),
6    InvalidChallenge,
7    RegistrationSessionExpired,
8    LoginSessionExpired,
9    OriginMismatch { expected: String, got: String },
10    InvalidOperationType,
11    RpIdHashMismatch,
12    UserPresentFlagNotSet,
13    InvalidSignature(String),
14    PasskeyNotFound,
15    UserHandleMismatch,
16    SignatureCounterRegression,
17    SerializationError(serde_json::Error),
18    Base64Error(base64::DecodeError),
19    InternalError(String),
20}
21
22impl fmt::Display for PasskeyError {
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        match self {
25            Self::DatabaseError(e) => write!(f, "Database error: {}", e),
26            Self::InvalidChallenge => write!(f, "Invalid challenge"),
27            Self::RegistrationSessionExpired => {
28                write!(f, "Registration session expired or invalid")
29            }
30            Self::LoginSessionExpired => write!(f, "Login session expired or invalid"),
31            Self::OriginMismatch { expected, got } => {
32                write!(f, "Origin mismatch: expected {}, got {}", expected, got)
33            }
34            Self::InvalidOperationType => write!(f, "Invalid operation type"),
35            Self::RpIdHashMismatch => write!(f, "RP ID Hash mismatch"),
36            Self::UserPresentFlagNotSet => write!(f, "User Present flag not set"),
37            Self::InvalidSignature(e) => write!(f, "Invalid signature: {}", e),
38            Self::PasskeyNotFound => write!(f, "Passkey not found"),
39            Self::UserHandleMismatch => write!(f, "User Handle mismatch"),
40            Self::SignatureCounterRegression => write!(f, "Signature counter regression"),
41            Self::SerializationError(e) => write!(f, "Serialization error: {}", e),
42            Self::Base64Error(e) => write!(f, "Base64 decode error: {}", e),
43            Self::InternalError(e) => write!(f, "Internal error: {}", e),
44        }
45    }
46}
47
48impl std::error::Error for PasskeyError {
49    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
50        match self {
51            Self::SerializationError(e) => Some(e),
52            Self::Base64Error(e) => Some(e),
53            _ => None,
54        }
55    }
56}
57
58impl From<serde_json::Error> for PasskeyError {
59    fn from(err: serde_json::Error) -> Self {
60        PasskeyError::SerializationError(err)
61    }
62}
63
64impl From<base64::DecodeError> for PasskeyError {
65    fn from(err: base64::DecodeError) -> Self {
66        PasskeyError::Base64Error(err)
67    }
68}
69
70pub type Result<T> = std::result::Result<T, PasskeyError>;