linux加密框架 crypto 算法管理 - 动态和静态算法管理

参考链接

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

动态和静态算法管理

静态算法

  • 加密框架中的算法分为静态算法和动态算法两种,其中静态算法指的是以"算法名.ko"形式存在的静态编译的算法模块,如aes.ko表示AES算法模块,md5.ko表示MD5算法模块
  • 静态算法模块是预定义的,在内核启动时或通过request_module函数加载到加密框架中
  • 在加密框架中,静态算法表示为一个算法说明实例。

动态算法

  • 而动态算法指的是根据算法模式(如CBC、HMAC等)和基础算法(静态算法或动态算法)创建的算法,如"cbc(aes)"表示使用AES算法的CBC模式的新算法,"hmac(md5)"表示使用MD5算法的HMAC模式的新算法,这些算法是根据外部应用需求动态创建并注册到加密框架中
  • 在加密框架中,动态算法表示为一个算法模板实例。

差异

  • 静态算法在密码学上属于算法的范畴
  • 动态算法在密码学上属于算法应用的范畴

创建动态算法

  • 发布创建动态算法通知
  • 如果外部应用在查找算法(如"cbc(aes)"算法)时,如果查找未命中,将创建注册用算法幼虫,然后在加密通知链上发布创建动态算法(CRYPTO_MSG_ALG_REQUEST)的通知
  • 如下所示
	ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
  • 如果是当前查找线程发布的创建动态算法通知,则larval为待创建算法同名的注册用算法幼虫,用于向创建动态算法的内核线程传递待创建算法的算法名、算法类型等信息,此时算法管理链表如下所示,其中cbc_aes_larval_r表示"cbc(aes)"算法对应的注册用算法幼虫。

算法管理链表

  • 加密通知链回调函数cryptomgr_notify根据通知消息类型msg调用不同的执行函数
  • 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;
}
  •  其中CRYPTO_MSG_ALG_REQUEST为创建动态算法(也称为算法探测)的通知,执行函数为cryptomgr_schedule_probe;
  • CRYPTO_MSG_ALG_REGISTER为算法正确性检验的通知,执行函数为cryptomgr_schedule_test。

cryptomgr_schedule_probe函数

  • cryptomgr_schedule_probe函数的输入参数为算法幼虫larval,返回值为执行结果,NOTIFY_STOP表示执行完毕,但是不表示已成功创建动态算法。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_schedule_probe(struct crypto_larval *larval)
{struct task_struct *thread;struct cryptomgr_param *param;const char *name = larval->alg.cra_name;const char *p;unsigned int len;int i;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++);len = p - name;if (!len || *p != '(')goto err_free_param;memcpy(param->template, name, len);i = 0;for (;;) {name = ++p;for (; isalnum(*p) || *p == '-' || *p == '_'; p++);if (*p == '(') {int recursion = 0;for (;;) {if (!*++p)goto err_free_param;if (*p == '(')recursion++;else if (*p == ')' && !recursion--)break;}p++;}len = p - name;if (!len)goto err_free_param;param->attrs[i].attr.rta_len = sizeof(param->attrs[i]);param->attrs[i].attr.rta_type = CRYPTOA_ALG;memcpy(param->attrs[i].data.name, name, len);param->tb[i + 1] = &param->attrs[i].attr;i++;if (i >= CRYPTO_MAX_ATTRS)goto err_free_param;if (*p == ')')break;if (*p != ',')goto err_free_param;}if (!i)goto err_free_param;param->tb[i + 1] = NULL;param->type.attr.rta_len = sizeof(param->type);param->type.attr.rta_type = CRYPTOA_TYPE;param->type.data.type = larval->alg.cra_flags & ~CRYPTO_ALG_TESTED;param->type.data.mask = larval->mask & ~CRYPTO_ALG_TESTED;param->tb[0] = &param->type.attr;param->otype = larval->alg.cra_flags;param->omask = larval->mask;crypto_alg_get(&larval->alg);param->larval = larval;thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;return NOTIFY_STOP;err_put_larval:crypto_alg_put(&larval->alg);
err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}
  • cryptomgr_schedule_probe函数执行流程如下所示。

创建内核线程执行算法探测

  • 1)在cryptomgr_schedule_probe函数函数中,需要从算法幼虫的算法名中解析出算法模板名和基础算法名,规则如下:
  • 正则表达式
    • a)基本规则:算法模板名(基础算法名1,…,基础算法名n);
    • b)算法模板名的有效字符包括0到9、a到z、A到Z、-、等;
    • c)基础算法名的有效字符包括0到9、a到z、A到Z、-、、(、)等;
    • d)所有基础算法名都必须包含在紧跟算法模板名后的()之内,当有多个基础算法时,基础算法名以",“间隔;
    • e)算法模板名与第一个”("之间不能有任何其他字符;
    • f)基础算法名最多不超过32个。
  • 例子
    • 例如,算法名为"hmac(md5)"时,解析出的算法模板为hmac,基础算法为静态算法md5;
    • 算法名为"authenc(hmac(md5),cbc(aes))"时,解析出的算法模板为authenc,基础算法为动态算法hmac(md5)和cbc(aes)。

cryptomgr_param

  • 2)传递给内核线程的参数数据结构为struct cryptomgr_param,定义如下所示:
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
struct cryptomgr_param {struct rtattr *tb[CRYPTO_MAX_ATTRS + 2];struct {struct rtattr attr;struct crypto_attr_type data;} type;struct {struct rtattr attr;struct crypto_attr_alg data;} attrs[CRYPTO_MAX_ATTRS];char template[CRYPTO_MAX_ALG_NAME];struct crypto_larval *larval;u32 otype;u32 omask;
};

参数介绍 

  • tb:参数名(T)列表,不含参数值,以NULL结尾。第1个为算法类型(CRYPTOA_TYPE),后续均为基础算法名(CRYPTOA_ALG)。
  • type:算法类型,TLV结构,包含算法类型和屏蔽位。
  • attrs:基础算法名列表,TLV结构。
  • larval:算法幼虫名,即待创建的动态算法的算法名。
  • template:算法模板名。
  • otype:原始的算法类型,传递给内核线程的算法类型中清除了算法已检测标志位。
  • omask:原始的算法类型屏蔽位,传递给内核线程的算法类型屏蔽位中清除了算法已检测标志位。
  • 填充完参数param后,创建名为"cryptomgr_probe"的内核线程,称为算法探测线程,其执行函数为cryptomgr_probe,如下所示。
thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;
  • 创建完算法探测线程后,算法查找线程调用crypto_larval_wait等待算法探测结束,如下所示。

	if (ok == NOTIFY_STOP)alg = crypto_larval_wait(larval);
  • 算法检测线程(非算法探测线程)通过注册用算法幼虫的完成量通知查找线程算法探测结束
  • struct completion *completion;完成量,指向算法幼虫的完成量。
  • 目前的版本  V5.15.12已经删除这个变量

cryptomgr_probe函数

  • cryptomgr_probe函数是算法探测线程的执行函数,输入参数为创建动态算法所需的参数
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_probe(void *data)
{struct cryptomgr_param *param = data;struct crypto_template *tmpl;int err;tmpl = crypto_lookup_template(param->template);if (!tmpl)goto out;do {err = tmpl->create(tmpl, param->tb);} while (err == -EAGAIN && !signal_pending(current));crypto_tmpl_put(tmpl);out:complete_all(&param->larval->completion);crypto_alg_put(&param->larval->alg);kfree(param);module_put_and_exit(0);
}
  • 处理流程如下所示

算法探测流程

  • 算法模板要么实现create接口要么实现alloc接口,两者必居其一
  • 其中create接口不仅创建算法模板实例,还实现算法模板实例注册,而alloc接口只创建算法模板实例,因此还需要调用者再进行算法模板实例注册。一般情况下,哈希算法的算法模板实现create接口,如HMAC模板提供的create接口为hmac_create函数,而分组算法的算法模板实现提供alloc接口,如CBC模板提供的alloc接口为crypto_cbc_alloc函数。
  • 如果在算法探测过程中出现错误,则需要在线程退出前调用crypto_larval_error函数完成收尾工作。crypto_larval_error函数的输入参数为算法幼虫名(即待创建的动态算法名)param->larval、原始算法类型param->otype和原始算法类型屏蔽位param->omask
    • 注意事项
    • crypto_larval_error 版本5.15.11已经不再支持
  • 如果以输入参数为条件查找到算法幼虫,则唤醒在其完成量上等待的线程;如果查找到的是已注册的算法,在算法检测线程中已唤醒在注册用算法幼虫完成量上等待的线程,如下所示。
    • 问题:
    • create和alloc必须要二者选一实现,但是我没有找到证据 进行论证

注册动态算法crypto_register_instance

  • crypto_register_instance函数用于注册动态算法(即算法模板实例),输入参数包括算法模板tmpl和算法模板实例inst,处理流程如下所示。
  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
int crypto_register_instance(struct crypto_template *tmpl,struct crypto_instance *inst)
{struct crypto_larval *larval;struct crypto_spawn *spawn;int err;err = crypto_check_alg(&inst->alg);if (err)return err;inst->alg.cra_module = tmpl->module;inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;down_write(&crypto_alg_sem);larval = ERR_PTR(-EAGAIN);for (spawn = inst->spawns; spawn;) {struct crypto_spawn *next;if (spawn->dead)goto unlock;next = spawn->next;spawn->inst = inst;spawn->registered = true;crypto_mod_put(spawn->alg);spawn = next;}larval = __crypto_register_alg(&inst->alg);if (IS_ERR(larval))goto unlock;hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;unlock:up_write(&crypto_alg_sem);err = PTR_ERR(larval);if (IS_ERR(larval))goto err;crypto_wait_for_test(larval);err = 0;err:return err;
}
EXPORT_SYMBOL_GPL(crypto_register_instance);

动态算法注册流程

  • 1)算法注册由通用算法注册函数__crypto_register_alg完成,输入参数为算法模板实例对应的通用算法说明inst->alg,返回值为检测用算法幼虫larval。
  • 2)算法模板和算法模板实例的关联代码如下:
	hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;
  • 即将算法模板实例添加到算法模板的实例链表中,同时设置算法模板实例归属的算法模板。
  • 3)和静态算法相同,动态算法注册的最后一步是算法正确性检验,调用crypto_wait_for_test函数实现。
  • 4)crypto_register_instance函数中接口调用情况如下所示。

接口调用情况

  • 5)注册同步哈希算法模板实例时使用的函数是shash_register_instance,其输入参数包括算法模板tmpl和同步哈希算法模板实例inst,处理流程如下所示。

同步哈希算法模板注册

  •  shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin
int shash_register_instance(struct crypto_template *tmpl,struct shash_instance *inst)
{int err;if (WARN_ON(!inst->free))return -EINVAL;err = shash_prepare_alg(&inst->alg);if (err)return err;return crypto_register_instance(tmpl, shash_crypto_instance(inst));
}
EXPORT_SYMBOL_GPL(shash_register_instance);
  • 和同步哈希静态算法相同,在注册前首先调用shash_prepare_alg函数检测同步哈希算法模板实例对应的同步哈希算法(inst->alg)的有效性,同时进行注册前的准备工作。注册前准备工作中最重要的一步是将算法类型常量设置为crypto_shash_type。
  • 同步哈希动态算法的注册工作是由通用动态算法注册函数crypto_register_instance完成。crypto_register_instance函数处理的是通用的算法模板实例,因此调用shash_crypto_instance函数获取同步哈希算法模板实例inst对应的通用算法模板实例。
  • shash_register_instance函数中接口调用情况如下所示。

接口调用

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

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

相关文章

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

参考链接 Linux加密框架的算法管理(四)_家有一希的博客-CSDN博客 函数介绍 如前所述,无论是静态算法还是动态算法,算法注册的最后一步都是进行算法正确性检验,一般流程是先调用__crypto_register_alg函数进行通用的算…

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…