Skip to main content

cc_teec/common/
psk.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2025-2026 KylinSoft Co., Ltd. <https://www.kylinos.cn/>
3// See LICENSES for license details.
4
5use mbedtls::{
6    Result,
7    hash::{Md, Type},
8};
9
10// 用于生成 PSK 的固定字符串常量
11const KYLINOS: &str = "www.kylinos.cn";
12const PKG: &str = "cc-utils"; // 用作 PSK 标识
13const TEEC: &str = "libcc_teec";
14
15/// 使用SM3哈希算法生成预共享密钥 (PSK)
16///
17/// 将 KYLINOS、PKG 和 TEEC 三个字符串按顺序拼接后进行 SM3 哈希运算,
18/// 生成 32 字节(256位)的 PSK。
19///
20/// # 返回
21/// * `Ok([u8; 32])` - 成功生成的 32 字节 PSK
22/// * `Err(_)` - 哈希运算过程中发生错误
23pub fn generate_psk() -> Result<[u8; 32]> {
24    let mut psk: [u8; 32] = Default::default();
25    let mut ctx = Md::new(Type::SM3)?;
26
27    ctx.update(KYLINOS.as_bytes())?;
28    ctx.update(PKG.as_bytes())?;
29    ctx.update(TEEC.as_bytes())?;
30    let _len = ctx.finish(&mut psk);
31
32    Ok(psk)
33}
34
35/// 获取 PSK 标识符
36///
37/// 返回用于标识 PSK 用途的字符串常量。
38/// 在 TLS/DTLS 协议中,客户端使用此标识符告知服务器使用哪个 PSK。
39pub const fn get_psk_identity() -> &'static str {
40    PKG
41}