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

二叶草 2020年2月13日22:01:28函数代码评论阅读模式

9. crypto_register_instance

函数原型:int crypto_register_instance(struct crypto_template *tmpl, struct crypto_instance *inst);

函数功能:算法实例的注册。

函数参数:tmpl 模板名称; inst 算法实例名称。

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

执行流程:

(1) 调用crypto_check_alg函数对实例对应的算法进行检测并返回结果err。

(2) 如果err为真,跳转到第8步。

(3) 对实例对应的算法模块和标志进行初始化操作。

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

(5) 调用__crypto_register_alg对实例对应的算法进行注册并返回larval。如果返回结果出错,则跳转到第7步。

(6) 调用Hash链表在实例中添加list并初始化实例对应的模板。

(7) 写信号量的释放操作,并对第5步产生结果larval输出结果err。然后如果larval出错,则跳转到第8步并调用crypto_wait_for_test。

(8) 返回err结果。

流程图:见图2-14。

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

图2-14 算法实例注册

10. crypto_unregister_instance

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

函数功能:算法实例的注销。

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

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

执行流程:

(1) 初始化链表users。

(2) 判断实例对应的算法标志是否为CRYPTO_ALG_INSTANCE,如果不是则返回-EINVAL宏定义。

(3) 对算法的引用计数进行原子读操作,然后进行调试。

(4) 对crypto_alg_aem进行写信号量的锁定操作。

(5) 使用Hash链表对实例中的list链表进行删除并初始化操作。

(6) 调用算法删除函数crypto_remove_alg删除users链表中的alg算法并获得结果err。

(7) 对写信号量进行释放操作。

(8) 判断第6步的结果是否为真,如果为真,则返回err。

(9) 释放模板的实例对象并调用crypto_remove_final处理链表users中成员的后续操作。并返回0。

流程图:见图2-15。

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

图2-15 算法实例注销

11. crypto_alloc_instance2

函数原型:void *crypto_alloc_instance2(const char *name, struct crypto_alg *alg, unsigned int head);

函数功能:算法实例的分配。

函数参数:name 分配的实例名; alg 算法注册名;head 用于内核空间分配。

函数返回值:返回空指针。

执行流程:

(1) 调用函数kzalloc对内核空间进行分配,返回结果p。如果内核空间分配失败,则返回-ENOMEN宏定义。

(2) 判断实例算法名长度是否超过了算法的最大长度,如果超过了算法名最大长度,则跳转到第4步。

(3) 判断实例算法对应的驱动名是否超过了算法的最大长度,如果超过了算法名最大长度,则跳转到第4步。否则返回内核空间地址。

(4) 释放内核空间并返回错误信息。

流程图:见图2-16。

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

图2-16 算法实例分配

12. crypto_alloc_instance

函数原型:struct crypto_instance *crypto_alloc_instance(const char *name,

struct crypto_alg *alg);

函数功能:算法实例的分配,通过调用crypto_alloc_instance2实现。

函数参数:name 分配的实例名; alg 算法注册名。

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

执行流程:

(1) 调用函数crypto_alloc_instance2分配算法实例,并返回结果inst。如果返回结果出错,则跳转到第4步。

(2) 调用crypto_instance_ctx获得算法实例的上下文,并返回结果spawn。

(3) 在获得spawn之后调用crypto_init_spawn对spawn进行初始化并返回结果err。如果初始化失败,则跳转到第4步,并返回inst算法实例对象。

(4) 释放分配的算法实例对象并返回错误结果。

流程图:见图2-17。

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

图2-17 算法实例分配接口

本文来源于:Linux加解密支持模块代码详细分析之核心文件分析-内部函数(3)-变化吧门户
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧门户观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
二叶草
Go语言中的常量 函数代码

Go语言中的常量

1 概述 常量,一经定义不可更改的量。功能角度看,当出现不需要被更改的数据时,应该使用常量进行存储,例如圆周率。从语法的角度看,使用常量可以保证数据,在整个运行期间内,不会被更改。例如当前处理器的架构...
Go语言的接口 函数代码

Go语言的接口

Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明...
Go语言支持的正则语法 函数代码

Go语言支持的正则语法

1 字符 语法 说明 . 任意字符,在单行模式(s标志)下,也可以匹配换行 字符类 否定字符类 d Perl 字符类 D 否定 Perl 字符类 ASCII 字符类 否定 ASCII 字符类 pN U...
Go语言的包管理 函数代码

Go语言的包管理

1 概述 Go 语言的源码复用建立在包(package)基础之上。包通过 package, import, GOPATH 操作完成。 2 main包 Go 语言的入口 main() 函数所在的包(pa...

发表评论