Skip to main content

rust_utee/
tee_api_types.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2025 KylinSoft Co., Ltd. <https://www.kylinos.cn/>
3// See LICENSES for license details.
4//
5// This file has been modified by KylinSoft on 2025.
6
7// Common Definitions
8
9use crate::libc_compat::size_t;
10use core::ffi::*;
11use core::fmt::{Display, Formatter, Result};
12
13#[allow(non_camel_case_types)]
14pub type TEE_Result = u32;
15
16#[repr(C)]
17#[derive(Copy, Clone)]
18pub struct TEE_UUID {
19    pub timeLow: u32,
20    pub timeMid: u16,
21    pub timeHiAndVersion: u16,
22    pub clockSeqAndNode: [u8; 8],
23}
24impl Display for TEE_UUID {
25    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
26        write!(
27            f,
28            "{:08x}-{:04x}-{:04x}-{:02x}{:02x}-{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}",
29            self.timeLow,
30            self.timeMid,
31            self.timeHiAndVersion,
32            self.clockSeqAndNode[0],
33            self.clockSeqAndNode[1],
34            self.clockSeqAndNode[2],
35            self.clockSeqAndNode[3],
36            self.clockSeqAndNode[4],
37            self.clockSeqAndNode[5],
38            self.clockSeqAndNode[6],
39            self.clockSeqAndNode[7]
40        )
41    }
42}
43
44#[derive(Copy, Clone)]
45#[repr(C)]
46pub struct TEE_Identity {
47    pub login: u32,
48    pub uuid: TEE_UUID,
49}
50
51#[derive(Copy, Clone)]
52#[repr(C)]
53pub struct Memref {
54    pub buffer: *mut c_void,
55    pub size: usize,
56}
57
58#[derive(Copy, Clone)]
59#[repr(C)]
60pub struct Value {
61    pub a: u32,
62    pub b: u32,
63}
64
65#[derive(Copy, Clone)]
66#[repr(C)]
67pub union TEE_Param {
68    pub memref: Memref,
69    pub value: Value,
70}
71
72#[repr(C)]
73pub struct __TEE_TASessionHandle {
74    _unused: [u8; 0],
75}
76#[allow(non_camel_case_types)]
77pub type TEE_TASessionHandle = *mut __TEE_TASessionHandle;
78
79#[repr(C)]
80pub struct __TEE_PropSetHandle {
81    _unused: [u8; 0],
82}
83#[allow(non_camel_case_types)]
84pub type TEE_PropSetHandle = *mut __TEE_PropSetHandle;
85
86#[repr(C)]
87pub struct __TEE_ObjectHandle {
88    _unused: [u8; 0],
89}
90#[allow(non_camel_case_types)]
91pub type TEE_ObjectHandle = *mut __TEE_ObjectHandle;
92
93#[repr(C)]
94pub struct __TEE_ObjectEnumHandle {
95    _unused: [u8; 0],
96}
97#[allow(non_camel_case_types)]
98pub type TEE_ObjectEnumHandle = *mut __TEE_ObjectEnumHandle;
99
100#[allow(non_camel_case_types)]
101#[repr(C)]
102pub struct TEE_OperationHandle {
103    /// 操作信息
104    pub info: TEE_OperationInfo,
105    /// 第一个密钥句柄
106    pub key1: TEE_ObjectHandle,
107    /// 第二个密钥句柄
108    pub key2: TEE_ObjectHandle,
109    /// 操作状态:INITIAL 或 ACTIVE
110    pub operation_state: u32,
111
112    /// 用于收集完整块或保存完整摘要的缓冲区
113    /// 对应 C 语言中的 uint8_t *buffer
114    pub buffer: *mut u8,
115    /// 是否需要缓冲两个块
116    pub buffer_two_blocks: bool,
117    /// 密码块大小
118    pub block_size: usize,
119    /// 缓冲区偏移量
120    pub buffer_offs: usize,
121    /// TEE Core 中的状态句柄
122    pub state: u32,
123}
124
125impl Default for TEE_OperationHandle {
126    fn default() -> Self {
127        TEE_OperationHandle {
128            info: TEE_OperationInfo::default(),
129            key1: core::ptr::null_mut(),
130            key2: core::ptr::null_mut(),
131            operation_state: 0,
132            buffer: core::ptr::null_mut(),
133            buffer_two_blocks: false,
134            block_size: 0,
135            buffer_offs: 0,
136            state: 0,
137        }
138    }
139}
140
141// Storage Definitions
142
143#[allow(non_camel_case_types)]
144pub type TEE_ObjectType = u32;
145
146#[repr(C)]
147#[derive(Debug, Default)]
148pub struct TEE_ObjectInfo {
149    pub objectType: u32,
150    pub objectSize: u32,
151    pub maxObjectSize: u32,
152    pub objectUsage: u32,
153    pub dataSize: usize,
154    pub dataPosition: usize,
155    pub handleFlags: u32,
156}
157
158// Reserve the GP 1.1.1 type
159#[repr(C)]
160#[derive(Copy, Clone)]
161pub enum TEE_Whence {
162    TEE_DATA_SEEK_SET,
163    TEE_DATA_SEEK_CUR,
164    TEE_DATA_SEEK_END,
165}
166
167#[derive(Copy, Clone)]
168#[repr(C)]
169pub union content {
170    pub memref: Memref,
171    pub value: Value,
172}
173
174#[derive(Copy, Clone)]
175#[repr(C)]
176pub struct TEE_Attribute {
177    pub attributeID: u32,
178    pub content: content,
179}
180
181// Cryptographic Operations API
182
183// Reserve the GP 1.1.1 type
184#[repr(C)]
185pub enum TEE_OperationMode {
186    TEE_MODE_ENCRYPT,
187    TEE_MODE_DECRYPT,
188    TEE_MODE_SIGN,
189    TEE_MODE_VERIFY,
190    TEE_MODE_MAC,
191    TEE_MODE_DIGEST,
192    TEE_MODE_DERIVE,
193}
194
195#[repr(C)]
196#[derive(Default, Copy, Clone)]
197pub struct TEE_OperationInfo {
198    pub algorithm: u32,
199    pub operationClass: u32,
200    pub mode: u32,
201    pub digestLength: u32,
202    pub maxKeySize: u32,
203    pub keySize: u32,
204    pub requiredKeyUsage: u32,
205    pub handleState: u32,
206}
207
208#[repr(C)]
209pub struct TEE_OperationInfoKey {
210    pub keySize: u32,
211    pub requiredKeyUsage: u32,
212}
213
214#[repr(C)]
215pub struct TEE_OperationInfoMultiple {
216    pub algorithm: u32,
217    pub operationClass: u32,
218    pub mode: u32,
219    pub digestLength: u32,
220    pub maxKeySize: u32,
221    pub handleState: u32,
222    pub operationState: u32,
223    pub numberOfKeys: u32,
224    pub keyInformation: *mut TEE_OperationInfoKey,
225}
226
227// Time & Date API
228
229#[repr(C)]
230pub struct TEE_Time {
231    pub seconds: u32,
232    pub millis: u32,
233}
234
235// TEE Arithmetical APIs
236
237#[allow(non_camel_case_types)]
238pub type TEE_BigInt = u32;
239#[allow(non_camel_case_types)]
240pub type TEE_BigIntFMM = u32;
241#[allow(non_camel_case_types)]
242pub type TEE_BigIntFMMContext = u32;
243
244// Tee Secure Element APIs
245
246#[repr(C)]
247pub struct __TEE_SEServiceHandle {
248    _unused: [u8; 0],
249}
250#[allow(non_camel_case_types)]
251pub type TEE_SEServiceHandle = *mut __TEE_SEServiceHandle;
252#[repr(C)]
253pub struct __TEE_SEReaderHandle {
254    _unused: [u8; 0],
255}
256#[allow(non_camel_case_types)]
257pub type TEE_SEReaderHandle = *mut __TEE_SEReaderHandle;
258#[repr(C)]
259pub struct __TEE_SESessionHandle {
260    _unused: [u8; 0],
261}
262#[allow(non_camel_case_types)]
263pub type TEE_SESessionHandle = *mut __TEE_SESessionHandle;
264#[repr(C)]
265pub struct __TEE_SEChannelHandle {
266    _unused: [u8; 0],
267}
268#[allow(non_camel_case_types)]
269pub type TEE_SEChannelHandle = *mut __TEE_SEChannelHandle;
270
271#[repr(C)]
272pub struct TEE_SEReaderProperties {
273    pub sePresent: bool,
274    pub teeOnly: bool,
275    pub selectResponseEnable: bool,
276}
277
278#[repr(C)]
279pub struct TEE_SEAID {
280    pub buffer: *mut u8,
281    pub bufferLen: size_t,
282}
283
284// Other definitions
285#[allow(non_camel_case_types)]
286pub type TEE_ErrorOrigin = u32;
287#[allow(non_camel_case_types)]
288pub type TEE_Session = *mut c_void;
289
290pub const TEE_MEM_INPUT: u32 = 0x00000001;
291pub const TEE_MEM_OUTPUT: u32 = 0x00000002;
292pub const TEE_MEMREF_0_USED: u32 = 0x00000001;
293pub const TEE_MEMREF_1_USED: u32 = 0x00000002;
294pub const TEE_MEMREF_2_USED: u32 = 0x00000004;
295pub const TEE_MEMREF_3_USED: u32 = 0x00000008;
296pub const TEE_SE_READER_NAME_MAX: u32 = 20;