我需要一次(解密)一些数据。可能必须在开始和结束时将额外的填充字节添加到目标数据字节。内置的加密 API 适用于struct scatterlist
对象,正如您在分组密码的 encrypt 方法的定义中看到的那样:
int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst,
struct scatterlist *src, unsigned int nbytes);
现在我为加密操作遵循的程序:
- 获取数据缓冲区buf (长度L )
- 计算左填充和右填充字节(rpad和lpad)
- 加密整个事情(lpad和buf和rpad)
- 去掉结果中的填充字节
最简单和低效的解决方案是分配L + rpad + lpad字节并在这个新区域中适当地复制缓冲区的内容。但由于 API 使用了这些scatterlist
对象,我想知道是否有办法避免这种纯粹的资源浪费。
我在 LWN 上阅读了几篇关于scatterlist
链接的文章,但快速浏览头文件让我担心:看起来我必须手动设置整个事情,这是一个非常糟糕的做法......
关于如何scatterlist
正确使用 API 的任何线索?理想情况下,我想做以下事情:
- 为输入和输出的填充字节分配缓冲区
- 分配一个仅存储“有用”加密字节的“有效负载”缓冲区
- 创建
scatterlist
包含填充缓冲区和目标缓冲区的对象 - 加密整体并将结果存储在输出填充缓冲区+输出“有效负载”缓冲区中
- 丢弃输入和输出填充缓冲区
- 将加密的“有效负载”缓冲区返回给用户