Coverage Report

Created: 2026-03-28 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/x509-parser-0.18.1/src/error.rs
Line
Count
Source
1
//! X.509 errors
2
3
use der_parser::error::BerError;
4
use nom::error::{ErrorKind, ParseError};
5
use nom::IResult;
6
7
/// An error that can occur while converting an OID to a Nid.
8
#[derive(Debug, PartialEq, Eq)]
9
pub 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.
14
pub 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)]
18
pub 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
73
impl From<nom::Err<BerError>> for X509Error {
74
0
    fn from(e: nom::Err<BerError>) -> Self {
75
0
        Self::Der(BerError::from(e))
76
0
    }
77
}
78
79
impl From<nom::Err<X509Error>> for X509Error {
80
0
    fn from(e: nom::Err<X509Error>) -> Self {
81
0
        match e {
82
0
            nom::Err::Error(e) | nom::Err::Failure(e) => e,
83
0
            nom::Err::Incomplete(i) => Self::Der(BerError::Incomplete(i)),
84
        }
85
0
    }
86
}
87
88
impl From<X509Error> for nom::Err<X509Error> {
89
0
    fn from(e: X509Error) -> nom::Err<X509Error> {
90
0
        nom::Err::Error(e)
91
0
    }
92
}
93
94
impl From<ErrorKind> for X509Error {
95
0
    fn from(e: ErrorKind) -> X509Error {
96
0
        X509Error::NomError(e)
97
0
    }
98
}
99
100
impl<I> ParseError<I> for X509Error {
101
0
    fn from_error_kind(_input: I, kind: ErrorKind) -> Self {
102
0
        X509Error::NomError(kind)
103
0
    }
104
0
    fn append(_input: I, kind: ErrorKind, _other: Self) -> Self {
105
0
        X509Error::NomError(kind)
106
0
    }
107
}
108
109
/// An error that can occur while parsing or validating a certificate.
110
#[derive(Debug, thiserror::Error)]
111
pub 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
}