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 (算法幼虫)
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
  • 数据成员  细分
    • alg:算法幼虫对应的通用算法说明;
    • adult:算法幼虫对应的算法成虫,即待注册或待检验的算法;
    • completion:算法幼虫对应的完成量,用于在注册或检验过程中进行线程同步;struct completion - 用于维护“完成”状态的结构:这是用于维护“完成”状态的不透明结构。完成当前使用 FIFO 来排队必须等待的线程“完成”事件。
    • mask:算法类型屏蔽字。
  • 在加密框架中每种算法都对应一个通用算法说明,需要由算法管理链表管理,算法幼虫是一种特殊的算法,不“成熟”,无法提供算法服务,因此其通用算法说明只是用来表示算法幼虫的属性(如算法名,算法类型等),并不提供算法接口。
  • 在加密框架中,算法动态注册和算法正确性检验都是由专门的内核线程实现的与执行算法查找或算法注册的内核线程之间通过完成量机制实现线程间同步。 

completion

  •  completion.h - include/linux/completion.h - Linux source code (v5.15.12) - Bootlin

/** struct completion - structure used to maintain state for a "completion"** This is the opaque structure used to maintain the state for a "completion".* Completions currently use a FIFO to queue threads that have to wait for* the "completion" event.** See also:  complete(), wait_for_completion() (and friends _timeout,* _interruptible, _interruptible_timeout, and _killable), init_completion(),* reinit_completion(), and macros DECLARE_COMPLETION(),* DECLARE_COMPLETION_ONSTACK().*/
struct completion {unsigned int done;struct swait_queue_head wait;
};

crypto_larval_alloc

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_larval_alloc函数输入参数包括算法名name、算法类型type和算法类型屏蔽字mask,实现根据输入参数创建同名的算法幼虫larval的功能。
struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask)
{struct crypto_larval *larval;larval = kzalloc(sizeof(*larval), GFP_KERNEL);if (!larval)return ERR_PTR(-ENOMEM);larval->mask = mask;larval->alg.cra_flags = CRYPTO_ALG_LARVAL | type;larval->alg.cra_priority = -1;larval->alg.cra_destroy = crypto_larval_destroy;strlcpy(larval->alg.cra_name, name, CRYPTO_MAX_ALG_NAME);init_completion(&larval->completion);return larval;
}
EXPORT_SYMBOL_GPL(crypto_larval_alloc);
  • 在crypto_larval_alloc函数中对新创建的算法幼虫的初始化如下所示

在算法幼虫初始化时,需要注意以下几点:

  • a)算法幼虫与算法同名;
  • b)算法幼虫的算法类型设置CRYPTO_ALG_LARVAL;
  • c)算法幼虫的算法优先级为-1;
  • d)算法幼虫设置了实例销毁接口crypto_larval_destroy。
  • 将crypto_larval_alloc函数创建的算法幼虫称为通用算法幼虫,实际上就是注册用算法幼虫。
  • completion.h - include/linux/completion.h - Linux source code (v5.15.12) - Bootlin
  • init_completion 
/*** init_completion - Initialize a dynamically allocated completion* @x:  pointer to completion structure that is to be initialized** This inline function will initialize a dynamically created completion* structure.*/
static inline void init_completion(struct completion *x)
{x->done = 0;init_swait_queue_head(&x->wait);
}
  • init_await_queue_head()
  • swait.h - include/linux/swait.h - Linux source code (v5.15.12) - Bootlin

 __crypto_register_alg

  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin

  • 在__crypto_register_alg函数中,再调用crypto_larval_alloc函数创建通用算法幼虫基础上,再进行如下设置,设置之后的算法幼虫称为检测用算法幼虫。 

​与通用算法幼虫(即注册用算法幼虫)相比,检测用算法幼虫增加了以下属性:

  • a)检验用算法幼虫设置了对应的算法成虫; larval->adult = crypto_mod_get(alg);
  • b)检验用算法幼虫设置了对应的算法驱动名;memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,CRYPTO_MAX_ALG_NAME);
  • c)检验用算法幼虫继承了算法成功的算法优先级。larval->alg.cra_priority = alg->cra_priority;
  • 没有修改引用计数吗?refcount_set(&larval->alg.cra_refcnt, 1);
  • 在加密框架中,用是否设置了算法驱动名来区分注册用算法幼虫和检测用算法幼虫,由内联函数crypto_is_test_larval实现,如下所示。 

crypto_is_test_larval函数

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
static inline int crypto_is_test_larval(struct crypto_larval *larval)
{return larval->alg.cra_driver_name[0];
}

crypto_larval_add函数

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_larval_add函数输入参数包括算法名name、算法类型type和算法类型屏蔽字mask
static struct crypto_alg *crypto_larval_add(const char *name, u32 type,u32 mask)
{struct crypto_alg *alg;struct crypto_larval *larval;larval = crypto_larval_alloc(name, type, mask);if (IS_ERR(larval))return ERR_CAST(larval);refcount_set(&larval->alg.cra_refcnt, 2);down_write(&crypto_alg_sem);alg = __crypto_alg_lookup(name, type, mask);if (!alg) {alg = &larval->alg;list_add(&alg->cra_list, &crypto_alg_list);}up_write(&crypto_alg_sem);if (alg != &larval->alg) {kfree(larval);if (crypto_is_larval(alg))alg = crypto_larval_wait(alg);}return alg;
}
  • 处理流程如下所示

创建注册用算法幼虫

  •  如上所示,crypto_larval_add函数并不是简单调用crypto_larval_alloc函数创建注册用算法幼虫larval,在返回前要调用__crypto_alg_lookup函数再次查找是否有符合条件的算法alg,根据查找结果确认返回值。
  • 算法幼虫larval和算法alg在数据结构上的共同点为通用算法说明,因此crypto_larval_add函数的返回值是通用算法说明,而调用者通过算法类型判断某个通用算法说明是否对应一个算法幼虫,由内联函数crypto_is_larval函数实现

crypto_is_larval

  • 判断某个通用算法说明是否对应一个算法幼虫,由内联函数crypto_is_larval函数实现
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
static inline int crypto_is_larval(struct crypto_alg *alg)
{return alg->cra_flags & CRYPTO_ALG_LARVAL;
}

3)crypto_larval_wait函数

  • crypto_larval_wait函数用于等待算法检测(即算法注册)完成,通过完成量实现与算法检测线程之间的同步,其完成量是带超时(60s)可中断的
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
{struct crypto_larval *larval = (void *)alg;long timeout;timeout = wait_for_completion_killable_timeout(&larval->completion, 60 * HZ);alg = larval->adult;if (timeout < 0)alg = ERR_PTR(-EINTR);else if (!timeout)alg = ERR_PTR(-ETIMEDOUT);else if (!alg)alg = ERR_PTR(-ENOENT);else if (IS_ERR(alg));else if (crypto_is_test_larval(larval) &&!(alg->cra_flags & CRYPTO_ALG_TESTED))alg = ERR_PTR(-EAGAIN);else if (!crypto_mod_get(alg))alg = ERR_PTR(-EAGAIN);crypto_mod_put(&larval->alg);return alg;
}
  • 超时中断,如下所示
timeout = wait_for_completion_interruptible_timeout(&larval->completion, 60 * HZ);
  • crypto_larval_wait函数只是简单地等待算法检测完成,而算法检测结果还需要通过其他条件进行综合判断,包括完成量返回的剩余时间timeout、算法幼虫关联的算法成虫alg(=larval->adult)
  • 检测条件为 : 完成量返回的剩余时间timeout  和  算法幼虫关联的算法成虫alg 

 具体规则如下:

  • i.根据timeout值判断线程同步结果
    • timeout<0说明等待被外部信号中断,返回EINTR错误
    • timeout=0说明等待算法注册超时,返回ETIMEDOUT
    • 	if (timeout < 0)alg = ERR_PTR(-EINTR);else if (!timeout)alg = ERR_PTR(-ETIMEDOUT);
      
    • ii.timeout>0说明算法注册在超时时间内完成,但是注册完成并不代表注册成功,还需要进一步判断

    • 例如注册用算法幼虫关联的算法成功alg无效说明算法注册失败,返回ENOENT(即没有这个算法)错误;
    • 如果算法幼虫为检验用算法幼虫,但算法未经过检验,返回EAGAIN错误,允许重新尝试算法注册流程,如下所示。
  • 	if (!alg)alg = ERR_PTR(-ENOENT);else if (crypto_is_test_larval(larval) &&!(alg->cra_flags & CRYPTO_ALG_TESTED))alg = ERR_PTR(-EAGAIN);
    
  • iii.以上条件均不满足时,说明算法已成功完成注册,返回注册好的算法alg。

4)crypto_larval_kill函数

  • 算法注册成功,同时也意味着算法幼虫使用的终结,注册线程将调用crypto_larval_kill函数“杀死”算法幼虫。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
void crypto_larval_kill(struct crypto_alg *alg)
{struct crypto_larval *larval = (void *)alg;down_write(&crypto_alg_sem);list_del(&alg->cra_list);up_write(&crypto_alg_sem);complete_all(&larval->completion);crypto_alg_put(alg);
}
EXPORT_SYMBOL_GPL(crypto_larval_kill);

具体操作流程 

  • 首先从算法管理链表中删除算法幼虫,使之变为孤儿;    list_del(&alg->cra_list);
  • 然后唤醒在算法幼虫完成量上等待的所有线程,使之变得无用;complete_all(&larval->completion);
  • 最后释放算法幼虫的占有权,彻底判处其死刑。crypto_alg_put(alg);
  • 内联函数crypto_alg_put用于释放算法alg(包括算法幼虫)的占有权

crypto_alg_put

  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
static inline void crypto_alg_put(struct crypto_alg *alg)
{if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)alg->cra_destroy(alg);
}
  • 释放算法占有权时,如果算法定义了cra_destroy接口,将调用其进行进一步处理,而在创建算法幼虫(crypto_larval_alloc函数)时将算法幼虫的cra_destroy接口设置为crypto_larval_destroy函数。
  • crypto_larval_destroy函数将先释放对算法成虫adult(如果有)的占用权,最终释放算法幼虫占用的内存空间,这样算法幼虫形神俱灭,消失的无影无踪。

​​​​​​​

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

基础开发内容 Vim编译器C语言回顾&#xff0c;重点介绍指针的概念Linux/MAC C语言的编译和调试Linux/MAC 常用开发工具介绍 Vim编译器 命令模式 拷贝 删除 粘贴等&#xff0c;通过i / a 等切换到编辑模式编辑模式 编辑字符&#xff0c;通过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 &#xff0c;右键点击&#xff0c;选择add Mouse Shortcut&#xff0c;按住ctrl&#xff0c;同时向下滑动滚轮&#xff1b;同理&#xff0c;操作 Increase…

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

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

音视频处理 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中级开发 视频转图片

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

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

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

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

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

虚拟机为Ubuntu分配空间

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

为什么人会摆高姿态_Yo , 你为什么喜欢冲浪?

“你为什么喜欢冲浪&#xff1f;” 那天木木突然问我。我愣住了。此时一道碧波恰从防泼堤&#xff08;jetty&#xff09;的那头升起&#xff0c;木木转头望去&#xff0c;视线追着那道浪缓缓向西&#xff0c;直至它破碎成白色的浪花。我瞥见他眼神中的光亮&#xff0c;就和小孩…