| //! X.509 errors |
| |
| use der_parser::error::BerError; |
| use nom::error::{ErrorKind, ParseError}; |
| use nom::IResult; |
| |
| /// An error that can occur while converting an OID to a Nid. |
| #[derive(Debug, PartialEq)] |
| pub struct NidError; |
| |
| /// Holds the result of parsing functions (X.509) |
| /// |
| /// Note that this type is also a `Result`, so usual functions (`map`, `unwrap` etc.) are available. |
| pub type X509Result<'a, T> = IResult<&'a [u8], T, X509Error>; |
| |
| /// An error that can occur while parsing or validating a certificate. |
| #[derive(Clone, Debug, PartialEq, thiserror::Error)] |
| pub enum X509Error { |
| #[error("generic error")] |
| Generic, |
| |
| #[error("invalid version")] |
| InvalidVersion, |
| #[error("invalid serial")] |
| InvalidSerial, |
| #[error("invalid algorithm identifier")] |
| InvalidAlgorithmIdentifier, |
| #[error("invalid X.509 name")] |
| InvalidX509Name, |
| #[error("invalid date")] |
| InvalidDate, |
| #[error("invalid X.509 Subject Public Key Info")] |
| InvalidSPKI, |
| #[error("invalid X.509 Subject Unique ID")] |
| InvalidSubjectUID, |
| #[error("invalid X.509 Issuer Unique ID")] |
| InvalidIssuerUID, |
| #[error("invalid extensions")] |
| InvalidExtensions, |
| #[error("invalid attributes")] |
| InvalidAttributes, |
| #[error("duplicate extensions")] |
| DuplicateExtensions, |
| #[error("duplicate attributes")] |
| DuplicateAttributes, |
| #[error("invalid Signature DER Value")] |
| InvalidSignatureValue, |
| #[error("invalid TBS certificate")] |
| InvalidTbsCertificate, |
| |
| // error types from CRL |
| #[error("invalid User certificate")] |
| InvalidUserCertificate, |
| |
| /// Top-level certificate structure is invalid |
| #[error("invalid certificate")] |
| InvalidCertificate, |
| |
| #[error("signature verification error")] |
| SignatureVerificationError, |
| #[error("signature unsupported algorithm")] |
| SignatureUnsupportedAlgorithm, |
| |
| #[error("BER error: {0}")] |
| Der(#[from] BerError), |
| #[error("nom error: {0:?}")] |
| NomError(ErrorKind), |
| } |
| |
| impl From<X509Error> for nom::Err<X509Error> { |
| fn from(e: X509Error) -> nom::Err<X509Error> { |
| nom::Err::Error(e) |
| } |
| } |
| |
| impl From<ErrorKind> for X509Error { |
| fn from(e: ErrorKind) -> X509Error { |
| X509Error::NomError(e) |
| } |
| } |
| |
| impl<I> ParseError<I> for X509Error { |
| fn from_error_kind(_input: I, kind: ErrorKind) -> Self { |
| X509Error::NomError(kind) |
| } |
| fn append(_input: I, kind: ErrorKind, _other: Self) -> Self { |
| X509Error::NomError(kind) |
| } |
| } |
| |
| /// An error that can occur while parsing or validating a certificate. |
| #[derive(Debug, thiserror::Error)] |
| pub enum PEMError { |
| #[error("base64 decode error")] |
| Base64DecodeError, |
| #[error("incomplete PEM")] |
| IncompletePEM, |
| #[error("invalid header")] |
| InvalidHeader, |
| #[error("missing header")] |
| MissingHeader, |
| |
| #[error("IO error: {0}")] |
| IOError(#[from] std::io::Error), |
| } |