// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

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_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_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_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_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_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 = 0x80000045;
pub const TEE_ALG_SM3: u32 = 0x50000007;
pub const TEE_ALG_ILLEGAL_VALUE: u32 = 0xEFFFFFFF;

// 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_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_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;

// 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;
