1.3.1.1.算法模板内核中的很多算法基本都是动态生成,也就是说只有在实际使用时才会动态分配并在内核注册该算法。内核中的算法有时候是由几种算法组合实现,为了便于管理,这时候就要抽象出一个模板来对各种算法的组织进行有效管理。 这里所说的算法模板的作用主要是上层调用者在构造一个算法时通过触发算法模板为调用的算法分配算法实例。模板的结构体原型如下。
struct crypto_template{ struct hlist_headinstances; struct crypto_instance*(*alloc)(struct rtattr**tb); void (*free)(struct crypto_instance*inst); int (*create)(struct crypto_template*tmpl, struct rtattr**tb); charname[CRYPTO_MAX_ALG_NAME]; }; 结构体crypto_template中list描述了模板的组织结构双链表进行组织,这样组织的优势在于便于快速查找算法属于哪个模板。instances描述了实例是以Hash链表的方式进行组织。alloc就说明了模板的主要作用:分配一个算法实例。有算法实例分配就有算法实例释放,free成员函数则负责释放实例对象。如果一个模板不存在就需要通过create钩子函数创建一个模板。Name描述了模板的名称。 1.3.1.2.算法实例算法实例仅仅说明内核中存在这样的算法,具体的算法实现还需要分配算法对象之后对算法进行注册。 算法实例的具体结构如下。
struct crypto_instance{ struct crypto_algalg; struct crypto_template*tmpl; struct hlist_nodelist; void *__ctx[] CRYPTO_MINALIGN_ATTR; };
结构体crypto_instance中成员tmpl把算法实例和算法模板联系起来了,list成员变量说明了算法实例的组织形式是以Hash链表进行组织的。__ctx为算法实例上下文。 1.3.1.3.算法对象的分配对象是用户实例对象的算法封装和核心的处理逻辑。在分析对象分配之前先要了解crypto_tfm和crypto_alg结构。 结构crypto_tfm是具体算法库中具体密码算法的通用结构[1]。 struct crypto_tfm{ union { struct ablkcipher_tfmablkcipher; struct blkcipher_tfmblkcipher; struct cipher_tfmcipher; struct compress_tfmcompress; } crt_u; void (*exit)(struct crypto_tfm*tfm);
struct crypto_alg*__crt_alg; void *__crt_ctx[] CRYPTO_MINALIGN_ATTR; }; 结构crypto_alg是一个抽象的统一算法接口,主要描述了驱动名称、内核模块的密码算法、上下文的大小、上下文对齐、对象的初始化及退出和算法的销毁。主要用于算法的注册,具体结构如下。 struct crypto_alg{ unsigned int cra_blocksize; unsigned int cra_ctxsize; unsigned int cra_alignmask; int cra_priority; char cra_name[CRYPTO_MAX_ALG_NAME]; char cra_driver_name[CRYPTO_MAX_ALG_NAME]; const struct crypto_type*cra_type; union { struct ablkcipher_algablkcipher; struct blkcipher_algblkcipher; struct cipher_algcipher; struct compress_algcompress; } cra_u; int (*cra_init)(struct crypto_tfm*tfm); void (*cra_exit)(struct crypto_tfm*tfm); void (*cra_destroy)(struct crypto_alg*alg); struct module*cra_module; };
从结构crypto_alg和crypto_tfm两个结构中涉及到了crypto_alg、 crypto_tfm、 xxx_tfm、xxx_alg,那么它们是什么关系呢? crypto_tfm是每个算法实例对应的结构,xxx_tfm是包含在 crypto_tfm中每类算法对应的算法操作集,这个算法操作集和VFS里面的xxx_ops一样,定义了许多钩子函数。crypto_alg则是算法的注册函数,可以通过对crypto_alg的填充实现算法的注册,而xxx_alg则是具体算法的注册。
本文转载于微信公众号: Linux内核之旅(LinuxKernelTravel),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|