rust-libteec 0.4.6

Rust implementation of TEE Client API for secure communication with Trusted Applications.
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2025-2026 KylinSoft Co., Ltd. <https://www.kylinos.cn/>
// See LICENSES for license details.

use mbedtls::{
    Result,
    hash::{Md, Type},
};

const KYLINOS: &str = "www.kylinos.cn";
const PKG: &str = "rust-libteec";
const TEEC: &str = "libcc_teec";

/// 生成 PSK
///
/// # 返回
/// * `Ok([u8; 32])` - 成功生成的 32 字节 PSK
/// * `Err(_)` - 哈希运算过程中发生错误
pub(crate) fn generate_psk() -> Result<[u8; 32]> {
    let mut psk: [u8; 32] = Default::default();
    let mut ctx = Md::new(Type::SM3)?;

    ctx.update(KYLINOS.as_bytes())?;
    ctx.update(PKG.as_bytes())?;
    ctx.update(TEEC.as_bytes())?;
    ctx.finish(&mut psk)?;

    Ok(psk)
}

pub(crate) const fn get_psk_identity() -> &'static str {
    PKG
}

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

    #[test]
    fn test_psk_generation_success() {
        generate_psk().expect("生成PSK应该成功");
    }

    #[test]
    fn test_psk_length() {
        let psk = generate_psk().expect("生成 PSK 应该成功");
        assert_eq!(psk.len(), 32, "PSK 长度应该为 32 字节");
    }

    #[test]
    fn test_psk_not_all_zero() {
        let psk = generate_psk().expect("生成 PSK 应该成功");
        assert!(psk.iter().any(|&b| b != 0), "PSK 不应该全为零");
    }

    #[test]
    fn test_psk_identity_not_empty() {
        let identity = get_psk_identity();
        assert!(!identity.is_empty());
    }

    #[test]
    fn test_psk_is_deterministic() {
        // 验证静态 PSK 的确定性(相同输入总是产生相同输出)
        let psk1 = generate_psk().expect("第一次生成 PSK 应该成功");
        let psk2 = generate_psk().expect("第二次生成 PSK 应该成功");
        assert_eq!(psk1, psk2, "静态 PSK 应该始终相同");
    }
}