Skip to main content

spki/
error.rs

1//! Error types
2
3use core::fmt;
4use der::asn1::ObjectIdentifier;
5
6/// Result type with `spki` crate's [`Error`] type.
7pub type Result<T> = core::result::Result<T, Error>;
8
9#[cfg(feature = "pem")]
10use der::pem;
11
12/// Error type
13#[derive(Copy, Clone, Debug, Eq, PartialEq)]
14#[non_exhaustive]
15pub enum Error {
16    /// Algorithm parameters are missing.
17    AlgorithmParametersMissing,
18
19    /// ASN.1 DER-related errors.
20    Asn1(der::Error),
21
22    /// Malformed cryptographic key contained in a SPKI document.
23    ///
24    /// This is intended for relaying errors related to the raw data contained
25    /// in [`SubjectPublicKeyInfo::subject_public_key`][`crate::SubjectPublicKeyInfo::subject_public_key`].
26    KeyMalformed,
27
28    /// Unknown algorithm OID.
29    OidUnknown {
30        /// Unrecognized OID value found in e.g. a SPKI `AlgorithmIdentifier`.
31        oid: ObjectIdentifier,
32    },
33}
34
35impl core::error::Error for Error {
36    fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
37        match self {
38            Error::Asn1(err) => Some(err),
39            _ => None,
40        }
41    }
42}
43
44impl fmt::Display for Error {
45    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46        match self {
47            Error::AlgorithmParametersMissing => {
48                f.write_str("AlgorithmIdentifier parameters missing")
49            }
50            Error::Asn1(err) => write!(f, "ASN.1 error: {err}"),
51            Error::KeyMalformed => f.write_str("SPKI cryptographic key data malformed"),
52            Error::OidUnknown { oid } => {
53                write!(f, "unknown/unsupported algorithm OID: {oid}")
54            }
55        }
56    }
57}
58
59impl From<der::Error> for Error {
60    fn from(err: der::Error) -> Error {
61        if let der::ErrorKind::OidUnknown { oid } = err.kind() {
62            Error::OidUnknown { oid }
63        } else {
64            Error::Asn1(err)
65        }
66    }
67}
68
69#[cfg(feature = "pem")]
70impl From<pem::Error> for Error {
71    fn from(err: pem::Error) -> Error {
72        der::Error::from(err).into()
73    }
74}