tasign 0.1.5

TA ELF signing utilities with CMS/PKCS#7 support
Documentation
//! 统一错误类型。

#[cfg(not(feature = "std"))]
use alloc::string::{String, ToString};
use thiserror::Error;

#[derive(Debug, Error)]
pub enum Error {
    /// [`crate::verify_elf_signature_with_limits`] 等整包验签路径上的失败(含阶段说明)。
    #[cfg(any(feature = "std", feature = "kernel-verify"))]
    #[error("ELF 验签: {0}")]
    VerifyElf(String),
    #[cfg(any(feature = "std", feature = "kernel-verify"))]
    #[error("ELF plain 构造失败: {0}")]
    Plain(#[from] crate::plain::PlainError),
    #[cfg(any(feature = "std", feature = "kernel-verify"))]
    #[error("{0}")]
    ResourceLimit(#[from] crate::limits::LimitsError),
    #[error("CMS 签名: {0}")]
    CmsSign(String),
    #[error("CMS 验签: {0}")]
    CmsVerify(String),
    #[error("私钥 PEM 解析失败: {0}")]
    KeyParse(String),
    #[error("DER 编解码失败: {0}")]
    RasnEncode(String),
    #[error("DER 解码失败: {0}")]
    RasnDecode(String),
    #[error("SM2 错误: {0}")]
    Sm2(String),
    #[error("ELF 写出: {0}")]
    ElfWrite(String),
    #[cfg(feature = "std")]
    #[error("IO: {0}")]
    Io(#[from] std::io::Error),
}

impl From<rasn::error::EncodeError> for Error {
    fn from(e: rasn::error::EncodeError) -> Self {
        Error::RasnEncode(e.to_string())
    }
}

impl From<rasn::error::DecodeError> for Error {
    fn from(e: rasn::error::DecodeError) -> Self {
        Error::RasnDecode(e.to_string())
    }
}

impl From<mbedtls::Error> for Error {
    fn from(e: mbedtls::Error) -> Self {
        Error::Sm2(e.to_string())
    }
}

#[cfg(any(feature = "std", feature = "kernel-verify"))]
impl Error {
    /// 为整包验签路径附加阶段说明,供上层记录或展示。
    pub fn at_verify_stage(stage: &'static str, err: impl core::fmt::Display) -> Self {
        #[cfg(feature = "std")]
        let msg = format!("{stage}: {err}");
        #[cfg(not(feature = "std"))]
        let msg = alloc::format!("{stage}: {err}");
        Error::VerifyElf(msg)
    }
}