use crate::SpiffeIdError;
use x509_parser::error::X509Error;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct X509ExtensionId(Box<str>);
impl X509ExtensionId {
pub(crate) fn new(oid: &x509_parser::asn1_rs::Oid<'_>) -> Self {
Self(oid.to_string().into_boxed_str())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for X509ExtensionId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
#[derive(Debug, thiserror::Error)]
#[error(transparent)]
pub struct X509ParseError {
source: X509Error,
}
impl X509ParseError {
pub(crate) const fn new(source: X509Error) -> Self {
Self { source }
}
}
#[derive(Debug, thiserror::Error)]
#[error(transparent)]
pub struct Pkcs8DecodeError {
source: pkcs8::Error,
}
impl Pkcs8DecodeError {
pub(crate) const fn new(source: pkcs8::Error) -> Self {
Self { source }
}
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum CertificateError {
#[error("X.509 extension is missing: {0}")]
MissingX509Extension(X509ExtensionId),
#[error("unexpected X.509 extension: {0}")]
UnexpectedExtension(String),
#[error("failed parsing X.509 certificate")]
ParseX509Certificate(#[source] X509ParseError),
#[error("certificate is missing SPIFFE ID in URI SAN")]
MissingSpiffeId,
#[error("certificate contains multiple URI SAN entries")]
MultipleUriSanEntries,
#[error("URI SAN exceeds maximum length ({max} bytes)")]
OversizedUriSan {
max: usize,
},
#[error("certificate contains multiple SPIFFE IDs in URI SAN")]
MultipleSpiffeIds,
#[error("certificate has too many URI SAN entries (max {max})")]
TooManyUriSanEntries {
max: usize,
},
#[error("certificate chain has too many certificates (max {max})")]
TooManyCertificates {
max: usize,
},
#[error("failed to parse SPIFFE ID from URI SAN: {0}")]
InvalidSpiffeId(#[from] SpiffeIdError),
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum PrivateKeyError {
#[error("failed decoding PKCS#8 private key")]
DecodePkcs8(#[source] Pkcs8DecodeError),
}