参考链接

  • 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博客

  • 参数类型为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函数接口好像不再使用了,目前与其相近是函数流程如下

整体流程

Linux加密框架 crypto算法模板 以及CBC算法模板实例相关推荐

  1. Linux加密框架 crypto 算法模板 HMAC模板举例

    参考链接 Linux加密框架中的主要数据结构(三)_家有一希的博客-CSDN博客 Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客 HMAC算法模板 hma ...

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

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

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

    参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的 ...

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

    参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的 ...

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

    算法查找接口crypto_find_alg 算法实例tfm是算法的一个可运行的副本,因此在创建算法实例前首先要查找确认算法是否已经注册有效,此时算法查找由函数crypto_find_alg实现. 补充 ...

  6. Linux加密框架 crypto 哈希算法举例 MD5

    参考链接 Linux加密框架 crypto 哈希算法说明 同步哈希shash_alg | 异步哈希 ahash_alg | 通用部分抽象 hash_alg_common_CHYabc123456hh的 ...

  7. Linux加密框架 crypto 算法模板 CBC模板举例

    参考链接 Linux加密框架中的主要数据结构(三)_家有一希的博客-CSDN博客 https://blog.csdn.net/CHYabc123456hh/article/details/122194 ...

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

    HMAC算法模板实例 HMAC算法模板的创建实例的接口是hmac_create函数 hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bo ...

  9. Linux加密框架 crypto 算法模板

    参考链接 Linux加密框架中的主要数据结构(三)_家有一希的博客-CSDN博客 algapi.h - include/crypto/algapi.h - Linux source code (v5. ...

最新文章

  1. JavaScript实现放大镜功能
  2. JAVA Roman to Integer 罗马数转换为int型方法
  3. 项目打包部署到Tomcat
  4. java护照号码校验_学无止境之小白学java……第001天
  5. 使用TFHpple解析html
  6. 红橙Darren视频笔记 CoordinatorLayout:实现自定义behavior
  7. for循环python爬虫_python爬虫 for循环只出来一条
  8. .net伪静态传多个参数
  9. Linux 安装telnet命令及使用
  10. 各区区号的字段和名称
  11. Redis 做网页UV统计
  12. 缺陷检测论文回顾(一)
  13. LDF转Excel;LDF转位定义;Excel转LDF;Excel转位定义;MatrixCreat(四)之工具使用
  14. ppt密码怎么设置,ppt权限密码如何破解?
  15. oracle创建本地表空间,本地管理表空间——大家继续讨论!
  16. python中 xlrd/xlwt模块详解
  17. 11.拼数(c++)
  18. chrome主页被垃圾软件篡改为hao123后最小白的修复方法
  19. HART协议基础知识
  20. kafka 消费者详解

热门文章

  1. 浏览器登录_经常用浏览器自动登录忘记了密码?教你一键查看网页星号密码
  2. 华为鸿蒙发布2.0,华为做到了!鸿蒙2.0正式发布,苹果安卓有危机?
  3. 【转】Microsoft Cloud全新认证体系介绍
  4. 软件工程 – 开发模型
  5. [你必须知道的.NET]第十七回:貌合神离:覆写和重载
  6. 一步步编写操作系统 75 从显卡读取光标位置1
  7. 【Python 必会技巧】利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
  8. android 倒计时封装,react native中的聊天气泡及timer封装成的发送验证码倒计时
  9. CCIE理论-第一篇-SDN概念复习
  10. 【PAT - 甲级1007】Maximum Subsequence Sum (25分)(前缀和)