散射列表密码API¶
简介¶
散射列表密码API 将页向量(散射列表)作为参数,并直接在页上操作。在某些情况下(例如 ECB 模式的密码算法),这将允许页在原地加密,无需复制。
这种设计的最初目标之一是方便地支持 IPsec,以便处理可以应用于分页的 skb,而无需线性化。
详情¶
最底层是算法,它们动态地向 API 注册。
“变换”是用户实例化的对象,它们维护状态,处理所有的实现逻辑(例如操作页向量),并为底层算法提供抽象。然而,在用户层面,它们非常简单。
从概念上讲,API 的分层结构如下所示
[transform api] (user interface)
[transform ops] (per-type logic glue e.g. cipher.c, compress.c)
[algorithm api] (for registering algorithms)
这种想法是为了使用户接口和算法注册API非常简单,同时对两者隐藏核心逻辑。许多来自现有API(如 Cryptoapi 和 Nettle)的优秀思想已被采纳用于此。
该 API 目前支持五种主要的变换类型:AEAD (带有关联数据的认证加密)、块密码、密码、压缩器和哈希。
请注意,“块密码”多少有些用词不当。实际上,它旨在支持所有密码,包括流密码。“块密码”和“密码”之间的区别在于,后者仅对一个块进行操作,而前者可以对任意量的数据进行操作,但须符合块大小要求(即,非流密码只能处理块的倍数)。
以下是使用此 API 的一个示例
#include <crypto/hash.h>
#include <linux/err.h>
#include <linux/scatterlist.h>
struct scatterlist sg[2];
char result[128];
struct crypto_ahash *tfm;
struct ahash_request *req;
tfm = crypto_alloc_ahash("md5", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm))
fail();
/* ... set up the scatterlists ... */
req = ahash_request_alloc(tfm, GFP_ATOMIC);
if (!req)
fail();
ahash_request_set_callback(req, 0, NULL, NULL);
ahash_request_set_crypt(req, sg, result, 2);
if (crypto_ahash_digest(req))
fail();
ahash_request_free(req);
crypto_free_ahash(tfm);
许多实际示例可在回归测试模块 (tcrypt.c) 中找到。
开发者须知¶
变换只能在用户上下文(user context)中分配,并且密码学方法只能从软中断(softirq)和用户上下文调用。对于具有 setkey 方法的变换,它也应该只从用户上下文调用。
当将此 API 用于密码算法时,如果每个散射列表包含的数据是密码算法块大小(通常为 8 字节)的倍数,性能将达到最佳。这可以避免在非对齐的页片段边界之间进行任何复制。
添加新算法¶
提交新算法以供纳入时,一个强制性要求是必须包含来自已知来源(最好是标准)的至少几个测试向量。
优先选择转换现有的知名代码,因为它更有可能经过审查并被广泛测试。如果提交来自 LGPL 来源的代码,请考虑将许可证更改为 GPL(参见 LGPL 的第 3 节)。
提交的算法也必须普遍无专利(例如,IDEA 直到大约 2011 年才会被纳入主线),并且应基于公认的标准和/或经过适当的同行评审。
另请检查可能与特定算法使用相关的任何 RFC,以及一般应用说明,例如 RFC2451 (“ESP CBC 模式密码算法”)。
最好避免使用大量宏,而是使用内联函数,因为 gcc 在内联方面做得很好,而过度使用宏可能会在某些平台上导致编译问题。
另请查看下面列出的网站上的 TODO 列表,以了解人们可能已经在做什么。
错误¶
- 将错误报告发送至
- 抄送
Herbert Xu <herbert@gondor.apana.org.au>, David S. Miller <davem@redhat.com>
更多信息¶
有关更多补丁和各种更新,包括当前的 TODO 列表,请参见:http://gondor.apana.org.au/~herbert/crypto/
致谢¶
以下人员在 API 开发过程中提供了宝贵的反馈
Alexey Kuznetzov
Rusty Russell
Herbert Valerio Riedel
Jeff Garzik
Michael Richardson
Andrew Morton
Ingo Oeser
Christoph Hellwig
此 API 的部分内容源自以下项目
- Kerneli Cryptoapi (http://www.kerneli.org/)
Alexander Kjeldaas
Herbert Valerio Riedel
Kyle McMartin
Jean-Luc Cooke
David Bryson
Clemens Fruhwirth
Tobias Ringstrom
Harald Welte
和;
- Nettle (https://www.lysator.liu.se/~nisse/nettle/)
Niels Möller
密码算法的原始开发者
Dana L. How (DES)
Andrew Tridgell and Steve French (MD4)
Colin Plumb (MD5)
Steve Reid (SHA1)
Jean-Luc Cooke (SHA256, SHA384, SHA512)
Kazunori Miyazawa / USAGI (HMAC)
Matthew Skala (Twofish)
Dag Arne Osvik (Serpent)
Brian Gladman (AES)
Kartikey Mahendra Bhatt (CAST6)
Jon Oberheide (ARC4)
Jouni Malinen (Michael MIC)
NTT(Nippon Telegraph and Telephone Corporation) (Camellia)
- SHA1 算法贡献者
Jean-Francois Dive
- DES 算法贡献者
Raimar Falke
Gisle Sælensminde
Niels Möller
- Blowfish 算法贡献者
Herbert Valerio Riedel
Kyle McMartin
- Twofish 算法贡献者
Werner Koch
Marc Mutz
- SHA256/384/512 算法贡献者
Andrew McDonald
Kyle McMartin
Herbert Valerio Riedel
- AES 算法贡献者
Alexander Kjeldaas
Herbert Valerio Riedel
Kyle McMartin
Adam J. Richter
Fruhwirth Clemens (i586)
Linus Torvalds (i586)
- CAST5 算法贡献者
Kartikey Mahendra Bhatt (原始开发者未知,FSF 版权所有)。
- TEA/XTEA 算法贡献者
Aaron Grothe
Michael Ringe
- Khazad 算法贡献者
Aaron Grothe
- Whirlpool 算法贡献者
Aaron Grothe
Jean-Luc Cooke
- Anubis 算法贡献者
Aaron Grothe
- Tiger 算法贡献者
Aaron Grothe
- VIA PadLock 贡献者
Michal Ludvig
- Camellia 算法贡献者
NTT(Nippon Telegraph and Telephone Corporation) (Camellia)
通用 scatterwalk 代码,由 Adam J. Richter <adam@yggdrasil.com> 提供
请将任何致谢更新或更正发送至:Herbert Xu <herbert@gondor.apana.org.au>