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

crypto_alloc_ahash函数

  • 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的,但是算法应用不关注哈希算法的实现方式,关注的是哈希算法提供的算法接口。为实现统一管理,加密框架默认哈希算法的实现方式为异步方式,将哈希算法的外部接口统一定义为异步哈希算法接口。
  • 算法实例是算法应用和加密框架之间的桥梁,算法应用通过算法实例实现算法调用。以哈希算法实例为例,在IPSEC框架的AH协议模块中,协议状态初始化(ah_init_state函数)时,将根据配置的认证算法名(x->aalg->alg_name)创建对应的异步哈希算法实例ahash,如下所示。
  • ah4.c - net/ipv4/ah4.c - Linux source code (v5.15.12) - Bootlin

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;
}
  • crypto_alloc_ahash函数的输入参数包括算法名alg_name、算法类型type和算法类型屏蔽字mask,返回值为新创建的异步哈希算法实例,函数处理流程非常简单,调用crypto_alloc_tfm函数创建算法alg_name对应的异步哈希算法实例
struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type,u32 mask)
{return crypto_alloc_tfm(alg_name, &crypto_ahash_type, type, mask);
}
EXPORT_SYMBOL_GPL(crypto_alloc_ahash);

crypto_alloc_tfm函数

static inline void *crypto_alloc_tfm(const char *alg_name,const struct crypto_type *frontend, u32 type, u32 mask)
{return crypto_alloc_tfm_node(alg_name, frontend, type, mask, NUMA_NO_NODE);
}
  • crypto_alloc_tfm函数的输入参数包括算法名alg_name、算法前端fronted(即算法类型常量)、算法类型type和算法类型屏蔽字mask
  • 处理流程如下图所示。

crypto_alloc_tfm函数处理流程

  • 1)crypto_alloc_tfm函数内部嵌套了一个函数crypto_alloc_tfm_node
  • crypto_alloc_tfm_node函数 处理流程包括两步,第一步调用crypto_find_alg函数查找符合条件的算法alg,第二步调用crypto_create_tfm_node函数根据算法alg创建对应的算法实例tfm。

  • 2)crypto_alloc_tfm_node函数返回一个void*类型的通用指针(即内存地址),由直接或间接的调用者负责解释通用指针的具体含义(即具体表示何种数据结构的指针)(使用的时候,将void*转化为 具体使用的结构体指针),如crypto_alloc_ahash函数作为直接调用者将crypto_alloc_tfm函数返回的通用指针解释为异步哈希算法实例的指针。
  • 即 将void* 转化为 crypto_ahash* 类型的指针
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 3)crypto_alloc_ahash函数调用crypto_alloc_tfm函数时,输入的算法前端为crypto_ahash_type,定义如下所示。
  • ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin
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),
};

crypto_create_tfm_node函数的

  • crypto_create_tfm_node函数的输入参数包括通用算法说明alg和算法前端frontend
  • 处理流程如下所示

crypto_create_tfm函数处理流程

  • 1)在申请内存前,需要计算算法实例所需的内存空间total,包括个性化算法实例占用的内存空间tfmsize、通用算法实例占用的内存空间以及算法实例占用的额外内存空间extsize,如下图所示。

  • 个性化算法实例内存空间由算法前端的成员变量tfmsize确定,算法实例占用的额外内存空间由具体算法确定,通过算法前端的extsize接口获取。创建异步哈希算法实例时,算法前端为crypto_ahash_type,tfmzise为offsetof(struct crypto_ahash, base),extsize接口为crypto_ahash_extsize函数

crypto_ahash_extsize函数

  • ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin  
static unsigned int crypto_ahash_extsize(struct crypto_alg *alg)
{if (alg->cra_type != &crypto_ahash_type)return sizeof(struct crypto_shash *);return crypto_alg_extsize(alg);
}
  • 如上所示,算法实例占用的额外内存空间与哈希算法实现方式有关
    • 实现方式为异步方式时,额外内存空间为异步哈希算法上下文空间;
    • 实现方式为同步方式时,额外内存空间用于保存同步哈希算法实现指针。
  • 2)申请完内存空间mem后,需要初始化通用算法实例tfm,包括:
    • a)通用算法实例tfm关联到通用算法说明alg, tfm->__crt_alg = alg;
    • b)  调用算法前端frontend的init_tfm接口初始化tfm。创建异步哈希算法实例时,算法前端crypto_ahash_type定义的initial_tfm接口为crypto_ahash_init_tfm函数。
      crypto_ahash_init_tfm函数的主要功能是利用异步哈希算法说明alg的算法接口初始化异步哈希算法实例hash的算法接口,但是如果算法的实现方式不是异步方式,将调用crypto_init_shash_ops_async函数使用同步哈希算法的异步实现接口(形如shash_async_xxx)初始化异步哈希算法实例的算法接口。
    • c)如果通用算法说明alg定义了cra_init接口则调用其进一步初始化tfm。在加密框架中,一般情况下动态算法的算法说明都会定义cra_init接口,而静态算法的算法说明都不定义cra_init接口,如HMAC模板创建的动态算法的算法说明的cra_init接口为hmac_init_tfm,而MD5算法的算法说明未定义cra_init接口

 

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

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

相关文章

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

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

python 画风场 scipy_Python数据分析及可视化实例之Scipy

强大到没有朋友的科学计算库,不知道怎么介绍ta!大牛张若愚出了厚本的《Python 科学计算》第二版里面包罗万象,就不做搬运工了,尽快开工pandas。来一弹在NLP自然语言处理中用到的稀疏矩阵处理:# coding: utf-8# # 稀疏矩…

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

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

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

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

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

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

guido python正式发布年份_Python语言适合哪些领域的计算问题? (1.3分)_学小易找答案...

【单选题】关于Python中的复数,下列说法错误的是 (1.3分)【多选题】药物作用的基本规律包括?【单选题】Python 中,以下哪个赋值操作符是错误的? (1.3分)【单选题】哪个选项是下面代码的执行结果? s "abcd1234" print ( s . find ( "cd" )) (1.3分)【填…

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的…

python中以下关于列表描述错误的_10. 以下关于列表操作的描述,错误的是:_学小易找答案...

【单选题】Python 语句 a1211.21 print(type(a)) 的输出结果为( )【单选题】Python语句序列"s1 [4, 5, 6]; s2 s1; s1[1]0; print(s2)"的运行结果是( )。【填空题】Python语句print(%d%%%d%(3/2, 3%2))的运行结果是( 1 )。【单选题】python语句print(type(123))的数…

写论文注意事项

参考链接 给研究生修改了一篇论文后,该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情,很多情况下,他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言,首先要用一小句话引…

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…

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

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

音视频处理 C语言编译器

命令 gcc/clang -g -O2 -o test test.c -I ... -L ... -lgcc Linux环境下的命令;clang是MAC环境下的执行命令-g 输出文件中的调试信息-O 对输出文件进行指令优化-o 输出文件,可执行文件-I 指定头文件,大写的i 从-I 开始 是链接内容&#x…

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…

python开发wince软件_Wince6.0应用开发:二、模拟器的使用

上一篇我们只是搭建我们的开发平台,那么下面我们结合之前安装的Wince6.0模拟器进行简单的开发,来了解一个操作流程一直写的东西都是很直白的,(*^__^*) 嘻嘻……一、连接上我们的模拟器1、打开vs2008,选择工具---->设备仿真器管…