| /* |
| * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved. |
| * |
| * Licensed 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. |
| */ |
| |
| /****************************************************************************** |
| * @file drv_tee.h |
| * @brief Header File for TEE |
| * @version V1.0 |
| * @date 12 Sep 2017 |
| ******************************************************************************/ |
| #ifndef _CSI_AES_H_ |
| #define _CSI_AES_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <stdint.h> |
| |
| /****** TEE AES mode *****/ |
| typedef enum { |
| TEE_AES_MODE_ECB = 0, ///< TEE AES ECB mode |
| TEE_AES_MODE_CBC = 1, ///< TEE AES CBC mode |
| TEE_AES_MODE_MAX, ///< invaild mode |
| } |
| tee_aes_mode_e; |
| |
| /** |
| \brief TEE AES encrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to plaintext buffer |
| \param[in] in_len Plaintext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to ciphertext buffer |
| \param[in] mode \ref tee_aes_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_aes_encrypt(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t iv[16], |
| uint8_t *out, |
| tee_aes_mode_e mode); |
| |
| /** |
| \brief TEE AES decrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to plaintext buffer |
| \param[in] mode \ref tee_aes_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_aes_decrypt(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t iv[16], |
| uint8_t *out, |
| uint32_t mode); |
| |
| /** |
| \brief TEE AES ECB encrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to plaintext buffer |
| \param[in] in_len Plaintext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to ciphertext buffer |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_aes_encrypt_ecb(in, in_len, key, key_len, out) \ |
| csi_tee_aes_encrypt(in, in_len, key, key_len, NULL, out, TEE_AES_MODE_ECB) |
| |
| /** |
| \brief TEE AES ECB decrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to plaintext buffer |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_aes_decrypt_ecb(in, in_len, key, key_len, out) \ |
| csi_tee_aes_decrypt(in, in_len, key, key_len, NULL, out, TEE_AES_MODE_ECB) |
| |
| /** |
| \brief TEE AES CBC encrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to plaintext buffer |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_aes_encrypt_cbc(in, in_len, key, key_len, iv, out) \ |
| csi_tee_aes_encrypt(in, in_len, key, key_len, iv, out, TEE_AES_MODE_CBC) |
| |
| /** |
| \brief TEE AES CBC decrypt |
| \note Length should be a multiple of the block size (16 bytes) |
| After calling this function, the content of iv is updated. |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to secret key |
| \param[in] key_len Secret key size,must be 16 bytes for AES128,24 bytes for AES192 or 32byes for AES256 |
| \param[out] out Pointer to plaintext buffer |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_aes_decrypt_cbc(in, in_len, key, key_len, iv, out) \ |
| csi_tee_aes_decrypt(in, in_len, key, key_len, iv, out, TEE_AES_MODE_CBC) |
| |
| /** |
| \brief TEE BASE64 encode/decode |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len input data buffer length |
| \param[out] out Pointer to output data buffer |
| \param[out] out_len output data buffer length |
| \param[in] is_encode 1 encode 0 decode |
| \param[in] wsafe base64 websafe feature,set 1, replace "+/" with "-_" |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_base64(const uint8_t *in, uint32_t in_len, |
| uint8_t *out, uint32_t *out_len, |
| uint32_t is_encode, |
| uint32_t wsafe); |
| |
| /** |
| \brief TEE BASE64 encode |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len input data buffer length |
| \param[out] out Pointer to output data buffer |
| \param[out] out_len output data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_base64_encode(in,in_len,out,out_len) \ |
| csi_tee_base64(in,in_len,out,out_len,1,0) |
| |
| /** |
| \brief TEE BASE64 decode |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len input data buffer length |
| \param[out] out Pointer to output data buffer |
| \param[out] out_len output data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_base64_decode(in,in_len,out,out_len) \ |
| csi_tee_base64(in,in_len,out,out_len,0,0) |
| |
| /** |
| \brief TEE BASE64 web safe encode |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len input data buffer length |
| \param[out] out Pointer to output data buffer |
| \param[out] out_len output data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_base64_websafe_encode(in,in_len,out,out_len) \ |
| csi_tee_base64(in,in_len,out,out_len,1,1) |
| |
| /** |
| \brief TEE BASE64 web safe decode |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len input data buffer length |
| \param[out] out Pointer to output data buffer |
| \param[out] out_len output data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_base64_websafe_decode(in,in_len,out,out_len) \ |
| csi_tee_base64(in,in_len,out,out_len,0,1) |
| |
| /** |
| \brief TEE obtain CID from Key Provisioning |
| \param[out] out Pointer to cid buffer |
| \param[out] out_len cid buffer length,if cid obtain successfully, |
| out_len is updated to actual cid sizes |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_get_cid(uint8_t *out, uint32_t *out_len); |
| |
| /****** lpm mode *****/ |
| typedef enum { |
| TEE_LPM_MODE_WAIT = 0, ///< lpm wait |
| TEE_LPM_MODE_DOZE = 1, ///< lpm doze |
| TEE_LPM_MODE_STOP = 2, ///< lpm stop |
| TEE_LPM_MODE_STANDBY = 3, ///< lpm standby |
| TEE_LPM_MODE_MAX, |
| } tee_lpm_mode_e; |
| |
| /** |
| \brief TEE set low power mode |
| \param[in] gate not use for now |
| \param[in] irqid not use for now |
| \param[in] mode \ref tee_lpm_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_enter_lpm(uint32_t gate, uint32_t irqid, tee_lpm_mode_e mode); |
| |
| /** |
| \brief TEE obtain manifest info from manifest table |
| \note call csi_tee_get_sys_img_info, csi_tee_get_sys_os_version or csi_tee_get_sys_partition is better |
| \param[out] out Pointer to info buffer |
| \param[out] out_len Info buffer length,if info obtain successfully, |
| out_len is updated to actual sizes |
| \param[in] name info name |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_get_manifest_info(uint8_t *out, uint32_t *out_len, char *name); |
| |
| /** |
| \brief TEE obtain image buffer from manifest table |
| \param[out] out Pointer to image buffer |
| \param[out] out_len Image buffer length,if info obtain successfully, |
| out_len is updated to actual image buffer sizes |
| \param[in] img_name image name |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_get_sys_img_info(out,out_len,img_name) \ |
| csi_tee_get_manifest_info(out,out_len,img_name) |
| |
| /** |
| \brief TEE obtain os version from manifest table |
| \param[out] out Pointer to os version buffer |
| \param[out] out_len OS version buffer length,if info obtain successfully, |
| out_len is updated to actual os version buffer sizes |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_get_sys_os_version(out,out_len) \ |
| csi_tee_get_manifest_info(out,out_len,"os_v") |
| |
| /** |
| \brief TEE obtain partition buffer from manifest table |
| \param[out] out Pointer to partition buffer |
| \param[out] out_len Partition buffer length,if info obtain successfully, |
| out_len is updated to actual partition buffer sizes |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_get_sys_partition(out,out_len) \ |
| csi_tee_get_manifest_info(out,out_len,"sys_p") |
| |
| /** |
| \brief TEE set random seed |
| \param[in] Seed random sedd |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_rand_seed(uint32_t seed); |
| |
| /** |
| \brief TEE ramdom date generation |
| \param[out] out Pointer to random data buffer |
| \param[in] out_len Data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_rand_generate(uint8_t *out, uint32_t out_len); |
| |
| /****** TEE RSA sign type *****/ |
| typedef enum { |
| TEE_RSA_MD5 = 0, ///< MD5 |
| TEE_RSA_SHA1 = 1, ///< SHA1 |
| TEE_RSA_SHA256 = 3, ///< SHA256 |
| TEE_RSA_SIGN_TYPE_MAX, ///< invailed type |
| } tee_rsa_sign_type_e; |
| |
| /** |
| \brief TEE RSA sign with private key |
| \param[in] in Pointer to digest buffer |
| \param[in] in_len Digest buffer length |
| \param[in] key Pointer to private key,key contains n, e, d |
| \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 |
| \param[out] sign Pointer to sign buffer |
| \param[out] sign_len Sign buffer length |
| \param[in] type \ref tee_rsa_sign_type_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_rsa_sign(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t *sign, uint32_t *sign_len, |
| tee_rsa_sign_type_e type); |
| |
| /** |
| \brief TEE RSA verify with public key |
| \param[in] in Pointer to digest buffer |
| \param[in] in_len Digest buffer length |
| \param[in] key Pointer to public key,key contains n, e |
| \param[in] key_len Public key size,must be 128*2 = 256 bytes for RSA1024, 256*2 = 512 bytes for RSA2048 |
| \param[in] sign Pointer to sign buffer |
| \param[in] sign_len Sign buffer length |
| \param[in] type \ref tee_rsa_sign_type_e |
| \return return 0 if verify successful,otherwise error code |
| */ |
| int32_t csi_tee_rsa_verify(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t *sign, uint32_t sign_len, |
| tee_rsa_sign_type_e type); |
| |
| /****** TEE RSA padding mode *****/ |
| typedef enum { |
| TEE_RSA_PKCS1_PADDING = 0x01, ///< RSA PKCS padding mode |
| TEE_RSA_NO_PADDING = 0x02, ///< RSA no padding mode |
| } tee_rsa_padding_mode_e; |
| |
| /** |
| \brief TEE RSA encrypt with public key |
| \param[in] in Pointer to plaintext buffer |
| \param[in] in_len Plaintext buffer length |
| \param[in] key Pointer to public key,key contains n, e |
| \param[in] key_len Public key size, must be 128*2 = 256 bytes for RSA1024, 256*2 = 512 bytes for RSA2048 |
| \param[in] out Pointer to ciphertext buffer |
| \param[in] out_len Ciphertext buffer length |
| \param[in] padding \ref tee_rsa_padding_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_rsa_encrypt(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t *out, uint32_t *out_len, |
| tee_rsa_padding_mode_e padding); |
| /** |
| \brief TEE RSA decrypt with private key |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to private key,key contains n, e, d |
| \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 |
| \param[in] out Pointer to plaintext buffer |
| \param[in] out_len Plaintext buffer length |
| \param[in] padding \ref tee_rsa_padding_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_rsa_decrypt(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t *out, uint32_t *out_len, |
| tee_rsa_padding_mode_e padding); |
| |
| /** |
| \brief TEE RSA sign with internal private key |
| \note Only use if key provisioning exist |
| \param[in] in Pointer to digest buffer |
| \param[in] in_len Digest buffer length |
| \param[out] sign Pointer to sign buffer |
| \param[out] sign_len Sign buffer length |
| \param[in] type \ref tee_rsa_sign_type_e |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_cid_rsa_sign(in,in_len,sign,sign_len,type) \ |
| csi_tee_rsa_sign(in,in_len,NULL,0,sign,sign_len,type) |
| |
| /** |
| \brief TEE RSA verify with internal public key |
| \note Only use if key provisioning exist |
| \param[in] in Pointer to digest buffer |
| \param[in] in_len Digest buffer length |
| \param[in] sign Pointer to sign buffer |
| \param[in] sign_len Sign buffer length |
| \param[in] type \ref tee_rsa_sign_type_e |
| \return return 0 if verify successful,otherwise error code |
| */ |
| #define csi_tee_cid_rsa_verify(in,in_len,sign,sign_len,type) \ |
| csi_tee_rsa_verify(in,in_len,NULL,0,sign,sign_len,type) |
| |
| /** |
| \brief TEE RSA encrypt with internal public key |
| \note Only use if key provisioning exist |
| \param[in] in Pointer to plaintext buffer |
| \param[in] in_len Plaintext buffer length |
| \param[in] out Pointer to ciphertext buffer |
| \param[in] out_len Ciphertext buffer length |
| \param[in] padding \ref tee_rsa_padding_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_cid_rsa_encrypt(in,in_len,out,out_len,padding) \ |
| csi_tee_rsa_encrypt(in,in_len,NULL,0,out,out_len,padding) |
| |
| /** |
| \brief TEE RSA decrypt with internal private key |
| \note Only use if key provisioning exist |
| \param[in] in Pointer to ciphertext buffer |
| \param[in] in_len Ciphertext buffer length |
| \param[in] key Pointer to private key,key contains n, e, d |
| \param[in] key_len Private key size,must be 128*3 = 384 bytes for RSA1024, 256*3 = 768 bytes for RSA2048 |
| \param[in] out Pointer to plaintext buffer |
| \param[in] out_len Plaintext buffer length |
| \param[in] padding \ref tee_rsa_padding_mode_e |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_cid_rsa_decrypt(in,in_len,out,out_len,padding) \ |
| csi_tee_rsa_decrypt(in,in_len,NULL,0,out,out_len,padding) |
| |
| /** |
| \brief verify boot image with boot public key |
| \note Only use if key provisioning exist |
| \param[in] in Pointer to digest buffer |
| \param[in] in_len Digest buffer length |
| \param[in] sign Pointer to sign buffer |
| \param[in] sign_len Sign buffer length |
| \param[in] type \ref tee_rsa_sign_type_e |
| \return return 0 if verify successful,otherwise error code |
| */ |
| int32_t csi_tee_img_rsa_verify(const uint8_t *in, uint32_t in_len, |
| uint8_t *sign, uint32_t sign_len, |
| tee_rsa_sign_type_e type); |
| |
| /****** TEE HASH operation mode *****/ |
| typedef enum { |
| TEE_HASH_OP_NONE = 0, ///< No operation |
| TEE_HASH_OP_START = 1, ///< HASH init |
| TEE_HASH_OP_UPDATA = 2, ///< HASH update |
| TEE_HASH_OP_FINISH = 3, ///< HASH finish |
| TEE_HASH_OP_MAX, ///< invailed operation |
| } tee_hash_op_e; |
| |
| /****** TEE HMAC type *****/ |
| typedef enum { |
| TEE_HMAC_SHA1 = 1, ///< HMAC with SHA1 |
| } tee_hmac_type_e; |
| |
| /** |
| \brief TEE HAMC |
| \note Call csi_tee_hmac_digest is better |
| out buffer size must be large enough according to type, eg. 20 bytes for TEE_HMAC_SHA1 |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len Input data buffer length |
| \param[in] key Pointer to key buffer |
| \param[in] key_len Key buffer size |
| \param[out] out Pointer to output date buffer |
| \param[in] type \ref tee_hmac_type_e |
| \param[in] hash_op \ref tee_hash_op_e |
| \param[in] ctx Pointer to context of hmac |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_hmac(const uint8_t *in, uint32_t in_len, |
| const uint8_t *key, uint32_t key_len, |
| uint8_t *out, |
| tee_hmac_type_e type, |
| tee_hash_op_e hash_op, |
| uint32_t *ctx); |
| |
| /** |
| \brief TEE HAMC digest |
| \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_HMAC_SHA1 |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len Input data buffer length |
| \param[in] key Pointer to key buffer |
| \param[in] key_len Key buffer size |
| \param[out] out Pointer to output date buffer |
| \param[in] type \ref tee_hmac_type_e |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_hmac_digest(in,in_len,key,key_len,out,type) \ |
| csi_tee_hmac(in,in_len,key,key_len,out,type,TEE_HASH_OP_NONE,NULL) |
| |
| /****** TEE SHA type *****/ |
| typedef enum { |
| TEE_SHA1 = 0, ///< SHA1 |
| TEE_SHA256 = 1, ///< SHA256 |
| TEE_SHA224 = 2, ///< SHA224 |
| TEE_SHA384 = 3, ///< SHA384 |
| TEE_SHA512 = 4, ///< SHA512 |
| TEE_SHA_MAX, ///< invaild sha type |
| } tee_sha_type_t; |
| |
| /** |
| \brief TEE SHA |
| \note Call csi_tee_sha_digest, csi_tee_sha_start, csi_tee_sha_update or csi_tee_sha_finish is better |
| out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len Input data buffer length |
| \param[out] out Pointer to output date buffer |
| \param[in] type \ref tee_sha_type_t |
| \param[in] hash_op \ref tee_hash_op_e |
| \param[in] ctx Pointer to context of sha |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_sha(const uint8_t *in, uint32_t in_len, |
| uint8_t *out, |
| tee_sha_type_t type, |
| tee_hash_op_e hash_op, |
| void *ctx); |
| |
| /** |
| \brief TEE SHA digest |
| \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len Input data buffer length |
| \param[out] out Pointer to output date buffer |
| \param[in] type \ref tee_sha_type_t |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_sha_digest(in,in_len,out,type) \ |
| csi_tee_sha(in,in_len,out,type,TEE_HASH_OP_NONE,NULL); |
| |
| /** |
| \brief TEE SHA start, initial sha |
| \param[in] type \ref tee_sha_type_t |
| \param[in] ctx Pointer to context of sha |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_sha_start(type,ctx) \ |
| csi_tee_sha(NULL,0,NULL,type,TEE_HASH_OP_START,ctx); |
| |
| /** |
| \brief TEE SHA update, update data |
| \param[in] in Pointer to input data buffer |
| \param[in] in_len Input data buffer length |
| \param[in] ctx Pointer to context of sha |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_sha_update(in,in_len,ctx) \ |
| csi_tee_sha(in,in_len,NULL,0,TEE_HASH_OP_UPDATA,ctx); |
| |
| /** |
| \brief TEE SHA digest, get sha digest |
| \note out buffer size must be large enough according to type, eg. 20 bytes for TEE_SHA1, 32 bytes for TEE_SHA256 |
| \param[out] out Pointer to output date buffer |
| \param[in] ctx Pointer to context of sha |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_sha_finish(out,ctx) \ |
| csi_tee_sha(NULL,0,out,0,TEE_HASH_OP_FINISH,ctx); |
| |
| /** |
| \brief TEE get device name and product key |
| \param[in] name_encrypted Pointer to device name ciphertext |
| \param[in] name_encrypted_len device name ciphertext length |
| \param[in] product_key_encrypted Pointer to device product key ciphertext |
| \param[in] product_key_encrypted_len Device product key ciphertext length |
| \param[out] name Pointer to device name |
| \param[out] name_len Device name length |
| \param[out] product_key Pointer to device product key |
| \param[out] product_key_len Device product key length |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_dev_info_get(const uint8_t *name_encrypted, uint32_t name_encrypted_len, |
| const uint8_t *product_key_encrypted, uint32_t product_key_encrypted_len, |
| const uint8_t *name, uint32_t *name_len, |
| const uint8_t *product_key, uint32_t *product_key_len); |
| |
| /** |
| \brief TEE device info sign |
| \param[in] in Pointer to input date buffer |
| \param[in] in_len Input data buffer length |
| \param[in] device_secret Pointer to device secret ciphertext |
| \param[in] device_secret_len Device secret ciphertext length |
| \param[out] sign Pointer to signed buffer |
| \param[out] sign_len Signed buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_dev_info_sign(const uint8_t *in, uint32_t in_len, |
| const uint8_t *device_secret, uint32_t device_secret_len, |
| const uint8_t *sign, uint32_t *sign_len); |
| |
| /** |
| \brief TEE device info encrypt/decrypt |
| \param[in] in Pointer to input date buffer |
| \param[in] in_len Input data buffer length |
| \param[in] out Pointer to output date buffer |
| \param[in] out_len Onput data buffer length |
| \param[in] is_enc 1 incrypt 0 decrypt |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_dev_info_crypt(const uint8_t *in, uint32_t in_len, |
| uint8_t *out, uint32_t *out_len, |
| uint8_t is_enc); |
| |
| /** |
| \brief TEE device info encrypt |
| \param[in] in Pointer to input date buffer |
| \param[in] in_len Input data buffer length |
| \param[in] out Pointer to output date buffer |
| \param[in] out_len Onput data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_dev_info_encrypt(in, in_len, out, out_len) \ |
| csi_tee_dev_info_crypt(in, in_len, out, out_len, 1) |
| |
| /** |
| \brief TEE device info decrypt |
| \param[in] in Pointer to input date buffer |
| \param[in] in_len Input data buffer length |
| \param[in] out Pointer to output date buffer |
| \param[in] out_len Onput data buffer length |
| \return return 0 if successful,otherwise error code |
| */ |
| #define csi_tee_dev_info_decrypt(in, in_len, out, out_len) \ |
| csi_tee_dev_info_crypt(in, in_len, out, out_len, 0) |
| |
| /****** system clock source type *****/ |
| typedef enum { |
| IHS_CLK = 0, ///< internel clock source |
| EHS_CLK = 1 ///< externel clock source |
| } clk_src_e; |
| |
| /****** system clock value scope *****/ |
| typedef enum { |
| OSR_8M_CLK_16M = 0x80204, ///< register value for clock 16M |
| OSR_8M_CLK_24M = 0x80206, ///< register value for clock 24M |
| OSR_8M_CLK_32M = 0x80208, ///< register value for clock 32M |
| OSR_8M_CLK_40M = 0x8020a, ///< register value for clock 40M |
| OSR_8M_CLK_48M = 0x8020c ///< register value for clock 48M |
| } clk_val_e; |
| |
| /** |
| \brief Set system frequence |
| \param[in] clk_src indicate clock source type |
| \param[in] clk_val system freqence to be set |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_set_sys_freq(uint32_t clk_src, uint32_t clk_val); |
| |
| /** |
| \brief Get system frequence |
| \param[in] clk_val value address to store system freqence |
| \return return 0 if successful,otherwise error code |
| */ |
| int32_t csi_tee_get_sys_freq(uint32_t *clk_val); |
| |
| |
| int32_t csi_tee_xor(uint8_t *out, uint32_t *out_len); |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* _CSI_AES_H_ */ |