rust-libutee 0.1.1

Rust library for UTEE-related functionality.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
// SPDX-License-Identifier: Apache-2.0
// Copyright (C) 2025 KylinSoft Co., Ltd. <https://www.kylinos.cn/>
// See LICENSES for license details.
//
// This file has been modified by KylinSoft on 2025.

use super::tee_api_types::*;
use core::ptr::null;

pub const TEE_CORE_API_MAJOR_VERSION: u32 = 0x00000001;
pub const TEE_CORE_API_MINOR_VERSION: u32 = 0x00000003;
pub const TEE_CORE_API_MAINTENANCE_VERSION: u32 = 0x00000001;

pub const TEE_HANDLE_NULL: *const u32 = null();

pub const TEE_TIMEOUT_INFINITE: u32 = 0xFFFFFFFF;

// API Error Codes
pub const TEE_SUCCESS: u32 = 0x00000000;
pub const TEE_ERROR_CORRUPT_OBJECT: u32 = 0xF0100001;
pub const TEE_ERROR_CORRUPT_OBJECT_2: u32 = 0xF0100002;
pub const TEE_ERROR_STORAGE_NOT_AVAILABLE: u32 = 0xF0100003;
pub const TEE_ERROR_STORAGE_NOT_AVAILABLE_2: u32 = 0xF0100004;
pub const TEE_ERROR_UNSUPPORTED_VERSION: u32 = 0xF0100005;
pub const TEE_ERROR_CIPHERTEXT_INVALID: u32 = 0xF0100006;
pub const TEE_ERROR_GENERIC: u32 = 0xFFFF0000;
pub const TEE_ERROR_ACCESS_DENIED: u32 = 0xFFFF0001;
pub const TEE_ERROR_CANCEL: u32 = 0xFFFF0002;
pub const TEE_ERROR_ACCESS_CONFLICT: u32 = 0xFFFF0003;
pub const TEE_ERROR_EXCESS_DATA: u32 = 0xFFFF0004;
pub const TEE_ERROR_BAD_FORMAT: u32 = 0xFFFF0005;
pub const TEE_ERROR_BAD_PARAMETERS: u32 = 0xFFFF0006;
pub const TEE_ERROR_BAD_STATE: u32 = 0xFFFF0007;
pub const TEE_ERROR_ITEM_NOT_FOUND: u32 = 0xFFFF0008;
pub const TEE_ERROR_NOT_IMPLEMENTED: u32 = 0xFFFF0009;
pub const TEE_ERROR_NOT_SUPPORTED: u32 = 0xFFFF000A;
pub const TEE_ERROR_NO_DATA: u32 = 0xFFFF000B;
pub const TEE_ERROR_OUT_OF_MEMORY: u32 = 0xFFFF000C;
pub const TEE_ERROR_BUSY: u32 = 0xFFFF000D;
pub const TEE_ERROR_COMMUNICATION: u32 = 0xFFFF000E;
pub const TEE_ERROR_SECURITY: u32 = 0xFFFF000F;
pub const TEE_ERROR_SHORT_BUFFER: u32 = 0xFFFF0010;
pub const TEE_ERROR_EXTERNAL_CANCEL: u32 = 0xFFFF0011;
pub const TEE_ERROR_TIMEOUT: u32 = 0xFFFF3001;
pub const TEE_ERROR_OVERFLOW: u32 = 0xFFFF300F;
pub const TEE_ERROR_TARGET_DEAD: u32 = 0xFFFF3024;
pub const TEE_ERROR_STORAGE_NO_SPACE: u32 = 0xFFFF3041;
pub const TEE_ERROR_MAC_INVALID: u32 = 0xFFFF3071;
pub const TEE_ERROR_SIGNATURE_INVALID: u32 = 0xFFFF3072;
pub const TEE_ERROR_TIME_NOT_SET: u32 = 0xFFFF5000;
pub const TEE_ERROR_TIME_NEEDS_RESET: u32 = 0xFFFF5001;

// Parameter Type Constants
pub const TEE_PARAM_TYPE_NONE: u32 = 0;
pub const TEE_PARAM_TYPE_VALUE_INPUT: u32 = 1;
pub const TEE_PARAM_TYPE_VALUE_OUTPUT: u32 = 2;
pub const TEE_PARAM_TYPE_VALUE_INOUT: u32 = 3;
pub const TEE_PARAM_TYPE_MEMREF_INPUT: u32 = 5;
pub const TEE_PARAM_TYPE_MEMREF_OUTPUT: u32 = 6;
pub const TEE_PARAM_TYPE_MEMREF_INOUT: u32 = 7;

// Login Type Constants
pub const TEE_LOGIN_PUBLIC: u32 = 0x00000000;
pub const TEE_LOGIN_USER: u32 = 0x00000001;
pub const TEE_LOGIN_GROUP: u32 = 0x00000002;
pub const TEE_LOGIN_APPLICATION: u32 = 0x00000004;
pub const TEE_LOGIN_APPLICATION_USER: u32 = 0x00000005;
pub const TEE_LOGIN_APPLICATION_GROUP: u32 = 0x00000006;
pub const TEE_LOGIN_TRUSTED_APP: u32 = 0xF0000000;

// Origin Code Constants
pub const TEE_ORIGIN_API: u32 = 0x00000001;
pub const TEE_ORIGIN_COMMS: u32 = 0x00000002;
pub const TEE_ORIGIN_TEE: u32 = 0x00000003;
pub const TEE_ORIGIN_TRUSTED_APP: u32 = 0x00000004;

// Property Sets pseudo handles
pub const TEE_PROPSET_TEE_IMPLEMENTATION: TEE_PropSetHandle = 0xFFFFFFFD as *mut _;
pub const TEE_PROPSET_CURRENT_CLIENT: TEE_PropSetHandle = 0xFFFFFFFE as *mut _;
pub const TEE_PROPSET_CURRENT_TA: TEE_PropSetHandle = 0xFFFFFFFF as *mut _;

// Memory Access Rights Constants
pub const TEE_MEMORY_ACCESS_READ: u32 = 0x00000001;
pub const TEE_MEMORY_ACCESS_WRITE: u32 = 0x00000002;
pub const TEE_MEMORY_ACCESS_ANY_OWNER: u32 = 0x00000004;

// Memory Management Constants
pub const TEE_MALLOC_FILL_ZERO: u32 = 0x00000000;
pub const TEE_MALLOC_NO_FILL: u32 = 0x00000001;
pub const TEE_MALLOC_NO_SHARE: u32 = 0x00000002;

// TEE_Whence Constants
pub const TEE_DATA_SEEK_SET: u32 = 0x00000000;
pub const TEE_DATA_SEEK_CUR: u32 = 0x00000001;
pub const TEE_DATA_SEEK_END: u32 = 0x00000002;
pub const TEE_WHENCE_ILLEGAL_VALUE: u32 = 0x7FFFFFFF;

// TEE_OperationMode Values
pub const TEE_MODE_ENCRYPT: u32 = 0x00000000;
pub const TEE_MODE_DECRYPT: u32 = 0x00000001;
pub const TEE_MODE_SIGN: u32 = 0x00000002;
pub const TEE_MODE_VERIFY: u32 = 0x00000003;
pub const TEE_MODE_MAC: u32 = 0x00000004;
pub const TEE_MODE_DIGEST: u32 = 0x00000005;
pub const TEE_MODE_DERIVE: u32 = 0x00000006;
pub const TEE_MODE_ILLEGAL_VALUE: u32 = 0x7FFFFFFF;

// Other constants
pub const TEE_STORAGE_PRIVATE: u32 = 0x00000001;

pub const TEE_DATA_FLAG_ACCESS_READ: u32 = 0x00000001;
pub const TEE_DATA_FLAG_ACCESS_WRITE: u32 = 0x00000002;
pub const TEE_DATA_FLAG_ACCESS_WRITE_META: u32 = 0x00000004;
pub const TEE_DATA_FLAG_SHARE_READ: u32 = 0x00000010;
pub const TEE_DATA_FLAG_SHARE_WRITE: u32 = 0x00000020;
pub const TEE_DATA_FLAG_OVERWRITE: u32 = 0x00000400;
pub const TEE_DATA_MAX_POSITION: u32 = 0xFFFFFFFF;
pub const TEE_OBJECT_ID_MAX_LEN: u32 = 64;
pub const TEE_MAX_HASH_SIZE: u32 = 64; // SHA512 is the largest supported hash algorithm
pub const TEE_USAGE_EXTRACTABLE: u32 = 0x00000001;
pub const TEE_USAGE_ENCRYPT: u32 = 0x00000002;
pub const TEE_USAGE_DECRYPT: u32 = 0x00000004;
pub const TEE_USAGE_MAC: u32 = 0x00000008;
pub const TEE_USAGE_SIGN: u32 = 0x00000010;
pub const TEE_USAGE_VERIFY: u32 = 0x00000020;
pub const TEE_USAGE_DERIVE: u32 = 0x00000040;
pub const TEE_HANDLE_FLAG_PERSISTENT: u32 = 0x00010000;
pub const TEE_HANDLE_FLAG_INITIALIZED: u32 = 0x00020000;
pub const TEE_HANDLE_FLAG_KEY_SET: u32 = 0x00040000;
pub const TEE_HANDLE_FLAG_EXPECT_TWO_KEYS: u32 = 0x00080000;
pub const TEE_HANDLE_FLAG_EXTRACTING: u32 = 0x00100000;
pub const TEE_OPERATION_CIPHER: u32 = 1;
pub const TEE_OPERATION_MAC: u32 = 3;
pub const TEE_OPERATION_AE: u32 = 4;
pub const TEE_OPERATION_DIGEST: u32 = 5;
pub const TEE_OPERATION_ASYMMETRIC_CIPHER: u32 = 6;
pub const TEE_OPERATION_ASYMMETRIC_SIGNATURE: u32 = 7;
pub const TEE_OPERATION_KEY_DERIVATION: u32 = 8;
pub const TEE_OPERATION_STATE_INITIAL: u32 = 0x00000000;
pub const TEE_OPERATION_STATE_ACTIVE: u32 = 0x00000001;
pub const TEE_OPERATION_STATE_EXTRACTING: u32 = 0x00000002;

// below constants are not updated to 1.3.1
// Algorithm Identifiers
pub const TEE_ALG_AES_ECB_NOPAD: u32 = 0x10000010;
pub const TEE_ALG_AES_CBC_NOPAD: u32 = 0x10000110;
pub const TEE_ALG_AES_CTR: u32 = 0x10000210;
pub const TEE_ALG_AES_CTS: u32 = 0x10000310;
pub const TEE_ALG_AES_XTS: u32 = 0x10000410;
pub const TEE_ALG_AES_CBC_MAC_NOPAD: u32 = 0x30000110;
pub const TEE_ALG_AES_CBC_MAC_PKCS5: u32 = 0x30000510;
pub const TEE_ALG_AES_CMAC: u32 = 0x30000610;
pub const TEE_ALG_AES_CCM: u32 = 0x40000710;
pub const TEE_ALG_AES_GCM: u32 = 0x40000810;
pub const TEE_ALG_DES_ECB_NOPAD: u32 = 0x10000011;
pub const TEE_ALG_DES_CBC_NOPAD: u32 = 0x10000111;
pub const TEE_ALG_DES_CBC_MAC_NOPAD: u32 = 0x30000111;
pub const TEE_ALG_DES_CBC_MAC_PKCS5: u32 = 0x30000511;
pub const TEE_ALG_DES3_ECB_NOPAD: u32 = 0x10000013;
pub const TEE_ALG_DES3_CBC_NOPAD: u32 = 0x10000113;
pub const TEE_ALG_DES3_CBC_MAC_NOPAD: u32 = 0x30000113;
pub const TEE_ALG_DES3_CBC_MAC_PKCS5: u32 = 0x30000513;
pub const TEE_ALG_SM4_ECB_NOPAD: u32 = 0x10000014;
pub const TEE_ALG_SM4_CBC_NOPAD: u32 = 0x10000114;
pub const TEE_ALG_SM4_CTR: u32 = 0x10000214;
pub const TEE_ALG_SM4_CMAC: u32 = 0x30000614; // 对GP标准扩充
pub const TEE_ALG_SM4_CCM: u32 = 0x40000714; // 对GP标准扩充
pub const TEE_ALG_SM4_GCM: u32 = 0x40000814; // 对GP标准扩充
pub const TEE_ALG_RSASSA_PKCS1_V1_5_MD5: u32 = 0x70001830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_SHA1: u32 = 0x70002830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_SHA224: u32 = 0x70003830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_SHA256: u32 = 0x70004830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_SHA384: u32 = 0x70005830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_SHA512: u32 = 0x70006830;
pub const TEE_ALG_RSASSA_PKCS1_V1_5_MD5SHA1: u32 = 0x7000F830;
pub const TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1: u32 = 0x70212930;
pub const TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224: u32 = 0x70313930;
pub const TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256: u32 = 0x70414930;
pub const TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384: u32 = 0x70515930;
pub const TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512: u32 = 0x70616930;
pub const TEE_ALG_RSAES_PKCS1_V1_5: u32 = 0x60000130;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1: u32 = 0x60210230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA224: u32 = 0x60310230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA256: u32 = 0x60410230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA384: u32 = 0x60510230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA512: u32 = 0x60610230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA3_224: u32 = 0x60810230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA3_256: u32 = 0x60910230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA3_384: u32 = 0x60A10230;
pub const TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA3_512: u32 = 0x60B10230;
pub const TEE_ALG_RSA_NOPAD: u32 = 0x60000030;
pub const TEE_ALG_DSA_SHA1: u32 = 0x70002131;
pub const TEE_ALG_DSA_SHA224: u32 = 0x70003131;
pub const TEE_ALG_DSA_SHA256: u32 = 0x70004131;
pub const TEE_ALG_DSA_SHA3_224: u32 = 0x70008131;
pub const TEE_ALG_DSA_SHA3_256: u32 = 0x70009131;
pub const TEE_ALG_DSA_SHA3_384: u32 = 0x7000A131;
pub const TEE_ALG_DSA_SHA3_512: u32 = 0x7000B131;
pub const TEE_ALG_SM2_DSA_SM3: u32 = 0x70006045;
pub const TEE_ALG_DH_DERIVE_SHARED_SECRET: u32 = 0x80000032;
pub const TEE_ALG_SM2_KEP: u32 = 0x60000045;
pub const TEE_ALG_MD5: u32 = 0x50000001;
pub const TEE_ALG_SHA1: u32 = 0x50000002;
pub const TEE_ALG_SHA224: u32 = 0x50000003;
pub const TEE_ALG_SHA256: u32 = 0x50000004;
pub const TEE_ALG_SHA384: u32 = 0x50000005;
pub const TEE_ALG_SHA512: u32 = 0x50000006;
pub const TEE_ALG_MD5SHA1: u32 = 0x5000000F;
pub const TEE_ALG_HMAC_MD5: u32 = 0x30000001;
pub const TEE_ALG_HMAC_SHA1: u32 = 0x30000002;
pub const TEE_ALG_HMAC_SHA224: u32 = 0x30000003;
pub const TEE_ALG_HMAC_SHA256: u32 = 0x30000004;
pub const TEE_ALG_HMAC_SHA384: u32 = 0x30000005;
pub const TEE_ALG_HMAC_SHA512: u32 = 0x30000006;
pub const TEE_ALG_HMAC_SM3: u32 = 0x30000007;
pub const TEE_ALG_HMAC_SHA3_224: u32 = 0x30000008;
pub const TEE_ALG_HMAC_SHA3_256: u32 = 0x30000009;
pub const TEE_ALG_HMAC_SHA3_384: u32 = 0x3000000A;
pub const TEE_ALG_HMAC_SHA3_512: u32 = 0x3000000B;
pub const TEE_ALG_ECDSA_P192: u32 = 0x70001041;
pub const TEE_ALG_ECDSA_P224: u32 = 0x70002041;
pub const TEE_ALG_ECDSA_P256: u32 = 0x70003041;
pub const TEE_ALG_ECDSA_P384: u32 = 0x70004041;
pub const TEE_ALG_ECDSA_P521: u32 = 0x70005041;
pub const TEE_ALG_ECDH_P192: u32 = 0x80001042;
pub const TEE_ALG_ECDH_P224: u32 = 0x80002042;
pub const TEE_ALG_ECDH_P256: u32 = 0x80003042;
pub const TEE_ALG_ECDH_P384: u32 = 0x80004042;
pub const TEE_ALG_ECDH_P521: u32 = 0x80005042;
pub const TEE_ALG_SM2_PKE: u32 = 0x80000046;
pub const TEE_ALG_SM3: u32 = 0x50000007;
pub const TEE_ALG_HKDF: u32 = 0x80000047;
pub const TEE_ALG_ED25519: u32 = 0x70006043;
pub const TEE_ALG_X25519: u32 = 0x80000044;
pub const TEE_ALG_ILLEGAL_VALUE: u32 = 0xEFFFFFFF;

// TEE_ALG_ECDSA_P* and TEE_ALG_ECDH_P* are deprecated
pub const TEE_ALG_ECDH_DERIVE_SHARED_SECRET: u32 = 0x80000042;
pub const TEE_ALG_ECDSA_SHA1: u32 = 0x70001042;
pub const TEE_ALG_ECDSA_SHA224: u32 = 0x70002042;
pub const TEE_ALG_ECDSA_SHA256: u32 = 0x70003042;
pub const TEE_ALG_ECDSA_SHA384: u32 = 0x70004042;
pub const TEE_ALG_ECDSA_SHA512: u32 = 0x70005042;

pub const TEE_ALG_X448: u32 = 0x80000045;
pub const TEE_ALG_SHA3_224: u32 = 0x50000008;
pub const TEE_ALG_SHA3_256: u32 = 0x50000009;
pub const TEE_ALG_SHA3_384: u32 = 0x5000000A;
pub const TEE_ALG_SHA3_512: u32 = 0x5000000B;
pub const TEE_ALG_SHAKE128: u32 = 0x50000101;
pub const TEE_ALG_SHAKE256: u32 = 0x50000102;

// Copied from TEE Internal API specificaion v1.0 table 6-9 "Structure of
// Algorithm Identifier".
pub const TEE_MAIN_ALGO_MD5: u32 = 0x01;
pub const TEE_MAIN_ALGO_SHA1: u32 = 0x02;
pub const TEE_MAIN_ALGO_SHA224: u32 = 0x03;
pub const TEE_MAIN_ALGO_SHA256: u32 = 0x04;
pub const TEE_MAIN_ALGO_SHA384: u32 = 0x05;
pub const TEE_MAIN_ALGO_SHA512: u32 = 0x06;
pub const TEE_MAIN_ALGO_SM3: u32 = 0x07;
pub const TEE_MAIN_ALGO_SHA3_224: u32 = 0x08;
pub const TEE_MAIN_ALGO_SHA3_256: u32 = 0x09;
pub const TEE_MAIN_ALGO_SHA3_384: u32 = 0x0A;
pub const TEE_MAIN_ALGO_SHA3_512: u32 = 0x0B;
pub const TEE_MAIN_ALGO_AES: u32 = 0x10;
pub const TEE_MAIN_ALGO_DES: u32 = 0x11;
pub const TEE_MAIN_ALGO_DES2: u32 = 0x12;
pub const TEE_MAIN_ALGO_DES3: u32 = 0x13;
pub const TEE_MAIN_ALGO_SM4: u32 = 0x14; /* Not in v1.2, extrapolated */
pub const TEE_MAIN_ALGO_RSA: u32 = 0x30;
pub const TEE_MAIN_ALGO_DSA: u32 = 0x31;
pub const TEE_MAIN_ALGO_DH: u32 = 0x32;
pub const TEE_MAIN_ALGO_ECDSA: u32 = 0x41;
pub const TEE_MAIN_ALGO_ECDH: u32 = 0x42;
pub const TEE_MAIN_ALGO_ED25519: u32 = 0x43;
pub const TEE_MAIN_ALGO_X25519: u32 = 0x44; /* Not in v1.2 spec */
pub const TEE_MAIN_ALGO_SM2_DSA_SM3: u32 = 0x45; /* Not in v1.2 spec */
pub const TEE_MAIN_ALGO_SM2_KEP: u32 = 0x46; /* Not in v1.2 spec */
pub const TEE_MAIN_ALGO_SM2_PKE: u32 = 0x47; /* Not in v1.2 spec */
pub const TEE_MAIN_ALGO_HKDF: u32 = 0xC0; /* OP-TEE extension */
pub const TEE_MAIN_ALGO_CONCAT_KDF: u32 = 0xC1;
pub const TEE_MAIN_ALGO_PBKDF2: u32 = 0xC2; /* OP-TEE extension */
pub const TEE_MAIN_ALGO_SHAKE128: u32 = 0xC3; /* OP-TEE extension */
pub const TEE_MAIN_ALGO_SHAKE256: u32 = 0xC4; /* OP-TEE extension */
pub const TEE_MAIN_ALGO_X448: u32 = 0x49;

// Object Types
pub const TEE_TYPE_AES: u32 = 0xA0000010;
pub const TEE_TYPE_DES: u32 = 0xA0000011;
pub const TEE_TYPE_DES3: u32 = 0xA0000013;
pub const TEE_TYPE_SM4: u32 = 0xA0000014;
pub const TEE_TYPE_HMAC_MD5: u32 = 0xA0000001;
pub const TEE_TYPE_HMAC_SHA1: u32 = 0xA0000002;
pub const TEE_TYPE_HMAC_SHA224: u32 = 0xA0000003;
pub const TEE_TYPE_HMAC_SHA256: u32 = 0xA0000004;
pub const TEE_TYPE_HMAC_SHA384: u32 = 0xA0000005;
pub const TEE_TYPE_HMAC_SHA512: u32 = 0xA0000006;
pub const TEE_TYPE_HMAC_SM3: u32 = 0xA0000007;
pub const TEE_TYPE_HMAC_SHA3_224: u32 = 0xA0000008;
pub const TEE_TYPE_HMAC_SHA3_256: u32 = 0xA0000009;
pub const TEE_TYPE_HMAC_SHA3_384: u32 = 0xA000000A;
pub const TEE_TYPE_HMAC_SHA3_512: u32 = 0xA000000B;
pub const TEE_TYPE_RSA_PUBLIC_KEY: u32 = 0xA0000030;
pub const TEE_TYPE_RSA_KEYPAIR: u32 = 0xA1000030;
pub const TEE_TYPE_DSA_PUBLIC_KEY: u32 = 0xA0000031;
pub const TEE_TYPE_DSA_KEYPAIR: u32 = 0xA1000031;
pub const TEE_TYPE_DH_KEYPAIR: u32 = 0xA1000032;
pub const TEE_TYPE_ECDSA_PUBLIC_KEY: u32 = 0xA0000041;
pub const TEE_TYPE_ECDSA_KEYPAIR: u32 = 0xA1000041;
pub const TEE_TYPE_ECDH_PUBLIC_KEY: u32 = 0xA0000042;
pub const TEE_TYPE_ECDH_KEYPAIR: u32 = 0xA1000042;
pub const TEE_TYPE_ED25519_PUBLIC_KEY: u32 = 0xA0000043;
pub const TEE_TYPE_ED25519_KEYPAIR: u32 = 0xA1000043;
pub const TEE_TYPE_ED448_PUBLIC_KEY: u32 = 0xA0000048;
pub const TEE_TYPE_ED448_KEYPAIR: u32 = 0xA1000048;
pub const TEE_TYPE_X448_PUBLIC_KEY: u32 = 0xA0000049;
pub const TEE_TYPE_X448_KEYPAIR: u32 = 0xA1000049;
pub const TEE_TYPE_SM2_DSA_PUBLIC_KEY: u32 = 0xA0000045;
pub const TEE_TYPE_SM2_DSA_KEYPAIR: u32 = 0xA1000045;
pub const TEE_TYPE_SM2_KEP_PUBLIC_KEY: u32 = 0xA0000046;
pub const TEE_TYPE_SM2_KEP_KEYPAIR: u32 = 0xA1000046;
pub const TEE_TYPE_SM2_PKE_PUBLIC_KEY: u32 = 0xA0000047;
pub const TEE_TYPE_SM2_PKE_KEYPAIR: u32 = 0xA1000047;
pub const TEE_TYPE_GENERIC_SECRET: u32 = 0xA0000000;
pub const TEE_TYPE_CORRUPTED_OBJECT: u32 = 0xA00000BE;
pub const TEE_TYPE_DATA: u32 = 0xA00000BF;
pub const TEE_TYPE_X25519_PUBLIC_KEY: u32 = 0xA0000044;
pub const TEE_TYPE_X25519_KEYPAIR: u32 = 0xA1000044;
pub const TEE_TYPE_HKDF_IKM: u32 = 0xA10000C0;
pub const TEE_TYPE_CONCAT_KDF_Z: u32 = 0xA10000C1;
pub const TEE_TYPE_PBKDF2_PASSWORD: u32 = 0xA10000C2;

// List of Object or Operation Attributes
pub const TEE_ATTR_SECRET_VALUE: u32 = 0xC0000000;
pub const TEE_ATTR_RSA_MODULUS: u32 = 0xD0000130;
pub const TEE_ATTR_RSA_PUBLIC_EXPONENT: u32 = 0xD0000230;
pub const TEE_ATTR_RSA_PRIVATE_EXPONENT: u32 = 0xC0000330;
pub const TEE_ATTR_RSA_PRIME1: u32 = 0xC0000430;
pub const TEE_ATTR_RSA_PRIME2: u32 = 0xC0000530;
pub const TEE_ATTR_RSA_EXPONENT1: u32 = 0xC0000630;
pub const TEE_ATTR_RSA_EXPONENT2: u32 = 0xC0000730;
pub const TEE_ATTR_RSA_COEFFICIENT: u32 = 0xC0000830;
pub const TEE_ATTR_DSA_PRIME: u32 = 0xD0001031;
pub const TEE_ATTR_DSA_SUBPRIME: u32 = 0xD0001131;
pub const TEE_ATTR_DSA_BASE: u32 = 0xD0001231;
pub const TEE_ATTR_DSA_PUBLIC_VALUE: u32 = 0xD0000131;
pub const TEE_ATTR_DSA_PRIVATE_VALUE: u32 = 0xC0000231;
pub const TEE_ATTR_DH_PRIME: u32 = 0xD0001032;
pub const TEE_ATTR_DH_SUBPRIME: u32 = 0xD0001132;
pub const TEE_ATTR_DH_BASE: u32 = 0xD0001232;
pub const TEE_ATTR_DH_X_BITS: u32 = 0xF0001332;
pub const TEE_ATTR_DH_PUBLIC_VALUE: u32 = 0xD0000132;
pub const TEE_ATTR_DH_PRIVATE_VALUE: u32 = 0xC0000232;
pub const TEE_ATTR_RSA_OAEP_LABEL: u32 = 0xD0000930;
pub const TEE_ATTR_RSA_PSS_SALT_LENGTH: u32 = 0xF0000A30;
pub const TEE_ATTR_ECC_PUBLIC_VALUE_X: u32 = 0xD0000141;
pub const TEE_ATTR_ECC_PUBLIC_VALUE_Y: u32 = 0xD0000241;
pub const TEE_ATTR_ECC_PRIVATE_VALUE: u32 = 0xC0000341;
pub const TEE_ATTR_ECC_CURVE: u32 = 0xF0000441;
pub const TEE_ATTR_SM2_ID_INITIATOR: u32 = 0xD0000446;
pub const TEE_ATTR_SM2_ID_RESPONDER: u32 = 0xD0000546;
pub const TEE_ATTR_SM2_KEP_USER: u32 = 0xF0000646;
pub const TEE_ATTR_SM2_KEP_CONFIRMATION_IN: u32 = 0xD0000746;
pub const TEE_ATTR_SM2_KEP_CONFIRMATION_OUT: u32 = 0xD0000846;
pub const TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X: u32 = 0xD0000946;
pub const TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y: u32 = 0xD0000A46;
pub const TEE_ATTR_FLAG_PUBLIC: u32 = 1 << 28;
pub const TEE_ATTR_FLAG_VALUE: u32 = 1 << 29;
// Deprecated, but kept for backwards compatibility
pub const TEE_ATTR_BIT_PROTECTED: u32 = 1 << 28;
pub const TEE_ATTR_BIT_VALUE: u32 = 1 << 29;

// List of Supported ECC Curves
pub const TEE_CRYPTO_ELEMENT_NONE: u32 = 0x00000000;
pub const TEE_ECC_CURVE_NIST_P192: u32 = 0x00000001;
pub const TEE_ECC_CURVE_NIST_P224: u32 = 0x00000002;
pub const TEE_ECC_CURVE_NIST_P256: u32 = 0x00000003;
pub const TEE_ECC_CURVE_NIST_P384: u32 = 0x00000004;
pub const TEE_ECC_CURVE_NIST_P521: u32 = 0x00000005;
pub const TEE_ECC_CURVE_SM2: u32 = 0x00000300;

// Panicked Functions Identification
// TA Interface
pub const TEE_PANIC_ID_TA_CLOSESESSIONENTRYPOINT: u32 = 0x00000101;
pub const TEE_PANIC_ID_TA_CREATEENTRYPOINT: u32 = 0x00000102;
pub const TEE_PANIC_ID_TA_DESTROYENTRYPOINT: u32 = 0x00000103;
pub const TEE_PANIC_ID_TA_INVOKECOMMANDENTRYPOINT: u32 = 0x00000104;
pub const TEE_PANIC_ID_TA_OPENSESSIONENTRYPOINT: u32 = 0x00000105;
/* Property Access */
pub const TEE_PANIC_ID_TEE_ALLOCATEPROPERTYENUMERATOR: u32 = 0x00000201;
pub const TEE_PANIC_ID_TEE_FREEPROPERTYENUMERATOR: u32 = 0x00000202;
pub const TEE_PANIC_ID_TEE_GETNEXTPROPERTY: u32 = 0x00000203;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASBINARYBLOCK: u32 = 0x00000204;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASBOOL: u32 = 0x00000205;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASIDENTITY: u32 = 0x00000206;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASSTRING: u32 = 0x00000207;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASU32: u32 = 0x00000208;
pub const TEE_PANIC_ID_TEE_GETPROPERTYASUUID: u32 = 0x00000209;
pub const TEE_PANIC_ID_TEE_GETPROPERTYNAME: u32 = 0x0000020A;
pub const TEE_PANIC_ID_TEE_RESETPROPERTYENUMERATOR: u32 = 0x0000020B;
pub const TEE_PANIC_ID_TEE_STARTPROPERTYENUMERATOR: u32 = 0x0000020C;
// Panic Function
pub const TEE_PANIC_ID_TEE_PANIC: u32 = 0x00000301;
// Internal Client API
pub const TEE_PANIC_ID_TEE_CLOSETASESSION: u32 = 0x00000401;
pub const TEE_PANIC_ID_TEE_INVOKETACOMMAND: u32 = 0x00000402;
pub const TEE_PANIC_ID_TEE_OPENTASESSION: u32 = 0x00000403;
// Cancellation
pub const TEE_PANIC_ID_TEE_GETCANCELLATIONFLAG: u32 = 0x00000501;
pub const TEE_PANIC_ID_TEE_MASKCANCELLATION: u32 = 0x00000502;
pub const TEE_PANIC_ID_TEE_UNMASKCANCELLATION: u32 = 0x00000503;
// Memory Management
pub const TEE_PANIC_ID_TEE_CHECKMEMORYACCESSRIGHTS: u32 = 0x00000601;
pub const TEE_PANIC_ID_TEE_FREE: u32 = 0x00000602;
pub const TEE_PANIC_ID_TEE_GETINSTANCEDATA: u32 = 0x00000603;
pub const TEE_PANIC_ID_TEE_MALLOC: u32 = 0x00000604;
pub const TEE_PANIC_ID_TEE_MEMCOMPARE: u32 = 0x00000605;
pub const TEE_PANIC_ID_TEE_MEMFILL: u32 = 0x00000606;
pub const TEE_PANIC_ID_TEE_MEMMOVE: u32 = 0x00000607;
pub const TEE_PANIC_ID_TEE_REALLOC: u32 = 0x00000608;
pub const TEE_PANIC_ID_TEE_SETINSTANCEDATA: u32 = 0x00000609;
// Generic Object
pub const TEE_PANIC_ID_TEE_CLOSEOBJECT: u32 = 0x00000701;
pub const TEE_PANIC_ID_TEE_GETOBJECTBUFFERATTRIBUTE: u32 = 0x00000702;
// deprecated
pub const TEE_PANIC_ID_TEE_GETOBJECTINFO: u32 = 0x00000703;
pub const TEE_PANIC_ID_TEE_GETOBJECTVALUEATTRIBUTE: u32 = 0x00000704;
// deprecated
pub const TEE_PANIC_ID_TEE_RESTRICTOBJECTUSAGE: u32 = 0x00000705;
pub const TEE_PANIC_ID_TEE_GETOBJECTINFO1: u32 = 0x00000706;
pub const TEE_PANIC_ID_TEE_RESTRICTOBJECTUSAGE1: u32 = 0x00000707;
// Transient Object
pub const TEE_PANIC_ID_TEE_ALLOCATETRANSIENTOBJECT: u32 = 0x00000801;
// deprecated
pub const TEE_PANIC_ID_TEE_COPYOBJECTATTRIBUTES: u32 = 0x00000802;
pub const TEE_PANIC_ID_TEE_FREETRANSIENTOBJECT: u32 = 0x00000803;
pub const TEE_PANIC_ID_TEE_GENERATEKEY: u32 = 0x00000804;
pub const TEE_PANIC_ID_TEE_INITREFATTRIBUTE: u32 = 0x00000805;
pub const TEE_PANIC_ID_TEE_INITVALUEATTRIBUTE: u32 = 0x00000806;
pub const TEE_PANIC_ID_TEE_POPULATETRANSIENTOBJECT: u32 = 0x00000807;
pub const TEE_PANIC_ID_TEE_RESETTRANSIENTOBJECT: u32 = 0x00000808;
pub const TEE_PANIC_ID_TEE_COPYOBJECTATTRIBUTES1: u32 = 0x00000809;
// Persistent Object
// deprecated
pub const TEE_PANIC_ID_TEE_CLOSEANDDELETEPERSISTENTOBJECT: u32 = 0x00000901;
pub const TEE_PANIC_ID_TEE_CREATEPERSISTENTOBJECT: u32 = 0x00000902;
pub const TEE_PANIC_ID_TEE_OPENPERSISTENTOBJECT: u32 = 0x00000903;
pub const TEE_PANIC_ID_TEE_RENAMEPERSISTENTOBJECT: u32 = 0x00000904;
pub const TEE_PANIC_ID_TEE_CLOSEANDDELETEPERSISTENTOBJECT1: u32 = 0x00000905;
// Persistent Object Enumeration
pub const TEE_PANIC_ID_TEE_ALLOCATEPERSISTENTOBJECTENUMERATOR: u32 = 0x00000A01;
pub const TEE_PANIC_ID_TEE_FREEPERSISTENTOBJECTENUMERATOR: u32 = 0x00000A02;
pub const TEE_PANIC_ID_TEE_GETNEXTPERSISTENTOBJECT: u32 = 0x00000A03;
pub const TEE_PANIC_ID_TEE_RESETPERSISTENTOBJECTENUMERATOR: u32 = 0x00000A04;
pub const TEE_PANIC_ID_TEE_STARTPERSISTENTOBJECTENUMERATOR: u32 = 0x00000A05;
// Data Stream Access
pub const TEE_PANIC_ID_TEE_READOBJECTDATA: u32 = 0x00000B01;
pub const TEE_PANIC_ID_TEE_SEEKOBJECTDATA: u32 = 0x00000B02;
pub const TEE_PANIC_ID_TEE_TRUNCATEOBJECTDATA: u32 = 0x00000B03;
pub const TEE_PANIC_ID_TEE_WRITEOBJECTDATA: u32 = 0x00000B04;
// Generic Operation
pub const TEE_PANIC_ID_TEE_ALLOCATEOPERATION: u32 = 0x00000C01;
pub const TEE_PANIC_ID_TEE_COPYOPERATION: u32 = 0x00000C02;
pub const TEE_PANIC_ID_TEE_FREEOPERATION: u32 = 0x00000C03;
pub const TEE_PANIC_ID_TEE_GETOPERATIONINFO: u32 = 0x00000C04;
pub const TEE_PANIC_ID_TEE_RESETOPERATION: u32 = 0x00000C05;
pub const TEE_PANIC_ID_TEE_SETOPERATIONKEY: u32 = 0x00000C06;
pub const TEE_PANIC_ID_TEE_SETOPERATIONKEY2: u32 = 0x00000C07;
pub const TEE_PANIC_ID_TEE_GETOPERATIONINFOMULTIPLE: u32 = 0x00000C08;
// Message Digest
pub const TEE_PANIC_ID_TEE_DIGESTDOFINAL: u32 = 0x00000D01;
pub const TEE_PANIC_ID_TEE_DIGESTUPDATE: u32 = 0x00000D02;
// Symmetric Cipher
pub const TEE_PANIC_ID_TEE_CIPHERDOFINAL: u32 = 0x00000E01;
pub const TEE_PANIC_ID_TEE_CIPHERINIT: u32 = 0x00000E02;
pub const TEE_PANIC_ID_TEE_CIPHERUPDATE: u32 = 0x00000E03;
// MAC
pub const TEE_PANIC_ID_TEE_MACCOMPAREFINAL: u32 = 0x00000F01;
pub const TEE_PANIC_ID_TEE_MACCOMPUTEFINAL: u32 = 0x00000F02;
pub const TEE_PANIC_ID_TEE_MACINIT: u32 = 0x00000F03;
pub const TEE_PANIC_ID_TEE_MACUPDATE: u32 = 0x00000F04;
// Authenticated Encryption
pub const TEE_PANIC_ID_TEE_AEDECRYPTFINAL: u32 = 0x00001001;
pub const TEE_PANIC_ID_TEE_AEENCRYPTFINAL: u32 = 0x00001002;
pub const TEE_PANIC_ID_TEE_AEINIT: u32 = 0x00001003;
pub const TEE_PANIC_ID_TEE_AEUPDATE: u32 = 0x00001004;
pub const TEE_PANIC_ID_TEE_AEUPDATEAAD: u32 = 0x00001005;
// Asymmetric
pub const TEE_PANIC_ID_TEE_ASYMMETRICDECRYPT: u32 = 0x00001101;
pub const TEE_PANIC_ID_TEE_ASYMMETRICENCRYPT: u32 = 0x00001102;
pub const TEE_PANIC_ID_TEE_ASYMMETRICSIGNDIGEST: u32 = 0x00001103;
pub const TEE_PANIC_ID_TEE_ASYMMETRICVERIFYDIGEST: u32 = 0x00001104;
// Key Derivation
pub const TEE_PANIC_ID_TEE_DERIVEKEY: u32 = 0x00001201;
// Random Data Generation
pub const TEE_PANIC_ID_TEE_GENERATERANDOM: u32 = 0x00001301;
// Time
pub const TEE_PANIC_ID_TEE_GETREETIME: u32 = 0x00001401;
pub const TEE_PANIC_ID_TEE_GETSYSTEMTIME: u32 = 0x00001402;
pub const TEE_PANIC_ID_TEE_GETTAPERSISTENTTIME: u32 = 0x00001403;
pub const TEE_PANIC_ID_TEE_SETTAPERSISTENTTIME: u32 = 0x00001404;
pub const TEE_PANIC_ID_TEE_WAIT: u32 = 0x00001405;
// Memory Allocation and Size of Objects
pub const TEE_PANIC_ID_TEE_BIGINTFMMCONTEXTSIZEINU32: u32 = 0x00001501;
pub const TEE_PANIC_ID_TEE_BIGINTFMMSIZEINU32: u32 = 0x00001502;
// Initialization
pub const TEE_PANIC_ID_TEE_BIGINTINIT: u32 = 0x00001601;
pub const TEE_PANIC_ID_TEE_BIGINTINITFMM: u32 = 0x00001602;
pub const TEE_PANIC_ID_TEE_BIGINTINITFMMCONTEXT: u32 = 0x00001603;
// Converter
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTFROMOCTETSTRING: u32 = 0x00001701;
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTFROMS32: u32 = 0x00001702;
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTTOOCTETSTRING: u32 = 0x00001703;
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTTOS32: u32 = 0x00001704;
// Logical Operation
pub const TEE_PANIC_ID_TEE_BIGINTCMP: u32 = 0x00001801;
pub const TEE_PANIC_ID_TEE_BIGINTCMPS32: u32 = 0x00001802;
pub const TEE_PANIC_ID_TEE_BIGINTGETBIT: u32 = 0x00001803;
pub const TEE_PANIC_ID_TEE_BIGINTGETBITCOUNT: u32 = 0x00001804;
pub const TEE_PANIC_ID_TEE_BIGINTSHIFTRIGHT: u32 = 0x00001805;
// Basic Arithmetic
pub const TEE_PANIC_ID_TEE_BIGINTADD: u32 = 0x00001901;
pub const TEE_PANIC_ID_TEE_BIGINTDIV: u32 = 0x00001902;
pub const TEE_PANIC_ID_TEE_BIGINTMUL: u32 = 0x00001903;
pub const TEE_PANIC_ID_TEE_BIGINTNEG: u32 = 0x00001904;
pub const TEE_PANIC_ID_TEE_BIGINTSQUARE: u32 = 0x00001905;
pub const TEE_PANIC_ID_TEE_BIGINTSUB: u32 = 0x00001906;
// Modular Arithmetic
pub const TEE_PANIC_ID_TEE_BIGINTADDMOD: u32 = 0x00001A01;
pub const TEE_PANIC_ID_TEE_BIGINTINVMOD: u32 = 0x00001A02;
pub const TEE_PANIC_ID_TEE_BIGINTMOD: u32 = 0x00001A03;
pub const TEE_PANIC_ID_TEE_BIGINTMULMOD: u32 = 0x00001A04;
pub const TEE_PANIC_ID_TEE_BIGINTSQUAREMOD: u32 = 0x00001A05;
pub const TEE_PANIC_ID_TEE_BIGINTSUBMOD: u32 = 0x00001A06;
// Other Arithmetic
pub const TEE_PANIC_ID_TEE_BIGINTCOMPUTEEXTENDEDGCD: u32 = 0x00001B01;
pub const TEE_PANIC_ID_TEE_BIGINTISPROBABLEPRIME: u32 = 0x00001B02;
pub const TEE_PANIC_ID_TEE_BIGINTRELATIVEPRIME: u32 = 0x00001B03;
// Fast Modular Multiplication
pub const TEE_PANIC_ID_TEE_BIGINTCOMPUTEFMM: u32 = 0x00001C01;
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTFROMFMM: u32 = 0x00001C02;
pub const TEE_PANIC_ID_TEE_BIGINTCONVERTTOFMM: u32 = 0x00001C03;

pub fn TEE_PARAM_TYPES(t0: u32, t1: u32, t2: u32, t3: u32) -> u32 {
    t0 | t1 << 4 | t2 << 8 | t3 << 12
}

pub const TEE_NUM_PARAMS: u32 = 4;

// Extract the type of a given parameter from paramTypes if you need more
// fine-grained type checking.
pub fn TEE_PARAM_TYPE_GET(param_types: u32, index: u32) -> u32 {
    if index >= 4 {
        return 0;
    }
    (param_types >> (index * 4)) & 0xF
}