AES
简要说明
AES(Advanced EncryptionStandard)高级加密标准是一种对称秘钥加密算法,即加密的密钥和解密的秘钥相同。AES采用对称分组密码体制,密钥的长度支持128、192、256,分组长度128位。
接口描述
csi_aes_initialize
aes_handle_t csi_aes_initialize(int32_t idx, aes_event_cb_t cb_event)
功能描述:
- 通过传入设备数初始化对应的aes实例,返回aes实例的句柄。
参数:
idx
: 设备号。cb_event
: aes实例的事件回调函数。回调函数原型定义见aes_event_cb_t。回调函数类型aes_event_cb_t定义如下:
typedef void (*aes_event_cb_t)(int32_t idx, aes_event_e event);
其中idx为设备号,event 为传给回调函数的事件类型,aes回调事件枚举类型 aes_event_e 。
返回值:
NULL: 初始化失败。
其它: 初始化成功时的实例句柄。
aes_event_e:
名字 | 定义 | 备注 |
---|---|---|
AES_EVENT_CRYPTO_COMPLETE | AES计算完成事件 |
csi_aes_uninitialize
int32_t csi_aes_uninitialize(aes_handle_t handle)
功能描述:
- aes实例反初始化。该接口会停止aes实例正在进行的工作(如果有),并且释放相关的软硬件资源。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_aes_power_control
int32_t csi_aes_power_control(aes_handle_t handle, csi_power_stat_e state)
功能描述:
- 配置设备实例的功耗模式。
参数:
handle
: 实例句柄。state
: 设备实例的功耗模式,参看- csi_power_stat_e \<csi_power_stat_e\ 的定义。
返回值:
- 错误码。
csi_aes_get_capabilities
aes_capabilities_t csi_aes_get_capabilities(int32_t idx)
功能描述:
- 获取aes实例支持的能力。
参数:
idx
: 设备号。
返回值:
- 描述aes能力的结构体,aes的能力定义见 aes_capabilities_t 。
aes_capabilities_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t ecb_mode :1 | 支持ecb模式 | |
uint32_t cbc_mode :1 | 支持cbc模式 | |
uint32_t cfb1_mode :1 | 支持cfb1模式 | |
uint32_t cfb8_mode :1 | 支持cfb8模式 | |
uint32_t cfb128_mode :1 | 支持cfb128模式 | |
uint32_t ofb_mode :1 | 支持ofb模式 | |
uint32_t ctr_mode :1 | 支持ctr模式 | |
uint32_t bits_128 :1 | 支持128bits模式 | |
uint32_t bits_192 :1 | 支持192bits模式 | |
uint32_t bits_256 :1 | 支持256bits模式 |
csi_aes_config
int32_t csi_aes_config(aes_handle_t handle,
aes_mode_e mode,
aes_key_len_bits_e keylen_bits,
aes_endian_mode_e endian)
功能描述:
- 配置aes实例的工作模式、key长度及大小端模式。
参数:
handle
: 实例句柄。mode
: aes 模式,参看 aes_mode_e定义。keylen_bits
: 密钥的长度,参看aes_key_len_bits_e 。endian
: aes 的大小端模式,参看aes_endian_mode_e的定义。
返回值:
- 错误码。
aes_mode_e:
名字 | 定义 | 备注 |
---|---|---|
AES_MODE_ECB | ECB模式 | |
AES_MODE_CBC | CBC模式 | |
AES_MODE_CFB1 | CFB1模式 | |
AES_MODE_CFB8 | CFB8模式 | |
AES_MODE_CFB128 | CFB128模式 | |
AES_MODE_OFB | OFB模式 | |
AES_MODE_CTR | CTR模式 |
aes_key_len_bits_e:
名字 | 定义 | 备注 |
---|---|---|
AES_KEY_LEN_BITS_128 | 128bits长度 | |
AES_KEY_LEN_BITS_192 | 192bits长度 | |
AES_KEY_LEN_BITS_256 | 256bits长度 |
aes_endian_mode_e:
名字 | 定义 | 备注 |
---|---|---|
AES_ENDIAN_LITTLE | AES 小端模式 | |
AES_ENDIAN_BIG | AES 大端模式 |
csi_aes_set_key
int32_t csi_aes_set_key(aes_handle_t handle, void *context, void *key, aes_key_len_bits_e key_len, aes_crypto_mode_e enc)
功能描述:
- 设置aes的秘钥。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。key
: 秘钥的缓冲区地址。key_len
: 待输入的秘钥长度。enc
: 加解密操作,参见 aes_crypto_mode_e。 的定义。
返回值:
- 错误码。
aes_crypto_mode_e:
名字 | 定义 | 备注 |
---|---|---|
AES_CRYPTO_MODE_ENCRYPT | AES 加密模式 | |
AES_CRYPTO_MODE_DECRYPT | AES 解密模式 |
csi_aes_ecb_crypto
int32_t csi_aes_ecb_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len)
功能描述:
- 用ECB模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。
返回值:
- 错误码。
csi_aes_cbc_crypto
int32_t csi_aes_cbc_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len, uint8_t iv[16])
功能描述:
- 操作aes通过之前设置的操作模式,执行aes cbc模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。iv
: 初始向量。
返回值:
- 错误码。
csi_aes_cfb1_crypto
int32_t csi_aes_cfb1_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len, uint8_t iv[16])
功能描述:
- 操作aes通过之前设置的操作模式,执行aes cfb1模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。iv
: 初始向量。
返回值:
- 错误码。
csi_aes_cfb8_crypto
int32_t csi_aes_cfb8_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len, uint8_t iv[16])
功能描述:
- 操作aes通过之前设置的操作模式,执行aes cfb8模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。iv
: 初始向量。
返回值:
- 错误码。
csi_aes_cfb128_crypto
int32_t csi_aes_cfb128_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len, uint8_t iv[16], uint32_t *num)
功能描述:
- 操作aes通过之前设置的操作模式,执行aes cfb128模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。iv
: 初始向量。num
: 已经计算完成的字节数在一个block中的偏移。
返回值:
- 错误码。
csi_aes_ofb_crypto
int32_t csi_aes_ofb_crypto(aes_handle_t handle, void *context, void *in, void *out, uint32_t len, uint8_t iv[16], uint32_t *num)
功能描述:
- 操作aes通过之前设置的操作模式,执行aes ofb模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。iv
: 初始向量。num
: 已经计算完成的字节数在一个block中的偏移。
返回值:
- 错误码。
csi_aes_ctr_crypto
int32_t csi_aes_ctr_crypto(aes_handle_t handle, void *context, void *in, void *out,
uint32_t len, uint8_t nonce_counter[16], uint8_t stream_block[16], uint32_t *num)
功能描述:
- 操作aes通过之前设置的操作模式,执行aes ctr模式加解密。
参数:
handle
: 实例句柄。context
: aes的context的缓冲区。in
: 操作前数据的缓冲区地址。out
: 操作后数据的缓冲区地址。len
: 待输入的数据长度。nonce_counter
: 随机计数器的缓冲区地址。stream_block
: 随机计数器加密后的缓冲区地址。num
: 已经计算完成的字节数在一个block中的偏移。
返回值:
- 错误码。
csi_aes_get_status
aes_status_t csi_aes_get_status(aes_handle_t handle)
功能描述:
- 获取当前时刻aes的状态。
参数:
handle
: 实例句柄。
返回值:
- aes状态的结构体,aes的状态定义见 aes_status_t \
。
- aes状态的结构体,aes的状态定义见 aes_status_t \
aes_status_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t busy :1 | 计算忙 |
示例
AES示例1
``` {.sourceCode .c} static aes_handle_t aes= NULL;
void example_main(void) { const uint8_t in[16] = "Hello, World!"; uint8_t out[16]; int32_t ret;
aes_capabilities_t cap;
//get aescapabilities
cap = csi_aes_get_capabilities(0);
printf("aes %s cbc mode \n",cap.cbc_mode==1 ? "support":"not support");
const uint8_t key[32] = "Demo-Key";
//initialize aes by idx
aes= csi_aes_initialize(0, NULL);
if (aes== NULL) {
//fail
return;
}
//config aes mode 、key bits len 、endian mode
ret = csi_aes_config(aes, AES_MODE_ECB, AES_KEY_LEN_BITS_256, AES_ENDIAN_LITTLE);
if (ret < 0) {
//fail
return;
}
//set aes key
ret = csi_aes_set_key(aes, NULL, (void *)key, AES_KEY_LEN_BITS_256, AES_CRYPTO_MODE_ENCRYPT);
if (ret < 0) {
//fail
return;
}
//start the aes operate
ret = csi_aes_ecb_crypto(aes, NULL, (void *)in, (void *)out, 16);
if (ret < 0) {
//fail
return;
}
while (1) {
aes_status_t status = csi_aes_get_status(aes);
if (status.busy ==0) {
break;
}
}
//uninitialize aes
ret = csi_aes_uninitialize(aes);
if(ret != 0) {
//failed
}
} ```