baron · 1 天前

Linux kernel crypto的介绍

目录

1、linux kernel crypto的软件框图
2、sendmsg/recvmsg如何调用到底层encrypt/decrypt
3、算法的底层实现(以为aes/hash为例)

1、linux kernel crypto的软件框图

(软件层级图)

image

af_alg是linux kernel crypto算法接口

实现了底层算法的调用(skcipher、aead、hash、rng),并且:

将这些接口export出去,给linux kernel其它模块使用(如tcrypt.c使用);
将这些接口注册sock_register, 用户程序通过sock通信来调用这些底层接口
在linux kernel中,仅支下四种crypto算法:

algif_skcipher 对称加解密算法
algif_aead 也算一种对称的加解密算法,具体介绍参见什么是AEAD加密
algif_hash 数字摘要算法
algif_rng 随机数产生
(软件结构图)

image

在Linux kernel的module_init阶段会将algif_type_skcipher、algif_type_aead、algif_type_hash、algif_type_rng 四种算法注册.

也就是添加到af_alg维护的alg_types链表种. alg_types链表种仅有这四个数据.

在userspace通过netlink调用了,kernel种的af_alg模块收到消息后, 根据上层传来的算法种类名字来选择走哪一个结构体(alg_type_xxx)的ops函数

2、sendmsg/recvmsg如何调用到底层encrypt/decrypt

以skcipher为例, 在userspace调用send()和recive()函数,对应的底层调用recvmsg和sendmsg函数

先看skcipher_recvmsg()函数,接受数据然后再调用encrypt/decrypt处理数据

static int skcipher_recvmsg(struct socket sock, struct msghdr msg,

          size_t ignored, int flags)

{

return (msg->msg_iocb && !is_sync_kiocb(msg->msg_iocb)) ?
    skcipher_recvmsg_async(sock, msg, flags) :
    skcipher_recvmsg_sync(sock, msg, flags);

}

而skcipher_sendmsg()函数就是将处理后的数据,在发送到sock端.

3、算法的底层实现(以为aes/hash为例)

在linux crypto底层,实现aes/hash的算法有四种方式

(1)、cpu的纯软实现,使用cpu的ALU,x0-x30等寄存器,加加减减的计算。(本文不讨论此项)
(2)、ARM-CE,就是The Armv8 Cryptographic Extension了,调用arm-ce的指令和寄存器,进行加加减减计算
(3)、ARM-NEON : 调用arm neon指令(128bit的寄存器v0-v31),进行加加减减计算
(4)、SOC crypto engine的实现
添加威♥:sami01_2023,回复ARM中文,领取ARM中文手册

推荐阅读
关注数
9491
文章数
256
vx: coding_the_world
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息