Linux kernel crypto的介绍
目錄
- 1、linux kernel crypto的軟件框圖
- 2、sendmsg/recvmsg如何調(diào)用到底層encrypt/decrypt
- 3、算法的底層實(shí)現(xiàn)(以為aes/hash為例)
1、linux kernel crypto的軟件框圖
(軟件層級(jí)圖)
af_alg是linux kernel crypto算法接口
實(shí)現(xiàn)了底層算法的調(diào)用(skcipher、aead、hash、rng),并且:
- 將這些接口export出去,給linux kernel其它模塊使用(如tcrypt.c使用);
- 將這些接口注冊(cè)sock_register, 用戶(hù)程序通過(guò)sock通信來(lái)調(diào)用這些底層接口
在linux kernel中,僅支下四種crypto算法:
- algif_skcipher 對(duì)稱(chēng)加解密算法
- algif_aead 也算一種對(duì)稱(chēng)的加解密算法,具體介紹參見(jiàn)什么是AEAD加密
- algif_hash 數(shù)字摘要算法
- algif_rng 隨機(jī)數(shù)產(chǎn)生
(軟件結(jié)構(gòu)圖)
在Linux kernel的module_init階段會(huì)將algif_type_skcipher、algif_type_aead、algif_type_hash、algif_type_rng 四種算法注冊(cè).
也就是添加到af_alg維護(hù)的alg_types鏈表種. alg_types鏈表種僅有這四個(gè)數(shù)據(jù).
在userspace通過(guò)netlink調(diào)用了,kernel種的af_alg模塊收到消息后, 根據(jù)上層傳來(lái)的算法種類(lèi)名字來(lái)選擇走哪一個(gè)結(jié)構(gòu)體(alg_type_xxx)的ops函數(shù)
2、sendmsg/recvmsg如何調(diào)用到底層encrypt/decrypt
以skcipher為例, 在userspace調(diào)用send()和recive()函數(shù),對(duì)應(yīng)的底層調(diào)用recvmsg和sendmsg函數(shù)
先看skcipher_recvmsg()函數(shù),接受數(shù)據(jù)然后再調(diào)用encrypt/decrypt處理數(shù)據(jù)
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()函數(shù)就是將處理后的數(shù)據(jù),在發(fā)送到sock端.
3、算法的底層實(shí)現(xiàn)(以為aes/hash為例)
在linux crypto底層,實(shí)現(xiàn)aes/hash的算法有四種方式
- (1)、cpu的純軟實(shí)現(xiàn),使用cpu的ALU,x0-x30等寄存器,加加減減的計(jì)算。(本文不討論此項(xiàng))
- (2)、ARM-CE,就是The Armv8 Cryptographic Extension了,調(diào)用arm-ce的指令和寄存器,進(jìn)行加加減減計(jì)算
- (3)、ARM-NEON : 調(diào)用arm neon指令(128bit的寄存器v0-v31),進(jìn)行加加減減計(jì)算
- (4)、SOC crypto engine的實(shí)現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的Linux kernel crypto的介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MTK方案下tee.img的打包方式的详
- 下一篇: [思考]-ARM LR寄存器的思考