linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程
参考链接
- Linux加密框架的应用示例(一)_家有一希的博客-CSDN博客
本文大纲
- 本节将从应用角度说明加密框架的运行流程,包括加密框架如何管理算法、如何动态创建算法,应用模块如何创建算法实例、如何通过算法实例调用算法接口等。
- 本节中加密框架的应用模块以IPSEC模块(XFRM框架)为例,IPSEC模块包括AH协议和ESP协议两种协议,其中AH协议提供数据完整性服务,ESP协议提供数据加密服务以及可选的数据完整性服务。
- AH协议和ESP协议提供的服务都是通过算法实现的
- AH协议通过认证算法提供数据完整性服务,认证算法的实现方式可以是哈希算法的HMAC模式也可以是分组算法的XCBC模式;
- ESP协议通过AEAD算法提供数据加密服务和可选的数据完整性服务,AEAD算法的实现方式可以是分组算法的CBC模式和可选的认证算法也可以是分组算法的CCM模式(同时提供加密服务和完整性服务)。
- XFRM框架在安全关联SA中配置协议使用的算法,体现在数据结构struct xfrm_state如下所示的成员变量。
- xfrm.h - include/net/xfrm.h - Linux source code (v5.15.12) - Bootlin
xfrm_state
/* Full description of state of transformer. */
struct xfrm_state {possible_net_t xs_net;union {struct hlist_node gclist;struct hlist_node bydst;};struct hlist_node bysrc;struct hlist_node byspi;struct hlist_node byseq;refcount_t refcnt;spinlock_t lock;struct xfrm_id id;struct xfrm_selector sel;struct xfrm_mark mark;u32 if_id;u32 tfcpad;u32 genid;/* Key manager bits */struct xfrm_state_walk km;/* Parameters of this state. */struct {u32 reqid;u8 mode;u8 replay_window;u8 aalgo, ealgo, calgo;u8 flags;u16 family;xfrm_address_t saddr;int header_len;int trailer_len;u32 extra_flags;struct xfrm_mark smark;} props;struct xfrm_lifetime_cfg lft;/* Data for transformer */struct xfrm_algo_auth *aalg;struct xfrm_algo *ealg;struct xfrm_algo *calg;struct xfrm_algo_aead *aead;const char *geniv;/* Data for encapsulator */struct xfrm_encap_tmpl *encap;struct sock __rcu *encap_sk;/* Data for care-of address */xfrm_address_t *coaddr;/* IPComp needs an IPIP tunnel for handling uncompressed packets */struct xfrm_state *tunnel;/* If a tunnel, number of users + 1 */atomic_t tunnel_users;/* State for replay detection */struct xfrm_replay_state replay;struct xfrm_replay_state_esn *replay_esn;/* Replay detection state at the time we sent the last notification */struct xfrm_replay_state preplay;struct xfrm_replay_state_esn *preplay_esn;/* replay detection mode */enum xfrm_replay_mode repl_mode;/* internal flag that only holds state for delayed aevent at the* moment*/u32 xflags;/* Replay detection notification settings */u32 replay_maxage;u32 replay_maxdiff;/* Replay detection notification timer */struct timer_list rtimer;/* Statistics */struct xfrm_stats stats;struct xfrm_lifetime_cur curlft;struct hrtimer mtimer;struct xfrm_state_offload xso;/* used to fix curlft->add_time when changing date */long saved_tmo;/* Last used time */time64_t lastused;struct page_frag xfrag;/* Reference to data common to all the instances of this* transformer. */const struct xfrm_type *type;struct xfrm_mode inner_mode;struct xfrm_mode inner_mode_iaf;struct xfrm_mode outer_mode;const struct xfrm_type_offload *type_offload;/* Security context */struct xfrm_sec_ctx *security;/* Private data of this transformer, format is opaque,* interpreted by xfrm_type methods. */void *data;
};
- xfrm.h - include/net/xfrm.h - Linux source code (v5.15.12) - Bootlin
/* Data for transformer */struct xfrm_algo_auth *aalg; //认证算法struct xfrm_algo *ealg; //加密算法struct xfrm_algo *calg; //压缩算法struct xfrm_algo_aead *aead; //AEAD算法
- 在配置安全关联SA时根据使用的协议和提供的服务设置对应的成员变量,XFRM框架定义的上述算法描述中通过算法名alg_name区分不同的算法,例如:
- xfrm.h - include/uapi/linux/xfrm.h - Linux source code (v5.15.12) - Bootlin
- xfrm.h - include/uapi/linux/xfrm.h - Linux source code (v5.15.12) - Bootlin
- 上述认证算法、加密算法、压缩算法、AEAD算法都是结构体变量,里面都定义名为alg_name的char数组,用于指定函数的名字。XFRM框架通过这个算法名字实现算法的区分
- 例子
- 1)某个使用AH协议的SA通过MD5算法的HMAC模式提供数据完整性服务,配置成员变量aalg,算法名alg_name为"hmac(md5)",在加密框架中表示通过HMAC模板和基础算法MD5动态创建的哈希算法;
- 2)某个使用ESP协议的SA通过AES算法的CBC模式提供数据加密服务,但不提供数据完整性服务,配置成员变量ealg,算法名alg_name为"cbc(aes)",在加密框架中表示通过chainiv模板和基础算法"cbc(aes)“动态创建的分组算法;
- 3)某个使用ESP协议的SA通过AES算法的CBC模式提供数据加密服务,通过MD5算法的HMAC模式提供数据完整性服务,配置成员变量ealg和aalg,算法名alg_name分别为"cbc(aes)“和"hmac(md5)”;
- 4)某个使用ESP协议的SA通过AES算法的CCM模式同时提供数据加密服务和完整性服务,配置成员变量aead,算法名alg_name为"ccm(aes)”,在加密框架中表示通过CCM模板和基础算法AES算法动态创建的AEAD算法。
- 在XFRM框架中,将使用ESP协议提供数据加密服务和可选的数据完整性服务的算法的称为AEAD算法。AEAD算法有两种实现方式,区别在于提供数据完整性的算法,一种是由分组算法提供数据加密服务,由认证算法提供数据完整性服务,如3)所示,另一种是由分组算法同时提供数据加密服务和完整性服务,如4)所示。
- 由于ESP协议的数据完整性服务是可选的,可以不配置认证算法,如2)所示,在XFRM框架中将2)和3)统一定义为authenc模板通过基础算法(加密算法和可选的认证算法)动态创建的AEAD算法,如下所示。
- authenc.h - include/crypto/authenc.h - Linux source code (v5.15.12) - Bootlin
- authenc.c - crypto/authenc.c - Linux source code (v5.15.12) - Bootlin
- 按照上述定义,2)中使用的AEAD算法名为为"authenc(digest_null,cbc(aes))",3)中使用的AEAD算法名为"authenc(hmac(md5),cbc(aes))"
- 对应上述authenc头文件中定义的结构体 crypto_authenc_keys,前一部分为认证,后面部分为加密。
- 如果不涉及 认证部分,使用digest_null进行替代。
- 其中digest_null为加密框架中定义的NULL算法,其算法接口都是不进行任何处理的空函数,如下所示。
- crypto_null.c - crypto/crypto_null.c - Linux source code (v5.15.12) - Bootlin
初始阶段
- 本节将分别介绍使用"hmac(md5)"算法的AH协议和"authenc(hmac(md5),cbc(aes))"算法的ESP协议的服务流程,包括如何创建算法实例以及如何提供服务。
1)初始阶段的算法管理链表和算法模板管理链表
- "hmac(md5)"算法和"authenc(hmac(md5),cbc(aes))"算法涉及的静态基础算法包括哈希算法MD5(即md5_salg)和分组算法AES(即aes_alg),涉及的算法模板包括HMAC模板(即hmac_tmpl)、CBC模板(即crypto_cbc_tmpl)、chainiv模板(即chainiv_tmpl)和authenc模板(crypto_authenc_tmpl)
- 因此加密框架初始阶段的算法管理链表和算法模板管理链表如下图所示
注:不考虑算法和算法模板的注册顺序。
算法说明
- MD5算法的同步哈希算法说明记为md5_salg,通用算法说明记为md5_alg(=&md5_salg->base),如下所示。
AES算法的通用算法说明记为aes_alg,如下所示。
3)算法运行上下文
- 算法运行过程中所需的内存空间称为算法运行的上下文,一般情况下由通用算法说明的成员变量cra_ctxsize标明算法运行所需的上下文空间大小(单位:字节)。
- a)MD5算法运行上下文
- MD5算法运行上下文用于缓存一个分组中的原始数据和计算的哈希值,抽象为数据结构struct md5_state,如下所示。
- md5.h - include/crypto/md5.h - Linux source code (v5.15.12) - Bootlin
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _CRYPTO_MD5_H
#define _CRYPTO_MD5_H#include <linux/types.h>#define MD5_DIGEST_SIZE 16
#define MD5_HMAC_BLOCK_SIZE 64
#define MD5_BLOCK_WORDS 16
#define MD5_HASH_WORDS 4#define MD5_H0 0x67452301UL
#define MD5_H1 0xefcdab89UL
#define MD5_H2 0x98badcfeUL
#define MD5_H3 0x10325476ULextern const u8 md5_zero_message_hash[MD5_DIGEST_SIZE];struct md5_state {u32 hash[MD5_HASH_WORDS]; //计算的哈希数值u32 block[MD5_BLOCK_WORDS]; //缓存一个分组中原始数据u64 byte_count; //已计算的数据字节长度
};#endif
- 从数据结构定义可以看出,MD5算法运行的上下文空间大小并不是由cra_ctxsize标明,而是通过哈希算法说明中的个性化参数statesize(即运行状态)标明,即statesize = sizeof(struct md5_state)。
- b)AES算法运行上下文
- AES算法运行上下文用于存储加密和解密使用的密钥,抽象为数据结构struct crypto_aes_ctx,如下所示:
/** Please ensure that the first two fields are 16-byte aligned* relative to the start of the structure, i.e., don't move them!*/
struct crypto_aes_ctx {u32 key_enc[AES_MAX_KEYLENGTH_U32]; //加密密钥u32 key_dec[AES_MAX_KEYLENGTH_U32]; //解密密钥u32 key_length; //密钥长度
};
- AES算法运行所需的上下文空间大小cra_ctxsize=sizeof(struct crypto_aes_ctx)(即484字节)
- 问题:AES不是属于对称加密算法吗?加密和解密使用的是相同的密钥,为什么结构体里面独立设计呢?
linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程相关推荐
- linux加密框架 crypto 算法管理 - 哈希算法应用实例
参考链接 Linux加密框架应用示例(二)_家有一希的博客-CSDN博客 linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程_CHYabc123456hh的博客-CSDN博 ...
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup
参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的 ...
- linux加密框架 crypto 算法管理 - 算法查找接口
参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的 ...
- linux加密框架 crypto 算法管理 - 算法检测
参考链接 Linux加密框架的算法管理(四)_家有一希的博客-CSDN博客 函数介绍 如前所述,无论是静态算法还是动态算法,算法注册的最后一步都是进行算法正确性检验,一般流程是先调用__crypto_ ...
- linux加密框架 crypto 算法管理 - 动态和静态算法管理
参考链接 Linux加密框架的算法管理(三)_家有一希的博客-CSDN博客 动态和静态算法管理 静态算法 加密框架中的算法分为静态算法和动态算法两种,其中静态算法指的是以"算法名.ko&qu ...
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_lookup函数
参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 函数介绍 static struct crypto_alg *crypto_alg_lookup(const char *n ...
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_larval_lookup
参考链接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客 crypto_larval_lookup函数介绍 crypto_larval_lookup函数的输入参数包括待查找的算法名n ...
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg
算法查找接口crypto_find_alg 算法实例tfm是算法的一个可运行的副本,因此在创建算法实例前首先要查找确认算法是否已经注册有效,此时算法查找由函数crypto_find_alg实现. 补充 ...
- linux加密框架 crypto 算法管理 - 创建哈希算法实例
crypto_alloc_ahash函数 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的,但是算法应用不关注哈希算法的实现方式,关注的是哈希算法提供的算法接口.为实现统一管理,加密框架 ...
最新文章
- 什么样的网站结构备受搜索引擎喜爱?
- python培训班深圳-深圳哪里有Python培训班?
- PHP调试的时候遇到Warning: session_start() [function.session-
- POJ 1651 Multiplication Puzzle 区间dp(水
- bigdecimal判断大于零_Python零基础入门(七):运算符
- vue 使用了浏览器的刷新之后报错_Laravel 7 + vue.js 学习笔记(一)
- mysql definer_mysql常见问题之视图权限控制--安全性为DEFINER
- Could not load java.net.BindException错误解决
- 如何实现移动端轮播图的左滑右滑效果
- opencv学习笔记3
- 为什么中国企业海外营销都选择Facebook?
- ORALCE 两表结构更新
- Swift设计模式: 观察者模式(发布-订阅模式)
- 嵌入式ARM体系结构总结
- x264码率控制(二)lookahead
- 苹果手机设置导入喜欢的音乐作为铃声
- 使用file.delete删除文件不起作用解决办法
- rman的conver方法拷贝ASM文件
- LINUX ROUTE命令详解-2
- 2021/7/8——集训Day.3
热门文章
- 计算机用户win7修改不,Win7电脑时间改不了的解决方法
- 【转】RabbitMQ六种队列模式-2.工作队列模式
- 第六节:WebApi的部署方式(自托管)
- 拼接符 防注入正则校验_Apache Kylin 命令注入漏洞调试分析(CVE-2020-1956)
- 【Python CheckiO 题解】Create Intervals
- CCIE-LAB-SDN-第一篇-修改交换机管理IP
- 【2019浙江省赛 - K 】Strings in the Pocket(马拉车,思维)
- *【UVA - 10382】Watering Grass(贪心,区间覆盖问题,思维)
- 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐搭积木(状压dp)
- 北大计算机类学什么,状元们去清华北大选了什么专业?计算机可不是首选,首选你想不到...