Linux kernel内核调用crypto算法的方法
2023-09-27 14:26:31 时间
快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
相关推荐:
The Armv8 Cryptographic Extension在Linux Kernel中的应用
Armv8 Cryptographic Extension介绍
Linux Kernel aarch64 Crypto原理和框架介绍
Linux Kernel aarch64的ARM-CE aes-ecb的底层代码解析
说明: 在无特别的说明下,本文讲述得都是armv8-aarch64体系、linux kernel 4.14 arm64软件环境!
1、定义一个算法
Linux Kernel中crypto算法的定义是以crypto_alg结构体来实现的
{
.cra_name = "__ecb-aes-" MODE,
.cra_driver_name = "__driver-ecb-aes-" MODE,
.cra_priority = 0,
.cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER |
CRYPTO_ALG_INTERNAL,
.cra_blocksize = AES_BLOCK_SIZE,
.cra_ctxsize = sizeof(struct crypto_aes_ctx),
.cra_alignmask = 7,
.cra_type = &crypto_blkcipher_type,
.cra_module = THIS_MODULE,
.cra_blkcipher = {
.min_keysize = AES_MIN_KEY_SIZE,
.max_keysize = AES_MAX_KEY_SIZE,
.ivsize = 0,
.setkey = aes_setkey,
.encrypt = ecb_encrypt,
.decrypt = ecb_decrypt,
},
2、注册crypto算法
注册一个算法(algapi.c),crypto_alg_list链表维护着一些列crypto_alg结构体
int crypto_register_alg(struct crypto_alg *alg)
{
struct crypto_larval *larval;
int err;
alg->cra_flags &= ~CRYPTO_ALG_DEAD;
err = crypto_check_alg(alg);
if (err)
return err;
down_write(&crypto_alg_sem);
larval = __crypto_register_alg(alg);
up_write(&crypto_alg_sem);
if (IS_ERR(larval))
return PTR_ERR(larval);
crypto_wait_for_test(larval);
return 0;
}
EXPORT_SYMBOL_GPL(crypto_register_alg);
3、crypto算法的查找
根据名字查询一个算法(api.c),返回crypto_alg
struct crypto_alg *crypto_alg_lookup(const char *name, u32 type, u32 mask)
{
struct crypto_alg *alg;
down_read(&crypto_alg_sem);
alg = __crypto_alg_lookup(name, type, mask);
up_read(&crypto_alg_sem);
return alg;
}
EXPORT_SYMBOL_GPL(crypto_alg_lookup);
4、算法调用的示例
(以tcrypt为例)
而在tcrypt.c的测试模块中,可根据名字,直接调用crypto_alg接口模块
test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
speed_template_16_24_32);
test_cipher_speed("ecb(aes)", DECRYPT, sec, NULL, 0,
speed_template_16_24_32);
test_cipher_speed("cbc(aes)", ENCRYPT, sec, NULL, 0,
speed_template_16_24_32);
test_cipher_speed("cbc(aes)", DECRYPT, sec, NULL, 0,
speed_template_16_24_32);
test_cipher_speed("lrw(aes)", ENCRYPT, sec, NULL, 0,
speed_template_32_40_48);
test_cipher_speed("lrw(aes)", DECRYPT, sec, NULL, 0,
speed_template_32_40_48);
test_cipher_speed("xts(aes)", ENCRYPT, sec, NULL, 0,
speed_template_32_48_64);
test_cipher_speed("xts(aes)", DECRYPT, sec, NULL, 0,
speed_template_32_48_64);
test_cipher_speed("ctr(aes)", ENCRYPT, sec, NULL, 0,
speed_template_16_24_32);
test_cipher_speed("ctr(aes)", DECRYPT, sec, NULL, 0,
speed_template_16_24_32);
相关文章
- 深入linux kernel内核配置选项
- 【Linux学习】Ubuntu下内核编译(一)
- 一、查看Linux内核版本命令(两种方法):
- Linux系统打开文件最大数量限制(进程打开的最大文件句柄数设置)
- Linux内核sysrq调试调优
- 怎样在 ubuntu 上安装 Linux 3.11 内核
- 戴文的Linux内核专题:10 配置内核(6)
- 戴文的Linux内核专题:22 配置内核 (18)
- 黑客内核:编写属于你的第一个Linux内核模块
- Linux 有问必答:如何在 Ubuntu 上配置网桥
- Linux常用命令大全
- linux内核是如何支持深度睡眠(deep sleep)方式的?
- linux内核调试方法总结
- linux下如何查看当前内核的配置?
- linux内核中的最简单的输入输出调度算法noop
- Linux部署达梦数据库超详细教程
- 《Linux/UNIX OpenLDAP实战指南》——2.8 OpenLDAP索引
- Linux 内核Ksets 对象
- Linux 内核usb_bulk_msg 接口
- 深入理解Linux网络技术内幕(六)——PCI层和网络接口卡
- 深入理解Linux网络内幕(七)——组件初始化的内核基础架构
- linux 内核等待队列
- Linux常用文件管理命令(下)
- 潜伏7年的Linux内核漏洞CVE-2017-2636曝光,可本地提权