1

解决了我的 Linux 加密示例,并且我可以正确调用 aead 密码,我遇到了一个有趣的问题。

我将我的散点列表定义为:

struct scatterlist sg[2];
sg_init_table(sg, 2 );
sg_set_buf(&sg[0], address, 512);
sg_set_buf(&sg[1], mac, 16);
aead_request_set_crypt(req, sg, sg, 512, iv);
crypto_aead_encrypt(req);

这很好用。但是,如果将缓冲区大小从 512 增加到 131072,那么它将“经常”恐慌。

 BUG: unable to handle kernel paging request at ffffeb04000cea80
 IP: [<ffffffff812f4880>] scatterwalk_done+0x50/0x60

现在,由于所有密码最终都调用了 scatterwalk_ 函数,我认为将 sg->length 设置为较大的值是一个问题。大概太大了,有时会翻到下一页。

在这里做什么是正确的?我是否必须将它分成许多分散列表,确保每个列表都不会转到下一页?这听起来很麻烦,或者有没有为我做这件事的功能?还是我只需要确保每个页面都是“可用的”?

4

1 回答 1

0

好的,实际上有两件事困扰着我。第一个是有时交给我的内存实际上是来自 vmalloc() 分配的内存。这意味着我应该改用 sg_set_page( , vmalloc_to_page() )。

第二个问题是scatterwalk函数不正确,很容易测试,如果您设置任何也生成mac的密码,作为第二个缓冲区;

cipherout = kmalloc( size, ...
macout = kmalloc( maclen, ...

这通常会起作用,因为新分配的内存位于页面边界上。但是,将其更改为;

 macout = kmalloc( maclen + 16, ...
 macout += 16;

我所做的只是分配一个更大的缓冲区,然后在内存中启动 16 个字节。(+1024 或 +3480,无关紧要)这将使 scatterwalk 恐慌。linux-crypto 邮件列表上有一个建议的补丁,这对未来很有用,但现在对我没有帮助。我需要确保mac地址对齐,如果没有,分配临时缓冲区(至少很小)。

于 2012-11-17T06:47:13.527 回答