Linux块设备加密之dm-crypt分析

相关的分析工作一年前就做完了,一直懒得写下来。现在觉得还是写下来,以来怕自己忘记了,二来可以给大家分享一下自己的研究经验。

 

这篇文章算是《Device Mapper代码分析》的后续篇,因为dm-crypt是基于dm框架的,因此与上一篇一样,也以2.6.33内核代码为基础来讲述代码的分析过程。但是本文侧重点不同在于着重分析一下三个方面:

1、Linux密码管理

2、dm-crypt到与Linux密码的关联

3、dm-crypt的异步处理

一、Linux密码管理

Linux内核中,密码相关的头文件在<srcdir>/include/crypto/下,实现文件在<srcdir>/crypto/下。相关的概念大致有加密、块加密、异步块加密、哈希、分组加密模式(ECB/CBC/CFB/OFB/CTR)等。接下来一一进行简单分析。

1.1 加密算法

我们可以从内核代码中挑一个简单而普通的加密算法来研究一下,例如<srcdir>/crypto/aes_generic.c描述的AES算法。

 

所有加密算法都是以内核模块方式编写的。所有内核模块的代码都是先看关键数据结构,再看算法。aes先声明了一个叫做crypto_alg的结构体,如下:

 

alg是algorithm的缩写。所有的加密、哈希等算法注册用数据结构都叫做xxx_alg,crypto_alg的完整定义在<srcdir>/include/linux/crypto.h中:

 

alg的关键成员有name(算法名)、driver_name(驱动名)、flags(算法类型、同步or异步)、blocksize(分组大小,单位:字节)、ctxsize(上下文大小/字节)、alignmask(ctx的对齐)、min/max-keysize(最小or最大密钥长度/字节)、init/exit(tfm的初始化和销毁)、destroy(alg的销毁)、set_key/encrypt/decrypt(设置密钥/加密/解密的函数)。有些算法可能还有iv_size之类的,后面再讲。

 

这里有个ctx(算法上下文)的概念要解释一下。所谓上下文,就是算法执行过程中所要贯穿始终的数据结构,由每个算法自己定义。set_key/encrypt/decrypt这几个函数都可以从参数获得算法上下文的指针。算法上下文所占的内存空间由密码管理器来分配,注册alg的时候指定ctx大小和对齐即可。ctx的对齐又是什么呢?在密码管理器分配ctx内存的时候,需要进行内存对齐。对于一些硬件加解密或者特殊要求的算法,ctx的首地址可能需要在内存中4字节或者16字节对齐,这个cra_alignmask就是指定这个。aes使用的是3(0x11),就是将首地址低二位清零,即4字节对齐,如果要求N字节对齐(N是2的某个指数),那么alignmask就可以指定为N-1。

 

那么ctx被分配到哪里了呢?这个跟另外一个数据结构有关,就是接下来要讲的struct crypto_tfm。我们先来看crypto_alg对应的set_key、encrypt、decrypt这三个函数的函数原型(注意这里的表述哦,是crypto_alg对应的三大函数)。

 

int  set_key(struct crypto_tfm *tfm, const u8 *in_key, unsigned int key_len);

void encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in);

void decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in);

 

in和out参数就是加解密之前和之后的传入传出数据,长度就是alg中的blocksize。这三个函数都有类型为struct crypto_tfm *的参数。tfm是transform的缩写。所有加密、哈希算法的set_key、encrypt、decrypt都带有这个参数。crypto_tfm的定义在<srcdir>/include/linux/crypto.h中:

从中间那个union和上面的一堆#define可以看出,从这个结构又可以分散出一组xxx_tfm。crypto_alg对应cipher_tfm。最后那个参数__crt_ctx[]就是上面说到的算法上下文。也就是说,算法上下文是跟随tfm一起分配的。从tfm,我们就可以得到ctx。Linux提供了一个函数inline void *crypto_tfm_ctx(struct crypto_tfm *tfm);来进行转换,该函数也在<srcdir>/include/linux/crypto.h中。

 

现在可以梳理一下alg、crypto_tfm、xxx_tfm、ctx的关系了。alg是注册用的;crypto_tfm是每个算法实例对应的结构;xxx_tfm包含在crypto_tfm中,是每类算法对应的结构,ctx在crypto_tfm的最后。当你的算法拿到一个crypto_tfm指针时,可以通过__crt_alg指针访

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值