Blame view

Documentation/crypto/architecture.rst 14.5 KB
3b72c814a   Stephan Mueller   crypto: doc - con...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
  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
8d23da22a   Stephan Mueller   crypto: doc - add...
159
160
     -  kpp for a Key-agreement Protocol Primitive (KPP) cipher such as
        an ECDH or DH implementation
3b72c814a   Stephan Mueller   crypto: doc - con...
161
162
163
164
165
166
167
168
169
  -  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
c79b411ea   Eric Biggers   crypto: skcipher ...
170
  -  geniv: IV generator (obsolete)
3b72c814a   Stephan Mueller   crypto: doc - con...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
  
  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)
8d23da22a   Stephan Mueller   crypto: doc - add...
200
201
  -  CRYPTO_ALG_TYPE_KPP Key-agreement Protocol Primitive (KPP) such as
     an ECDH or DH implementation
84ede58df   Eric Biggers   crypto: hash - re...
202
  -  CRYPTO_ALG_TYPE_HASH Raw message digest
3b72c814a   Stephan Mueller   crypto: doc - con...
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
  
  -  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
c79b411ea   Eric Biggers   crypto: skcipher ...
313
314
315
  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:
3b72c814a   Stephan Mueller   crypto: doc - con...
316
317
318
  
  1. esp_output() invokes crypto_aead_encrypt() to trigger an
     encryption operation of the AEAD cipher with IV generator.
c79b411ea   Eric Biggers   crypto: skcipher ...
319
     The SEQIV generates the IV.
3b72c814a   Stephan Mueller   crypto: doc - con...
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
  
  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.