參考鏈接
- Linux加密框架中的主要數據結構(三)_家有一希的博客-CSDN博客
- algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
定義
struct crypto_template {struct list_head list;struct hlist_head instances;struct module *module;int (*create)(struct crypto_template *tmpl, struct rtattr **tb);char name[CRYPTO_MAX_ALG_NAME];
};
crypto_template各成員變量含義
- 1)list:算法模板鏈表節點。
- 2)instance:算法模板實例哈希鏈表的頭節點。算法模板通過實例哈希鏈表管理由該模板創建的所有算法模板實例。
- 3)module:算法模板所屬的模塊,一般為THIS_MODULE,編譯時確定。
- 4)name:算法模板名,最多包含64個字符。
- 5)alloc:創建算法模板實例(struct crypto_instance)的接口,返回值為新創建的算法模板實例。創建完需要調用注冊接口完成算法模板實例注冊。? 刪除
- 6)free:算法模板實例的析構函數,用于釋放算法模板實例占用的內存資源? ?刪除
- 7)create:創建算法模板實例的接口。與alloc接口不同,create接口不會顯式地創建一個算法模板實例(無論返回值還是輸出參數都不是struct crypto_instance類型),而是隱式地創建一個算法模板實例,同時將注冊新創建的算法模板實例? (源碼可知)。
- 一般情況下,分組算法模式的實例地創建接口為alloc接口,哈希算法模式的實例創建接口為create接口。
- 無論是通過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,參數值數據結構根據參數類型定義。
/* 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;
};
- ?參數類型為CRYPTOA_TYPE時,算法類型TLV結構(即tb[0])如下所示,通過函數crypto_get_attr_type可以獲取算法類型和屏蔽位。
- algapi.c - crypto/algapi.c - Linux source code (v5.15.11) - Bootlin
- #define RTA_DATA(rta) ? ((void*)(((char*)(rta)) + RTA_LENGTH(0)))? ?返回空指針指向一個結構體,第一個參數char*指向的是type,第二個參數int是mask屏蔽位
- #define RTA_LENGTH(len)?? ?(RTA_ALIGN(sizeof(struct rtattr)) + (len))
struct crypto_attr_type {u32 type;u32 mask;
};


- ?參數類型為CRYPTOA_ALG時,基礎算法名TLV結構(即tb[1])如下所示,通過函數crypto_attr_alg_name獲取基礎算法名


- algapi.c - crypto/algapi.c - Linux source code (v5.15.11) - Bootlin?
const char *crypto_attr_alg_name(struct rtattr *rta)
{struct crypto_attr_alg *alga;if (!rta)return ERR_PTR(-ENOENT);if (RTA_PAYLOAD(rta) < sizeof(*alga))return ERR_PTR(-EINVAL);if (rta->rta_type != CRYPTOA_ALG)return ERR_PTR(-EINVAL);alga = RTA_DATA(rta);alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0;return alga->name;
}
EXPORT_SYMBOL_GPL(crypto_attr_alg_name);
參考鏈接
- C/C++ struct初始化/復制/內存分配技巧_wys的專欄-CSDN博客?