本示例演示使用SHA-256算法对输入数据进行哈希处理,并验证计算结果是否正确。
hash_begin_session ( const struct device * dev,
struct hash_ctx * ctx,
enum hash_algo algo )
初始化一次参数,例如算法,该算法对于会话中的所有操作可能保持不变。状态可以缓存在硬件和/或驱动程序数据状态变量中。
参数说明
字段 | 说明 |
---|---|
dev | 指向驱动程序实例的设备结构的指针 |
ctx | 指向上下文结构的指针。通过此结构提供各种一次性参数,如会话功能和算法。结构文档指定了在进行此调用之前,应用将填充哪些字段 |
algo | 要在此会话中使用的哈希算法。例如 sha256 |
返回值说明
成功时为 0,失败时为负 errno 代码
static int hash_compute ( struct hash_ctx * ctx, struct hash_pkt * pkt )
参数说明
字段 | 说明 |
---|---|
ctx | 指向此操作的加密上下文的指针 |
pkt | 容纳输入/输出的结构 |
返回值说明
成功时为 0,失败时为负 errno 代码
更多Crypto API接口可查看Zephyr官网Crypto APIs。
SDK 中提供了 aes256_sha 的示例。
本示例演示使用SHA-256算法对输入数据进行哈希处理,并验证计算结果是否正确。
{SDK}\.sdk\csk\samples\driver\crypto\aes256_sha
适用开发板:大模型开发套件
编译版型:csk6_duomotai_devkit
在 SDK 根目录(duomotai_ap
)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit .sdk/csk/samples/driver/crypto/aes256_sha/ -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.调用函数进行哈希操作
hash_mode(dev);
3.开始哈希会话
ret = hash_begin_session(dev, &ctx, CRYPTO_HASH_ALGO_SHA256);
4.计算哈希值
ret = hash_compute(&ctx, &pkt);
5.验证哈希结果
memcmp(crypto_sha_result_data_8w, sha256_results[6], 32)
6.结束哈希会话
hash_free_session(dev, &ctx);
按下开发板复位按钮,运行程序,可通过串口查看打印结果。
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 ECB Cipher Sample");
ecb_mode(dev);
return 0;
}