散射列表密碼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>