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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux加密框架 crypto 算法管理 - 动态和静态算法管理

發(fā)布時(shí)間:2023/12/13 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux加密框架 crypto 算法管理 - 动态和静态算法管理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接

  • Linux加密框架的算法管理(三)_家有一希的博客-CSDN博客

動(dòng)態(tài)和靜態(tài)算法管理

靜態(tài)算法

  • 加密框架中的算法分為靜態(tài)算法和動(dòng)態(tài)算法兩種,其中靜態(tài)算法指的是以"算法名.ko"形式存在的靜態(tài)編譯的算法模塊,如aes.ko表示AES算法模塊,md5.ko表示MD5算法模塊
  • 靜態(tài)算法模塊是預(yù)定義的,在內(nèi)核啟動(dòng)時(shí)或通過request_module函數(shù)加載到加密框架中
  • 在加密框架中,靜態(tài)算法表示為一個(gè)算法說明實(shí)例。

動(dòng)態(tài)算法

  • 而動(dòng)態(tài)算法指的是根據(jù)算法模式(如CBC、HMAC等)和基礎(chǔ)算法(靜態(tài)算法或動(dòng)態(tài)算法)創(chuàng)建的算法,如"cbc(aes)"表示使用AES算法的CBC模式的新算法,"hmac(md5)"表示使用MD5算法的HMAC模式的新算法,這些算法是根據(jù)外部應(yīng)用需求動(dòng)態(tài)創(chuàng)建并注冊(cè)到加密框架中
  • 在加密框架中,動(dòng)態(tài)算法表示為一個(gè)算法模板實(shí)例。

差異

  • 靜態(tài)算法在密碼學(xué)上屬于算法的范疇
  • 動(dòng)態(tài)算法在密碼學(xué)上屬于算法應(yīng)用的范疇

創(chuàng)建動(dòng)態(tài)算法

  • 發(fā)布創(chuàng)建動(dòng)態(tài)算法通知
  • 如果外部應(yīng)用在查找算法(如"cbc(aes)"算法)時(shí),如果查找未命中,將創(chuàng)建注冊(cè)用算法幼蟲,然后在加密通知鏈上發(fā)布創(chuàng)建動(dòng)態(tài)算法(CRYPTO_MSG_ALG_REQUEST)的通知
  • 如下所示
ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
  • 如果是當(dāng)前查找線程發(fā)布的創(chuàng)建動(dòng)態(tài)算法通知,則larval為待創(chuàng)建算法同名的注冊(cè)用算法幼蟲,用于向創(chuàng)建動(dòng)態(tài)算法的內(nèi)核線程傳遞待創(chuàng)建算法的算法名、算法類型等信息,此時(shí)算法管理鏈表如下所示,其中cbc_aes_larval_r表示"cbc(aes)"算法對(duì)應(yīng)的注冊(cè)用算法幼蟲。

  • 加密通知鏈回調(diào)函數(shù)cryptomgr_notify根據(jù)通知消息類型msg調(diào)用不同的執(zhí)行函數(shù)
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
  • 如下所示

static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,void *data) {switch (msg) {case CRYPTO_MSG_ALG_REQUEST:return cryptomgr_schedule_probe(data);case CRYPTO_MSG_ALG_REGISTER:return cryptomgr_schedule_test(data);case CRYPTO_MSG_ALG_LOADED:break;}return NOTIFY_DONE; }
  • ?其中CRYPTO_MSG_ALG_REQUEST為創(chuàng)建動(dòng)態(tài)算法(也稱為算法探測(cè))的通知,執(zhí)行函數(shù)為cryptomgr_schedule_probe;
  • CRYPTO_MSG_ALG_REGISTER為算法正確性檢驗(yàn)的通知,執(zhí)行函數(shù)為cryptomgr_schedule_test。

cryptomgr_schedule_probe函數(shù)

  • cryptomgr_schedule_probe函數(shù)的輸入?yún)?shù)為算法幼蟲larval,返回值為執(zhí)行結(jié)果,NOTIFY_STOP表示執(zhí)行完畢,但是不表示已成功創(chuàng)建動(dòng)態(tài)算法。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_schedule_probe(struct crypto_larval *larval) {struct task_struct *thread;struct cryptomgr_param *param;const char *name = larval->alg.cra_name;const char *p;unsigned int len;int i;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++);len = p - name;if (!len || *p != '(')goto err_free_param;memcpy(param->template, name, len);i = 0;for (;;) {name = ++p;for (; isalnum(*p) || *p == '-' || *p == '_'; p++);if (*p == '(') {int recursion = 0;for (;;) {if (!*++p)goto err_free_param;if (*p == '(')recursion++;else if (*p == ')' && !recursion--)break;}p++;}len = p - name;if (!len)goto err_free_param;param->attrs[i].attr.rta_len = sizeof(param->attrs[i]);param->attrs[i].attr.rta_type = CRYPTOA_ALG;memcpy(param->attrs[i].data.name, name, len);param->tb[i + 1] = &param->attrs[i].attr;i++;if (i >= CRYPTO_MAX_ATTRS)goto err_free_param;if (*p == ')')break;if (*p != ',')goto err_free_param;}if (!i)goto err_free_param;param->tb[i + 1] = NULL;param->type.attr.rta_len = sizeof(param->type);param->type.attr.rta_type = CRYPTOA_TYPE;param->type.data.type = larval->alg.cra_flags & ~CRYPTO_ALG_TESTED;param->type.data.mask = larval->mask & ~CRYPTO_ALG_TESTED;param->tb[0] = &param->type.attr;param->otype = larval->alg.cra_flags;param->omask = larval->mask;crypto_alg_get(&larval->alg);param->larval = larval;thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;return NOTIFY_STOP;err_put_larval:crypto_alg_put(&larval->alg); err_free_param:kfree(param); err_put_module:module_put(THIS_MODULE); err:return NOTIFY_OK; }
  • cryptomgr_schedule_probe函數(shù)執(zhí)行流程如下所示。

  • 1)在cryptomgr_schedule_probe函數(shù)函數(shù)中,需要從算法幼蟲的算法名中解析出算法模板名和基礎(chǔ)算法名,規(guī)則如下:
  • 正則表達(dá)式
    • a)基本規(guī)則:算法模板名(基礎(chǔ)算法名1,…,基礎(chǔ)算法名n);
    • b)算法模板名的有效字符包括0到9、a到z、A到Z、-、等;
    • c)基礎(chǔ)算法名的有效字符包括0到9、a到z、A到Z、-、、(、)等;
    • d)所有基礎(chǔ)算法名都必須包含在緊跟算法模板名后的()之內(nèi),當(dāng)有多個(gè)基礎(chǔ)算法時(shí),基礎(chǔ)算法名以",“間隔;
    • e)算法模板名與第一個(gè)”("之間不能有任何其他字符;
    • f)基礎(chǔ)算法名最多不超過32個(gè)。
  • 例子
    • 例如,算法名為"hmac(md5)"時(shí),解析出的算法模板為hmac,基礎(chǔ)算法為靜態(tài)算法md5;
    • 算法名為"authenc(hmac(md5),cbc(aes))"時(shí),解析出的算法模板為authenc,基礎(chǔ)算法為動(dòng)態(tài)算法hmac(md5)和cbc(aes)。

cryptomgr_param

  • 2)傳遞給內(nèi)核線程的參數(shù)數(shù)據(jù)結(jié)構(gòu)為struct cryptomgr_param,定義如下所示:
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
struct cryptomgr_param {struct rtattr *tb[CRYPTO_MAX_ATTRS + 2];struct {struct rtattr attr;struct crypto_attr_type data;} type;struct {struct rtattr attr;struct crypto_attr_alg data;} attrs[CRYPTO_MAX_ATTRS];char template[CRYPTO_MAX_ALG_NAME];struct crypto_larval *larval;u32 otype;u32 omask; };

參數(shù)介紹?

  • tb:參數(shù)名(T)列表,不含參數(shù)值,以NULL結(jié)尾。第1個(gè)為算法類型(CRYPTOA_TYPE),后續(xù)均為基礎(chǔ)算法名(CRYPTOA_ALG)。
  • type:算法類型,TLV結(jié)構(gòu),包含算法類型和屏蔽位。
  • attrs:基礎(chǔ)算法名列表,TLV結(jié)構(gòu)。
  • larval:算法幼蟲名,即待創(chuàng)建的動(dòng)態(tài)算法的算法名。
  • template:算法模板名。
  • otype:原始的算法類型,傳遞給內(nèi)核線程的算法類型中清除了算法已檢測(cè)標(biāo)志位。
  • omask:原始的算法類型屏蔽位,傳遞給內(nèi)核線程的算法類型屏蔽位中清除了算法已檢測(cè)標(biāo)志位。
  • 填充完參數(shù)param后,創(chuàng)建名為"cryptomgr_probe"的內(nèi)核線程,稱為算法探測(cè)線程,其執(zhí)行函數(shù)為cryptomgr_probe,如下所示。
thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;
  • 創(chuàng)建完算法探測(cè)線程后,算法查找線程調(diào)用crypto_larval_wait等待算法探測(cè)結(jié)束,如下所示。

if (ok == NOTIFY_STOP)alg = crypto_larval_wait(larval);
  • 算法檢測(cè)線程(非算法探測(cè)線程)通過注冊(cè)用算法幼蟲的完成量通知查找線程算法探測(cè)結(jié)束
  • struct completion *completion;完成量,指向算法幼蟲的完成量。
  • 目前的版本? V5.15.12已經(jīng)刪除這個(gè)變量

cryptomgr_probe函數(shù)

  • cryptomgr_probe函數(shù)是算法探測(cè)線程的執(zhí)行函數(shù),輸入?yún)?shù)為創(chuàng)建動(dòng)態(tài)算法所需的參數(shù)
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_probe(void *data) {struct cryptomgr_param *param = data;struct crypto_template *tmpl;int err;tmpl = crypto_lookup_template(param->template);if (!tmpl)goto out;do {err = tmpl->create(tmpl, param->tb);} while (err == -EAGAIN && !signal_pending(current));crypto_tmpl_put(tmpl);out:complete_all(&param->larval->completion);crypto_alg_put(&param->larval->alg);kfree(param);module_put_and_exit(0); }
  • 處理流程如下所示

  • 算法模板要么實(shí)現(xiàn)create接口要么實(shí)現(xiàn)alloc接口,兩者必居其一
  • 其中create接口不僅創(chuàng)建算法模板實(shí)例,還實(shí)現(xiàn)算法模板實(shí)例注冊(cè),而alloc接口只創(chuàng)建算法模板實(shí)例,因此還需要調(diào)用者再進(jìn)行算法模板實(shí)例注冊(cè)。一般情況下,哈希算法的算法模板實(shí)現(xiàn)create接口,如HMAC模板提供的create接口為hmac_create函數(shù),而分組算法的算法模板實(shí)現(xiàn)提供alloc接口,如CBC模板提供的alloc接口為crypto_cbc_alloc函數(shù)。
  • 如果在算法探測(cè)過程中出現(xiàn)錯(cuò)誤,則需要在線程退出前調(diào)用crypto_larval_error函數(shù)完成收尾工作。crypto_larval_error函數(shù)的輸入?yún)?shù)為算法幼蟲名(即待創(chuàng)建的動(dòng)態(tài)算法名)param->larval、原始算法類型param->otype和原始算法類型屏蔽位param->omask
    • 注意事項(xiàng)
    • crypto_larval_error 版本5.15.11已經(jīng)不再支持
  • 如果以輸入?yún)?shù)為條件查找到算法幼蟲,則喚醒在其完成量上等待的線程;如果查找到的是已注冊(cè)的算法,在算法檢測(cè)線程中已喚醒在注冊(cè)用算法幼蟲完成量上等待的線程,如下所示。
    • 問題:
    • create和alloc必須要二者選一實(shí)現(xiàn),但是我沒有找到證據(jù) 進(jìn)行論證

注冊(cè)動(dòng)態(tài)算法crypto_register_instance

  • crypto_register_instance函數(shù)用于注冊(cè)動(dòng)態(tài)算法(即算法模板實(shí)例),輸入?yún)?shù)包括算法模板tmpl和算法模板實(shí)例inst,處理流程如下所示。
  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
int crypto_register_instance(struct crypto_template *tmpl,struct crypto_instance *inst) {struct crypto_larval *larval;struct crypto_spawn *spawn;int err;err = crypto_check_alg(&inst->alg);if (err)return err;inst->alg.cra_module = tmpl->module;inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;down_write(&crypto_alg_sem);larval = ERR_PTR(-EAGAIN);for (spawn = inst->spawns; spawn;) {struct crypto_spawn *next;if (spawn->dead)goto unlock;next = spawn->next;spawn->inst = inst;spawn->registered = true;crypto_mod_put(spawn->alg);spawn = next;}larval = __crypto_register_alg(&inst->alg);if (IS_ERR(larval))goto unlock;hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;unlock:up_write(&crypto_alg_sem);err = PTR_ERR(larval);if (IS_ERR(larval))goto err;crypto_wait_for_test(larval);err = 0;err:return err; } EXPORT_SYMBOL_GPL(crypto_register_instance);

  • 1)算法注冊(cè)由通用算法注冊(cè)函數(shù)__crypto_register_alg完成,輸入?yún)?shù)為算法模板實(shí)例對(duì)應(yīng)的通用算法說明inst->alg,返回值為檢測(cè)用算法幼蟲larval。
  • 2)算法模板和算法模板實(shí)例的關(guān)聯(lián)代碼如下:
hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;
  • 即將算法模板實(shí)例添加到算法模板的實(shí)例鏈表中,同時(shí)設(shè)置算法模板實(shí)例歸屬的算法模板。
  • 3)和靜態(tài)算法相同,動(dòng)態(tài)算法注冊(cè)的最后一步是算法正確性檢驗(yàn),調(diào)用crypto_wait_for_test函數(shù)實(shí)現(xiàn)。
  • 4)crypto_register_instance函數(shù)中接口調(diào)用情況如下所示。

  • 5)注冊(cè)同步哈希算法模板實(shí)例時(shí)使用的函數(shù)是shash_register_instance,其輸入?yún)?shù)包括算法模板tmpl和同步哈希算法模板實(shí)例inst,處理流程如下所示。

  • ?shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin
int shash_register_instance(struct crypto_template *tmpl,struct shash_instance *inst) {int err;if (WARN_ON(!inst->free))return -EINVAL;err = shash_prepare_alg(&inst->alg);if (err)return err;return crypto_register_instance(tmpl, shash_crypto_instance(inst)); } EXPORT_SYMBOL_GPL(shash_register_instance);
  • 和同步哈希靜態(tài)算法相同,在注冊(cè)前首先調(diào)用shash_prepare_alg函數(shù)檢測(cè)同步哈希算法模板實(shí)例對(duì)應(yīng)的同步哈希算法(inst->alg)的有效性,同時(shí)進(jìn)行注冊(cè)前的準(zhǔn)備工作。注冊(cè)前準(zhǔn)備工作中最重要的一步是將算法類型常量設(shè)置為crypto_shash_type。
  • 同步哈希動(dòng)態(tài)算法的注冊(cè)工作是由通用動(dòng)態(tài)算法注冊(cè)函數(shù)crypto_register_instance完成。crypto_register_instance函數(shù)處理的是通用的算法模板實(shí)例,因此調(diào)用shash_crypto_instance函數(shù)獲取同步哈希算法模板實(shí)例inst對(duì)應(yīng)的通用算法模板實(shí)例。
  • shash_register_instance函數(shù)中接口調(diào)用情況如下所示。

總結(jié)

以上是生活随笔為你收集整理的linux加密框架 crypto 算法管理 - 动态和静态算法管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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