关于linux内核模块:SCE-内核态接口使用手册
1.介绍SCE部件作为飞腾平台的平安组件,提供了对称算法加速器(SCA)、哈希算法加速器(HASH)、非对称算法加速器(ACA)和真随机数生成器(TRNG)。 用户通过Linux Kernel Crypto API框架实现内核对各种算法驱动的反对,目前内核态已实现SCA、HASH、TRNG反对的算法驱动。通过装置SCE内核层驱动可查看已反对的算法驱动,利用开发者可通过相应的内核态接口实现对算法模块的调用。 2.装置与测试2.1硬件及零碎要求硬件要求如下表所示。 我的项目阐明CPU飞腾平台CPU已支持系统1、Ubuntu 22.04(kernel 4.19.0)存储无要求内存无要求2.2软件目录架构软件目录架构如图所示: 1.src文件夹:驱动模块源码。2.include文件夹:驱动模块头文件。3.test文件夹:内核层驱动测试代码。 2.3内核驱动算法概述目前反对的内核态驱动算法如下表所示。 加速器算法算法名驱动名对称引擎SM4ecb(sm4)cbc(sm4)ctr(sm4)ofb(sm4)ecb(sm4)-phytiumcbc(sm4)phytiumctr(sm4)-phytiumofb(sm4)-phytium对称引擎AESecb(aes)cbc(aes)ctr(aes)ofb(aes)ecb(aes)-phytiumcbc(aes)phytiumctr(aes)-phytiumofb(aes)-phytium对称引擎DESecb(des)cbc(des)ctr(des)ofb(des)ecb(des3_ede)cbc(des3_ede)ctr(des3_ede)ofb(des3_ede)ecb(aes)-phytiumcbc(aes)phytiumctr(aes)-phytiumofb(aes)-phytiumecb(des3_ede)-phytiumcbc(des3_ede)-phytiumctr(des3_ede)-phytiumofb(des3_ede)-phytium哈希引擎DESecb(des)cbc(des)ctr(des)ofb(des)ecb(des3_ede)cbc(des3_ede)ctr(des3_ede)ofb(des3_ede)ecb(des)-phytiumcbc(des)-phytiumctr(des)-phytiumofb(des)-phytiumecb(des3_ede)-phytiumcbc(des3_ede)-phytiumctr(des3_ede)-phytiumofb(des3_ede)-phytium哈希引擎SHAsha1sha224sha256sha384sha512md5hmac(sha1)hmac(sha224)hmac(sha256)hmac(sha384)hmac(sha512)hmac(md5)sha1-phytiumsha224-phytiumsha256-phytiumsha384-phytiumsha512-phytiummd5-phytiumhmac(sha1)-phytiumhmac(sha224)-phytiumhmac(sha256)-phytiumhmac(sha384)-phytiumhmac(sha512)-phytiumhmac(md5)-phytium哈希引擎SM3sm3hmac(sm3)sm3-phytiumhmac(sm3)-phytium真随机数生成器TRNGTRNGtrng-phytium2.4内核层编译、装置与测试1.SCE内核层内核驱动编译装置步骤 进入驱动代码目录cd driver# 编译驱动模块make# 加载驱动模块sudo insmod phytium_sce.ko# 抉择应用内核层驱动模块# 驱动模块反对用户态和内核态切换# 通过操作/proc/sce_dir/sce_work_state管制# 输出1启用内核态模块,输出2启用用户态模块,输出0敞开所有模块sudo echo 1 > /proc/sce_dir/sce_work_state# 查看驱动模块以后模式cat /proc/sce_dir/sce_work_state# 查看内核反对的SCE算法驱动cat /proc/crypto | grep phytium2.SCE内核态接口编译装置 #进入内核态测试代码目录cd driver/test# 编译测试模块make# 在执行mtest.ko前必须先加载好内核驱动模块# 执行mtest.ko时通过传入参数可反对对不同算法进行功能性测试# 倡议关上两个终端窗口A和B,其中可在A终端输出测试命令,B终端执行命令“sudo dmesg -w”sudo insmod mtest.ko #当在终端A执行该命令之后,可在终端B查到到内核打印信息,其中表明须要传入的参数信息#示例命令,对hash进行功能测试sudo insmod mtest.ko alg=sm3 mode=hash3 SCE内核态API阐明该章节介绍SCE内核态API接口,接口的应用示例可浏览参考kernel/test目录下的测试用例。 3.1哈希算法3.1.1调配哈希算法对象函数原型struct crypto_ahash *crypto_alloc_ahash(const char *alg_name, u32 type, u32 mask)函数性能调配一个新创建的异步哈希算法实例输出阐明alg_name - 算法名type - 算法类型mask - 算法类型屏蔽字输入阐明无返回值阐明新创建的异步哈希算法对象应用阐明 注意事项hash算法能够是同步形式实现或异步形式实现,但算法利用不关注hash算法的实现形式,而是关注hash算法提供的算法接口。为实现对立治理,加密框架默认hash算法的实现形式为异步形式,将哈希算法的内部接口对立定义为异步哈希算法接口3.1.2调配哈希算法数据申请对象函数原型struct ahash_request *ahash_request_alloc(struct crypto_ahash *tfm, gfp_t gfp)函数性能调配申请数据结构输出阐明tfm - 算法实例gfp - API调用传递给kmalloc的内存调配标记输入阐明无返回值阐明胜利时返回调配的申请句柄,如果内存不足则返回NULL应用阐明 注意事项若为同步调用的形式,则不须要调配创立req对象3.1.3设置异步回调函数原型void ahash_request_set_callback(struct ahash_request *req, u32 flags,crypto_completion_t compl, void *data)函数性能用于设置加解密实现后须要调用的回调函数输出阐明req - 申请句柄flags -标记位,指定为0或ORingcompl -注册到申请句柄的回调函数指针data - 指向内核加密API不应用的内存输入阐明无返回值阐明无应用阐明 注意事项 3.1.4设置密钥函数原型int crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int keylen)函数性能设置密钥输出阐明tfm - 算法实例key - 密钥数据keylen - 密钥数据长度输入阐明无返回值阐明胜利时返回调配的申请句柄,如果内存不足则返回NULL应用阐明 注意事项 3.1.5设置数据函数原型void ahash_request_set_crypt(struct ahash_request *req, struct scatterlist *src, u8 *result, unsigned int nbytes)函数性能设置数据内存输出阐明req - 申请句柄src - 源扩散/收集列表result - 由音讯摘要填充的缓冲区nbytes - 从@src解决的字节数输入阐明无返回值阐明无应用阐明 注意事项 3.1.6性能接口函数原型int crypto_ahash_init(struct ahash_request *req)int crypto_ahash_digest(struct ahash_request *req)int crypto_ahash_update(struct ahash_request *req)int crypto_ahash_finup(struct ahash_request *req)int crypto_ahash_final(struct ahash_request *req)函数性能init:初始化音讯摘要digest:计算缓冲区的音讯摘要update:向音讯摘要中增加数据以进行解决finup:更新和实现音讯摘要final:计算音讯摘要输出阐明req - ahash_request句柄输入阐明无返回值阐明胜利计算音讯摘要返回0,非0为 失败应用阐明hash算法最终摘要值生成接口能够有多种调用形式,如crypto_ahash_digest示意在该接口中会实现生成摘要相干的所有流程。当然该操作也可拆分为init、update、final或init、update、finup类型的步骤,步骤拆分当前就能够反对在init之后执行屡次update,以间断为hash操作提供数据,并在数据更新实现后调用final操作获取所有数据的最终hash值注意事项 3.1.7开释req资源函数原型void ahash_request_free(struct ahash_request *req)函数性能开释req资源输出阐明req - ahash_request句柄输入阐明无返回值阐明无应用阐明注意事项3.1.8开释tfm资源函数原型void crypto_free_ahash(struct crypto_ahash *tfm)函数性能开释tfm资源输出阐明tfm -算法实例输入阐明无返回值阐明无应用阐明 注意事项 3.2对称算法3.2.1调配对称算法对象函数原型struct crypto_skcipher *crypto_alloc_skcipher(const char *alg_name, u32 type, u32 mask)函数性能调配一个新创建的对称算法实例输出阐明alg_name - 算法名type - 算法类型mask - 算法类型屏蔽字输入阐明无返回值阐明新创建的算法实例应用阐明 注意事项 3.2.2调配对称算法数据申请对象函数原型struct skcipher_request *skcipher_request_alloc(struct crypto_skcipher *tfm, gfp_t gfp)函数性能调配req输出阐明tfm - 算法实例gfp - API调用传递给kmalloc的内存调配标记输入阐明无返回值阐明胜利时返回调配的申请句柄,如果内存不足则返回NULL应用阐明 注意事项 3.2.3设置异步回调函数原型void skcipher_request_set_callback(struct skcipher_request *req, u32 flags, crypto_completion_t compl, void *data)函数性能用于设置加解密实现后须要调用的回调函数输出阐明req - 申请句柄flags -标记位,指定为0或ORingcompl -注册到申请句柄的回调函数指针data - 指向内核加密API不应用的内存输入阐明无返回值阐明无应用阐明 注意事项 3.2.4设置密钥函数原型int crypto_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key, unsigned int keylen)函数性能设置密钥输出阐明tfm - 算法实例key - 密钥数据keylen - 密钥数据长度输入阐明无返回值阐明胜利时返回调配的申请句柄,如果内存不足则返回NULL应用阐明 注意事项 3.2.5设置数据函数原型void skcipher_request_set_crypt(struct skcipher_request *req, struct scatterlist *src, struct scatterlist *dst, unsigned int cryptlen, void *iv)函数性能设置数据内存输出阐明req - 申请句柄src - 源扩散/收集列表dst - 指标扩散/收集列表cryptlen - 从@src解决的字节数iv - IV数据,必须合乎crypto_skcipher_ivsize定义的IV大小输入阐明无返回值阐明无应用阐明 注意事项 3.2.6加密函数原型int crypto_skcipher_encrypt(struct skcipher_request *req)函数性能加密流程输出阐明req - 申请句柄输入阐明无返回值阐明胜利加密返回0,非0为失败应用阐明 注意事项 3.2.7解密函数原型int crypto_skcipher_decrypt(struct skcipher_request *req)函数性能解密流程输出阐明req - 申请句柄输入阐明无返回值阐明胜利解密返回0,非0为失败应用阐明 注意事项 3.2.8开释req资源函数原型void skcipher_request_free(struct skcipher_request *req)函数性能开释req资源输出阐明req - 申请句柄输入阐明无返回值阐明无应用阐明 注意事项 3.2.9开释tfm资源函数原型void crypto_free_skcipher(struct crypto_skcipher *tfm)函数性能开释tfm资源输出阐明tfm -算法实例输入阐明无返回值阐明无应用阐明 注意事项 3.3真随机数生成器3.3.1调配真随机数生成器对象函数原型struct crypto_rng *crypto_alloc_rng(const char *alg_name, u32 type, u32 mask)函数性能调配一个新创建的TRNG实例输出阐明alg_name - 算法名type - 算法类型mask - 算法类型屏蔽字输入阐明无返回值阐明新创建的算法实例应用阐明 注意事项 3.3.2获取随机数函数原型int crypto_rng_get_bytes(struct crypto_rng *tfm, u8 *rdata, unsigned int dlen)函数性能获取随机数输出阐明tfm - 算法实例rdata - 保留随机数的输入缓冲区dlen - 输入缓冲区的长度输入阐明无返回值阐明0为胜利,非0为失败应用阐明 注意事项 3.3.3开释tfm资源函数原型void crypto_free_rng(struct crypto_rng *tfm)函数性能开释tfm资源输出阐明tfm -算法实例输入阐明无返回值阐明无应用阐明 注意事项 4 算法应用示例4.1哈希算法应用示例4.1.1定义构造定义多个构造体变量,其中:struct crypto_wait:异步操作期待对象 struct ahash_request:异步操作申请对象struct crypto_ahash:哈希算法对象(上下文)struct scatterlist:用来保留加/解密缓冲区的构造 ...