2

我需要一次(解密)一些数据。可能必须在开始和结束时将额外的填充字节添加到目标数据字节。内置的加密 API 适用于struct scatterlist对象,正如您在分组密码的 encrypt 方法的定义中看到的那样:

int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
           struct scatterlist *src, unsigned int nbytes);

现在我为加密操作遵循的程序:

  1. 获取数据缓冲区buf (长度L )
  2. 计算左填充和右填充字节(rpadlpad
  3. 加密整个事情(lpadbufrpad
  4. 去掉结果中的填充字节

最简单和低效的解决方案是分配L + rpad + lpad字节并在这个新区域中适当地复制缓冲区的内容。但由于 API 使用了这些scatterlist对象,我想知道是否有办法避免这种纯粹的资源浪费。

我在 LWN 上阅读了几篇关于scatterlist链接的文章,但快速浏览头文件让我担心:看起来我必须手动设置整个事情,这是一个非常糟糕的做法......

关于如何scatterlist正确使用 API 的任何线索?理想情况下,我想做以下事情:

  1. 为输入和输出的填充字节分配缓冲区
  2. 分配一个仅存储“有用”加密字节的“有效负载”缓冲区
  3. 创建scatterlist包含填充缓冲区和目标缓冲区的对象
  4. 加密整体并将结果存储在输出填充缓冲区+输出“有效负载”缓冲区中
  5. 丢弃输入和输出填充缓冲区
  6. 将加密的“有效负载”缓冲区返回给用户
4

3 回答 3

2

首先,对不起我的英语,我不是以英语为母语的人。我想你正在内核“blkcipher_walk_virt”中寻找这个api,你可以在ecb.c“crypto_ecb_crypt”中找到它的用法。你也可以看到 padlock_aes.c

于 2013-02-22T09:58:22.970 回答
2

在通过代码调查后,我找到了一个合适的解决方案。尽管存在一些细微的差异,但它很好地遵循了我在问题中列出的程序。

根据JohnsonD ​​iao 的建议,我深入研究了scatterwalk.c文件以了解 Crypto API 如何使用这些scatterlist对象。

出现的问题是两个后续scatterlist. 假设我有两个链式scatterlist. 第一个保存有关 12 字节缓冲区的信息,第二个保存有关 20 字节缓冲区的信息。我想使用 AES128-CTR 将两个缓冲区作为一个整体进行加密。在这种特殊情况下,API 将:

  1. 加密第一个引用的缓冲区的 12 个字节scatterlist
  2. 增加计数器
  3. 加密第二个 scatterlist 的前 16 个字节
  4. 增加计数器
  5. 加密最后剩余的 4 个字节

我期望的行为是:

  1. 加密第一个缓冲区的 12 个字节 + 第二个缓冲区的 4 个第一个字节
  2. 增加计数器
  3. 加密第二个缓冲区的最后 16 个字节

因此,为了强制执行这一点,必须在模式中分配一个 16 字节对齐的填充缓冲区:

n填充请求的加密所需的填充字节数。然后我们有:缓冲区长度

其中l buf是填充缓冲区的总长度。现在,最后的l buf - n填充字节必须用第一个输入数据字节填充。如果输入太短而无法确保完整副本,那没关系。

因此,我们在填充缓冲区的偏移量n pad处复制第一个l cpy = min(l buf - n pad , l data )字节

简而言之,这是程序:

  1. 分配长度为l buf的适当填充缓冲区
  2. 在填充缓冲区中的偏移量n pad处复制有效负载缓冲区的前l cpy字节
  3. 在 a 中引用填充缓冲区scatterlist
  4. 引用另一个中的有效负载缓冲区scatterlist(使用l cpy移位)
  5. 求密码
  6. 提取填充缓冲区中存在的有效负载字节
  7. 丢弃填充缓冲区

我对此进行了测试,它似乎工作得很好。

于 2013-02-22T13:06:24.720 回答
1

我也在学习这部分。这是我的分析:

如果您的加密设备一次需要加密 16 字节,则应将对齐设置为 (16-1)。就像 padlock_aes.c 一样,参见 ecb_aes_alg.cra_alignmask。内核将在 blkcipher_next_copy 和 blkcipher_next_slow 中处理这个问题。但我很困惑,在 aes_generic.c 中 alignmask 为 3,内核如何在没有 blkcipher_next_copy 的情况下处理这个问题?

于 2013-02-23T02:56:52.270 回答