tasign 0.2.0

TA ELF signing utilities with CMS/PKCS#7 support
//! 与 `scripts/tasign_sign_verify_external_elf_with_fixtures.sh` 中
//! `tests/fixtures/gmssl` 一致的内建**测试**材料,供 `cargo install` 后免拷贝 fixture 试跑。
//!
//! **非生产用途**:内嵌私钥与证书仅用于联调/示例;生产环境须使用自有 PKI 与密钥管理。
//!
//! - 证书:优先以 **DER** 内嵌(`openssl x509 -outform DER`),与 CMS 路径一致。
//! - 根 CA:为 **PEM**(`ca.crt`),与 mbedtls 验链 `from_pem` 一致。
//! - 私钥:GmSSL 加密 **PEM**(`leaf.key` / `ca_leaf.key`),`sign` 时写入临时文件再解析。

/// CLI 字面量:与 `--leaf-cert` / `--leaf-key` 等联用表示使用本模块内建测试材料(见 `tasign-tool`)。
pub const TEST_ARG: &str = "TEST";

/// 与 fixture 私钥及脚本环境变量 `PASS` 默认一致(`123456`)。
pub const TEST_LEAF_KEY_PASS: &str = "123456";

// --- 证书 DER(`openssl x509 -in …​.crt -outform DER`)---

pub static LEAF_CERT_DER: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/tests/fixtures/gmssl/leaf.der"
));
pub static INTERMEDIATE_CERT_DER: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/tests/fixtures/gmssl/intermediate.der"
));
pub static CA_LEAF_CERT_DER: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/tests/fixtures/gmssl/ca_leaf.der"
));

/// 根 CA,PEM(验链用)。
pub static CA_CERT_PEM: &[u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/fixtures/gmssl/ca.crt"));

// --- 私钥 PEM(GmSSL 加密 PKCS#8)---

pub static LEAF_KEY_PEM: &[u8] = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/fixtures/gmssl/leaf.key"));
pub static CA_LEAF_KEY_PEM: &[u8] =
    include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/tests/fixtures/gmssl/ca_leaf.key"));

#[inline]
pub fn is_test_arg(s: &str) -> bool {
    s == TEST_ARG
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn embedded_cert_der_non_empty() {
        assert!(!LEAF_CERT_DER.is_empty());
        assert!(!INTERMEDIATE_CERT_DER.is_empty());
        assert!(!CA_LEAF_CERT_DER.is_empty());
    }

    #[test]
    fn ca_pem_starts_with_banner() {
        let s = std::str::from_utf8(CA_CERT_PEM).expect("ca.crt utf8");
        assert!(s.contains("-----BEGIN") && s.contains("CERTIFICATE"));
    }
}