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.pswp.cn/news/446087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446087.shtml
英文地址,請注明出處:http://en.pswp.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函數進行通用的算…