日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發(fā)布時間:2023/12/13 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考鏈接

  • Linux加密框架的應用示例(一)_家有一希的博客-CSDN博客

本文大綱

  • 本節(jié)將從應用角度說明加密框架的運行流程,包括加密框架如何管理算法、如何動態(tài)創(chuàng)建算法,應用模塊如何創(chuàng)建算法實例、如何通過算法實例調(diào)用算法接口等
  • 本節(jié)中加密框架的應用模塊以IPSEC模塊(XFRM框架)為例IPSEC模塊包括AH協(xié)議和ESP協(xié)議兩種協(xié)議,其中AH協(xié)議提供數(shù)據(jù)完整性服務,ESP協(xié)議提供數(shù)據(jù)加密服務以及可選的數(shù)據(jù)完整性服務
  • AH協(xié)議和ESP協(xié)議提供的服務都是通過算法實現(xiàn)的
    • AH協(xié)議通過認證算法提供數(shù)據(jù)完整性服務,認證算法的實現(xiàn)方式可以是哈希算法的HMAC模式也可以是分組算法的XCBC模式
    • ESP協(xié)議通過AEAD算法提供數(shù)據(jù)加密服務和可選的數(shù)據(jù)完整性服務,AEAD算法的實現(xiàn)方式可以是分組算法的CBC模式和可選的認證算法也可以是分組算法的CCM模式(同時提供加密服務和完整性服務)。
  • XFRM框架在安全關(guān)聯(lián)SA中配置協(xié)議使用的算法,體現(xiàn)在數(shù)據(jù)結(jié)構(gòu)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算法
  • 在配置安全關(guān)聯(lián)SA時根據(jù)使用的協(xié)議和提供的服務設(shè)置對應的成員變量,XFRM框架定義的上述算法描述中通過算法名alg_name區(qū)分不同的算法,例如:
  • 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算法都是結(jié)構(gòu)體變量,里面都定義名為alg_name的char數(shù)組,用于指定函數(shù)的名字。XFRM框架通過這個算法名字實現(xiàn)算法的區(qū)分

  • 例子
  • 1)某個使用AH協(xié)議的SA通過MD5算法的HMAC模式提供數(shù)據(jù)完整性服務,配置成員變量aalg,算法名alg_name為"hmac(md5)",在加密框架中表示通過HMAC模板和基礎(chǔ)算法MD5動態(tài)創(chuàng)建的哈希算法;
  • 2)某個使用ESP協(xié)議的SA通過AES算法的CBC模式提供數(shù)據(jù)加密服務,但不提供數(shù)據(jù)完整性服務,配置成員變量ealg,算法名alg_name為"cbc(aes)",在加密框架中表示通過chainiv模板和基礎(chǔ)算法"cbc(aes)“動態(tài)創(chuàng)建的分組算法;
  • 3)某個使用ESP協(xié)議的SA通過AES算法的CBC模式提供數(shù)據(jù)加密服務,通過MD5算法的HMAC模式提供數(shù)據(jù)完整性服務,配置成員變量ealg和aalg,算法名alg_name分別為"cbc(aes)“和"hmac(md5)”;
  • 4)某個使用ESP協(xié)議的SA通過AES算法的CCM模式同時提供數(shù)據(jù)加密服務和完整性服務,配置成員變量aead,算法名alg_name為"ccm(aes)”,在加密框架中表示通過CCM模板和基礎(chǔ)算法AES算法動態(tài)創(chuàng)建的AEAD算法。
  • 在XFRM框架中,將使用ESP協(xié)議提供數(shù)據(jù)加密服務和可選的數(shù)據(jù)完整性服務的算法的稱為AEAD算法。AEAD算法有兩種實現(xiàn)方式,區(qū)別在于提供數(shù)據(jù)完整性的算法,一種是由分組算法提供數(shù)據(jù)加密服務,由認證算法提供數(shù)據(jù)完整性服務,如3)所示,另一種是由分組算法同時提供數(shù)據(jù)加密服務和完整性服務,如4)所示。
  • 由于ESP協(xié)議的數(shù)據(jù)完整性服務是可選的,可以不配置認證算法,如2)所示,在XFRM框架中將2)和3)統(tǒng)一定義為authenc模板通過基礎(chǔ)算法(加密算法和可選的認證算法)動態(tài)創(chuàng)建的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頭文件中定義的結(jié)構(gòu)體 crypto_authenc_keys,前一部分為認證,后面部分為加密。
  • 如果不涉及 認證部分,使用digest_null進行替代。
  • 其中digest_null為加密框架中定義的NULL算法,其算法接口都是不進行任何處理的空函數(shù),如下所示。?
  • crypto_null.c - crypto/crypto_null.c - Linux source code (v5.15.12) - Bootlin

初始階段

  • 本節(jié)將分別介紹使用"hmac(md5)"算法的AH協(xié)議和"authenc(hmac(md5),cbc(aes))"算法的ESP協(xié)議的服務流程,包括如何創(chuàng)建算法實例以及如何提供服務。

1)初始階段的算法管理鏈表和算法模板管理鏈表

  • "hmac(md5)"算法和"authenc(hmac(md5),cbc(aes))"算法涉及的靜態(tài)基礎(chǔ)算法包括哈希算法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)算法運行上下文

  • 算法運行過程中所需的內(nèi)存空間稱為算法運行的上下文,一般情況下由通用算法說明的成員變量cra_ctxsize標明算法運行所需的上下文空間大小(單位:字節(jié))。
  • a)MD5算法運行上下文
  • MD5算法運行上下文用于緩存一個分組中的原始數(shù)據(jù)和計算的哈希值,抽象為數(shù)據(jù)結(jié)構(gòu)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]; //計算的哈希數(shù)值u32 block[MD5_BLOCK_WORDS]; //緩存一個分組中原始數(shù)據(jù)u64 byte_count; //已計算的數(shù)據(jù)字節(jié)長度 };#endif
  • 從數(shù)據(jù)結(jié)構(gòu)定義可以看出,MD5算法運行的上下文空間大小并不是由cra_ctxsize標明,而是通過哈希算法說明中的個性化參數(shù)statesize(即運行狀態(tài))標明,即statesize = sizeof(struct md5_state)。
  • b)AES算法運行上下文
  • AES算法運行上下文用于存儲加密和解密使用的密鑰,抽象為數(shù)據(jù)結(jié)構(gòu)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字節(jié))
  • 問題:AES不是屬于對稱加密算法嗎?加密和解密使用的是相同的密鑰,為什么結(jié)構(gòu)體里面獨立設(shè)計呢?

?

總結(jié)

以上是生活随笔為你收集整理的linux加密框架 crypto 算法管理 - 应用角度讲解加密框架的运行流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。