散射列表密碼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 列表,以瞭解人們可能已經在做什麼。

錯誤

將錯誤報告發送至

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