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

参考链接

  • Linux加密框架应用示例(二)_家有一希的博客-CSDN博客
  • linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程_CHYabc123456hh的博客-CSDN博客

在应用模块中创建并初始化哈希算法实例

  • 假设某个SA配置使用的认证算法为"hmac(md5)"(即x->aalg->alg_name为"hmac(md5)"),在调用ah_init_state函数初始化SA状态时,将创建认证算法对应的异步哈希算法实例ahash,并设置HMAC密钥(密钥数据保存在SA中,即x->aalg->alg_key

 ah_init_state函数

  • 调用ah_init_state函数初始化SA状态
static int ah_init_state(struct xfrm_state *x)
{struct ah_data *ahp = NULL;struct xfrm_algo_desc *aalg_desc;struct crypto_ahash *ahash;if (!x->aalg)goto error;if (x->encap)goto error;ahp = kzalloc(sizeof(*ahp), GFP_KERNEL);if (!ahp)return -ENOMEM;ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;ahp->ahash = ahash;if (crypto_ahash_setkey(ahash, x->aalg->alg_key,(x->aalg->alg_key_len + 7) / 8))goto error;/** Lookup the algorithm description maintained by xfrm_algo,* verify crypto transform properties, and store information* we need for AH processing.  This lookup cannot fail here* after a successful crypto_alloc_ahash().*/aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);BUG_ON(!aalg_desc);if (aalg_desc->uinfo.auth.icv_fullbits/8 !=crypto_ahash_digestsize(ahash)) {pr_info("%s: %s digestsize %u != %hu\n",__func__, x->aalg->alg_name,crypto_ahash_digestsize(ahash),aalg_desc->uinfo.auth.icv_fullbits / 8);goto error;}ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;ahp->icv_trunc_len = x->aalg->alg_trunc_len/8;if (x->props.flags & XFRM_STATE_ALIGN4)x->props.header_len = XFRM_ALIGN4(sizeof(struct ip_auth_hdr) +ahp->icv_trunc_len);elsex->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) +ahp->icv_trunc_len);if (x->props.mode == XFRM_MODE_TUNNEL)x->props.header_len += sizeof(struct iphdr);x->data = ahp;return 0;error:if (ahp) {crypto_free_ahash(ahp->ahash);kfree(ahp);}return -EINVAL;
}
  • 创建认证算法对应的异步哈希算法实例ahash
	ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;
  • 并设置HMAC密钥(密钥数据保存在SA中,即x->aalg->alg_key
	ahp->ahash = ahash;if (crypto_ahash_setkey(ahash, x->aalg->alg_key,(x->aalg->alg_key_len + 7) / 8))goto error;
	/* Data for transformer */struct xfrm_algo_auth	*aalg;   //认证算法struct xfrm_algo	*ealg;       //加密算法struct xfrm_algo	*calg;       //压缩算法struct xfrm_algo_aead	*aead;   //AEAD算法

  • 这一块有点绕
  • 由于默认算法以异步方式实现,因此在ah_init_state函数中将调用crypto_alloc_ahash函数创建与认证算法"hmac(md5)"对应的异步哈希算法实例,记为hmac_md5_ahash
  • 由于MD5算法是以同步方式实现的,由其衍生的"hmac(md5)"算法也是以同步方式实现的,因此也会同步创建"hmac(md5)"算法的同步哈希算法实例,记为hmac_md5_shash
  • 由于"hmac(md5)"算法是在MD5算法基础上构造的,具体的算法运算由MD5算法实现,因此还会同步创建MD5算法的同步哈希算法实例,记为md5_shash
  • 综上所述,调用crypto_alloc_ahash函数实际上创建了三个算法实例,其中hmac_md5_ahash是面向具体算法应用(如IPSEC模块)的,md5_shash是面向具体算法实现(如MD5算法)的,hmac_md5_shash负责将hmac_md5_ahash和md5_shash两个算法实例串联在一起,三个算法实例的关系如下所示。

在这里插入图片描述

创建哈希算法实例hmac_md5_ahash

  • 下面将按照函数调用关系逐步说明如何创建哈希算法实例hmac_md5_ahash。

1)ah_init_state函数

  • ah_init_state函数调用crypto_alloc_ahash函数异步哈希算法实例hmac_md5_ahash时,输入参数包括算法alg_name(=“hmac(md5)”)、算法类型type(=0)和算法类型屏蔽字mask(=0)
	ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;
  • 从函数的输入参数可知,ah_init_state函数不关心认证算法的实现方式,只关心是否有可提供服务的认证算法

2)crypto_alloc_ahash函数

  • 实际上crypto_alloc_ahash函数是一个包裹函数(wrapper),具体工作由crypto_alloc_tfm函数实现。crypto_alloc_tfm函数继承了调用者所有的输入参数。
  • ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin
  • 由于crypto_alloc_tfm函数并不是创建特定的算法实例(即特定数据结构指针),而是返回一个通用指针(即void *),由调用者具体解释通用指针的含义(即将通用指针转换为特定算法实例数据结构指针)。不同类型算法实例占用的内存空间不同、初始化流程存在差异,这些不同和差异由crypto_alloc_tfm函数的输入参数frontend说明,在这里参数frontend按照字面理解为算法前端,按照数据结构实际上就是算法类型常量指针。
  • frontend的类型是 crypto_type
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin  
  • 由于crypto_alloc_ahash函数用于创建异步哈希算法实例,因此在调用crypto_alloc_tfm函数时传递的frontend参数为异步哈希算法类型常量crypto_shash_type,调用结束后将crypto_alloc_tfm函数返回地通用指针隐式地强制转换为异步哈希算法实例指针

3)crypto_alloc_tfm函数

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_alloc_tfm函数内部调用  crypto_alloc_tfm_node 函数
  • crypto_alloc_tfm_node 函数的基本逻辑是先调用crypto_find_alg函数查找符合条件(包括算法名alg_name、算法类型type和算法类型屏蔽字)的算法alg,然后再调用crypto_create_tfm_node函数创建与算法alg关联的算法实例tfm。
void *crypto_alloc_tfm_node(const char *alg_name,const struct crypto_type *frontend, u32 type, u32 mask,int node)
{void *tfm;int err;for (;;) {struct crypto_alg *alg;alg = crypto_find_alg(alg_name, frontend, type, mask);if (IS_ERR(alg)) {err = PTR_ERR(alg);goto err;}tfm = crypto_create_tfm_node(alg, frontend, node);if (!IS_ERR(tfm))return tfm;crypto_mod_put(alg);err = PTR_ERR(tfm);err:if (err != -EAGAIN)break;if (fatal_signal_pending(current)) {err = -EINTR;break;}}return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(crypto_alloc_tfm_node);
  • 假设第一次使用"hmac(md5)“算法,算法查找不命中,因此加密框架将根据算法模板(HMAC模板)和基础算法(MD5算法)动态创建新的算法(通用算法说明记为hmac_md5_alg)并注册。
  • 截至到目前为止,函数接口调用关系如下图所示

 在这里插入图片描述

  •  crypto_find_alg 函数调用之前,alg_name指代hmac(md5),crypto_find_alg函数转化之后输出alg,alg已经指定的是hmac_md5_alg

3. 创建动态算法"hmac(md5)”

  • 1)crypto_find_alg函数
  • crypto_find_alg函数的主要功能是确认算法查找的预期算法类型(包括算法类型type以及算法类型屏蔽字mask)和算法查找接口lookup
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
struct crypto_alg *crypto_find_alg(const char *alg_name,const struct crypto_type *frontend,u32 type, u32 mask)
{if (frontend) {type &= frontend->maskclear;mask &= frontend->maskclear;type |= frontend->type;mask |= frontend->maskset;}return crypto_alg_mod_lookup(alg_name, type, mask);
}
EXPORT_SYMBOL_GPL(crypto_find_alg);
  • 按照调用关系,此时传递给crypto_find_alg函数的算法前端frontend为异步哈希算法类型常量crypto_ahash_type,算法类型type和算法类型屏蔽字均为0,其中算法前端frontend与算法查找相关的成员变量如下所示。

static const struct crypto_type crypto_ahash_type = {.extsize = crypto_ahash_extsize,.init_tfm = crypto_ahash_init_tfm,.free = crypto_ahash_free_instance,
#ifdef CONFIG_PROC_FS.show = crypto_ahash_show,
#endif.report = crypto_ahash_report,.maskclear = ~CRYPTO_ALG_TYPE_MASK,.maskset = CRYPTO_ALG_TYPE_AHASH_MASK,.type = CRYPTO_ALG_TYPE_AHASH,.tfmsize = offsetof(struct crypto_ahash, base),
};
  • 在调用算法查找接口lookup(默认接口crypto_alg_mod_lookup)时,算法类型type为CRYPTO_ALG_TYPE_AHASH,算法类型屏蔽字mask为CRYPTO_ALG_TYPE_AHASH_MASK。
  • 注意事项:未找到证据  在遍历算法管理链表查找算法前(crypto_larval_lookup函数),还会再次更新算法类型为type=type&mask=0x08(在算法类型定义中为CRYPTO_ALG_TYPE_HASH)。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 在遍历管理算法链表时,如果((cra_flags ^ type) & mask)=0表示当前算法满足查找条件中的算法类型要求,否则不满足算法类型要求,也就是说只要是哈希算法,无论是同步方式实现还是异步方式实现,都满足算法类型要求。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 2)crypto_alg_mod_lookup函数
  • 在crypto_alg_mod_lookup函数中,调用crypto_larval_lookup函数查找符合条件的算法。假设第一次使用"hmac(md5)"算法,算法查找不命中,在调用crypto_larval_lookup函数时将返回一个与查找算法同名的注册用算法幼虫,记为hmac_md5_larval_r。
  • 算法查找不命中时,加密框架尝试动态创建符合条件的算法,调用crypto_probing_notify函数在加密通知链发布一个算法注册(CRYPTO_MSG_ALG_REQUEST)通知,动态创建"hmac(md5)“算法,传递的参数由注册用算法幼虫hmac_md5_larval_r指定。
  • larvel 接收 crypto_larval_lookup  返回的  算法同名的注册用算法幼虫,记为hmac_md5_larval_r
  • larvel 指定 hmac_md5_larval_r;
  • larvel 作为函数的形参输入,由函数 crypto_probing_notify 进行 算法注册
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 发布算法注册通知时,通过解析注册用算法幼虫hmac_md5_larval_r的算法名(即"hmac(md5)”)可获取算法模板名hmac和基础算法名md5,加上预期的算法类型共同组成传递给算法探测线程cryptomgr_probe的参数param。 

  • https://elixir.bootlin.com/linux/latest/source/crypto/algboss.c#L50
  • 算法探测线程运行时,根据算法模板名hmac查找到对应的算法模板hmac_tmpl。由于算法模板hmac_tmpl定义了create接口(即hmac_create函数),将调用之根据参数列表param->tb创建并注册动态算法。

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

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

相关文章

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。名片管理系统主要包括用户管理和名片管理功能。用户功能主要包括:用户注册、用…

音视频处理 Clion搭建ffmpeg开发环境

参考链接 Ubuntu 20.04 搭建 CLion FFmpeg 开发环境_TYYJ-洪伟的博客-CSDN博客 安装CLion 首先到 jetbrains 官网 https://www.jetbrains.com/clion/ 下载 CLion 安装包 CLion-2021.1.tar.gz使用finalshell和ubuntu之间配置ssh链接将Clion-2022.1.tar.gz 使用move移动到 /hom…

音视频处理 ffmpeg中级开发 H264编码

开发介绍 libavcodec/avcodec.h常用的数据结构 AVCodec 编码器结构体AVCodecContext 编码器上下文AVFrame 解码后的帧结构体内存的分配和释放 av_frame_alloc 申请av_frame_free() 释放avcodec_alloc_context3() 创建编码器上下文avcodec_free_context() 释放编码器上下文解码…

音视频处理 ffmpeg中级开发 视频转图片

操作流程 目的:使用FFmpeg将视频的每一帧数据转换为图片1,打开输入的多媒体文件,检索多媒体文件中的流信息2,查找视频流的索引号,通过索引号获取数据流;通过解析视频流中的编码参数得到解码器ID&#xff0…

企业知识库与知识管理:如何统一战略与实践

在知识密集型的现代企业中,知识已经成为了一种宝贵的资产。如何有效地管理和利用这一资产,成为企业持续发展与创新的关键。企业知识库与知识管理作为知识经济的两大支柱,它们的重要性不言而喻。但很多时候,我们发现企业的知识管理…

音视频处理 ffmpeg中级开发 AAC编码

介绍 编码流程类似于视频编码,1,查找编码器;2,设定参数,打开编码器;3,数据编码编码函数 avcodec_encode_audio2 已经被弃用FFmpeg 过时 Api 汇总整理 - 灰色飘零 - 博客园 未成功使用 旧版本i…

虚拟机为Ubuntu分配空间

当虚拟机里面的创建的ubuntu镜像需要更大的空间,将ubuntu关掉之后,对应调整硬盘的空间大小,由先前的20G上调至50G,但是先前的20G内存空间映射的位置是/dev/sda,后面增加的这段内存空间30G映射到/dev/sda1因此&#xff…