| Kernel Crypto API Architecture | 
 | ============================== | 
 |  | 
 | Cipher algorithm types | 
 | ---------------------- | 
 |  | 
 | The kernel crypto API provides different API calls for the following | 
 | cipher types: | 
 |  | 
 | -  Symmetric ciphers | 
 |  | 
 | -  AEAD ciphers | 
 |  | 
 | -  Message digest, including keyed message digest | 
 |  | 
 | -  Random number generation | 
 |  | 
 | -  User space interface | 
 |  | 
 | Ciphers And Templates | 
 | --------------------- | 
 |  | 
 | The kernel crypto API provides implementations of single block ciphers | 
 | and message digests. In addition, the kernel crypto API provides | 
 | numerous "templates" that can be used in conjunction with the single | 
 | block ciphers and message digests. Templates include all types of block | 
 | chaining mode, the HMAC mechanism, etc. | 
 |  | 
 | Single block ciphers and message digests can either be directly used by | 
 | a caller or invoked together with a template to form multi-block ciphers | 
 | or keyed message digests. | 
 |  | 
 | A single block cipher may even be called with multiple templates. | 
 | However, templates cannot be used without a single cipher. | 
 |  | 
 | See /proc/crypto and search for "name". For example: | 
 |  | 
 | -  aes | 
 |  | 
 | -  ecb(aes) | 
 |  | 
 | -  cmac(aes) | 
 |  | 
 | -  ccm(aes) | 
 |  | 
 | -  rfc4106(gcm(aes)) | 
 |  | 
 | -  sha1 | 
 |  | 
 | -  hmac(sha1) | 
 |  | 
 | -  authenc(hmac(sha1),cbc(aes)) | 
 |  | 
 | In these examples, "aes" and "sha1" are the ciphers and all others are | 
 | the templates. | 
 |  | 
 | Synchronous And Asynchronous Operation | 
 | -------------------------------------- | 
 |  | 
 | The kernel crypto API provides synchronous and asynchronous API | 
 | operations. | 
 |  | 
 | When using the synchronous API operation, the caller invokes a cipher | 
 | operation which is performed synchronously by the kernel crypto API. | 
 | That means, the caller waits until the cipher operation completes. | 
 | Therefore, the kernel crypto API calls work like regular function calls. | 
 | For synchronous operation, the set of API calls is small and | 
 | conceptually similar to any other crypto library. | 
 |  | 
 | Asynchronous operation is provided by the kernel crypto API which | 
 | implies that the invocation of a cipher operation will complete almost | 
 | instantly. That invocation triggers the cipher operation but it does not | 
 | signal its completion. Before invoking a cipher operation, the caller | 
 | must provide a callback function the kernel crypto API can invoke to | 
 | signal the completion of the cipher operation. Furthermore, the caller | 
 | must ensure it can handle such asynchronous events by applying | 
 | appropriate locking around its data. The kernel crypto API does not | 
 | perform any special serialization operation to protect the caller's data | 
 | integrity. | 
 |  | 
 | Crypto API Cipher References And Priority | 
 | ----------------------------------------- | 
 |  | 
 | A cipher is referenced by the caller with a string. That string has the | 
 | following semantics: | 
 |  | 
 | :: | 
 |  | 
 |         template(single block cipher) | 
 |  | 
 |  | 
 | where "template" and "single block cipher" is the aforementioned | 
 | template and single block cipher, respectively. If applicable, | 
 | additional templates may enclose other templates, such as | 
 |  | 
 | :: | 
 |  | 
 |         template1(template2(single block cipher))) | 
 |  | 
 |  | 
 | The kernel crypto API may provide multiple implementations of a template | 
 | or a single block cipher. For example, AES on newer Intel hardware has | 
 | the following implementations: AES-NI, assembler implementation, or | 
 | straight C. Now, when using the string "aes" with the kernel crypto API, | 
 | which cipher implementation is used? The answer to that question is the | 
 | priority number assigned to each cipher implementation by the kernel | 
 | crypto API. When a caller uses the string to refer to a cipher during | 
 | initialization of a cipher handle, the kernel crypto API looks up all | 
 | implementations providing an implementation with that name and selects | 
 | the implementation with the highest priority. | 
 |  | 
 | Now, a caller may have the need to refer to a specific cipher | 
 | implementation and thus does not want to rely on the priority-based | 
 | selection. To accommodate this scenario, the kernel crypto API allows | 
 | the cipher implementation to register a unique name in addition to | 
 | common names. When using that unique name, a caller is therefore always | 
 | sure to refer to the intended cipher implementation. | 
 |  | 
 | The list of available ciphers is given in /proc/crypto. However, that | 
 | list does not specify all possible permutations of templates and | 
 | ciphers. Each block listed in /proc/crypto may contain the following | 
 | information -- if one of the components listed as follows are not | 
 | applicable to a cipher, it is not displayed: | 
 |  | 
 | -  name: the generic name of the cipher that is subject to the | 
 |    priority-based selection -- this name can be used by the cipher | 
 |    allocation API calls (all names listed above are examples for such | 
 |    generic names) | 
 |  | 
 | -  driver: the unique name of the cipher -- this name can be used by the | 
 |    cipher allocation API calls | 
 |  | 
 | -  module: the kernel module providing the cipher implementation (or | 
 |    "kernel" for statically linked ciphers) | 
 |  | 
 | -  priority: the priority value of the cipher implementation | 
 |  | 
 | -  refcnt: the reference count of the respective cipher (i.e. the number | 
 |    of current consumers of this cipher) | 
 |  | 
 | -  selftest: specification whether the self test for the cipher passed | 
 |  | 
 | -  type: | 
 |  | 
 |    -  skcipher for symmetric key ciphers | 
 |  | 
 |    -  cipher for single block ciphers that may be used with an | 
 |       additional template | 
 |  | 
 |    -  shash for synchronous message digest | 
 |  | 
 |    -  ahash for asynchronous message digest | 
 |  | 
 |    -  aead for AEAD cipher type | 
 |  | 
 |    -  compression for compression type transformations | 
 |  | 
 |    -  rng for random number generator | 
 |  | 
 |    -  kpp for a Key-agreement Protocol Primitive (KPP) cipher such as | 
 |       an ECDH or DH implementation | 
 |  | 
 | -  blocksize: blocksize of cipher in bytes | 
 |  | 
 | -  keysize: key size in bytes | 
 |  | 
 | -  ivsize: IV size in bytes | 
 |  | 
 | -  seedsize: required size of seed data for random number generator | 
 |  | 
 | -  digestsize: output size of the message digest | 
 |  | 
 | -  geniv: IV generator (obsolete) | 
 |  | 
 | Key Sizes | 
 | --------- | 
 |  | 
 | When allocating a cipher handle, the caller only specifies the cipher | 
 | type. Symmetric ciphers, however, typically support multiple key sizes | 
 | (e.g. AES-128 vs. AES-192 vs. AES-256). These key sizes are determined | 
 | with the length of the provided key. Thus, the kernel crypto API does | 
 | not provide a separate way to select the particular symmetric cipher key | 
 | size. | 
 |  | 
 | Cipher Allocation Type And Masks | 
 | -------------------------------- | 
 |  | 
 | The different cipher handle allocation functions allow the specification | 
 | of a type and mask flag. Both parameters have the following meaning (and | 
 | are therefore not covered in the subsequent sections). | 
 |  | 
 | The type flag specifies the type of the cipher algorithm. The caller | 
 | usually provides a 0 when the caller wants the default handling. | 
 | Otherwise, the caller may provide the following selections which match | 
 | the aforementioned cipher types: | 
 |  | 
 | -  CRYPTO_ALG_TYPE_CIPHER Single block cipher | 
 |  | 
 | -  CRYPTO_ALG_TYPE_COMPRESS Compression | 
 |  | 
 | -  CRYPTO_ALG_TYPE_AEAD Authenticated Encryption with Associated Data | 
 |    (MAC) | 
 |  | 
 | -  CRYPTO_ALG_TYPE_KPP Key-agreement Protocol Primitive (KPP) such as | 
 |    an ECDH or DH implementation | 
 |  | 
 | -  CRYPTO_ALG_TYPE_HASH Raw message digest | 
 |  | 
 | -  CRYPTO_ALG_TYPE_SHASH Synchronous multi-block hash | 
 |  | 
 | -  CRYPTO_ALG_TYPE_AHASH Asynchronous multi-block hash | 
 |  | 
 | -  CRYPTO_ALG_TYPE_RNG Random Number Generation | 
 |  | 
 | -  CRYPTO_ALG_TYPE_AKCIPHER Asymmetric cipher | 
 |  | 
 | -  CRYPTO_ALG_TYPE_PCOMPRESS Enhanced version of | 
 |    CRYPTO_ALG_TYPE_COMPRESS allowing for segmented compression / | 
 |    decompression instead of performing the operation on one segment | 
 |    only. CRYPTO_ALG_TYPE_PCOMPRESS is intended to replace | 
 |    CRYPTO_ALG_TYPE_COMPRESS once existing consumers are converted. | 
 |  | 
 | The mask flag restricts the type of cipher. The only allowed flag is | 
 | CRYPTO_ALG_ASYNC to restrict the cipher lookup function to | 
 | asynchronous ciphers. Usually, a caller provides a 0 for the mask flag. | 
 |  | 
 | When the caller provides a mask and type specification, the caller | 
 | limits the search the kernel crypto API can perform for a suitable | 
 | cipher implementation for the given cipher name. That means, even when a | 
 | caller uses a cipher name that exists during its initialization call, | 
 | the kernel crypto API may not select it due to the used type and mask | 
 | field. | 
 |  | 
 | Internal Structure of Kernel Crypto API | 
 | --------------------------------------- | 
 |  | 
 | The kernel crypto API has an internal structure where a cipher | 
 | implementation may use many layers and indirections. This section shall | 
 | help to clarify how the kernel crypto API uses various components to | 
 | implement the complete cipher. | 
 |  | 
 | The following subsections explain the internal structure based on | 
 | existing cipher implementations. The first section addresses the most | 
 | complex scenario where all other scenarios form a logical subset. | 
 |  | 
 | Generic AEAD Cipher Structure | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | The following ASCII art decomposes the kernel crypto API layers when | 
 | using the AEAD cipher with the automated IV generation. The shown | 
 | example is used by the IPSEC layer. | 
 |  | 
 | For other use cases of AEAD ciphers, the ASCII art applies as well, but | 
 | the caller may not use the AEAD cipher with a separate IV generator. In | 
 | this case, the caller must generate the IV. | 
 |  | 
 | The depicted example decomposes the AEAD cipher of GCM(AES) based on the | 
 | generic C implementations (gcm.c, aes-generic.c, ctr.c, ghash-generic.c, | 
 | seqiv.c). The generic implementation serves as an example showing the | 
 | complete logic of the kernel crypto API. | 
 |  | 
 | It is possible that some streamlined cipher implementations (like | 
 | AES-NI) provide implementations merging aspects which in the view of the | 
 | kernel crypto API cannot be decomposed into layers any more. In case of | 
 | the AES-NI implementation, the CTR mode, the GHASH implementation and | 
 | the AES cipher are all merged into one cipher implementation registered | 
 | with the kernel crypto API. In this case, the concept described by the | 
 | following ASCII art applies too. However, the decomposition of GCM into | 
 | the individual sub-components by the kernel crypto API is not done any | 
 | more. | 
 |  | 
 | Each block in the following ASCII art is an independent cipher instance | 
 | obtained from the kernel crypto API. Each block is accessed by the | 
 | caller or by other blocks using the API functions defined by the kernel | 
 | crypto API for the cipher implementation type. | 
 |  | 
 | The blocks below indicate the cipher type as well as the specific logic | 
 | implemented in the cipher. | 
 |  | 
 | The ASCII art picture also indicates the call structure, i.e. who calls | 
 | which component. The arrows point to the invoked block where the caller | 
 | uses the API applicable to the cipher type specified for the block. | 
 |  | 
 | :: | 
 |  | 
 |  | 
 |     kernel crypto API                                |   IPSEC Layer | 
 |                                                      | | 
 |     +-----------+                                    | | 
 |     |           |            (1) | 
 |     |   aead    | <-----------------------------------  esp_output | 
 |     |  (seqiv)  | ---+ | 
 |     +-----------+    | | 
 |                      | (2) | 
 |     +-----------+    | | 
 |     |           | <--+                (2) | 
 |     |   aead    | <-----------------------------------  esp_input | 
 |     |   (gcm)   | ------------+ | 
 |     +-----------+             | | 
 |           | (3)               | (5) | 
 |           v                   v | 
 |     +-----------+       +-----------+ | 
 |     |           |       |           | | 
 |     |  skcipher |       |   ahash   | | 
 |     |   (ctr)   | ---+  |  (ghash)  | | 
 |     +-----------+    |  +-----------+ | 
 |                      | | 
 |     +-----------+    | (4) | 
 |     |           | <--+ | 
 |     |   cipher  | | 
 |     |   (aes)   | | 
 |     +-----------+ | 
 |  | 
 |  | 
 |  | 
 | The following call sequence is applicable when the IPSEC layer triggers | 
 | an encryption operation with the esp_output function. During | 
 | configuration, the administrator set up the use of seqiv(rfc4106(gcm(aes))) | 
 | as the cipher for ESP. The following call sequence is now depicted in | 
 | the ASCII art above: | 
 |  | 
 | 1. esp_output() invokes crypto_aead_encrypt() to trigger an | 
 |    encryption operation of the AEAD cipher with IV generator. | 
 |  | 
 |    The SEQIV generates the IV. | 
 |  | 
 | 2. Now, SEQIV uses the AEAD API function calls to invoke the associated | 
 |    AEAD cipher. In our case, during the instantiation of SEQIV, the | 
 |    cipher handle for GCM is provided to SEQIV. This means that SEQIV | 
 |    invokes AEAD cipher operations with the GCM cipher handle. | 
 |  | 
 |    During instantiation of the GCM handle, the CTR(AES) and GHASH | 
 |    ciphers are instantiated. The cipher handles for CTR(AES) and GHASH | 
 |    are retained for later use. | 
 |  | 
 |    The GCM implementation is responsible to invoke the CTR mode AES and | 
 |    the GHASH cipher in the right manner to implement the GCM | 
 |    specification. | 
 |  | 
 | 3. The GCM AEAD cipher type implementation now invokes the SKCIPHER API | 
 |    with the instantiated CTR(AES) cipher handle. | 
 |  | 
 |    During instantiation of the CTR(AES) cipher, the CIPHER type | 
 |    implementation of AES is instantiated. The cipher handle for AES is | 
 |    retained. | 
 |  | 
 |    That means that the SKCIPHER implementation of CTR(AES) only | 
 |    implements the CTR block chaining mode. After performing the block | 
 |    chaining operation, the CIPHER implementation of AES is invoked. | 
 |  | 
 | 4. The SKCIPHER of CTR(AES) now invokes the CIPHER API with the AES | 
 |    cipher handle to encrypt one block. | 
 |  | 
 | 5. The GCM AEAD implementation also invokes the GHASH cipher | 
 |    implementation via the AHASH API. | 
 |  | 
 | When the IPSEC layer triggers the esp_input() function, the same call | 
 | sequence is followed with the only difference that the operation starts | 
 | with step (2). | 
 |  | 
 | Generic Block Cipher Structure | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | Generic block ciphers follow the same concept as depicted with the ASCII | 
 | art picture above. | 
 |  | 
 | For example, CBC(AES) is implemented with cbc.c, and aes-generic.c. The | 
 | ASCII art picture above applies as well with the difference that only | 
 | step (4) is used and the SKCIPHER block chaining mode is CBC. | 
 |  | 
 | Generic Keyed Message Digest Structure | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | Keyed message digest implementations again follow the same concept as | 
 | depicted in the ASCII art picture above. | 
 |  | 
 | For example, HMAC(SHA256) is implemented with hmac.c and | 
 | sha256_generic.c. The following ASCII art illustrates the | 
 | implementation: | 
 |  | 
 | :: | 
 |  | 
 |  | 
 |     kernel crypto API            |       Caller | 
 |                                  | | 
 |     +-----------+         (1)    | | 
 |     |           | <------------------  some_function | 
 |     |   ahash   | | 
 |     |   (hmac)  | ---+ | 
 |     +-----------+    | | 
 |                      | (2) | 
 |     +-----------+    | | 
 |     |           | <--+ | 
 |     |   shash   | | 
 |     |  (sha256) | | 
 |     +-----------+ | 
 |  | 
 |  | 
 |  | 
 | The following call sequence is applicable when a caller triggers an HMAC | 
 | operation: | 
 |  | 
 | 1. The AHASH API functions are invoked by the caller. The HMAC | 
 |    implementation performs its operation as needed. | 
 |  | 
 |    During initialization of the HMAC cipher, the SHASH cipher type of | 
 |    SHA256 is instantiated. The cipher handle for the SHA256 instance is | 
 |    retained. | 
 |  | 
 |    At one time, the HMAC implementation requires a SHA256 operation | 
 |    where the SHA256 cipher handle is used. | 
 |  | 
 | 2. The HMAC instance now invokes the SHASH API with the SHA256 cipher | 
 |    handle to calculate the message digest. |