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>;