1、linux kernel crypto的软件框图

(软件层级图)
在这里插入图片描述
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 随机数产生

(软件结构图)
在这里插入图片描述
在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的实现
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐