x509_parser/
error.rs

1//! X.509 errors
2
3use der_parser::error::BerError;
4use nom::error::{ErrorKind, ParseError};
5use nom::IResult;
6
7/// An error that can occur while converting an OID to a Nid.
8#[derive(Debug, PartialEq, Eq)]
9pub struct NidError;
10
11/// Holds the result of parsing functions (X.509)
12///
13/// Note that this type is also a `Result`, so usual functions (`map`, `unwrap` etc.) are available.
14pub type X509Result<'a, T> = IResult<&'a [u8], T, X509Error>;
15
16/// An error that can occur while parsing or validating a certificate.
17#[derive(Clone, Debug, PartialEq, thiserror::Error)]
18pub enum X509Error {
19    #[error("generic error")]
20    Generic,
21
22    #[error("invalid version")]
23    InvalidVersion,
24    #[error("invalid serial")]
25    InvalidSerial,
26    #[error("invalid algorithm identifier")]
27    InvalidAlgorithmIdentifier,
28    #[error("invalid X.509 name")]
29    InvalidX509Name,
30    #[error("invalid date")]
31    InvalidDate,
32    #[error("invalid X.509 Subject Public Key Info")]
33    InvalidSPKI,
34    #[error("invalid X.509 Subject Unique ID")]
35    InvalidSubjectUID,
36    #[error("invalid X.509 Issuer Unique ID")]
37    InvalidIssuerUID,
38    #[error("invalid extensions")]
39    InvalidExtensions,
40    #[error("invalid attributes")]
41    InvalidAttributes,
42    #[error("duplicate extensions")]
43    DuplicateExtensions,
44    #[error("duplicate attributes")]
45    DuplicateAttributes,
46    #[error("invalid Signature DER Value")]
47    InvalidSignatureValue,
48    #[error("invalid TBS certificate")]
49    InvalidTbsCertificate,
50
51    // error types from CRL
52    #[error("invalid User certificate")]
53    InvalidUserCertificate,
54
55    /// Top-level certificate structure is invalid
56    #[error("invalid certificate")]
57    InvalidCertificate,
58
59    #[error("signature verification error")]
60    SignatureVerificationError,
61    #[error("signature unsupported algorithm")]
62    SignatureUnsupportedAlgorithm,
63
64    #[error("invalid number")]
65    InvalidNumber,
66
67    #[error("BER error: {0}")]
68    Der(#[from] BerError),
69    #[error("nom error: {0:?}")]
70    NomError(ErrorKind),
71}
72
73impl From<nom::Err<BerError>> for X509Error {
74    fn from(e: nom::Err<BerError>) -> Self {
75        Self::Der(BerError::from(e))
76    }
77}
78
79impl From<nom::Err<X509Error>> for X509Error {
80    fn from(e: nom::Err<X509Error>) -> Self {
81        match e {
82            nom::Err::Error(e) | nom::Err::Failure(e) => e,
83            nom::Err::Incomplete(i) => Self::Der(BerError::Incomplete(i)),
84        }
85    }
86}
87
88impl From<X509Error> for nom::Err<X509Error> {
89    fn from(e: X509Error) -> nom::Err<X509Error> {
90        nom::Err::Error(e)
91    }
92}
93
94impl From<ErrorKind> for X509Error {
95    fn from(e: ErrorKind) -> X509Error {
96        X509Error::NomError(e)
97    }
98}
99
100impl<I> ParseError<I> for X509Error {
101    fn from_error_kind(_input: I, kind: ErrorKind) -> Self {
102        X509Error::NomError(kind)
103    }
104    fn append(_input: I, kind: ErrorKind, _other: Self) -> Self {
105        X509Error::NomError(kind)
106    }
107}
108
109/// An error that can occur while parsing or validating a certificate.
110#[derive(Debug, thiserror::Error)]
111pub enum PEMError {
112    #[error("base64 decode error")]
113    Base64DecodeError,
114    #[error("incomplete PEM")]
115    IncompletePEM,
116    #[error("invalid header")]
117    InvalidHeader,
118    #[error("missing header")]
119    MissingHeader,
120
121    #[error("IO error: {0}")]
122    IOError(#[from] std::io::Error),
123}