2                     Scatterlist Cryptographic API
 
   6 The Scatterlist Crypto API takes page vectors (scatterlists) as
 
   7 arguments, and works directly on pages.  In some cases (e.g. ECB
 
   8 mode ciphers), this will allow for pages to be encrypted in-place
 
  11 One of the initial goals of this design was to readily support IPsec,
 
  12 so that processing can be applied to paged skb's without the need
 
  18 At the lowest level are algorithms, which register dynamically with the
 
  21 'Transforms' are user-instantiated objects, which maintain state, handle all
 
  22 of the implementation logic (e.g. manipulating page vectors) and provide an 
 
  23 abstraction to the underlying algorithms.  However, at the user 
 
  24 level they are very simple.
 
  26 Conceptually, the API layering looks like this:
 
  28   [transform api]  (user interface)
 
  29   [transform ops]  (per-type logic glue e.g. cipher.c, compress.c)
 
  30   [algorithm api]  (for registering algorithms)
 
  32 The idea is to make the user interface and algorithm registration API
 
  33 very simple, while hiding the core logic from both.  Many good ideas
 
  34 from existing APIs such as Cryptoapi and Nettle have been adapted for this.
 
  36 The API currently supports three types of transforms: Ciphers, Digests and
 
  37 Compressors.  The compression algorithms especially seem to be performing
 
  40 Support for hardware crypto devices via an asynchronous interface is
 
  43 Here's an example of how to use the API:
 
  45         #include <linux/crypto.h>
 
  46         #include <linux/err.h>
 
  47         #include <linux/scatterlist.h>
 
  49         struct scatterlist sg[2];
 
  51         struct crypto_hash *tfm;
 
  52         struct hash_desc desc;
 
  54         tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
 
  58         /* ... set up the scatterlists ... */
 
  63         if (crypto_hash_digest(&desc, &sg, 2, result))
 
  66         crypto_free_hash(tfm);
 
  69 Many real examples are available in the regression test module (tcrypt.c).
 
  74 As Triple DES is part of the DES module, for those using modular builds,
 
  75 add the following line to /etc/modprobe.conf:
 
  79 The Null algorithms reside in the crypto_null module, so these lines
 
  82   alias cipher_null crypto_null
 
  83   alias digest_null crypto_null
 
  84   alias compress_null crypto_null
 
  86 The SHA384 algorithm shares code within the SHA512 module, so you'll
 
  93 Transforms may only be allocated in user context, and cryptographic
 
  94 methods may only be called from softirq and user contexts.
 
  96 When using the API for ciphers, performance will be optimal if each
 
  97 scatterlist contains data which is a multiple of the cipher's block
 
  98 size (typically 8 bytes).  This prevents having to do any copying
 
  99 across non-aligned page fragment boundaries.
 
 102 ADDING NEW ALGORITHMS
 
 104 When submitting a new algorithm for inclusion, a mandatory requirement
 
 105 is that at least a few test vectors from known sources (preferably
 
 106 standards) be included.
 
 108 Converting existing well known code is preferred, as it is more likely
 
 109 to have been reviewed and widely tested.  If submitting code from LGPL
 
 110 sources, please consider changing the license to GPL (see section 3 of
 
 113 Algorithms submitted must also be generally patent-free (e.g. IDEA
 
 114 will not be included in the mainline until around 2011), and be based
 
 115 on a recognized standard and/or have been subjected to appropriate
 
 118 Also check for any RFCs which may relate to the use of specific algorithms,
 
 119 as well as general application notes such as RFC2451 ("The ESP CBC-Mode
 
 122 It's a good idea to avoid using lots of macros and use inlined functions
 
 123 instead, as gcc does a good job with inlining, while excessive use of
 
 124 macros can cause compilation problems on some platforms.
 
 126 Also check the TODO list at the web site listed below to see what people
 
 127 might already be working on.
 
 133 Herbert Xu <herbert@gondor.apana.org.au>
 
 134 Cc: David S. Miller <davem@redhat.com>
 
 139 For further patches and various updates, including the current TODO
 
 141 http://gondor.apana.org.au/~herbert/crypto/
 
 153 The following people provided invaluable feedback during the development
 
 158   Herbert Valerio Riedel
 
 165 Portions of this API were derived from the following projects:
 
 167   Kerneli Cryptoapi (http://www.kerneli.org/)
 
 169     Herbert Valerio Riedel
 
 179   Nettle (http://www.lysator.liu.se/~nisse/nettle/)
 
 182 Original developers of the crypto algorithms:
 
 185   Andrew Tridgell and Steve French (MD4)
 
 188   Jean-Luc Cooke (SHA256, SHA384, SHA512)
 
 189   Kazunori Miyazawa / USAGI (HMAC)
 
 190   Matthew Skala (Twofish)
 
 191   Dag Arne Osvik (Serpent)
 
 193   Kartikey Mahendra Bhatt (CAST6)
 
 195   Jouni Malinen (Michael MIC)
 
 197 SHA1 algorithm contributors:
 
 200 DES algorithm contributors:
 
 205 Blowfish algorithm contributors:
 
 206   Herbert Valerio Riedel
 
 209 Twofish algorithm contributors:
 
 213 SHA256/384/512 algorithm contributors:
 
 216   Herbert Valerio Riedel
 
 218 AES algorithm contributors:
 
 220   Herbert Valerio Riedel
 
 223   Fruhwirth Clemens (i586)
 
 224   Linus Torvalds (i586)
 
 226 CAST5 algorithm contributors:
 
 227   Kartikey Mahendra Bhatt (original developers unknown, FSF copyright).
 
 229 TEA/XTEA algorithm contributors:
 
 233 Khazad algorithm contributors:
 
 236 Whirlpool algorithm contributors:
 
 240 Anubis algorithm contributors:
 
 243 Tiger algorithm contributors:
 
 246 VIA PadLock contributors:
 
 249 Generic scatterwalk code by Adam J. Richter <adam@yggdrasil.com>
 
 251 Please send any credits updates or corrections to:
 
 252 Herbert Xu <herbert@gondor.apana.org.au>