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

参考链接

本文大纲

  • 本节将从应用角度说明加密框架的运行流程,包括加密框架如何管理算法、如何动态创建算法,应用模块如何创建算法实例、如何通过算法实例调用算法接口等
  • 本节中加密框架的应用模块以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;
};
	/* Data for transformer */
	struct xfrm_algo_auth	*aalg;   //认证算法
	struct xfrm_algo	*ealg;       //加密算法
	struct xfrm_algo	*calg;       //压缩算法
	struct xfrm_algo_aead	*aead;   //AEAD算法

  • 例子
  • 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	0x10325476UL

extern 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不是属于对称加密算法吗?加密和解密使用的是相同的密钥,为什么结构体里面独立设计呢?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值