Linux内核 crypto文件夹 密码学知识学习

密码算法分类

  • 对称算法
  • 非对称算法
  • 消息摘要(单向哈希)算法
  • 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作。这些函数可以在内核crypto文件夹下,相应的文件中找到。不过内核模块不能直接调用这些函数,因为它们并没有export。
  • 内核提供一个统一的框架,来管理这些算法。加密算法通过crypto_register_alg()和crypto_unregister_alg()注册。

对称算法

  • 头文件
// 包含对称密码(symmetric key)算法API(该文件内部包含了linux/crypto.h所以无需再次引入linux/crypto.h)
#include <crypto/skcipher.h> 
// 对称密码API需要使用的struct scatterlist结构(用来保存输入/输出缓冲区)
#include <linux/scatterlist.h> 
  • Linux内核scatterlist API介绍 - AlanTu - 博客园    

需要使用的重要数据结构 和  函数

// 用来保存加/解密缓冲区的结构
struct scatterlist sg;
// 加密算法对象(上下文)
struct crypto_skcipher *tfm;
// 异步操作请求对象
struct skcipher_request *req;
// 异步操作等待对象
struct crypto_wait wait;// 该函数用于等待异步加密操作完成,通常需要将crypto_skcipher_decrypt的返回值作为err参数传入
int crypto_wait_req(int err, struct crypto_wait *wait);// 该函数作为异步加密操作的回调函数传入req对象中,在加密完成后被调用
void crypto_req_done(struct crypto_async_request *req, int err);// 该函数根据密码算法名称分配密码算法对象,内核支持的密码算法可以在/proc/crypto文件中查看
struct crypto_skcipher *crypto_alloc_skcipher(const char *alg_name,u32 type, u32 mask);struct skcipher_request *skcipher_request_alloc(struct crypto_skcipher *tfm, gfp_t gfp);// init function
// 初始化scatterlist时需要使用kmalloc分配的内存,如果使用vmalloc分配的内存会导致内存页分配错误,目前还不知道具体原因
void sg_init_one(struct scatterlist *sg,const void *buf, unsigned int buflen);// 设置异步调用的回调函数,这里data是一个自定数据结构,其会被传给回调函数。
void skcipher_request_set_callback(struct skcipher_request *req,u32 flags,crypto_completion_t compl,void *data);// 内核的对称加密API可以“原地”加密,即加解密共用相同的缓冲区,因此这里的src和dst可以设置为同一个
void skcipher_request_set_crypt(struct skcipher_request *req,struct scatterlist *src, struct scatterlist *dst,unsigned int cryptlen, void *iv);// 设置密钥和密钥长度,密码长度单位为字节
int crypto_skcipher_setkey(struct crypto_skcipher *tfm,const u8 *key, unsigned int keylen);// 解密,将返回值传入crypto_wait_req函数来等待可能的异步操作完成
int crypto_skcipher_decrypt(struct skcipher_request *req);
// 加密
int crypto_skcipher_encrypt(struct skcipher_request *req)// 释放资源
void crypto_free_skcipher(struct crypto_skcipher *tfm);
void skcipher_request_free(struct skcipher_request *req);

scatterlist.h

  • scatterlist.h - include/linux/scatterlist.h - Linux source code (v5.15.11) - Bootlin
  • scatterlist类型数据可以认为是这些密码算法操纵的数据对象。

crypto_skcipher

  • Linux Kernel Crypto API — The Linux Kernel 4.7 documentation
  • crypto_tfm类型指针tfm可以理解为指代了一个算法对象

操作流程

  • 内核加密编程接口 - 老僧非是爱花红 - 博客园

 PPT中对内核加密算法的使用总结得很详细。总的来说,在内核态使用加密算法的过程分为以下几步:

  • 分配tranform对象   也就是具体的算法
  • 分配request对象  异步操作等待对象
  • 设置上下文 如加密密钥/验签公钥,填充数据源,给scatterlist设置缓冲区,给异步请求对象设置回调函数/初始化向量等,给密码算法对象设置密钥
  • 完成加密/解密/摘要/验签
  • 释放transform,request等对象

 例子  SM3

  • struct crypto_ahash * atfm = crypto_alloc_ahash("sm3-generic",0,0);
  • struct ahash_request *req = ahash_request_alloc(atfm,GFP_KERNEL);
  • struct crypto_wait wait;crypto_init_wait(&wait);
  • ahash_request_set_callback(req,CRYPTO_TFM_REQ_MAY_BACKLOG,crypto_req_done,&wait);
  • struct scatterlist sg;sg_init_one(&sg,data,size);
  • ahash_request_set_crypt(req,&sg,result,size);
  • ret=crypto_ahash_digest(req);
  • ahash_request_free(req);     
  • crypto_free_ahash(atfm);

相关数据结构关联

  • 上图粗略描述了静态算法构造transform、构造request的过程:分配空间/初始化函数指针/建立tfm、req和alg之间的关联。
  • 建立关联的过程被各种看似复杂的对象之间的包含/被包含的关系掩盖了简单的实质,之所以实现得这么复杂,是为了未来能灵活地对加密模块进行扩展,阅读这部分代码时我们不要被这种复杂的假象所吓倒。
  • 最终干活的为transform,transform中保存的相关函数指针是在构造transform时从对应的alg实例中拷贝过来的,对应上图中棕色的一部分。

 例子

int linux_kernel_crypto_decrypt(void* data_in_out, int data_len, void* key, int key_len, void* iv, int iv_len) {struct crypto_skcipher* cipher;struct skcipher_request* req;struct crypto_wait wait;struct scatterlist sg;size_t block_size;int ret;// 分配算法对象,支持的算法可以在/proc/crypto文件中查看cipher = crypto_alloc_skcipher("cbc(aes)", 0, 0);if (IS_ERR(cipher)) {printk("fail to allocate cipher\n");return -1;}// skcipher api不支持填充,所以加/解密数据需要为加密块的整数倍block_size = crypto_skcipher_blocksize(cipher);if (data_len % block_size != 0) {printk("data len not aligned");return -1;}// 分配req对象req = skcipher_request_alloc(cipher, GFP_KERNEL);if (IS_ERR(req)) {printk("fail to allocate req\n");return -1;}sg_init_one(&sg, data_in_out, data_len);skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, crypto_req_done, &wait);skcipher_request_set_crypt(req, &sg, &sg, data_len, iv);ret = crypto_skcipher_setkey(cipher, key, key_len);if ( 0 != ret) {printk("fail to set key, error %d\n", ret);return -1;}// 执行解密操作ret = crypto_wait_req(crypto_skcipher_decrypt(req), &wait); if (0 != ret) {printk("decryption error %d\n", ret);return -1;}// 释放资源crypto_free_skcipher(cipher);skcipher_request_free(req);printk("decryption finished");return 0;
}

相关学习

struct shash_desc {struct crypto_shash *tfm;u32 flags;void *__ctx[] CRYPTO_MINALIGN_ATTR;
};
  • tfm: 加密handler
  • ctx: 空数组的首地址,相当于汇编里的一个标号,指向结构体的后一个字节。
    这个结构体可能会跟一段buffer一起被申请,而ctx就相当于这段buffer的首地址,所以为了防止访问buffer时出现对齐错误,需要给ctx加上属性CRYPTO_MINALIGN_ATTR
  • CRYPTO_MINALIGN_ATTR的含义是通过可能的字节填充,使得ctx是以最大的对齐标准对齐的,防止出现对齐错误。例如在我的机器上,CRYPTO_MINALIGN_ATTR的含义是强制以64位对齐。
static struct sdesc *init_sdesc(struct crypto_shash *alg)
{struct sdesc *sdesc;int size;size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);sdesc = kmalloc(size, GFP_KERNEL);if (!sdesc)return ERR_PTR(-ENOMEM);sdesc->shash.tfm = alg;return sdesc;
}
  • crypto_shash_descsize(alg): 得到这个加密算法需要的buffer大小。
  • struct shash_desc的大小加上buffer大小就是总共需要申请的内存大小size。
  • kmalloc: 申请小于一页的内存。其中GFP_KERNEL表示申请正常的内核RAM,可以睡眠。
  • kmalloc
  • ERR_PTR: 把错误码变成指针。解读PTR_ERR,ERR_PTR,IS_ERR_窗外云天的专栏-CSDN博客

适用场景

  • Kernel Crypto框架_内核工匠-CSDN博客_内核crypto
  • Kernel crypto主要用于kernel层的安全特性实现,但在user-space也可以通过系统调用的方式来使用它;因为在Linux-2.6.38中已经通过socket (addr family: AF_ALG)方式导出接口到user-space.
  • 在开发时如要快速确认kernel中是否支持某种算法,可以cat /proc/crypto 查看

  •  name代表算法名称,hmac是对应的模式(抽象成template)
  • priority代表算法的优先级(在相同名称下,数字越大代表优先级越高,默认使用高优先级的算法);selftest代表开机算法自检结果;type指算法类型;async指异步方式调用;blocksize指最小单个数据处理块大小;min keysize和max keysize指算法的最小/最大密钥长度;ivsize指算法的IV初始向量长度。
  • *selftest之后的所有字段其实都是crypto_type->show()所提供的,后面会提及

crypto整体框架

  •  crypto core是最基本骨架 ,它提供crypto的核心组件(包括crypto_alg,crypto_template的管理,cryptd内核线程等);基于crypto core,内核实现了8类常用的算法,DRBG伪随机数算法,Hash算法,SKCIPHER对称加解密算法,AKCIPHER非对称加解密算法,AEAD认证加密算法,HMAC算法,COMPRESS压缩算法,KPP密钥协商算法。
  • 一些用于secure的硬件模块(如hw_rng硬件随机数产生器,qce硬加密模块)的驱动程序,会通过crypto core提供的算法注册接口(crypto_register_alg)将其注册到crypto子系统中,并且在注册时会对算法做静态正确性自检,并在/proc/crypto中的selftest中呈现到userspace。除了注册到crypto子系统以外,驱动也可以通过VFS以设置节点形式提供给用户空间使用(如/dev/qce,/dev/hw_rng)。
  • Crypto core通过socket方式,将kernel层的算法能力提供给用户空间。
  • Kernel crypto中基本所有操作都是围绕着几个核心数据结构展开:struct crypto_alg,struct crypto_template,struct crypto_instance,struct crypto_tfm,struct crypto_type。其他算法都可以基于它们做扩展。例如struct skcipher_alg,struct shash_alg都是继承自struct crypto_alg

 结构体介绍

  • algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin

struct crypto_template

  • 算法模板,一般在module_init时通过调用crypto_register_template接口注册到crypto_template_list链表中。
  • 在算法加密中,分块加密模式分为很多种,以对称加解密为例,有CBC,ECB,GCM,CTR,XTS,而这些加密模式适用于所有的对称加密算法,如AES,DES;因此kernel就将加密模式抽象成模板,在开发新的算法时只需要实现单个block的数据处理(加密,hmac等);在申请使用算法时,我们通过算法名来组合出相应的算法(kernel会将组合出来的算法动态注册到crypto子系统),格式为template(single block cipher),例如cbc(aes),ecb(des)。
    • list用于模块的crypto_template_list链表管理;
    • instance用于管理当前模板下所有的crypto_instance;
    • alloc接口用于申请算法实例;
    • free用于释放算法实例;

struct crypto_alg 

 

  •  crypto.h - include/linux/crypto.h - Linux source code (v5.15.11) - Bootlin
  • crypto_alg是个基类,任何算法都可以基于它派生出衍生类;每个算法都对应着一个struct crypto_alg实例,一般在module_init中调用crypto_register_alg接口将具体的crypto_alg对象添加到crypto_alg_list链表中。
  • 这里有一个很重要的数据成员cra_u,因为它体现了kernel crypto架构设计者的设计思想:它将四种比较常用的算法类型的处理方式抽象到基类当中,即如果你要添加的算法为这4类,就只需要实现这4类算法所对应的方法,如果不是这4类当中,就需要在基类上做派生,实现特定的crypto_type。
    • cra_list:是用作链表管理
    • cra_users:此算法被引用的所有crypto_spawn实例链表。
    • cra_blocksize:是单个处理数据块大小
    • cra_ctxsize:为transformation context大小
    • cra_alignmask:指待处理数据buffer的对齐要求
    • cra_priority:是当前算法优先级
    • cra_refcnt:为当前算法的引用计数
    • cra_name和cra_driver_name:分别指代算法名及驱动名
    • cra_type:指算法类型;cra_u将四大类算法类型进行了统一。
    • cra_init:是用于每次数据操作上下文前的初始化,比如在硬件加密中,会实现此接口对相关寄存器做初始化;cra_exit则与前者相反。
    • cra_destroy:是用于crypto在kernel中注销的相关操作。

struct crypto_instance

  •  algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
  • 这个结构体是代表kernel通过template动态创建的算法实例,并且会与crypto_template相关联,可以看到这里的alg并不是个指针。它是通过template->alloc()创建的,创建的同时,会将算法name初始化。
  • __ctx:当前只指向crypto_spawn,我个人理解可能是架构设计者考虑到未来扩展性,就将crypto_spawn与crypto_instance拆分开来了。

struct crypto_spawn

通过模板动态生成的算法实例的一部分。

  • list:添加到crypto_alg->cra_users链表中。
  • frontend:见下文。

struct crypto_type

  • crypto_type就是用于重载crypto_alg中的cra_u中的各个类中的成员函数,当通过crypto_alloc_base,crypto_create_tfm等接口申请相应的crypto的TFM上下文时,若有传入crypto_type参数,TFM优先使用crypto_type中的init_tfm成员函数去初始化crypto_tfm衍生类的操作方法。
    • ctxsize:获取当前算法类型TFM上下文大小(crypto_tfm+crypto_tfm.__crt_ctx)
    • extsize:获取当前算法类型TFM上下文大小(即crypto_tfm衍生类的大小)。
    • init:一般为空(功能与init_tfm类似,通常在后者中初始化TFM)。
    • init_tfm:顾名思义,初始化TFM。
    • show:呈现当前算法类型的基本信息,/proc/crypto后半段信息就是从这获取的。
    • free:释放crypto_instance。

struct crypto_tfm

  • 具体算法处理(transformation)上下文的实例,里面会将此次算法上下文的key,IV等信息设置到__crt_ctx中。
  • crt_u:算法的operation,kernel会在__crypto_alloc_tfm接口中关联到crypto_type或xxx_alg中的实现方法。

例子讲解

  • 通过用例介绍crypto子系统逻辑
  • 在文件系统加密(FBE)中通过kernel crypto做密钥派生。
  • 背景:在Android 7.0时,引入了文件加密功能,所谓文件加密,即每个文件都用不同的key对文件进行加密。
  • 原理:密钥派生中,使用了crypto中的ecb(aes)算法通过类密钥及inode.nonce派生出每个文件的密钥。
  • 具体实现在kernel/fs/crypto/keyinfo.c
  • crypto.c - fs/crypto/crypto.c - Linux source code (v5.15.11) - Bootlin

  • 1)申请“ecb(aes)”算法的tfm上下文。这里会涉及到“算法动态注册”,即如果在crypto_alg_list链表中没有找到name为”ecb(aes)”的crypto_alg对象,那crypto子系统会通过一个名为”cryptomgr_probe”的内核线程查找到name为“ecb”的crypto_template对象,以及查找到name为”aes”的crypto_alg对象,动态创建出一个name为“ecb(aes)”的crypto_alg并注册到链表当中。

  • 在获取到了crypto_alg后,就会申请crypto_tfm,并用crypto_alg->cra_init()或crypto_type->init_tfm()对其进行初始化(主要是当前算法的各个函数指针)。
  • 2) 在tfm上下文中申请一个数据处理请求(req)。一个tfm中,可以做多次数据加解密。这里只是申请内存,并关联到tfm的操作。
  • 3) 设置密钥到tfm->__crt_ctx中。
  • 4) 把待加密数据信息放入req当中。
  • 5)以异步方式调用crypto_skcipher_encrypt对req做加密处理,线程在此会block一段时间,直到req请求被处理完成。因此不能在中断上下文中使用。

 算法自检

  • 出于安全性考虑,FIPS等相关标准要求在系统开机时必须做算法正确性自检,如果自检失败,则停止系统的启动;因此算法自检这部分自然也在框架中实现了。(源码位于:kernel/crypto/testmgr.c)
  • Kernel中的算法自检为静态自检,即给定输入参数,及正确结果,如果算法计算出来的结果与正确结果不匹配,则自检失败。
  • 算法自检的时间点固定为每个crypto_alg注册的时候,具体流程如下图2.4所示:

Linux加密框架设计和实现

  • Linux加密框架设计与实现(第一部份) - 内核源码-Chinaunix 

内核 crypto介绍

  • Linux kernel crypto的介绍_代码改变世界-CSDN博客_crypto linux 

在这里插入图片描述

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函数

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

  • 以skcipher为例, 在userspace调用send()和recive()函数,对应的底层调用recvmsg和sendmsg函数。先看skcipher_recvmsg()函数,接受数据然后再调用encrypt/decrypt处理数据
  • 而skcipher_sendmsg()函数就是将处理后的数据,在发送到sock端.

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);
}

算法的底层实现(以为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的实现

参考链接

  • Linux source code (v5.15.11) - Bootlin         Linux内核 在线源代码 查询函数定义和使用
  • Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)_万能的终端和网络-程序员宅基地 - 程序员宅基地
  • 没有调用crypto_skcipher_encrypt回调 | 码农俱乐部 - Golang中国 - Go语言中文社区
  • Linux内核加密接口分析_一些笔记杂谈-CSDN博客_linux内核加密接口
  • Linux内核中使用crypto进行sha1方法_Rain的博客-CSDN博客
  • Linux内核模块开发_j5856004的博客-CSDN博客
  • Linux驱动开发1-内核入门之hello模块_zusi_csdn-CSDN博客_linux内核驱动开发
  • linux crypto_u014044624的博客-CSDN博客
  • Linux内核crypto子系统学习笔记_scarecrow_byr的专栏-CSDN博客_crypto驱动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux crypto相关知识的汇总 Linux加密框架crypto中的算法和算法模式(一)

Linux加密框架中的算法和算法模式 Linux加密框架中的算法和算法模式&#xff08;一&#xff09;_家有一希的博客-CSDN博客 加密框架支持的密码算法主要是对称密码算法和哈希算法&#xff0c;暂时不支持非对称密码算法。除密码算法外&#xff0c;加密框架还包括伪随机数生成算法…

Linux crypto相关知识的汇总 Linux加密框架crypto对称算法和哈希算法加密模式

参考链接 Linux加密框架中的算法和算法模式&#xff08;二&#xff09;_家有一希的博客-CSDN博客 对称算法 分组算法模式 ECB模式 ECB模式下&#xff0c;明文数据被分为大小合适的分组&#xff0c;然后对每个分组独立进行加密或解密如下图所示如果两个明文块相同&#xff0c…

Linux加密框架中的算法和算法模式

参考链接 Linux加密框架中的算法和算法模式&#xff08;三&#xff09;_家有一希的博客-CSDN博客 对称算法 14 如上所示&#xff0c;在arc4.c中定义了两个与RC4算法相关的算法实现&#xff0c;分别为arc4和ecb(arc4)&#xff0c;其中arc4是RC算法的算法实现&#xff0c;而ecb…

Linux加密框架crypto AES代码相关

例子 aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.11) - Bootlin static struct crypto_alg aes_alg {.cra_name "aes",.cra_driver_name "aes-generic",.cra_priority 100,.cra_flags CRYPTO_ALG_TYPE_CIPHER,.cra_blocks…

Linux加密框架 crypto RC4

参考链接 arc4.h Linux加密框架中的主要数据结构&#xff08;一&#xff09;_家有一希的博客-CSDN博客 头文件 arc4.h - include/crypto/arc4.h - Linux source code (v5.15.11) - Bootlin实现代码 arc4.c arc4.c - crypto/arc4.c - Linux source code (v5.15.11) - Bootlin…

Linux加密框架 crypto 哈希算法说明 同步哈希shash_alg | 异步哈希 ahash_alg | 通用部分抽象 hash_alg_common

参考链接 Linux加密框架中的主要数据结构&#xff08;二&#xff09;_家有一希的博客-CSDN博客 定义 通用算法说明数据结构crypto_alg的联合体成员变量cra_u中包含多种算法的个性化属性&#xff0c;如分组算法、块加密算法、压缩算法、伪随机数算法等&#xff0c;但不包含哈希…

Linux加密框架 crypto 哈希算法举例 MD5

参考链接 Linux加密框架 crypto 哈希算法说明 同步哈希shash_alg | 异步哈希 ahash_alg | 通用部分抽象 hash_alg_common_CHYabc123456hh的博客-CSDN博客Linux加密框架中的主要数据结构&#xff08;二&#xff09;_家有一希的博客-CSDN博客 MD5 md5.h - include/crypto/md5.h …

事务没提交的数据查的出来吗?_“金三银四”面试官:说说事务的ACID,什么是脏读、幻读?...

一、事务事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。--摘自百科在MySQL里&#xff0c;事务是在引擎层面实现&#xff0c;比如MyIsam不支持&#xff0c;InnoDB支持面试清单&#xff08;Java岗&#xff09;&#xff1a;JavaJVM数…

Linux加密框架 crypto 算法模板

参考链接 Linux加密框架中的主要数据结构&#xff08;三&#xff09;_家有一希的博客-CSDN博客algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin 定义 struct crypto_template {struct list_head list;struct hlist_head instances;struct modu…

Linux加密框架 crypto 算法模板 CBC模板举例

参考链接 Linux加密框架中的主要数据结构&#xff08;三&#xff09;_家有一希的博客-CSDN博客https://blog.csdn.net/CHYabc123456hh/article/details/122194754 CBC算法模板 cbc.c - crypto/cbc.c - Linux source code (v5.15.11) - BootlinCBC算法模板属性 1)CBC算法模板名…

leetcode数组汇总_LeetCode刷题实战43:字符串相乘

算法的重要性&#xff0c;我就不多说了吧&#xff0c;想去大厂&#xff0c;就必须要经过基础知识和业务逻辑面试算法面试。所以&#xff0c;为了提高大家的算法能力&#xff0c;这个公众号后续每天带大家做一道算法题&#xff0c;题目就从LeetCode上面选 &#xff01;今天和大家…

Linux加密框架 crypto 算法模板 HMAC模板举例

参考链接 Linux加密框架中的主要数据结构&#xff08;三&#xff09;_家有一希的博客-CSDN博客Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客 HMAC算法模板 hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlinhmac.c - crypto/hmac.c - Linux…

判断非负整数是否是3的倍数_五年级数学因数与倍数知识点汇总与解题方法技巧...

在日常教学过程中&#xff0c;我发现孩子们和某些家长对学习数学的方法有一些误区&#xff0c;就是觉着数学&#xff0c;单纯就是逻辑思维&#xff0c;只要多做练习题就能学好&#xff0c;但是不是这样的&#xff0c;低年级的学生&#xff0c;学习数学还是以背诵为主&#xff0…

tcp通讯一次最多能发送多少数据?_关于TCP/IP,必须知道的十个知识点

本文整理了一些TCP/IP协议簇中需要必知必会的十大问题&#xff0c;既是面试高频问题&#xff0c;又是程序员必备基础素养。一、TCP/IP模型TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;&#xff0c;包含了一系列构成互联网基础的网络…

Linux内核crypto子系统的调用逻辑

testmgr.c - crypto/testmgr.c - Linux source code (v5.15.11) - Bootlin上述代码是内核内部即crypto子系统对外提供密码服务的测试程序调用流程&#xff1a;crypto API <—> crypto core <—> crypto_register_alg处于用户态的程序想要调用处于内核态的密码算法&…

Linux加密框架 crypto算法模板 以及CBC算法模板实例

参考链接 Linux加密框架中的主要数据结构&#xff08;四&#xff09;_家有一希的博客-CSDN博客algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin struct crypto_instance {struct crypto_alg alg;struct crypto_template *tmpl;union {/* Node i…

tomcat temp 大量 upload 文件_渗透测试之文件上传漏洞总结

文末下载上传环境源码客户端js检查一般都是在网页上写一段javascript脚本&#xff0c;校验上传文件的后缀名&#xff0c;有白名单形式也有黑名单形式。查看源代码可以看到有如下代码对上传文件类型进行了限制&#xff1a;我们可以看到对上传文件类型进行了限制。绕过方法1.我们…

Linux加密框架 crypto算法模板 以及HMAC算法模板实例

HMAC算法模板实例 HMAC算法模板的创建实例的接口是hmac_create函数hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin hmac_create输入的参数包括 算法模板 tmpl 和 算法模板实例参数 tbhmac_cretae函数返回的结果为0表示算法模板实例已经创建注册算法模…

linux加密框架 crypto 算法crypto_register_alg的注册流程

算法注册流程 静态算法模块初始化 分组算法模块初始化 AES算法模块&#xff08;aes_generic.c&#xff09;的初始化接口aes_init实现向加密框架注册AES算法的功能&#xff0c;如下所示。aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.12) - Bootlin sta…

linux加密框架 crypto 静态哈希算法crypto_register_shash注册流程

参考链接 Linux加密框架的算法管理&#xff08;一&#xff09;_家有一希的博客-CSDN博客_linux加密框架设计与实现shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin 函数介绍 crypto_register_shash函数实现向加密框架注册静态哈希算法的功能&#xff0c;…