没有合适的资源?快使用搜索试试~ 我知道了~
Linux内核加密框架设计与实现-书签版
4星 · 超过85%的资源 需积分: 50 61 下载量 186 浏览量
2017-10-24
17:10:30
上传
评论 2
收藏 482KB PDF 举报
温馨提示
试读
118页
特此感谢 独孤九贱的原创,链接:http://bbs.chinaunix.net/thread-3627341-1-1.html
资源推荐
资源详情
资源评论
好久没有在内核版发贴,主要是迫于生计压力,每天忙于糊口,要过年了,发个贴子,骗点分。
声明:文中所述观点,仅为笔者一家之言,并不保证其正确性、完整性,仅供讨论学习之用。如有转载,请注明出处与作者。
文章太长了,受发贴长度限制,全文被分成几个部份,这是第一部份,后续部份会陆续贴出来。
一、 前言
Linux 加密框架是内核安全子系统的重要组成部份,同时,它又一个的独立子系统形式出现,从它出现在内核根目录下的 crypto/就可以看出其地位了。
Crypto 实现较为复杂,其主要体现在其 OOP 的设计思路和高度的对像抽像与封装模型,作者展现了其出色的架构设计水准和面向对像的抽像能力。本
文力图从加密框架的重要应用,即 IPSec(xfrm)的两个重要协议 AH 和 ESP 对加密框架的使用,展现其设计与实现。
内核版本:2.6.31.13
二、 算法模版
1. 模版的基本概念
算法模版是加密框架的第一个重要概念。内核中有很多算法是动态生成的,例如 cbc(des)算法。内核并不存在这样的算法,它事实上是 cbc 和 des 的
组合,但是内核加密框架从统一抽像管理的角度。将 cbc(des)看做一个算法,在实际使用时动态分配并向内核注册该算法。这样,可以将 cbc 抽像为一
个模版,它可以同任意的加密算法进行组合。算法模版使用结构 crypto_template 来描述,其结构原型:
1. struct crypto_template {
2. struct list_head list; //模版链表成员,用于注册
3. struct hlist_head instances; //算法实例链表首部
4. struct module *module; //模块指针
5.
6. struct crypto_instance *(*alloc)(struct rtattr **tb); //算法实例分配
7. void (*free)(struct crypto_instance *inst); //算法实例释放
8.
9. char name[CRYPTO_MAX_ALG_NAME]; //模版名称
10. };
复制代码
例如,一个名为 cbc 的算法模版,可以用它来动态分配 cbc(des),cbc(twofish)……诸如此类。
crypto/algapi.c 下包含了模版的一些常用操作。最为常见的就是模版的注册与注销,其实质是对以 crypto_template_list 为首的链表的操作过程:
1. static LIST_HEAD(crypto_template_list);
2.
3. int crypto_register_template(struct crypto_template *tmpl)
4. {
5. struct crypto_template *q;
6. int err = -EEXIST;
7.
8. down_write(&crypto_alg_sem);
9.
10. //遍历 crypto_template_list,看当前模板是否被注册
11. list_for_each_entry(q, &crypto_template_list, list) {
12. if (q == tmpl)
13. goto out;
14. }
15.
16. //注册之
17. list_add(&tmpl->list, &crypto_template_list);
18. //事件通告
19. crypto_notify(CRYPTO_MSG_TMPL_REGISTER, tmpl);
20. err = 0;
21. out:
22. up_write(&crypto_alg_sem);
23. return err;
24. }
25. EXPORT_SYMBOL_GPL(crypto_register_template);
复制代码
注销算法模版,除了模版本身,还有一个重要的内容是处理算法模版产生的算法实例,关于算法实例,后文详述。
1. void crypto_unregister_template(struct crypto_template *tmpl)
2. {
3. struct crypto_instance *inst;
4. struct hlist_node *p, *n;
5. struct hlist_head *list;
6. LIST_HEAD(users);
7.
8. down_write(&crypto_alg_sem);
9.
10. BUG_ON(list_empty(&tmpl->list));
11. //注销算法模版,并重新初始化模版的 list 成员
12. list_del_init(&tmpl->list);
13.
14. //首先移除模版上的所有算法实例
15. list = &tmpl->instances;
16. hlist_for_each_entry(inst, p, list, list) {
17. int err = crypto_remove_alg(&inst->alg, &users);
18. BUG_ON(err);
19. }
20.
21. crypto_notify(CRYPTO_MSG_TMPL_UNREGISTER, tmpl);
22.
23. up_write(&crypto_alg_sem);
24.
25. //释放模版的所有算法实例分配的内存
26. hlist_for_each_entry_safe(inst, p, n, list, list) {
27. BUG_ON(atomic_read(&inst->alg.cra_refcnt) != 1);
28. tmpl->free(inst);
29. }
30. crypto_remove_final(&users);
31. }
32. EXPORT_SYMBOL_GPL(crypto_unregister_template);
复制代码
2. 算法模版的查找
1. crypto_lookup_template 函数根据名称,查找相应的模版:
2.
3. struct crypto_template *crypto_lookup_template(const char *name)
4. {
5. return try_then_request_module(__crypto_lookup_template(name), name);
6. }
复制代码
__crypto_lookup_template 完成实质的模版模找工作,而 try_then_request_module 则尝试动态插入相应的内核模块,如果需要的话:
剩余117页未读,继续阅读
资源评论
- zcszw05042018-08-11挺不错,很好
小心你的履带
- 粉丝: 11
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功