1use der_parser::error::BerError;
4use nom::error::{ErrorKind, ParseError};
5use nom::IResult;
6
7#[derive(Debug, PartialEq, Eq)]
9pub struct NidError;
10
11pub type X509Result<'a, T> = IResult<&'a [u8], T, X509Error>;
15
16#[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("invalid User certificate")]
53 InvalidUserCertificate,
54
55 #[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#[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}