linux加密框架 crypto 算法管理 - 算法检测

参考链接

  • Linux加密框架的算法管理(四)_家有一希的博客-CSDN博客

函数介绍

  • 如前所述,无论是静态算法还是动态算法,算法注册的最后一步都是进行算法正确性检验,一般流程是先调用__crypto_register_alg函数进行通用的算法注册即将待注册的算法添加到算法管理链表中),同时创建对应的检测用算法幼虫,然后调用crypto_wait_for_test函数启动算法正确性检验,并等待检验结束
  • 简单地说,算法正确性检验就是利用样本数据sampledata对算法接口进行计算正确性的验证。算法通过正确性检验的标志是算法标志cra_flags中置算法已检测标志CRYPTO_ALG_TESTED。算法通过正确性检验说明能够提供正常的服务,如加密/解密服务、计算消息摘要服务等。
  • crypto_wait_for_test函数用于启动算法正确性检验,并等待检验结束,输入参数为检测用算法幼虫larval
  • 函数处理流程如下所示。

启动算法检测

static void crypto_wait_for_test(struct crypto_larval *larval)
{int err;err = crypto_probing_notify(CRYPTO_MSG_ALG_REGISTER, larval->adult);if (err != NOTIFY_STOP) {if (WARN_ON(err != NOTIFY_DONE))goto out;crypto_alg_tested(larval->alg.cra_driver_name, 0);}err = wait_for_completion_killable(&larval->completion);WARN_ON(err);if (!err)crypto_notify(CRYPTO_MSG_ALG_LOADED, larval);out:crypto_larval_kill(&larval->alg);
}
  • 1)在crypto_wait_for_test函数中,调用crypto_probing_notify函数在加密通知链上发布算法正确性检验CRYPTO_MSG_ALG_REGISTER)的通知,携带的参数为检测用算法幼虫对应的算法成虫,即待检验的算法。
  • 2)静态算法(如AES算法)注册发布算法检验通知时,算法管理链表如下所示,其中aes_larval_t表示检测用算法幼虫,关联到对应的算法成虫(aes_larval_t->adult=aes_alg)。 

算法管理链表

  • 3)动态算法(如"cbc(aes)"算法)注册发布算法检验通知时,算法管理链表如下所示,其中cbc_aes_larval_r表示注册用算法幼虫,cbc_aes_larval_t表示检测用算法幼虫,注册用算法幼虫还未关联到算法成虫,检测用算法幼虫关联到算法成虫(cbc_aes_larval_t->adult=cbc_aes_alg)。 

算法管理链表

算法检测启动

  • 发布算法检测通知后,加密通知链回调函数cryptomgr_notify(CRYPTO_MSG_ALG_REGISTER)将调用cryptomgr_schedule_test函数启动算法检测。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,void *data)
{switch (msg) {case CRYPTO_MSG_ALG_REQUEST:return cryptomgr_schedule_probe(data);case CRYPTO_MSG_ALG_REGISTER:return cryptomgr_schedule_test(data);case CRYPTO_MSG_ALG_LOADED:break;}return NOTIFY_DONE;
}

  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_schedule_test(struct crypto_alg *alg)
{struct task_struct *thread;struct crypto_test_param *param;u32 type;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;memcpy(param->driver, alg->cra_driver_name, sizeof(param->driver));memcpy(param->alg, alg->cra_name, sizeof(param->alg));type = alg->cra_flags;/* Do not test internal algorithms. */if (type & CRYPTO_ALG_INTERNAL)type |= CRYPTO_ALG_TESTED;param->type = type;thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}
  • cryptomgr_schedule_test函数输入参数为待检测的算法alg,通过创建专门的算法检测线程处理算法正确性检验
  • 处理流程如下所示

启动算法检测

  •  1)算法正确性检验的参数数据结构为struct crypto_test_param,定义如下所示。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
struct crypto_test_param {char driver[CRYPTO_MAX_ALG_NAME];char alg[CRYPTO_MAX_ALG_NAME];u32 type;
};

参数介绍

  • 如上所示,算法正确性检验的参数包括算法驱动名driver、算法名alg和算法类型type。
  • 2)cryptomgr_schedule_test函数将创建名为"cryptomgr_test"的内核线程(即算法检验线程)处理算法正确性检验,处理接口为cryptomgr_test。
thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;
  • 3)在cryptomgr_test函数中,调用alg_test函数根据算法驱动名driver、算法名alg和算法类型type实现算法正确性检验。
  • err = alg_test(param->driver, param->alg, type, CRYPTO_ALG_TESTED);
static int cryptomgr_test(void *data)
{struct crypto_test_param *param = data;u32 type = param->type;int err = 0;#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTSgoto skiptest;
#endifif (type & CRYPTO_ALG_TESTED)goto skiptest;err = alg_test(param->driver, param->alg, type, CRYPTO_ALG_TESTED);skiptest:crypto_alg_tested(param->driver, err);kfree(param);module_put_and_exit(0);
}static int cryptomgr_schedule_test(struct crypto_alg *alg)
{struct task_struct *thread;struct crypto_test_param *param;u32 type;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;memcpy(param->driver, alg->cra_driver_name, sizeof(param->driver));memcpy(param->alg, alg->cra_name, sizeof(param->alg));type = alg->cra_flags;/* Do not test internal algorithms. */if (type & CRYPTO_ALG_INTERNAL)type |= CRYPTO_ALG_TESTED;param->type = type;thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}

算法检测结束

  • 在cryptomgr_test函数中,算法正确性检验结束后将调用crypto_alg_tested函数完成收尾工作。
  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
void crypto_alg_tested(const char *name, int err)
{struct crypto_larval *test;struct crypto_alg *alg;struct crypto_alg *q;LIST_HEAD(list);bool best;down_write(&crypto_alg_sem);list_for_each_entry(q, &crypto_alg_list, cra_list) {if (crypto_is_moribund(q) || !crypto_is_larval(q))continue;test = (struct crypto_larval *)q;if (!strcmp(q->cra_driver_name, name))goto found;}pr_err("alg: Unexpected test result for %s: %d\n", name, err);goto unlock;found:q->cra_flags |= CRYPTO_ALG_DEAD;alg = test->adult;if (err || list_empty(&alg->cra_list))goto complete;alg->cra_flags |= CRYPTO_ALG_TESTED;/* Only satisfy larval waiters if we are the best. */best = true;list_for_each_entry(q, &crypto_alg_list, cra_list) {if (crypto_is_moribund(q) || !crypto_is_larval(q))continue;if (strcmp(alg->cra_name, q->cra_name))continue;if (q->cra_priority > alg->cra_priority) {best = false;break;}}list_for_each_entry(q, &crypto_alg_list, cra_list) {if (q == alg)continue;if (crypto_is_moribund(q))continue;if (crypto_is_larval(q)) {struct crypto_larval *larval = (void *)q;/** Check to see if either our generic name or* specific name can satisfy the name requested* by the larval entry q.*/if (strcmp(alg->cra_name, q->cra_name) &&strcmp(alg->cra_driver_name, q->cra_name))continue;if (larval->adult)continue;if ((q->cra_flags ^ alg->cra_flags) & larval->mask)continue;if (best && crypto_mod_get(alg))larval->adult = alg;elselarval->adult = ERR_PTR(-EAGAIN);continue;}if (strcmp(alg->cra_name, q->cra_name))continue;if (strcmp(alg->cra_driver_name, q->cra_driver_name) &&q->cra_priority > alg->cra_priority)continue;crypto_remove_spawns(q, &list, alg);}complete:complete_all(&test->completion);unlock:up_write(&crypto_alg_sem);crypto_remove_final(&list);
}
EXPORT_SYMBOL_GPL(crypto_alg_tested);
  • crypto_alg_tested函数输入参数包括算法驱动名name和检验结果err(为0表示检验正确,非0表示检验失败),处理流程如下所示。

检测结束收尾流程

  • 1)检测结束收尾时,需要通过算法幼虫的完成量唤醒等待注册、检验结束的线程。
  • 在crypto_alg_tested函数中,首先根据输入的算法驱动名name查找对应的检测用算法幼虫test,如下所示。
test = (struct crypto_larval *)q;if (!strcmp(q->cra_driver_name, name))goto found;
  • 然后根据检测用算法幼虫test关联到算法成虫alg,如果算法检测通过(err=0)则设置算法成功alg的已检验标志 CRYPTO_ALG_TESTED,同时将检测用算法幼虫设置为已死亡,表示检测用算法幼虫的使命终结,如下所示。
found:q->cra_flags |= CRYPTO_ALG_DEAD;alg = test->adult;if (err || list_empty(&alg->cra_list))goto complete;alg->cra_flags |= CRYPTO_ALG_TESTED;
  • 再根据算法成虫alg查找对应的注册用算法幼虫larval,并进行关联,通过注册用算法幼虫唤醒所有等待注册结束的线程,如下所示。

  • 与目前版本V5.15.11存在差异 

  • 2)算法检验结束收尾时,算法管理链表如下所示。

算法管理链表

  • 注意:算法检验收尾时,只是通过注册用和检验用算法幼虫唤醒等待算法注册完成的线程,并不清理注册过程中的中间变量(即注册用和检验用算法幼虫) 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

select选中的值_selenium下拉框处理(select)

前言 web自动化中,常见的场景还有一个下拉框的选择,哪么在selenium中如何做下拉框的操作呢?selectselect在HTML中表示元素名,可创建单选或多选菜单。HTML中select长什么样子:select在HTML中元素名,下面有选…

linux加密框架 crypto 算法管理 - 创建哈希算法实例

crypto_alloc_ahash函数 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的,但是算法应用不关注哈希算法的实现方式,关注的是哈希算法提供的算法接口。为实现统一管理,加密框架默认哈希算法的实现方式为异步方式,…

发票管理软件_企业为什么需要ERP企业管理软件?

对于一个制造企业来说,生产是企业最大的动力,而生产也需要进行优化管理,一个好的生产管理方式会带给企业巨大的发展空间和利润价值。对于一个制造企业来说,生产是企业最大的动力,而生产也需要进行优化管理,…

linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程

参考链接 Linux加密框架的应用示例(一)_家有一希的博客-CSDN博客 本文大纲 本节将从应用角度说明加密框架的运行流程,包括加密框架如何管理算法、如何动态创建算法,应用模块如何创建算法实例、如何通过算法实例调用算法接口等。…

java 累进计费率计算_设计费400万,缴纳所得税100万,如何筹划

很多公司老板都会把利润放在第一位,照理说这是没错的,公司要盈利才能继续经营下去。我国有很多针对小微企业的政策,盈利不高的情况下,基本不会去考虑纳税问题,也没有多少税收压力。但是对一些暴利的服务型行业、软件设…

linux加密框架 crypto 算法管理 - 哈希算法应用实例

参考链接 Linux加密框架应用示例(二)_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程_CHYabc123456hh的博客-CSDN博客 在应用模块中创建并初始化哈希算法实例 假设某个SA配置使用的认证算法为"hmac(md5…

Linux加密框架 crypto crypto_larval | crypto_larval_alloc | __crypto_register_alg 介绍

参考链接 Lniux加密框架中的主要数据结构(五)_家有一希的博客-CSDN博客crypto_larval struct crypto_larval {struct crypto_alg alg;struct crypto_alg *adult;struct completion completion;u32 mask; };结构体名叫 crypto_larval (算法幼…

好玩的脚本代码大全_Github | 推荐一个Python脚本集合项目

点击上方"蓝字"关注我们Python大数据分析记录 分享 成长用python写小脚本是一件好玩的事情,因为不是个大活儿,而且能解决眼边前十分繁琐的事情,这种轻松且便宜的代码颇受人民群众的欢迎~有点生活小妙招的意味大家较为熟知的脚本…

linux加密框架 crypto 算法管理 - 算法查找接口

参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup_CHYabc123456hh的…

xml模糊查询语句_2Mybatis学习笔记07:动态SQL语句(原创,转载请注明来源)

开发环境:硬件环境:Windows10JDK 1.8; 软件环境:JavaEclipseMybatismaven3.6tomcat8.0Postgresql 10.6; 用到的jar包: asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar javassist-3.17.1-GA.jar …

硬件密码组件的硬件结构、作用及实现应用设计

引 言 1 硬件密码组件的概念 密码技术是解决信息安全问题的核心技术。要实现信息的保密性、完整性、可控性和不可否认性等安全要求,都离不开密码技术的运用。在具体的信息安全系统中,密码技术的运用可以基于软件密码组件(简称为SCM&#xf…

sql倒序查询语句_SQL丨1.基本查询语句复习

此为自用查询语句1.selectSELECT column1,column2 FROM table1;常用的格式惯例:大写了SELECT和FROM,而将表名和列名小写;通常在列名中使用下划线,避免使用空格;在每个语句末尾添加分号;SQL不区分大小写。2.…

基于区块链的档案共享 项目启动

注意事项 已经备份了一个配置fabric的完整ubuntu系统,其需要注意的细节如下1,此镜像系统需要配置host文件,sudo vim /etc/hosts,添加如下内容127.0.0.1 orderer.example.com peer0.org1.example.com peer1.org1.example.c…

知道一点怎么设直线方程_【初中数学】反比例函数策略(二) ——构造方程法...

【相关阅读】【初中数学】反比例函数策略之一 ——数形结合反比例函数策略(二)——构造方程法(王 桥)上一次,咱们探讨了解决反比例函数的策略一——数形结合,本节课我们继续反比例函数的策略(二)——构造方程法。构造方程法,在《春季攻势》第…

wpf将文字转化为图形_将创新转化为实际应用

Worldsensing是全球公认的物联网先驱。这家位于西班牙巴塞罗那的技术供应商成立于2008年,为城市和传统行业提供运营情报。伊格纳西维拉霍萨纳(IgnasiVilajosana)是公司联合创始人兼首席执行官。伊格纳西拥有西班牙巴塞罗那大学物理学博士学位,还接受过美…

音视频处理 FFmpeg相关内容介绍 以及八大

FFmpeg的介绍 FFmpeg由Fabrice Bellard于2000年创建,由C和汇编语言进行开发FF -> Fast Forward 快进mpeg -> 标准化组织 Moving Pictures Experts Group使用到FFmpeg的开源项目gstreamer: a framework for streaming mediachromiummpv: Command line video pl…

音视频处理 基础开发 语言基础

基础开发内容 Vim编译器C语言回顾,重点介绍指针的概念Linux/MAC C语言的编译和调试Linux/MAC 常用开发工具介绍 Vim编译器 命令模式 拷贝 删除 粘贴等,通过i / a 等切换到编辑模式编辑模式 编辑字符,通过ESC进行切换常用命令 创建文件 vim …

音视频处理 ffmpeg下载、编译和安装

创建文件夹 ffmpeg_sources 存放源文件ffmpeg_build 构建文件并安装库bin 存放二进制可执行文件 安装依赖环境 整体安装 sudo apt-get update -qq && sudo apt-get -y install \autoconf \automake \build-essential \cmake \git-core…

CLion配置 鼠标滚轮 放大和缩小

操作 点击File -> Settings点击Appearance & Behavior -> Keymap在搜索框搜索 font 选择 Decrease FontSize ,右键点击,选择add Mouse Shortcut,按住ctrl,同时向下滑动滚轮;同理,操作 Increase…

struts2通配符_基于Struts2框架的名片管理系统

本篇博文将分享一款基于Struts2框架的名片管理系统,JSP引擎为Tomcat9.0,数据库采用的是MySQL5.5,集成开发环境为Eclipse IDE for Java EE Developers。名片管理系统主要包括用户管理和名片管理功能。用户功能主要包括:用户注册、用…