76 lines
2.4 KiB
Rust
76 lines
2.4 KiB
Rust
|
|
use std::fmt;
|
||
|
|
use std::string::FromUtf8Error;
|
||
|
|
|
||
|
|
use base64::DecodeError;
|
||
|
|
use crypto_common::InvalidLength;
|
||
|
|
use digest::MacError;
|
||
|
|
use serde_json::Error as JsonError;
|
||
|
|
|
||
|
|
use self::Error::*;
|
||
|
|
use crate::algorithm::AlgorithmType;
|
||
|
|
|
||
|
|
#[derive(Debug)]
|
||
|
|
pub enum Error {
|
||
|
|
AlgorithmMismatch(AlgorithmType, AlgorithmType),
|
||
|
|
Base64(DecodeError),
|
||
|
|
Format,
|
||
|
|
InvalidSignature,
|
||
|
|
Json(JsonError),
|
||
|
|
NoClaimsComponent,
|
||
|
|
NoHeaderComponent,
|
||
|
|
NoKeyId,
|
||
|
|
NoKeyWithKeyId(String),
|
||
|
|
NoSignatureComponent,
|
||
|
|
RustCryptoMac(MacError),
|
||
|
|
RustCryptoMacKeyLength(InvalidLength),
|
||
|
|
TooManyComponents,
|
||
|
|
Utf8(FromUtf8Error),
|
||
|
|
#[cfg(feature = "openssl")]
|
||
|
|
OpenSsl(openssl::error::ErrorStack),
|
||
|
|
}
|
||
|
|
|
||
|
|
impl fmt::Display for Error {
|
||
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
||
|
|
match *self {
|
||
|
|
AlgorithmMismatch(a, b) => {
|
||
|
|
write!(f, "Expected algorithm type {:?} but found {:?}", a, b)
|
||
|
|
}
|
||
|
|
NoKeyId => write!(f, "No key id found"),
|
||
|
|
NoKeyWithKeyId(ref kid) => write!(f, "Key with key id {} not found", kid),
|
||
|
|
NoHeaderComponent => write!(f, "No header component found in token string"),
|
||
|
|
NoClaimsComponent => write!(f, "No claims component found in token string"),
|
||
|
|
NoSignatureComponent => write!(f, "No signature component found in token string"),
|
||
|
|
TooManyComponents => write!(f, "Too many components found in token string"),
|
||
|
|
Format => write!(f, "Format"),
|
||
|
|
InvalidSignature => write!(f, "Invalid signature"),
|
||
|
|
Base64(ref x) => write!(f, "{}", x),
|
||
|
|
Json(ref x) => write!(f, "{}", x),
|
||
|
|
Utf8(ref x) => write!(f, "{}", x),
|
||
|
|
RustCryptoMac(ref x) => write!(f, "{}", x),
|
||
|
|
RustCryptoMacKeyLength(ref x) => write!(f, "{}", x),
|
||
|
|
#[cfg(feature = "openssl")]
|
||
|
|
OpenSsl(ref x) => write!(f, "{}", x),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl std::error::Error for Error {}
|
||
|
|
|
||
|
|
macro_rules! error_wrap {
|
||
|
|
($f:ty, $e:expr) => {
|
||
|
|
impl From<$f> for Error {
|
||
|
|
fn from(f: $f) -> Error {
|
||
|
|
$e(f)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
error_wrap!(DecodeError, Base64);
|
||
|
|
error_wrap!(JsonError, Json);
|
||
|
|
error_wrap!(FromUtf8Error, Utf8);
|
||
|
|
error_wrap!(MacError, RustCryptoMac);
|
||
|
|
error_wrap!(InvalidLength, RustCryptoMacKeyLength);
|
||
|
|
#[cfg(feature = "openssl")]
|
||
|
|
error_wrap!(openssl::error::ErrorStack, Error::OpenSsl);
|