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_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
}

} ```

results matching ""

    No results matching ""