use mbedtls::{
Result,
hash::{Md, Type},
};
const KYLINOS: &str = "www.kylinos.cn";
const PKG: &str = "rust-libteec";
const TEEC: &str = "libcc_teec";
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() {
let psk1 = generate_psk().expect("第一次生成 PSK 应该成功");
let psk2 = generate_psk().expect("第二次生成 PSK 应该成功");
assert_eq!(psk1, psk2, "静态 PSK 应该始终相同");
}
}