散列表加密 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 列表,看看是否有人可能已经在从事这项工作。

错误

将错误报告发送至

linux-crypto@vger.kernel.org

抄送

Herbert Xu <herbert@gondor.apana.org.au>, David S. Miller <davem@redhat.com>

更多信息

有关更多补丁和各种更新(包括当前的 TODO 列表),请参阅:http://gondor.apana.org.au/~herbert/crypto/

作者

  • James Morris

  • David S. Miller

  • Herbert Xu

贡献

以下人员在 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

以及;

加密算法的原始开发者

  • 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>