/**
*@file    sr_aes.h
*@brief   AES加解密接口
*@details 提供AES加解密接口相关枚举
*@copyright Copyright (c) 2024 lierda. All rights reserved.
*@author  Lierda-RDC
*@date    2024-05-07
*@example ZhaoyangSDK\example\component\crypto\crypto_example.c
*/
#ifndef _SR_AES_H
#define _SR_AES_H

#include "sr_stddef.h"
#include "mbedtls/cipher.h" 


/**
 * @brief AES算法类型
 */
typedef enum SR_AES_TYPE
{
	SR_AES_ECB128 = MBEDTLS_CIPHER_AES_128_ECB,  /*!< AES 128-bit ECB mode*/
	SR_AES_ECB192 = MBEDTLS_CIPHER_AES_192_ECB,  /*!< AES 192-bit ECB mode*/
	SR_AES_ECB256 = MBEDTLS_CIPHER_AES_256_ECB,  /*!< AES 256-bit ECB mode*/
	SR_AES_CBC128 = MBEDTLS_CIPHER_AES_128_CBC,  /*!< AES 128-bit CBC mode*/
	SR_AES_CBC192 = MBEDTLS_CIPHER_AES_192_CBC,  /*!< AES 192-bit CBC mode*/
	SR_AES_CBC256 = MBEDTLS_CIPHER_AES_256_CBC,  /*!< AES 256-bit CBC mode*/
	SR_AES_CTR128 = MBEDTLS_CIPHER_AES_128_CTR,  /*!< AES 128-bit CTR mode*/
	SR_AES_CTR192 = MBEDTLS_CIPHER_AES_192_CTR,  /*!< AES 192-bit CTR mode*/
	SR_AES_CTR256 = MBEDTLS_CIPHER_AES_256_CTR,  /*!< AES 256-bit CTR mode*/
}SR_AES_TYPE_E;




/*  
 * @brief AES加密 
 * 
 * @param[in] type   AES算法类型，取值SR_AES_TYPE类型
 * @param[in] key    密钥 
 * @param[in] keyBit 密钥长度(bit),取值必须为128, 192 or 256
 * @param[in] iv     初始化向量，CBC/CTR等算法需要。固定16字节 
 * @param[in] in     输入数据  
 * @param[in] inLen  输入数据的长度（字节）  
 * @param[out] out    输出数据缓存区,一定要预留足够空间
 *  
 * @return 成功(>0)：返回密文长度           失败：返回负值错误码
 */  
int SR_AesEncrypt(SR_AES_TYPE_E type,uint8_t *key,uint16_t keyBit,uint8_t iv[16],uint8_t *in,uint16_t inLen, uint8_t *out);


/*  
 * @brief AES解密 
 * 
 * @param[in] type   AES算法类型，取值SR_AES_TYPE类型
 * @param[in] key    密钥 
 * @param[in] keyBit 密钥长度(bit),取值必须为128, 192 or 256
 * @param[in] iv     初始化向量，CBC/CTR等算法需要。固定16字节 
 * @param[in] in     输入数据  
 * @param[in] inLen  输入数据的长度（字节）  
 * @param[out] out    输出数据缓存区，一定要预留足够空间
 *  
 * @return 成功(>0)：返回明文长度           失败：返回负值错误码
 */  
int SR_AesDecrypt(SR_AES_TYPE_E type,uint8_t *key,uint16_t keyBit,uint8_t iv[16],uint8_t *in,uint16_t inLen, uint8_t *out);


#endif


