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 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}