汇聚全球视觉新闻资讯
你所在的位置:汇视网 > 聚焦 >科技

Linux加解密支持模块代码详细分析之核心文件分析-内部函数(1)

发布时间:2017-02-19 09:51  来源:汇视网   编辑:文辉  阅读量:11898   

2.4.1.5. 内部函数

文件algapi.c中内部函数的详细信息如下。

1. __crypto_register_alg

函数原型:static struct crypto_larval *__crypto_register_alg(struct crypto_alg *alg);

函数功能:算法注册。

函数参数:alg 算法注册名。

函数返回值:返回crypto_larval对象。

执行流程:

(1) 判断算法是否死亡,如果算法死亡,跳转到第11步,否则初始化链表cra_users。

(2) 设置算法标志。

(3) 对算法的引用计数进行原子设置。

(4) 遍历链表crypto_alg_list,并返回crypto_alg 对象q。

(5) 判断q是否和传入的参数alg相等,如果相等,跳转到第11步,否则判断算法的标志是否为死亡或者正在死亡,如果判断正确,跳过后面操作跳转到第4步。否则判断q是否为larval类型的算法,如果是接着进行驱动名比较,如若相同则跳转到第11步,然后再跳转到第4步。否则判断驱动名和算法名是否相同,如果相同,跳转到第11步,遍历结束。

(6) 分配larval算法,并判断分配是否出错。如果出错,则跳转到第9步。否则返回ret。

(7) 通过alg获取算法模块。然后对获取结果进行判断,如果获取失败,则跳转第10步。否则对larval的算法引用计数设置原子操作。

(8) 算法驱动名称拷贝并设置优先级,然后向crypto_alg_list链表添加节点。

(9) 返回larval。

(10) 释放申请的larval内核空间。

(11) 返回ret的错误处理并跳转到第9步。

流程图:见图2-6。

2. crypto_alg_tested

函数原型:void crypto_alg_tested(const char *name, int err);

函数功能:算法测试。

函数参数:name 算法名称; err 算法测试结果。

函数返回值:无。

执行流程:

(1) 对crypto_alg_sem写信号量进行锁定。

(2) 对链表crypto_alg_list进行遍历并返回算法q。如果算法q状态为死亡或者正在死亡或者传入参数q的larval算法生成失败,跳转到第2步。否则判断传入的算法名和驱动名是否相同,如果相同,则跳转到第3步。遍历结束跳转到第4步。

(3) 跳转函数处理过程。

a. 设置算法q的标志为CRYPTO_ALG_DEAD。

b. 判断cra_list链表是否为空,如果链表为空,跳转到第5步,否则设置算法alg的算法标志为CRYPTO_ALG_TESTED。

c. 遍历链表crypto_alg_list并返回算法q。接下来对遍历中的情况进行判定。

如果算法q和alg相等,则跳过后面操作继续遍历;否则判断算法q标志是否死亡或者正在死亡,如果判定结果正确,则跳过后面操作继续遍历;否则判断算法larval是否生成成功,如果成功,则检查算法的通用名称或者具体名称可以满足larval的命名需求;否则判断算法alg和q的名称是否相同,如果相同,则跳过后面操作继续遍历;否则判断算法alg和q的驱动名称是否相同且q的优先级高于alg。如果判断驱动名称相同且q优先级高于alg,则跳过后面操作继续遍历。

(4)crypto_alg_sem写信号量释放并删除list链表。

流程图:见图2-7。

Linux加解密支持模块代码详细分析之核心文件分析-内部函数(1)

图2-6 算法注册

3. crypto_register_alg

函数原型:int crypto_register_alg(struct crypto_alg *alg);

函数功能:算法注册,属于API接口。

函数参数:alg 算法注册名。

函数返回值:函数调用成功返回0。

执行流程:

(1) 对传入参数alg进行算法检测,如果检测没问题则返回结果。

(2) 对crypto_alg_sem进行写信号量的锁定操作。

(3) 通过调用__crypto_register_alg函数获取算法注册。

(4) 对crypto_alg_sem进行写信号量的释放操作。

(5) 如果第3步获得的算法注册结果出错,则返回错误处理结果;否则调用crypto_wait_for_test函数。

流程图:见图2-8。

4. crypto_remove_alg

函数原型:static int crypto_remove_alg(struct crypto_alg *alg, struct list_head *list);

函数功能:在算法事件链表中删除一个算法。

函数参数:alg 算法名; list 算法链表。

函数返回值:函数调用成功返回0。

执行流程:

(1) 判断链表cra_list为空的可能性有多大,如果链表为空可能性很大,则返回-ENOENT,否则对算法alg的标志进行设置。

(2) 调用事件通知函数crypto_notify通知内核将要注销算法alg。

(3) 删除链表cra_list并初始化。

(4) 调用函数crypto_remove_spawns,最后返回0。

流程图:见图2-9。

Linux加解密支持模块代码详细分析之核心文件分析-内部函数(1)

图2-9 删除一个算法

Linux加解密支持模块代码详细分析之核心文件分析-内部函数(1)

图2-8 注册算法

郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。

相关搜索热词: