1use core::fmt;
4use der::asn1::ObjectIdentifier;
5
6pub type Result<T> = core::result::Result<T, Error>;
8
9#[cfg(feature = "pem")]
10use der::pem;
11
12#[derive(Copy, Clone, Debug, Eq, PartialEq)]
14#[non_exhaustive]
15pub enum Error {
16    AlgorithmParametersMissing,
18
19    Asn1(der::Error),
21
22    KeyMalformed,
27
28    OidUnknown {
30        oid: ObjectIdentifier,
32    },
33}
34
35impl fmt::Display for Error {
36    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37        match self {
38            Error::AlgorithmParametersMissing => {
39                f.write_str("AlgorithmIdentifier parameters missing")
40            }
41            Error::Asn1(err) => write!(f, "ASN.1 error: {}", err),
42            Error::KeyMalformed => f.write_str("SPKI cryptographic key data malformed"),
43            Error::OidUnknown { oid } => {
44                write!(f, "unknown/unsupported algorithm OID: {}", oid)
45            }
46        }
47    }
48}
49
50impl From<der::Error> for Error {
51    fn from(err: der::Error) -> Error {
52        if let der::ErrorKind::OidUnknown { oid } = err.kind() {
53            Error::OidUnknown { oid }
54        } else {
55            Error::Asn1(err)
56        }
57    }
58}
59
60#[cfg(feature = "pem")]
61impl From<pem::Error> for Error {
62    fn from(err: pem::Error) -> Error {
63        der::Error::from(err).into()
64    }
65}
66
67#[cfg(feature = "std")]
68impl std::error::Error for Error {}