本示例演示使用AES-128 CBC模式进行加密和解密的示例操作。
static int cipher_begin_session ( const struct device * dev,
struct cipher_ctx * ctx,
enum cipher_algo algo,
enum cipher_mode mode,
enum cipher_op optype )
初始化一次性参数,如会话密钥、算法和密码模式,这些参数对于会话中的所有操作可能保持不变。状态可以缓存在硬件和/或驱动程序数据状态变量中。
参数说明
字段 | 说明 |
---|---|
dev | 指向驱动程序实例的设备结构的指针 |
ctx | 指向上下文结构的指针。各种一次性参数,如键、键长等,都是通过此结构提供的。结构文档指定了在进行此调用之前,应用将填充哪些字段 |
algo | 要在此会话中使用的加密算法。例如AES |
mode | 要在此会话中使用的密码模式。例如 CBC、CTR |
optype | 我们是否应该在此会话中加密或解密 |
返回值说明
成功时为 0,失败时为负 errno 代码
static int cipher_cbc_op ( struct cipher_ctx * ctx,
struct cipher_pkt * pkt,
uint8_t * iv )
参数说明
字段 | 说明 |
---|---|
ctx | 指向此操作的加密上下文的指针 |
pkt | 保存输入/输出缓冲器指针的结构 |
iv | 运算的初始化向量 (IV)。为了安全起见,不应在多个操作(在会话上下文中)重复使用相同的 IV 值 |
返回值说明
成功时为 0,失败时为负 errno 代码
更多Crypto API接口可查看Zephyr官网Crypto APIs。
SDK 中提供了 aes128_cbc 的示例。
本示例演示使用AES-128 CBC模式进行加密和解密的示例操作。
{SDK}\.sdk\csk\samples\driver\crypto\aes128_cbc
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk/csk/samples/driver/crypto/aes128_cbc/ -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的 DAP_USB
接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop
是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin
文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。
若您已按照 《环境搭建》 教程完成开发环境的安装,可在编译完成后执行 lisa zep exec cskburn
指令完成烧录。
lisa zep exec cskburn -s \\.\COMxx -C 6 -b 1500000 0x000000 --verify-all .\build\zephyr\zephyr.bin
请将命令行中的的 COMx 替换为开发套件在 PC 上对应的串口号(可通过设备管理器查看)。例如:
COM3
。
lisa zep exec cskburn -s PORT -C 6 0x000000 --verify-all ./build/zephyr/zephyr.bin -b 1500000
请将命令行中的 PORT 替换为开发套件连接在 PC 上对应的串口号。例如:
/dev/ttyUSB0
。
烧录完成后,连接串口终端,按下开发板复位按钮,可看到串口有对应的信息输出。
以下代码与注释已省略一部分非关键接口代码,主要呈现示例的主业务流程与主要接口的使用。
在工程目录prj.conf
文件中需配置以下模块:
CONFIG_CRYPTO=y
CONFIG_LOG=y
CONFIG_LOG_MODE_MINIMAL=y
1.从设备树中获取设备
const struct device *dev = DEVICE_DT_GET(CRYPTO_DRV_NAME);
2.调用函数进行加密解密操作
cbc_mode(dev);
3.首先初始化 cipher_ctx 和 cipher_pkt 结构体。
4.开始加密会话
cipher_begin_session(dev, &ini, CRYPTO_CIPHER_ALGO_AES, CRYPTO_CIPHER_MODE_CBC,CRYPTO_CIPHER_OP_ENCRYPT)
5.执行加密操作
cipher_cbc_op(&ini, &encrypt, iv)
6.验证加密结果
memcmp(encrypt.out_buf, cbc_ciphertext, sizeof(cbc_ciphertext))
7.结束加密会话
cipher_free_session(dev, &ini);
8.开始解密会话
cipher_begin_session(dev, &ini, CRYPTO_CIPHER_ALGO_AES, CRYPTO_CIPHER_MODE_CBC,CRYPTO_CIPHER_OP_DECRYPT)
9.执行解密操作
cipher_cbc_op(&ini, &decrypt, iv)
10.验证解密结果
memcmp(decrypt.out_buf, plaintext, sizeof(plaintext))
*11.结束解密会话
cipher_free_session(dev, &ini);
按下开发板复位按钮,运行程序,可通过串口查看打印结果。
int main(void)
{
const struct device *dev = DEVICE_DT_GET(CRYPTO_DRV_NAME);
if (!dev) {
LOG_ERR("crypto device not found \n");
return -1;
}
LOG_INF("AES128 CBC Cipher Sample");
cbc_mode(dev);
return 0;
}