AES
设备说明
AES可以实现AES(高级加密标准)编码算法,即Rijndael算法。AES支持三种不同长度的密钥,称为AES-128、AES-192和AES-256。此外,AES还支持ECB(电子码本)模式和CBC(密码块链)模式。
对于AES算法,输入块、输出块和状态的长度为128位。这由Nb=4表示,它反映了状态中32位字的数量。密钥K的长度是128、192或256位。密钥长度由Nk=4、6、8表示,它反映了密码密钥中32位字的数目。在算法执行期间要执行的轮数取决于密钥大小。轮数用Nr表示,其中Nr=10时,Nk=4;Nr=12时,Nk=6;Nr=14时,Nk=8。
接口列表
函数 | 说明 |
---|---|
csi_aes_init | 初始化 |
csi_aes_uninit | 去初始化 |
csi_aes_set_encrypt_key | 设置加密密钥 |
csi_aes_set_decrypt_key | 设置解密密钥 |
csi_aes_ecb_encrypt | 加密计算(ecb模式) |
csi_aes_ecb_decrypt | 解密计算(ecb模式) |
csi_aes_cbc_encrypt | 加密计算(cbc模式) |
csi_aes_cbc_decrypt | 解密计算(cbc模式) |
csi_aes_cfb1_encrypt | 加密计算(cfb1模式) |
csi_aes_cfb1_decrypt | 解密计算(cfb1模式) |
csi_aes_cfb8_encrypt | 加密计算(cfb8模式) |
csi_aes_cfb8_decrypt | 解密计算(cfb8模式) |
csi_aes_cfb128_decrypt | 加密计算(cfb128模式) |
csi_aes_cfb128_encrypt | 解密计算(cfb128模式) |
csi_aes_ofb_encrypt | 加密计算(ofb模式) |
csi_aes_ofb_decrypt | 解密计算(ofb模式) |
csi_aes_ctr_encrypt | 加密计算(ctr模式) |
csi_aes_ctr_decrypt | 解密计算(ctr模式) |
AES的CSI接口在用户对接时是否必须适配的说明如下所示:
函数 | 是否必须适配 |
---|---|
csi_aes_init | 必须 |
csi_aes_uninit | 必须 |
csi_aes_set_encrypt_key | 必须 |
csi_aes_set_decrypt_key | 必须 |
csi_aes_ecb_encrypt | 必须 |
csi_aes_ecb_decrypt | 必须 |
csi_aes_cbc_encrypt | 必须 |
csi_aes_cbc_decrypt | 必须 |
csi_aes_cfb1_encrypt | 非必须 |
csi_aes_cfb1_decrypt | 非必须 |
csi_aes_cfb8_encrypt | 非必须 |
csi_aes_cfb8_decrypt | 非必须 |
csi_aes_cfb128_decrypt | 非必须 |
csi_aes_cfb128_encrypt | 非必须 |
csi_aes_ofb_encrypt | 非必须 |
csi_aes_ofb_decrypt | 非必须 |
csi_aes_ctr_encrypt | 非必须 |
csi_aes_ctr_decrypt | 非必须 |
接口详细描述
csi_aes_init
csi_error_t csi_aes_init(csi_aes_t *aes, uint32_t idx)
功能描述:
- 通过索引号初始化对应的aes实例,返回结果值。
参数:
aes
: 设备句柄(需要用户申请句柄空间)。idx
: 控制器号。
返回值:
CSI_OK: 初始化成功。
CSI_ERROR: 初始化失败。
csi_aes_t
成员 | 类型 | 说明 |
---|---|---|
dev | csi_dev_t | csi设备统一句柄 |
*priv | void | 对接接口句柄地址 |
csi_dev_t
成员 | 类型 | 说明 |
---|---|---|
reg_base | uint32_t | 外设基址 |
irq_num | uint8_t | 外设中断号 |
idx | uint8_t | 外设ID |
irq_handler | 函数指针 | 外设中断函数地址 |
csi_error_t
类型 | 说明 |
---|---|
CSI_OK | 返回成功 |
CSI_ERROR | 返回错误 |
CSI_BUSY | 返回忙碌 |
CSI_TIMEOUT | 返回超时 |
CSI_UNSUPPORTED | 返回不支持 |
csi_aes_uninit
void csi_aes_uninit(csi_aes_t *aes)
功能描述:
- aes实例反初始化,该接口会停止aes实例正在进行的工作(如果有),并且释放相关的软硬件资源。
参数:
aes
: 实例句柄。
返回值:
- 无。
csi_aes_set_encrypt_key
csi_error_t csi_aes_set_encrypt_key(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len)
功能描述:
- 设置aes算法加密密钥。
参数:
aes
: 实例句柄。key
: 密钥指针。key_len
: 密钥长度。
返回值:
CSI_OK: 配置成功。
CSI_ERROR: 配置失败。
csi_aes_key_bits_t
类型 | 说明 |
---|---|
AES_KEY_LEN_BITS_128 | 密钥长度128位 |
AES_KEY_LEN_BITS_192 | 密钥长度192位 |
AES_KEY_LEN_BITS_256 | 密钥长度256位 |
csi_aes_set_decrypt_key
csi_error_t csi_aes_set_decrypt_key(csi_aes_t *aes, void *key, csi_aes_key_bits_t key_len)
功能描述:
- 设置aes算法解密密钥。
参数:
aes
: 实例句柄。key
: 密钥指针。key_len
: 密钥长度。
返回值:
CSI_OK: 配置成功。
CSI_ERROR: 配置失败。
csi_aes_ecb_encrypt
csi_error_t csi_aes_ecb_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size)
功能描述:
- ecb模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_ecb_decrypt
csi_error_t csi_aes_ecb_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size)
功能描述:
- ecb模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_cbc_encrypt
csi_error_t csi_aes_cbc_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cbc模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_cbc_decrypt
csi_error_t csi_aes_cbc_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cbc模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_cfb1_encrypt
csi_error_t csi_aes_cfb1_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cfb1模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_cfb1_decrypt
csi_error_t csi_aes_cfb1_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cfb1模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_cfb8_encrypt
csi_error_t csi_aes_cfb8_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cfb8模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_cfb8_decrypt
csi_error_t csi_aes_cfb8_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv)
功能描述:
- cfb8模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_cfb128_encrypt
csi_error_t csi_aes_cfb128_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num)
功能描述:
- cfb128模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量num
: 输出参数,计算了多少个cfb数据块
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_cfb128_decrypt
csi_error_t csi_aes_cfb128_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num)
功能描述:
- cfb128模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量num
: 输出参数,计算了多少个cfb数据块
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_ofb_encrypt
csi_error_t csi_aes_ofb_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num)
功能描述:
- ofb模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量num
: 输出参数,计算了多少个ofb数据块
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_ofb_decrypt
csi_error_t csi_aes_ofb_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, void *iv, uint32_t *num)
功能描述:
- ofb模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。iv
:初始化向量num
: 输出参数,计算了多少个ofb数据块
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
csi_aes_ctr_encrypt
csi_error_t csi_aes_ctr_encrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, uint8_t nonce_counter[16], uint8_t stream_block[16], void *iv, uint32_t *num)
功能描述:
- ctr模式加密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。nonce_counter
:随机计数器128位stream_block
:流块iv
:初始化向量num
:输出参数,计算了多少个ctr数据块
返回值:
CSI_OK: 加密成功。
CSI_ERROR: 加密失败。
csi_aes_ctr_decrypt
csi_error_t csi_aes_ctr_decrypt(csi_aes_t *aes, void *in, void *out, uint32_t size, uint8_t nonce_counter[16], uint8_t stream_block[16], void *iv, uint32_t *num)
功能描述:
- ctr模式解密接口。
参数:
aes
: 实例句柄。in
: 输入数据指针。out
: 输出数据指针。size
: 输入数据长度(16字节对齐)。nonce_counter
:随机计数器128位stream_block
:流块iv
:初始化向量num
:输出参数,计算了多少个ctr数据块
返回值:
CSI_OK: 解密成功。
CSI_ERROR: 解密失败。
初始化示例
#include <stdio.h>
#include <soc.h>
#include <drv/aes.h>
static csi_aes_t g_aes;
int main(void)
{
int ret = 0;
/* init aes 0 */
ret = csi_aes_init(&g_aes, 0);
return ret;
}
同步模式使用示例
ECB-256模式
#include <stdio.h>
#include <soc.h>
#include <drv/aes.h>
#define CHECK_RETURN(ret) \
do { \
if (ret != 0) { \
return -1; \
} \
} while(0);
static csi_aes_t g_aes;
int main(void)
{
int ret = 0;
const uint8_t in[16] = "Hello, World!";
const uint8_t key[32] = "Demo-Key";
const uint8_t expect[16] =
{0x7b, 0xab, 0x3a, 0xb2, 0xf3, 0x3c, 0xcf, 0xca,
0x20, 0x7a, 0xc9, 0x63, 0x7f, 0x02, 0x49, 0x55};
uint8_t out[16];
/* STEP 1: init aes */
ret = csi_aes_init(&g_aes, 0);
CHECK_RETURN(ret);
/* STEP 2: config encrypt key */
ret = csi_aes_set_encrypt_key(&g_aes, (void *)key, AES_KEY_LEN_BITS_256);
CHECK_RETURN(ret);
/* STEP 3: do encryption process */
ret = csi_aes_ecb_encrypt(&g_aes, (void *)in, (void *)out, 16);
CHECK_RETURN(ret);
/* STEP 4: compare output result */
ret = memcmp(out, expect, 16);
CHECK_RETURN(ret);
/* STEP 5: config decrypt key */
ret = csi_aes_set_decrypt_key(&g_aes, (void *)key, AES_KEY_LEN_BITS_256);
CHECK_RETURN(ret);
/* STEP 6: do decryption process */
ret = csi_aes_ecb_decrypt(&g_aes, (void *)expect, (void *)out, 16);
CHECK_RETURN(ret);
/* STEP 7: compare output result */
ret = memcmp(out, in, 16);
CHECK_RETURN(ret);
return ret;
}
CBC-256模式
#include <stdio.h>
#include <soc.h>
#include <drv/aes.h>
#define CHECK_RETURN(ret) \
do { \
if (ret != 0) { \
return -1; \
} \
} while(0);
static csi_aes_t g_aes;
int main(void)
{
int ret = 0;
const uint8_t in[16] = "Hello, World!";
const uint8_t key[32] = "Demo-Key";
const uint8_t iv[16] = {0};
const uint8_t expect[16] =
{0x7b, 0xab, 0x3a, 0xb2, 0xf3, 0x3c, 0xcf, 0xca,
0x20, 0x7a, 0xc9, 0x63, 0x7f, 0x02, 0x49, 0x55};
uint8_t out[16];
/* STEP 1: init aes */
ret = csi_aes_init(&g_aes, 0);
CHECK_RETURN(ret);
/* STEP 2: config encrypt key */
ret = csi_aes_set_encrypt_key(&g_aes, (void *)key, AES_KEY_LEN_BITS_256);
CHECK_RETURN(ret);
/* STEP 3: do encryption process */
ret = csi_aes_cbc_encrypt(&g_aes, (void *)in, (void *)out, 16, (void *)iv);
CHECK_RETURN(ret);
/* STEP 4: compare output result */
ret = memcmp(out, expect, 16);
CHECK_RETURN(ret);
/* STEP 5: clear init vector (!!!if not clear will cache last iv value) */
memset((void *)iv, 0, 16);
/* STEP 6: config decrypt key */
ret = csi_aes_set_decrypt_key(&g_aes, (void *)key, AES_KEY_LEN_BITS_256);
CHECK_RETURN(ret);
/* STEP 7: do decryption process */
ret = csi_aes_cbc_decrypt(&g_aes, (void *)expect, (void *)out, 16, (void *)iv);
CHECK_RETURN(ret);
/* STEP 8: compare output result */
ret = memcmp(out, in, 16);
CHECK_RETURN(ret);
return ret;
}