PadLock AES内核测试模块(1)

一、简述

主要编写了一个测试验证PadLock AES内核接口的验证模块。应用PadLock AES内核接口实现加密解密。本文提供了应用该模块的方法、步骤、原理及源码。

二、操作环境


操作系统


mint17


内核


3.8.0


编译器


gcc4.7.3


CPU


VIA Nano X2 L4530 @ 1.6+ GHz


内存


4G


多核


2个

三、主要原理

Linux内核有关于加密的函数的接口,主要在cryto文件夹目录中。有AES、SHA等多种算法的实现接口。网上有很多介绍Linux内核关于加密算法框架的文章,通过阅读Linux内核源码,编写了一个使用AES内核函数库的内核模块。

使用AES加密算法主要有4个函数:

crypto_blkcipher_setkey
crypto_blkcipher_set_iv
crypto_blkcipher_encrypt
crypto_blkcipher_decrypt

只有这几个函数配置正确,那么就可以正常使用Linux内核的AES加密库了。下面介绍这几个函数的用法。

static inline int crypto_blkcipher_setkey(struct crypto_blkcipher *tfm,

const u8 *key, unsigned int keylen)

该函数主要是用于设置加密关键字key。这里需要说明下AES算法的如何应用,对于算法层级,AES通过key(关键字)、iv(初始化向量)、加密模式(CBC/ECB/CFB/OFB等)、key-length(128/192/256)来确定加密的模式,依据不同的模式同样的明文加密出的密文是不一样的。crypto_blkcipher_setkey()函数就是设置其key。*key是秘钥,keylen是秘钥长度(单位字节可以选择16、24、32)

下面说说crypto_blkcipher *tfm,结构体这个是加密上下文,它是贯穿加密的始终,crypto_blkcipher_setkey、crypto_blkcipher_set_iv都是用来设置tfm这个结构体的,它是加密配置的载体。

struct crypto_blkcipher {
struct crypto_tfm base;
};

struct crypto_tfm {

u32 crt_flags;
union {
struct ablkcipher_tfm ablkcipher;
struct aead_tfm aead;
struct blkcipher_tfm blkcipher;
struct cipher_tfm cipher;
struct hash_tfm hash;
struct compress_tfm compress;
struct rng_tfm rng;
} crt_u;   //确定是算法模式
void (*exit)(struct crypto_tfm *tfm); //退出函数
struct crypto_alg *__crt_alg;
void *__crt_ctx[] CRYPTO_MINALIGN_ATTR;
};

从中间那个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中。

下面介绍crypto_blkcipher_set_iv函数

static inline void crypto_blkcipher_set_iv(struct crypto_blkcipher *tfm,

const u8 *src, unsigned int len)

它的功能是设置iv(初始化向量)。src是iv值,len是iv的长度,tfm是和前面讲述的一样。

下面介绍核心加密函数crypto_blkcipher_encrypt_iv:

static inline int crypto_blkcipher_encrypt(struct blkcipher_desc *desc,
      struct scatterlist *dst,
      struct scatterlist *src,
      unsigned int nbytes)

它的功能就是实现加密。返回0表示正确,1表示错误。*desc是加密上下文结构体,上面set_iv和set_key就是用来设置这个blkcipher_desc结构体的,

原型为:

struct blkcipher_desc {
struct crypto_blkcipher *tfm;
void *info;
u32 flags;
};

其中tfm就是之前我们所说的加密上下文,info通常用来存放iv,因为块加密的散集序列工具(scatterwalk)在初始化时直接将info当作iv来使用。

散集序列(scatterlist)是什么呢?【1】

在Linux内核中,跟外设打交道有三种方式:IO、端口和DMA,这个教科书上都讲了。其中DMA方式是由DMA控制器来控制内存、外设间的数据传输。我们知道,Linux的地址空间有三种:虚拟地址、物理地址和总线地址。DMA要求每次传输的一整块数据分布在连续的总线地址空间上。而DMA是为传输大块数据设计的,但是大块的连续总线地址空间通常是稀缺的。因此当没有那么多连续空间时,只能将大块数据分散到尽可能少的小块连续地址上,然后让DMA控制器一块接着一块地把数据全部传完。因此Linux内核中专门设计了一种叫做散集序列(scatterlist)的数据结构将小块的连续总线地址串起来,交给DMA驱动自动地一个接着一个地传输。

说白了,scatterlist就是一个线性表(scatterlist可以是链表,也可以是数组),每个元素包含一个指针指向一块总线地址连续的内存块,这是为DMA量身定做的数据结构。

scatterlist的结构体
struct scatterlist {
#ifdef CONFIG_DEBUG_SG
unsigned long	sg_magic;
#endif
unsigned long	page_link;     //哪一页
unsigned int	offset;            //页的偏移
unsigned int	length;           //该数据长度
dma_addr_t	dma_address;
#ifdef CONFIG_NEED_SG_DMA_LENGTH
unsigned int	dma_length;
#endif
};

在本文中给scatterwalk分配空间及设置数据利用函数:

sg_init_one()。

scatterwalk是对物理内存的操作,它便于DMA的传输。但是我们在Linux内核中的操作很多是对虚拟内存的处理(显示数据printk),因此还需要在应用scatterwalk的同时,要还需要它映射到虚拟内存中来利用(kmap),在后面实现程序中会介绍。

dst是目的地址,src是原数据,nbytes是处理的字节。

crypto_blkcipher_decrypt函数的原型是:
static inline int crypto_blkcipher_decrypt(struct blkcipher_desc *desc,
   struct scatterlist *dst,
   struct scatterlist *src,
   unsigned int nbytes)

该函数的作用是解密,和加密算法参数类似,不再累述。

时间: 2024-10-13 20:11:34

PadLock AES内核测试模块(1)的相关文章

PadLock AES内核测试模块

一.简述 主要编写了一个测试验证PadLock AES内核接口的验证模块.应用PadLock AES内核接口实现加密解密.本文提供了应用该模块的方法.步骤.原理及源码. 二.操作环境 操作系统 mint17 内核 3.8.0 编译器 gcc4.7.3 CPU VIA Nano X2 L4530 @ 1.6+ GHz 内存 4G 多核 2个 三.主要原理 Linux内核有关于加密的函数的接口,主要在cryto文件夹目录中.有AES.SHA等多种算法的实现接口.网上有很多介绍Linux内核关于加密算

一个内核定时器模块

/* 内核定时器测试模块 */ #include <linux/kernel.h> //内核 #include <linux/module.h> //内核模块 #include <linux/init.h> //模块初始化和注销 #include <linux/slab.h> //屋里内存分配管理 #include <linux/list.h> //内核链表 #include <linux/timer.h> //内核定时器 //内核模

OSG 中 相交测试 模块 工作流程及原理

主要涉及三个类: 1. osgUtil::PolytopeIntersector // 具体不同算法实现类 2. osgUtil::IntersectionVisitor //用来遍历节点树的每个节点 3.osg::Node * mNode;  //  你要做相交测试的根节点 先看用法: osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Inter

bug管理工具之禅道的测试模块的使用

由于公司的bug管理工具是禅道,上手之前看了下禅道测试模块的使用,并记录了下来 角色:产品经理PO,项目经理PM,开发,测试 测试任务: bug: 1.维护bug视图模块:[测试]-[Bug]-左侧[维护模块]:维护软件每一个模块,即新建-删除-修改模块/子模块名称(如[首页]模块,[关于我们]模块) 2.提交bug:[测试]-[Bug]-[+提Bug] 注意点: (1)Bug的优先级别(见bug优先级别随笔)以及严重级别标准? (2)Bug负责人如何划分? (3)Bug修复截止时间如何确定?

Linux系统启动流程、内核及模块管理

Linux系统启动流程.内核及模块管理 Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)内核(kernel): 进程管理(创建.调度.销毁等).内存管理.网络管理(网络协议栈).驱动程序.文件系统.安全功能IPC:Inter Process Communication机制本地进程间通信机制:消息队列.semerphor.shm(共享内存)跨主机进程间通信机制:socket等运行中的系统环境可分为两层:内核空间.用户空间内核空间(模式):内核代码(特权级操作-->系统调

NPM测试模块之rewire教程

摘要:有了rewire模块,再也不用担心测试私有函数了. 在玩转Node.js单元测试,我介绍了3个用于编写测试代码的NPM模块:Mocha, Should以及SuperTest.为了怂恿大家写单元测试,我再介绍一款神奇的NPM测试模块:rewire. GitHub仓库: Fundebug/rewire-tutorial rewire原理 对于技术,知其然,也应该知其所以然. 对于rewire,它的基本功能与require相同,都是用于导入模块,只是,它会为导入的模块添加两个特殊的函数:__ge

python中关于不执行if __name__ == &#39;__main__&#39;:测试模块的解决

1.新建测试脚本文件: 2.编辑测试脚本 import unittest import requests import json import HTMLTestRunner ur1 = 'http://118.178.247.67:8081/systLogonUser/adminLogon.do' headers = {'Content-Type':'application/x-www-form-urlencoded','Referer':'118.178.247.67'} data = { '

可以用py库: pyautogui (自动测试模块,模拟鼠标、键盘动作)来代替pyuserinput

PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块 pyUserInput模块安装前需要安装pywin32和pyHook模块.(想要装的看https://www.cnblogs.com/mapu/p/9235571.html) pyautogui 库 2017-10-4 python pip.exe install pyautogui python3.6下,直接就可以安装了,无须其它依赖 http://blog.csdn.net/astroboythu/article/details

内核、模块

内核参数说明 /proc目录介绍详见链接 内核参数目录及配置文件: /proc/* /usr/lib/sysctl.d/* /etc/sysctl.d/*.conf /etc/sysctl.conf #开机读取的内核参数文件: 修改内核参数的注意事项 Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现. 修改/proc下内核参数文件内容,不能使用编辑器来修改内核参数文件,理由是由于内核随时可能更改这些文