Linux加密框架 crypto算法模板 以及CBC算法模板实例

参考链接

  • Linux加密框架中的主要数据结构(四)_家有一希的博客-CSDN博客
  • algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
struct crypto_instance {struct crypto_alg alg;struct crypto_template *tmpl;union {/* Node in list of instances after registration. */struct hlist_node list;/* List of attached spawns before registration. */struct crypto_spawn *spawns;};void *__ctx[] CRYPTO_MINALIGN_ATTR;
};

算法模板实例数据结构 crypto_instance各成员变量含义如下所示:

  • 1)alg:算法模板实例对应的算法说明
    • Linux加密框架crypto crypto_alg|cipher_alg数据结构|AES例子_CHYabc123456hh的博客-CSDN博客
  • 2)tmpl:算法模板实例使用的算法模板
    • algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
  • 3)list:算法模板实例在算法模板的实例哈希链表中对应的节点。
    • 注册后实例列表中的节点。
  • spawns:注册前的附加生成列表。
    • algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
  • 4)__ctx:算法模板实例的上下文。

例子

  • 由算法模板实例数据结构定义,算法模板实例也是一种算法,如分组算法根据算法模板(如CBC模式)创建的块加密算法。
  • CBC算法模板的创建实例接口为crypto_cbc_alloc,输入参数为创建CBC算法模板实例的参数tb,返回值为新创建的算法模板实例。
  • crypto_cbc_alloc函数创建CBC算法模板流程如下所示
  • 上面参考链接的内容,如下,但是在目前较为新的版本中 v5.15.11已经不再使用了

在这里插入图片描述

  •  根据上述流程进行推导
  • 无论是通过alloc接口还是create接口创建算法模板实例,输入参数tb为创建算法模板实例的相关参数,至少包括算法类型及屏蔽位(tb[0])和基础算法的算法名(tb[1])。每个参数都是TLV格式,类型T有CRYPTOA_TYPE(算法类型)、CRYPTOA_ALG(基础算法名)、CRYPTOA_U32等多种类型,而每种类型的参数值不同,因此接口输入参数tb的数据类型struct rtattr只包括rta_len和rta_type两个成员变量,分别对应着TLV结构的L和T,参数值数据结构根据参数类型定义。
  •  参数类型为CRYPTOA_TYPE时,算法类型TLV结构(即tb[0])如下所示,通过函数crypto_get_attr_type可以获取算法类型和屏蔽位。
/* Generic structure for encapsulation of optional route information.It is reminiscent of sockaddr, but with sa_family replacedwith attribute type.*/struct rtattr {unsigned short	rta_len;unsigned short	rta_type;
};
  • Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客
  • 首先调用 crypto_attr_type

  •  其中  crypto_attr_type 显示如下,包含type和mask
  • crypto_attr_type返回的类型是 RTA_DATA(rta),
  • 其中RTA_DATA 定义如下,返回的是void*指向一块内存区域,这个内存区域使用的时候可以转型为crypto_attr_type的结构
  • #define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
  • #define RTA_LENGTH(len)    (RTA_ALIGN(sizeof(struct rtattr)) + (len))
struct crypto_attr_type {u32 type;u32 mask;
};
  • Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客

算法类型TLV结构

  •  参数类型为CRYPTOA_ALG时,基础算法名TLV结构(即tb[1])如下所示,通过函数crypto_attr_alg_name获取基础算法名

  • crypto_template结构体内部的 create函数,需要输入 crypto_template模板名字和rtattr类型(rta_len 和 rta_type )进行创建
  • crypto_spawn
    • list: 在基础算法的用户链表users中的链表节点
    • alg: 关联的基础算法
    • frontend: 关联的算法实例前端,即算法类型常量
    • mask: 算法的类型屏蔽位
  • crypto_type

  • 例子
  • Linux加密框架 crypto 算法模板 CBC模板举例_CHYabc123456hh的博客-CSDN博客
/*** skcipher_alloc_instance_simple - allocate instance of simple block cipher mode** Allocate an skcipher_instance for a simple block cipher mode of operation,* e.g. cbc or ecb.  The instance context will have just a single crypto_spawn,* that for the underlying cipher.  The {min,max}_keysize, ivsize, blocksize,* alignmask, and priority are set from the underlying cipher but can be* overridden if needed.  The tfm context defaults to skcipher_ctx_simple, and* default ->setkey(), ->init(), and ->exit() methods are installed.** @tmpl: the template being instantiated* @tb: the template parameters** Return: a pointer to the new instance, or an ERR_PTR().  The caller still*	   needs to register the instance.*/struct skcipher_instance *skcipher_alloc_instance_simple(struct crypto_template *tmpl, struct rtattr **tb)
{u32 mask;struct skcipher_instance *inst;struct crypto_cipher_spawn *spawn;struct crypto_alg *cipher_alg;int err;err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER, &mask);if (err)return ERR_PTR(err);inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);if (!inst)return ERR_PTR(-ENOMEM);spawn = skcipher_instance_ctx(inst);err = crypto_grab_cipher(spawn, skcipher_crypto_instance(inst),crypto_attr_alg_name(tb[1]), 0, mask);if (err)goto err_free_inst;cipher_alg = crypto_spawn_cipher_alg(spawn);err = crypto_inst_setname(skcipher_crypto_instance(inst), tmpl->name,cipher_alg);if (err)goto err_free_inst;inst->free = skcipher_free_instance_simple;/* Default algorithm properties, can be overridden */inst->alg.base.cra_blocksize = cipher_alg->cra_blocksize;inst->alg.base.cra_alignmask = cipher_alg->cra_alignmask;inst->alg.base.cra_priority = cipher_alg->cra_priority;inst->alg.min_keysize = cipher_alg->cra_cipher.cia_min_keysize;inst->alg.max_keysize = cipher_alg->cra_cipher.cia_max_keysize;inst->alg.ivsize = cipher_alg->cra_blocksize;/* Use skcipher_ctx_simple by default, can be overridden */inst->alg.base.cra_ctxsize = sizeof(struct skcipher_ctx_simple);inst->alg.setkey = skcipher_setkey_simple;inst->alg.init = skcipher_init_tfm_simple;inst->alg.exit = skcipher_exit_tfm_simple;return inst;err_free_inst:skcipher_free_instance_simple(inst);return ERR_PTR(err);
}
	inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
  • 其中,*spawn的类型是crypto_cipher_spawn,参见代码:crypto_cipher_spawn是在crypto_spawn的基础上是进一步封装
struct crypto_cipher_spawn {struct crypto_spawn base;
};
  • 回到参考链接中
  • Linux加密框架中的主要数据结构(四)_家有一希的博客-CSDN博客
  • head为0,表示算法模板实例前不预留空间
  • spawn = skcipher_instance_ctx(inst)
  • skcipher.h - include/crypto/internal/skcipher.h - Linux source code (v5.15.11) - Bootlin

  • algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin 

  • 通过上述两个函数,实现了spawn和inst->_ctx 指向同一片区域,如图所示

  •     cipher_alg = crypto_spawn_cipher_alg(spawn);
  • cipher.h - include/crypto/internal/cipher.h - Linux source code (v5.15.11) - Bootlin 

  • 也就是 spawn起到了一个衔接器的作用,衔接算法模板实例inst 和 基础算法cipher_alg
  •  设置个性化算法属性,继承基础算法的算法属性 和  设置算法通用属性

  • 参考链接里面中的 crypto_cbc_alloc函数接口好像不再使用了,目前与其相近是函数流程如下

接口调用情况

整体流程

创建CBC算法模板实例流程 

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

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

相关文章

tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结

文末下载上传环境源码客户端js检查一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。查看源代码可以看到有如下代码对上传文件类型进行了限制:我们可以看到对上传文件类型进行了限制。绕过方法1.我们…

Linux加密框架 crypto算法模板 以及HMAC算法模板实例

HMAC算法模板实例 HMAC算法模板的创建实例的接口是hmac_create函数hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin hmac_create输入的参数包括 算法模板 tmpl 和 算法模板实例参数 tbhmac_cretae函数返回的结果为0表示算法模板实例已经创建注册算法模…

python判断密码强度并输出_密码强度判断

[python]代码库def pdsz(cd):nnnn Falsefor c in cd:if c.isnumeric():nnnn Truebreakreturn nnnndef pdzm(cd):nnnn Falsefor c in cd:if c.isupper():nnnn Truebreakreturn nnnndef pdhh(cd):nnnn Falsefor c in cd:if c.islower():nnnn Truebreakreturn nnnndef main(…

linux加密框架 crypto 算法crypto_register_alg的注册流程

算法注册流程 静态算法模块初始化 分组算法模块初始化 AES算法模块(aes_generic.c)的初始化接口aes_init实现向加密框架注册AES算法的功能,如下所示。aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.12) - Bootlin sta…

python 方法的实例_python调用自定义函数的实例操作

在python中,想要调用自定义函数必须先声明,然后才能调用。使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果。(1)声明函数python中使用 def 可以声明…

linux加密框架 crypto 静态哈希算法crypto_register_shash注册流程

参考链接 Linux加密框架的算法管理(一)_家有一希的博客-CSDN博客_linux加密框架设计与实现shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin 函数介绍 crypto_register_shash函数实现向加密框架注册静态哈希算法的功能,…

多个线程访问统一对象的不同方法_C#多线程读写同一文件处理

在多线程访问读写同一个文件时,经常遇到异常:“文件正在由另一进程使用,因此该进程无法访问此文件”。多线程访问统一资源的异常,解决方案1,保证读写操作单线程执行,可以使用lock解决方案2,使用…

linux加密框架 crypto 通用算法注册接口__crypto_register_alg注册流程

函数介绍 __crypto_register_alg函数实现向加密框架注册算法(包括静态算法和动态算法)的功能,输入参数为算法说明alg,注册成功时返回算法注册用的算法幼虫larval,注册失败时返回失败原因。__crypto_register_alg函数执…

spark官方文档_Spark整合Ray思路漫谈

什么是Ray之前花了大概两到三天把Ray相关的论文,官网文档看了一遍,同时特意去找了一些中文资料看Ray当前在国内的发展情况(以及目前国内大部分人对Ray的认知程度)。先来简单介绍下我对Ray的认知。首先基因很重要,所以我们先需要探查下Ray最初…

python用http协议传数据_python基础 -- 简单实现HTTP协议

标签:一、直接代码# -*- coding: utf-8 -*-import socket__author__ ‘lpe234‘__date__ ‘2015-03-12‘if __name__ ‘__main__‘:sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind((‘127.0.0.1‘, 8001))sock.listen(5)while True:connecti…

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

算法查找接口crypto_find_alg 算法实例tfm是算法的一个可运行的副本,因此在创建算法实例前首先要查找确认算法是否已经注册有效,此时算法查找由函数crypto_find_alg实现。补充: struct crypto_tfm *tfm; crypto_tfm类型指针tfm可以理解为指代…

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

参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的博客-CSDN博客 函数介绍 crypto_alg_mod_lookup函数输入参数包括待查找的算法名name、算法类型type和算…

qt triggered信号_Qt之网络编程UDP通信

点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获UDP通信概述UDP(UserDatagramProtocol,用户数据报协议)是轻量的、不可靠的、面向数据报(datagram)、无…

adguard没有核心 core no_面试官:线程池如何按照core、max、queue的执行顺序去执行?...

前言这是一个真实的面试题。前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core、max、queue的执行循序去执行?"。我们都知道线程池中代码执行顺序是:corePool->workQueue->maxPool,源码…

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

参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 crypto_larval_lookup函数介绍 crypto_larval_lookup函数的输入参数包括待查找的算法名name、算法类型type和算法类型屏蔽位mask,查找命中时返回查找到的算法或注册用算法幼…

python ssh 远程登录路由器执行命令_ssh批量登录并执行命令(python实现)

局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的。现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件&…

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

参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 函数介绍 static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,u32 mask) {struct crypto_alg *alg;u32 test 0;if (!((type | mask) & CRYPTO_ALG_TESTED))…

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

参考链接 Linux加密框架的算法管理(三)_家有一希的博客-CSDN博客 动态和静态算法管理 静态算法 加密框架中的算法分为静态算法和动态算法两种,其中静态算法指的是以"算法名.ko"形式存在的静态编译的算法模块,如aes.k…

3分钟入门python_3分钟带你了解世界第一语言Python 入门上手也这么简单!

一、Python入门1. Python爬虫入门一之综述Python爬虫入门二之爬虫基础了解Python爬虫入门三之Urllib库的基本使用Python爬虫入门四之Urllib库的高级用法Python爬虫入门五之URLError异常处理Python爬虫入门六之Cookie的使用Python爬虫入门七之正则表达式Python爬虫入门八之Beaut…

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

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