散列表加密 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) 中提供了许多实际示例。
开发者注意事项¶
转换只能在用户上下文中分配,并且只能从软中断和用户上下文中调用加密方法。对于具有 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 和 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(日本电报电话公司)(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(日本电报电话公司)(Camellia)
Adam J. Richter <adam@yggdrasil.com> 的通用散步代码
请将任何贡献更新或更正发送至:Herbert Xu <herbert@gondor.apana.org.au>