Fixed efficiency pre-test on RSA prime generation (no security issue, but RSA key...
[BearSSL] / inc / bearssl_block.h
1 /*
2 * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24
25 #ifndef BR_BEARSSL_BLOCK_H__
26 #define BR_BEARSSL_BLOCK_H__
27
28 #include <stddef.h>
29 #include <stdint.h>
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /** \file bearssl_block.h
36 *
37 * # Block Ciphers and Symmetric Ciphers
38 *
39 * This file documents the API for block ciphers and other symmetric
40 * ciphers.
41 *
42 *
43 * ## Procedural API
44 *
45 * For a block cipher implementation, up to three separate sets of
46 * functions are provided, for CBC encryption, CBC decryption, and CTR
47 * encryption/decryption. Each set has its own context structure,
48 * initialised with the encryption key.
49 *
50 * For CBC encryption and decryption, the data to encrypt or decrypt is
51 * referenced as a sequence of blocks. The implementations assume that
52 * there is no partial block; no padding is applied or removed. The
53 * caller is responsible for handling any kind of padding.
54 *
55 * Function for CTR encryption are defined only for block ciphers with
56 * blocks of 16 bytes or more (i.e. AES, but not DES/3DES).
57 *
58 * Each implemented block cipher is identified by an "internal name"
59 * from which are derived the names of structures and functions that
60 * implement the cipher. For the block cipher of internal name "`xxx`",
61 * the following are defined:
62 *
63 * - `br_xxx_BLOCK_SIZE`
64 *
65 * A macro that evaluates to the block size (in bytes) of the
66 * cipher. For all implemented block ciphers, this value is a
67 * power of two.
68 *
69 * - `br_xxx_cbcenc_keys`
70 *
71 * Context structure that contains the subkeys resulting from the key
72 * expansion. These subkeys are appropriate for CBC encryption. The
73 * structure first field is called `vtable` and points to the
74 * appropriate OOP structure.
75 *
76 * - `br_xxx_cbcenc_init(br_xxx_cbcenc_keys *ctx, const void *key, size_t len)`
77 *
78 * Perform key expansion: subkeys for CBC encryption are computed and
79 * written in the provided context structure. The key length MUST be
80 * adequate for the implemented block cipher. This function also sets
81 * the `vtable` field.
82 *
83 * - `br_xxx_cbcenc_run(const br_xxx_cbcenc_keys *ctx, void *iv, void *data, size_t len)`
84 *
85 * Perform CBC encryption of `len` bytes, in place. The encrypted data
86 * replaces the cleartext. `len` MUST be a multiple of the block length
87 * (if it is not, the function may loop forever or overflow a buffer).
88 * The IV is provided with the `iv` pointer; it is also updated with
89 * a copy of the last encrypted block.
90 *
91 * - `br_xxx_cbcdec_keys`
92 *
93 * Context structure that contains the subkeys resulting from the key
94 * expansion. These subkeys are appropriate for CBC decryption. The
95 * structure first field is called `vtable` and points to the
96 * appropriate OOP structure.
97 *
98 * - `br_xxx_cbcdec_init(br_xxx_cbcenc_keys *ctx, const void *key, size_t len)`
99 *
100 * Perform key expansion: subkeys for CBC decryption are computed and
101 * written in the provided context structure. The key length MUST be
102 * adequate for the implemented block cipher. This function also sets
103 * the `vtable` field.
104 *
105 * - `br_xxx_cbcdec_run(const br_xxx_cbcdec_keys *ctx, void *iv, void *data, size_t num_blocks)`
106 *
107 * Perform CBC decryption of `len` bytes, in place. The decrypted data
108 * replaces the ciphertext. `len` MUST be a multiple of the block length
109 * (if it is not, the function may loop forever or overflow a buffer).
110 * The IV is provided with the `iv` pointer; it is also updated with
111 * a copy of the last _encrypted_ block.
112 *
113 * - `br_xxx_ctr_keys`
114 *
115 * Context structure that contains the subkeys resulting from the key
116 * expansion. These subkeys are appropriate for CTR encryption and
117 * decryption. The structure first field is called `vtable` and
118 * points to the appropriate OOP structure.
119 *
120 * - `br_xxx_ctr_init(br_xxx_ctr_keys *ctx, const void *key, size_t len)`
121 *
122 * Perform key expansion: subkeys for CTR encryption and decryption
123 * are computed and written in the provided context structure. The
124 * key length MUST be adequate for the implemented block cipher. This
125 * function also sets the `vtable` field.
126 *
127 * - `br_xxx_ctr_run(const br_xxx_ctr_keys *ctx, const void *iv, uint32_t cc, void *data, size_t len)` (returns `uint32_t`)
128 *
129 * Perform CTR encryption/decryption of some data. Processing is done
130 * "in place" (the output data replaces the input data). This function
131 * implements the "standard incrementing function" from NIST SP800-38A,
132 * annex B: the IV length shall be 4 bytes less than the block size
133 * (i.e. 12 bytes for AES) and the counter is the 32-bit value starting
134 * with `cc`. The data length (`len`) is not necessarily a multiple of
135 * the block size. The new counter value is returned, which supports
136 * chunked processing, provided that each chunk length (except possibly
137 * the last one) is a multiple of the block size.
138 *
139 * - `br_xxx_ctrcbc_keys`
140 *
141 * Context structure that contains the subkeys resulting from the
142 * key expansion. These subkeys are appropriate for doing combined
143 * CTR encryption/decryption and CBC-MAC, as used in the CCM and EAX
144 * authenticated encryption modes. The structure first field is
145 * called `vtable` and points to the appropriate OOP structure.
146 *
147 * - `br_xxx_ctrcbc_init(br_xxx_ctr_keys *ctx, const void *key, size_t len)`
148 *
149 * Perform key expansion: subkeys for combined CTR
150 * encryption/decryption and CBC-MAC are computed and written in the
151 * provided context structure. The key length MUST be adequate for
152 * the implemented block cipher. This function also sets the
153 * `vtable` field.
154 *
155 * - `br_xxx_ctrcbc_encrypt(const br_xxx_ctrcbc_keys *ctx, void *ctr, void *cbcmac, void *data, size_t len)`
156 *
157 * Perform CTR encryption of some data, and CBC-MAC. Processing is
158 * done "in place" (the output data replaces the input data). This
159 * function applies CTR encryption on the data, using a full
160 * block-size counter (i.e. for 128-bit blocks, the counter is
161 * incremented as a 128-bit value). The 'ctr' array contains the
162 * initial value for the counter (used in the first block) and it is
163 * updated with the new value after data processing. The 'cbcmac'
164 * value shall point to a block-sized value which is used as IV for
165 * CBC-MAC, computed over the encrypted data (output of CTR
166 * encryption); the resulting CBC-MAC is written over 'cbcmac' on
167 * output.
168 *
169 * The data length MUST be a multiple of the block size.
170 *
171 * - `br_xxx_ctrcbc_decrypt(const br_xxx_ctrcbc_keys *ctx, void *ctr, void *cbcmac, void *data, size_t len)`
172 *
173 * Perform CTR decryption of some data, and CBC-MAC. Processing is
174 * done "in place" (the output data replaces the input data). This
175 * function applies CTR decryption on the data, using a full
176 * block-size counter (i.e. for 128-bit blocks, the counter is
177 * incremented as a 128-bit value). The 'ctr' array contains the
178 * initial value for the counter (used in the first block) and it is
179 * updated with the new value after data processing. The 'cbcmac'
180 * value shall point to a block-sized value which is used as IV for
181 * CBC-MAC, computed over the encrypted data (input of CTR
182 * encryption); the resulting CBC-MAC is written over 'cbcmac' on
183 * output.
184 *
185 * The data length MUST be a multiple of the block size.
186 *
187 * - `br_xxx_ctrcbc_ctr(const br_xxx_ctrcbc_keys *ctx, void *ctr, void *data, size_t len)`
188 *
189 * Perform CTR encryption or decryption of the provided data. The
190 * data is processed "in place" (the output data replaces the input
191 * data). A full block-sized counter is applied (i.e. for 128-bit
192 * blocks, the counter is incremented as a 128-bit value). The 'ctr'
193 * array contains the initial value for the counter (used in the
194 * first block), and it is updated with the new value after data
195 * processing.
196 *
197 * The data length MUST be a multiple of the block size.
198 *
199 * - `br_xxx_ctrcbc_mac(const br_xxx_ctrcbc_keys *ctx, void *cbcmac, const void *data, size_t len)`
200 *
201 * Compute CBC-MAC over the provided data. The IV for CBC-MAC is
202 * provided as 'cbcmac'; the output is written over the same array.
203 * The data itself is untouched. The data length MUST be a multiple
204 * of the block size.
205 *
206 *
207 * It shall be noted that the key expansion functions return `void`. If
208 * the provided key length is not allowed, then there will be no error
209 * reporting; implementations need not validate the key length, thus an
210 * invalid key length may result in undefined behaviour (e.g. buffer
211 * overflow).
212 *
213 * Subkey structures contain no interior pointer, and no external
214 * resources are allocated upon key expansion. They can thus be
215 * discarded without any explicit deallocation.
216 *
217 *
218 * ## Object-Oriented API
219 *
220 * Each context structure begins with a field (called `vtable`) that
221 * points to an instance of a structure that references the relevant
222 * functions through pointers. Each such structure contains the
223 * following:
224 *
225 * - `context_size`
226 *
227 * The size (in bytes) of the context structure for subkeys.
228 *
229 * - `block_size`
230 *
231 * The cipher block size (in bytes).
232 *
233 * - `log_block_size`
234 *
235 * The base-2 logarithm of cipher block size (e.g. 4 for blocks
236 * of 16 bytes).
237 *
238 * - `init`
239 *
240 * Pointer to the key expansion function.
241 *
242 * - `run`
243 *
244 * Pointer to the encryption/decryption function.
245 *
246 * For combined CTR/CBC-MAC encryption, the `vtable` has a slightly
247 * different structure:
248 *
249 * - `context_size`
250 *
251 * The size (in bytes) of the context structure for subkeys.
252 *
253 * - `block_size`
254 *
255 * The cipher block size (in bytes).
256 *
257 * - `log_block_size`
258 *
259 * The base-2 logarithm of cipher block size (e.g. 4 for blocks
260 * of 16 bytes).
261 *
262 * - `init`
263 *
264 * Pointer to the key expansion function.
265 *
266 * - `encrypt`
267 *
268 * Pointer to the CTR encryption + CBC-MAC function.
269 *
270 * - `decrypt`
271 *
272 * Pointer to the CTR decryption + CBC-MAC function.
273 *
274 * - `ctr`
275 *
276 * Pointer to the CTR encryption/decryption function.
277 *
278 * - `mac`
279 *
280 * Pointer to the CBC-MAC function.
281 *
282 * For block cipher "`xxx`", static, constant instances of these
283 * structures are defined, under the names:
284 *
285 * - `br_xxx_cbcenc_vtable`
286 * - `br_xxx_cbcdec_vtable`
287 * - `br_xxx_ctr_vtable`
288 * - `br_xxx_ctrcbc_vtable`
289 *
290 *
291 * ## Implemented Block Ciphers
292 *
293 * Provided implementations are:
294 *
295 * | Name | Function | Block Size (bytes) | Key lengths (bytes) |
296 * | :-------- | :------- | :----------------: | :-----------------: |
297 * | aes_big | AES | 16 | 16, 24 and 32 |
298 * | aes_small | AES | 16 | 16, 24 and 32 |
299 * | aes_ct | AES | 16 | 16, 24 and 32 |
300 * | aes_ct64 | AES | 16 | 16, 24 and 32 |
301 * | aes_x86ni | AES | 16 | 16, 24 and 32 |
302 * | aes_pwr8 | AES | 16 | 16, 24 and 32 |
303 * | des_ct | DES/3DES | 8 | 8, 16 and 24 |
304 * | des_tab | DES/3DES | 8 | 8, 16 and 24 |
305 *
306 * **Note:** DES/3DES nominally uses keys of 64, 128 and 192 bits (i.e. 8,
307 * 16 and 24 bytes), but some of the bits are ignored by the algorithm, so
308 * the _effective_ key lengths, from a security point of view, are 56,
309 * 112 and 168 bits, respectively.
310 *
311 * `aes_big` is a "classical" AES implementation, using tables. It
312 * is fast but not constant-time, since it makes data-dependent array
313 * accesses.
314 *
315 * `aes_small` is an AES implementation optimized for code size. It
316 * is substantially slower than `aes_big`; it is not constant-time
317 * either.
318 *
319 * `aes_ct` is a constant-time implementation of AES; its code is about
320 * as big as that of `aes_big`, while its performance is comparable to
321 * that of `aes_small`. However, it is constant-time. This
322 * implementation should thus be considered to be the "default" AES in
323 * BearSSL, to be used unless the operational context guarantees that a
324 * non-constant-time implementation is safe, or an architecture-specific
325 * constant-time implementation can be used (e.g. using dedicated
326 * hardware opcodes).
327 *
328 * `aes_ct64` is another constant-time implementation of AES. It is
329 * similar to `aes_ct` but uses 64-bit values. On 32-bit machines,
330 * `aes_ct64` is not faster than `aes_ct`, often a bit slower, and has
331 * a larger footprint; however, on 64-bit architectures, `aes_ct64`
332 * is typically twice faster than `aes_ct` for modes that allow parallel
333 * operations (i.e. CTR, and CBC decryption, but not CBC encryption).
334 *
335 * `aes_x86ni` exists only on x86 architectures (32-bit and 64-bit). It
336 * uses the AES-NI opcodes when available.
337 *
338 * `aes_pwr8` exists only on PowerPC / POWER architectures (32-bit and
339 * 64-bit, both little-endian and big-endian). It uses the AES opcodes
340 * present in POWER8 and later.
341 *
342 * `des_tab` is a classic, table-based implementation of DES/3DES. It
343 * is not constant-time.
344 *
345 * `des_ct` is an constant-time implementation of DES/3DES. It is
346 * substantially slower than `des_tab`.
347 *
348 * ## ChaCha20 and Poly1305
349 *
350 * ChaCha20 is a stream cipher. Poly1305 is a MAC algorithm. They
351 * are described in [RFC 7539](https://tools.ietf.org/html/rfc7539).
352 *
353 * Two function pointer types are defined:
354 *
355 * - `br_chacha20_run` describes a function that implements ChaCha20
356 * only.
357 *
358 * - `br_poly1305_run` describes an implementation of Poly1305,
359 * in the AEAD combination with ChaCha20 specified in RFC 7539
360 * (the ChaCha20 implementation is provided as a function pointer).
361 *
362 * `chacha20_ct` is a straightforward implementation of ChaCha20 in
363 * plain C; it is constant-time, small, and reasonably fast.
364 *
365 * `chacha20_sse2` leverages SSE2 opcodes (on x86 architectures that
366 * support these opcodes). It is faster than `chacha20_ct`.
367 *
368 * `poly1305_ctmul` is an implementation of the ChaCha20+Poly1305 AEAD
369 * construction, where the Poly1305 part is performed with mixed 32-bit
370 * multiplications (operands are 32-bit, result is 64-bit).
371 *
372 * `poly1305_ctmul32` implements ChaCha20+Poly1305 using pure 32-bit
373 * multiplications (32-bit operands, 32-bit result). It is slower than
374 * `poly1305_ctmul`, except on some specific architectures such as
375 * the ARM Cortex M0+.
376 *
377 * `poly1305_ctmulq` implements ChaCha20+Poly1305 with mixed 64-bit
378 * multiplications (operands are 64-bit, result is 128-bit) on 64-bit
379 * platforms that support such operations.
380 *
381 * `poly1305_i15` implements ChaCha20+Poly1305 with the generic "i15"
382 * big integer implementation. It is meant mostly for testing purposes,
383 * although it can help with saving a few hundred bytes of code footprint
384 * on systems where code size is scarce.
385 */
386
387 /**
388 * \brief Class type for CBC encryption implementations.
389 *
390 * A `br_block_cbcenc_class` instance points to the functions implementing
391 * a specific block cipher, when used in CBC mode for encrypting data.
392 */
393 typedef struct br_block_cbcenc_class_ br_block_cbcenc_class;
394 struct br_block_cbcenc_class_ {
395 /**
396 * \brief Size (in bytes) of the context structure appropriate
397 * for containing subkeys.
398 */
399 size_t context_size;
400
401 /**
402 * \brief Size of individual blocks (in bytes).
403 */
404 unsigned block_size;
405
406 /**
407 * \brief Base-2 logarithm of the size of individual blocks,
408 * expressed in bytes.
409 */
410 unsigned log_block_size;
411
412 /**
413 * \brief Initialisation function.
414 *
415 * This function sets the `vtable` field in the context structure.
416 * The key length MUST be one of the key lengths supported by
417 * the implementation.
418 *
419 * \param ctx context structure to initialise.
420 * \param key secret key.
421 * \param key_len key length (in bytes).
422 */
423 void (*init)(const br_block_cbcenc_class **ctx,
424 const void *key, size_t key_len);
425
426 /**
427 * \brief Run the CBC encryption.
428 *
429 * The `iv` parameter points to the IV for this run; it is
430 * updated with a copy of the last encrypted block. The data
431 * is encrypted "in place"; its length (`len`) MUST be a
432 * multiple of the block size.
433 *
434 * \param ctx context structure (already initialised).
435 * \param iv IV for CBC encryption (updated).
436 * \param data data to encrypt.
437 * \param len data length (in bytes, multiple of block size).
438 */
439 void (*run)(const br_block_cbcenc_class *const *ctx,
440 void *iv, void *data, size_t len);
441 };
442
443 /**
444 * \brief Class type for CBC decryption implementations.
445 *
446 * A `br_block_cbcdec_class` instance points to the functions implementing
447 * a specific block cipher, when used in CBC mode for decrypting data.
448 */
449 typedef struct br_block_cbcdec_class_ br_block_cbcdec_class;
450 struct br_block_cbcdec_class_ {
451 /**
452 * \brief Size (in bytes) of the context structure appropriate
453 * for containing subkeys.
454 */
455 size_t context_size;
456
457 /**
458 * \brief Size of individual blocks (in bytes).
459 */
460 unsigned block_size;
461
462 /**
463 * \brief Base-2 logarithm of the size of individual blocks,
464 * expressed in bytes.
465 */
466 unsigned log_block_size;
467
468 /**
469 * \brief Initialisation function.
470 *
471 * This function sets the `vtable` field in the context structure.
472 * The key length MUST be one of the key lengths supported by
473 * the implementation.
474 *
475 * \param ctx context structure to initialise.
476 * \param key secret key.
477 * \param key_len key length (in bytes).
478 */
479 void (*init)(const br_block_cbcdec_class **ctx,
480 const void *key, size_t key_len);
481
482 /**
483 * \brief Run the CBC decryption.
484 *
485 * The `iv` parameter points to the IV for this run; it is
486 * updated with a copy of the last encrypted block. The data
487 * is decrypted "in place"; its length (`len`) MUST be a
488 * multiple of the block size.
489 *
490 * \param ctx context structure (already initialised).
491 * \param iv IV for CBC decryption (updated).
492 * \param data data to decrypt.
493 * \param len data length (in bytes, multiple of block size).
494 */
495 void (*run)(const br_block_cbcdec_class *const *ctx,
496 void *iv, void *data, size_t len);
497 };
498
499 /**
500 * \brief Class type for CTR encryption/decryption implementations.
501 *
502 * A `br_block_ctr_class` instance points to the functions implementing
503 * a specific block cipher, when used in CTR mode for encrypting or
504 * decrypting data.
505 */
506 typedef struct br_block_ctr_class_ br_block_ctr_class;
507 struct br_block_ctr_class_ {
508 /**
509 * \brief Size (in bytes) of the context structure appropriate
510 * for containing subkeys.
511 */
512 size_t context_size;
513
514 /**
515 * \brief Size of individual blocks (in bytes).
516 */
517 unsigned block_size;
518
519 /**
520 * \brief Base-2 logarithm of the size of individual blocks,
521 * expressed in bytes.
522 */
523 unsigned log_block_size;
524
525 /**
526 * \brief Initialisation function.
527 *
528 * This function sets the `vtable` field in the context structure.
529 * The key length MUST be one of the key lengths supported by
530 * the implementation.
531 *
532 * \param ctx context structure to initialise.
533 * \param key secret key.
534 * \param key_len key length (in bytes).
535 */
536 void (*init)(const br_block_ctr_class **ctx,
537 const void *key, size_t key_len);
538
539 /**
540 * \brief Run the CTR encryption or decryption.
541 *
542 * The `iv` parameter points to the IV for this run; its
543 * length is exactly 4 bytes less than the block size (e.g.
544 * 12 bytes for AES/CTR). The IV is combined with a 32-bit
545 * block counter to produce the block value which is processed
546 * with the block cipher.
547 *
548 * The data to encrypt or decrypt is updated "in place". Its
549 * length (`len` bytes) is not required to be a multiple of
550 * the block size; if the final block is partial, then the
551 * corresponding key stream bits are dropped.
552 *
553 * The resulting counter value is returned.
554 *
555 * \param ctx context structure (already initialised).
556 * \param iv IV for CTR encryption/decryption.
557 * \param cc initial value for the block counter.
558 * \param data data to encrypt or decrypt.
559 * \param len data length (in bytes).
560 * \return the new block counter value.
561 */
562 uint32_t (*run)(const br_block_ctr_class *const *ctx,
563 const void *iv, uint32_t cc, void *data, size_t len);
564 };
565
566 /**
567 * \brief Class type for combined CTR and CBC-MAC implementations.
568 *
569 * A `br_block_ctrcbc_class` instance points to the functions implementing
570 * a specific block cipher, when used in CTR mode for encrypting or
571 * decrypting data, along with CBC-MAC.
572 */
573 typedef struct br_block_ctrcbc_class_ br_block_ctrcbc_class;
574 struct br_block_ctrcbc_class_ {
575 /**
576 * \brief Size (in bytes) of the context structure appropriate
577 * for containing subkeys.
578 */
579 size_t context_size;
580
581 /**
582 * \brief Size of individual blocks (in bytes).
583 */
584 unsigned block_size;
585
586 /**
587 * \brief Base-2 logarithm of the size of individual blocks,
588 * expressed in bytes.
589 */
590 unsigned log_block_size;
591
592 /**
593 * \brief Initialisation function.
594 *
595 * This function sets the `vtable` field in the context structure.
596 * The key length MUST be one of the key lengths supported by
597 * the implementation.
598 *
599 * \param ctx context structure to initialise.
600 * \param key secret key.
601 * \param key_len key length (in bytes).
602 */
603 void (*init)(const br_block_ctrcbc_class **ctx,
604 const void *key, size_t key_len);
605
606 /**
607 * \brief Run the CTR encryption + CBC-MAC.
608 *
609 * The `ctr` parameter points to the counter; its length shall
610 * be equal to the block size. It is updated by this function
611 * as encryption proceeds.
612 *
613 * The `cbcmac` parameter points to the IV for CBC-MAC. The MAC
614 * is computed over the encrypted data (output of CTR
615 * encryption). Its length shall be equal to the block size. The
616 * computed CBC-MAC value is written over the `cbcmac` array.
617 *
618 * The data to encrypt is updated "in place". Its length (`len`
619 * bytes) MUST be a multiple of the block size.
620 *
621 * \param ctx context structure (already initialised).
622 * \param ctr counter for CTR encryption (initial and final).
623 * \param cbcmac IV and output buffer for CBC-MAC.
624 * \param data data to encrypt.
625 * \param len data length (in bytes).
626 */
627 void (*encrypt)(const br_block_ctrcbc_class *const *ctx,
628 void *ctr, void *cbcmac, void *data, size_t len);
629
630 /**
631 * \brief Run the CTR decryption + CBC-MAC.
632 *
633 * The `ctr` parameter points to the counter; its length shall
634 * be equal to the block size. It is updated by this function
635 * as decryption proceeds.
636 *
637 * The `cbcmac` parameter points to the IV for CBC-MAC. The MAC
638 * is computed over the encrypted data (i.e. before CTR
639 * decryption). Its length shall be equal to the block size. The
640 * computed CBC-MAC value is written over the `cbcmac` array.
641 *
642 * The data to decrypt is updated "in place". Its length (`len`
643 * bytes) MUST be a multiple of the block size.
644 *
645 * \param ctx context structure (already initialised).
646 * \param ctr counter for CTR encryption (initial and final).
647 * \param cbcmac IV and output buffer for CBC-MAC.
648 * \param data data to decrypt.
649 * \param len data length (in bytes).
650 */
651 void (*decrypt)(const br_block_ctrcbc_class *const *ctx,
652 void *ctr, void *cbcmac, void *data, size_t len);
653
654 /**
655 * \brief Run the CTR encryption/decryption only.
656 *
657 * The `ctr` parameter points to the counter; its length shall
658 * be equal to the block size. It is updated by this function
659 * as decryption proceeds.
660 *
661 * The data to decrypt is updated "in place". Its length (`len`
662 * bytes) MUST be a multiple of the block size.
663 *
664 * \param ctx context structure (already initialised).
665 * \param ctr counter for CTR encryption (initial and final).
666 * \param data data to decrypt.
667 * \param len data length (in bytes).
668 */
669 void (*ctr)(const br_block_ctrcbc_class *const *ctx,
670 void *ctr, void *data, size_t len);
671
672 /**
673 * \brief Run the CBC-MAC only.
674 *
675 * The `cbcmac` parameter points to the IV for CBC-MAC. The MAC
676 * is computed over the encrypted data (i.e. before CTR
677 * decryption). Its length shall be equal to the block size. The
678 * computed CBC-MAC value is written over the `cbcmac` array.
679 *
680 * The data is unmodified. Its length (`len` bytes) MUST be a
681 * multiple of the block size.
682 *
683 * \param ctx context structure (already initialised).
684 * \param cbcmac IV and output buffer for CBC-MAC.
685 * \param data data to decrypt.
686 * \param len data length (in bytes).
687 */
688 void (*mac)(const br_block_ctrcbc_class *const *ctx,
689 void *cbcmac, const void *data, size_t len);
690 };
691
692 /*
693 * Traditional, table-based AES implementation. It is fast, but uses
694 * internal tables (in particular a 1 kB table for encryption, another
695 * 1 kB table for decryption, and a 256-byte table for key schedule),
696 * and it is not constant-time. In contexts where cache-timing attacks
697 * apply, this implementation may leak the secret key.
698 */
699
700 /** \brief AES block size (16 bytes). */
701 #define br_aes_big_BLOCK_SIZE 16
702
703 /**
704 * \brief Context for AES subkeys (`aes_big` implementation, CBC encryption).
705 *
706 * First field is a pointer to the vtable; it is set by the initialisation
707 * function. Other fields are not supposed to be accessed by user code.
708 */
709 typedef struct {
710 /** \brief Pointer to vtable for this context. */
711 const br_block_cbcenc_class *vtable;
712 #ifndef BR_DOXYGEN_IGNORE
713 uint32_t skey[60];
714 unsigned num_rounds;
715 #endif
716 } br_aes_big_cbcenc_keys;
717
718 /**
719 * \brief Context for AES subkeys (`aes_big` implementation, CBC decryption).
720 *
721 * First field is a pointer to the vtable; it is set by the initialisation
722 * function. Other fields are not supposed to be accessed by user code.
723 */
724 typedef struct {
725 /** \brief Pointer to vtable for this context. */
726 const br_block_cbcdec_class *vtable;
727 #ifndef BR_DOXYGEN_IGNORE
728 uint32_t skey[60];
729 unsigned num_rounds;
730 #endif
731 } br_aes_big_cbcdec_keys;
732
733 /**
734 * \brief Context for AES subkeys (`aes_big` implementation, CTR encryption
735 * and decryption).
736 *
737 * First field is a pointer to the vtable; it is set by the initialisation
738 * function. Other fields are not supposed to be accessed by user code.
739 */
740 typedef struct {
741 /** \brief Pointer to vtable for this context. */
742 const br_block_ctr_class *vtable;
743 #ifndef BR_DOXYGEN_IGNORE
744 uint32_t skey[60];
745 unsigned num_rounds;
746 #endif
747 } br_aes_big_ctr_keys;
748
749 /**
750 * \brief Context for AES subkeys (`aes_big` implementation, CTR encryption
751 * and decryption + CBC-MAC).
752 *
753 * First field is a pointer to the vtable; it is set by the initialisation
754 * function. Other fields are not supposed to be accessed by user code.
755 */
756 typedef struct {
757 /** \brief Pointer to vtable for this context. */
758 const br_block_ctrcbc_class *vtable;
759 #ifndef BR_DOXYGEN_IGNORE
760 uint32_t skey[60];
761 unsigned num_rounds;
762 #endif
763 } br_aes_big_ctrcbc_keys;
764
765 /**
766 * \brief Class instance for AES CBC encryption (`aes_big` implementation).
767 */
768 extern const br_block_cbcenc_class br_aes_big_cbcenc_vtable;
769
770 /**
771 * \brief Class instance for AES CBC decryption (`aes_big` implementation).
772 */
773 extern const br_block_cbcdec_class br_aes_big_cbcdec_vtable;
774
775 /**
776 * \brief Class instance for AES CTR encryption and decryption
777 * (`aes_big` implementation).
778 */
779 extern const br_block_ctr_class br_aes_big_ctr_vtable;
780
781 /**
782 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
783 * (`aes_big` implementation).
784 */
785 extern const br_block_ctrcbc_class br_aes_big_ctrcbc_vtable;
786
787 /**
788 * \brief Context initialisation (key schedule) for AES CBC encryption
789 * (`aes_big` implementation).
790 *
791 * \param ctx context to initialise.
792 * \param key secret key.
793 * \param len secret key length (in bytes).
794 */
795 void br_aes_big_cbcenc_init(br_aes_big_cbcenc_keys *ctx,
796 const void *key, size_t len);
797
798 /**
799 * \brief Context initialisation (key schedule) for AES CBC decryption
800 * (`aes_big` implementation).
801 *
802 * \param ctx context to initialise.
803 * \param key secret key.
804 * \param len secret key length (in bytes).
805 */
806 void br_aes_big_cbcdec_init(br_aes_big_cbcdec_keys *ctx,
807 const void *key, size_t len);
808
809 /**
810 * \brief Context initialisation (key schedule) for AES CTR encryption
811 * and decryption (`aes_big` implementation).
812 *
813 * \param ctx context to initialise.
814 * \param key secret key.
815 * \param len secret key length (in bytes).
816 */
817 void br_aes_big_ctr_init(br_aes_big_ctr_keys *ctx,
818 const void *key, size_t len);
819
820 /**
821 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
822 * (`aes_big` implementation).
823 *
824 * \param ctx context to initialise.
825 * \param key secret key.
826 * \param len secret key length (in bytes).
827 */
828 void br_aes_big_ctrcbc_init(br_aes_big_ctrcbc_keys *ctx,
829 const void *key, size_t len);
830
831 /**
832 * \brief CBC encryption with AES (`aes_big` implementation).
833 *
834 * \param ctx context (already initialised).
835 * \param iv IV (updated).
836 * \param data data to encrypt (updated).
837 * \param len data length (in bytes, MUST be multiple of 16).
838 */
839 void br_aes_big_cbcenc_run(const br_aes_big_cbcenc_keys *ctx, void *iv,
840 void *data, size_t len);
841
842 /**
843 * \brief CBC decryption with AES (`aes_big` implementation).
844 *
845 * \param ctx context (already initialised).
846 * \param iv IV (updated).
847 * \param data data to decrypt (updated).
848 * \param len data length (in bytes, MUST be multiple of 16).
849 */
850 void br_aes_big_cbcdec_run(const br_aes_big_cbcdec_keys *ctx, void *iv,
851 void *data, size_t len);
852
853 /**
854 * \brief CTR encryption and decryption with AES (`aes_big` implementation).
855 *
856 * \param ctx context (already initialised).
857 * \param iv IV (constant, 12 bytes).
858 * \param cc initial block counter value.
859 * \param data data to encrypt or decrypt (updated).
860 * \param len data length (in bytes).
861 * \return new block counter value.
862 */
863 uint32_t br_aes_big_ctr_run(const br_aes_big_ctr_keys *ctx,
864 const void *iv, uint32_t cc, void *data, size_t len);
865
866 /**
867 * \brief CTR encryption + CBC-MAC with AES (`aes_big` implementation).
868 *
869 * \param ctx context (already initialised).
870 * \param ctr counter for CTR (16 bytes, updated).
871 * \param cbcmac IV for CBC-MAC (updated).
872 * \param data data to encrypt (updated).
873 * \param len data length (in bytes, MUST be a multiple of 16).
874 */
875 void br_aes_big_ctrcbc_encrypt(const br_aes_big_ctrcbc_keys *ctx,
876 void *ctr, void *cbcmac, void *data, size_t len);
877
878 /**
879 * \brief CTR decryption + CBC-MAC with AES (`aes_big` implementation).
880 *
881 * \param ctx context (already initialised).
882 * \param ctr counter for CTR (16 bytes, updated).
883 * \param cbcmac IV for CBC-MAC (updated).
884 * \param data data to decrypt (updated).
885 * \param len data length (in bytes, MUST be a multiple of 16).
886 */
887 void br_aes_big_ctrcbc_decrypt(const br_aes_big_ctrcbc_keys *ctx,
888 void *ctr, void *cbcmac, void *data, size_t len);
889
890 /**
891 * \brief CTR encryption/decryption with AES (`aes_big` implementation).
892 *
893 * \param ctx context (already initialised).
894 * \param ctr counter for CTR (16 bytes, updated).
895 * \param data data to MAC (updated).
896 * \param len data length (in bytes, MUST be a multiple of 16).
897 */
898 void br_aes_big_ctrcbc_ctr(const br_aes_big_ctrcbc_keys *ctx,
899 void *ctr, void *data, size_t len);
900
901 /**
902 * \brief CBC-MAC with AES (`aes_big` implementation).
903 *
904 * \param ctx context (already initialised).
905 * \param cbcmac IV for CBC-MAC (updated).
906 * \param data data to MAC (unmodified).
907 * \param len data length (in bytes, MUST be a multiple of 16).
908 */
909 void br_aes_big_ctrcbc_mac(const br_aes_big_ctrcbc_keys *ctx,
910 void *cbcmac, const void *data, size_t len);
911
912 /*
913 * AES implementation optimized for size. It is slower than the
914 * traditional table-based AES implementation, but requires much less
915 * code. It still uses data-dependent table accesses (albeit within a
916 * much smaller 256-byte table), which makes it conceptually vulnerable
917 * to cache-timing attacks.
918 */
919
920 /** \brief AES block size (16 bytes). */
921 #define br_aes_small_BLOCK_SIZE 16
922
923 /**
924 * \brief Context for AES subkeys (`aes_small` implementation, CBC encryption).
925 *
926 * First field is a pointer to the vtable; it is set by the initialisation
927 * function. Other fields are not supposed to be accessed by user code.
928 */
929 typedef struct {
930 /** \brief Pointer to vtable for this context. */
931 const br_block_cbcenc_class *vtable;
932 #ifndef BR_DOXYGEN_IGNORE
933 uint32_t skey[60];
934 unsigned num_rounds;
935 #endif
936 } br_aes_small_cbcenc_keys;
937
938 /**
939 * \brief Context for AES subkeys (`aes_small` implementation, CBC decryption).
940 *
941 * First field is a pointer to the vtable; it is set by the initialisation
942 * function. Other fields are not supposed to be accessed by user code.
943 */
944 typedef struct {
945 /** \brief Pointer to vtable for this context. */
946 const br_block_cbcdec_class *vtable;
947 #ifndef BR_DOXYGEN_IGNORE
948 uint32_t skey[60];
949 unsigned num_rounds;
950 #endif
951 } br_aes_small_cbcdec_keys;
952
953 /**
954 * \brief Context for AES subkeys (`aes_small` implementation, CTR encryption
955 * and decryption).
956 *
957 * First field is a pointer to the vtable; it is set by the initialisation
958 * function. Other fields are not supposed to be accessed by user code.
959 */
960 typedef struct {
961 /** \brief Pointer to vtable for this context. */
962 const br_block_ctr_class *vtable;
963 #ifndef BR_DOXYGEN_IGNORE
964 uint32_t skey[60];
965 unsigned num_rounds;
966 #endif
967 } br_aes_small_ctr_keys;
968
969 /**
970 * \brief Context for AES subkeys (`aes_small` implementation, CTR encryption
971 * and decryption + CBC-MAC).
972 *
973 * First field is a pointer to the vtable; it is set by the initialisation
974 * function. Other fields are not supposed to be accessed by user code.
975 */
976 typedef struct {
977 /** \brief Pointer to vtable for this context. */
978 const br_block_ctrcbc_class *vtable;
979 #ifndef BR_DOXYGEN_IGNORE
980 uint32_t skey[60];
981 unsigned num_rounds;
982 #endif
983 } br_aes_small_ctrcbc_keys;
984
985 /**
986 * \brief Class instance for AES CBC encryption (`aes_small` implementation).
987 */
988 extern const br_block_cbcenc_class br_aes_small_cbcenc_vtable;
989
990 /**
991 * \brief Class instance for AES CBC decryption (`aes_small` implementation).
992 */
993 extern const br_block_cbcdec_class br_aes_small_cbcdec_vtable;
994
995 /**
996 * \brief Class instance for AES CTR encryption and decryption
997 * (`aes_small` implementation).
998 */
999 extern const br_block_ctr_class br_aes_small_ctr_vtable;
1000
1001 /**
1002 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
1003 * (`aes_small` implementation).
1004 */
1005 extern const br_block_ctrcbc_class br_aes_small_ctrcbc_vtable;
1006
1007 /**
1008 * \brief Context initialisation (key schedule) for AES CBC encryption
1009 * (`aes_small` implementation).
1010 *
1011 * \param ctx context to initialise.
1012 * \param key secret key.
1013 * \param len secret key length (in bytes).
1014 */
1015 void br_aes_small_cbcenc_init(br_aes_small_cbcenc_keys *ctx,
1016 const void *key, size_t len);
1017
1018 /**
1019 * \brief Context initialisation (key schedule) for AES CBC decryption
1020 * (`aes_small` implementation).
1021 *
1022 * \param ctx context to initialise.
1023 * \param key secret key.
1024 * \param len secret key length (in bytes).
1025 */
1026 void br_aes_small_cbcdec_init(br_aes_small_cbcdec_keys *ctx,
1027 const void *key, size_t len);
1028
1029 /**
1030 * \brief Context initialisation (key schedule) for AES CTR encryption
1031 * and decryption (`aes_small` implementation).
1032 *
1033 * \param ctx context to initialise.
1034 * \param key secret key.
1035 * \param len secret key length (in bytes).
1036 */
1037 void br_aes_small_ctr_init(br_aes_small_ctr_keys *ctx,
1038 const void *key, size_t len);
1039
1040 /**
1041 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
1042 * (`aes_small` implementation).
1043 *
1044 * \param ctx context to initialise.
1045 * \param key secret key.
1046 * \param len secret key length (in bytes).
1047 */
1048 void br_aes_small_ctrcbc_init(br_aes_small_ctrcbc_keys *ctx,
1049 const void *key, size_t len);
1050
1051 /**
1052 * \brief CBC encryption with AES (`aes_small` implementation).
1053 *
1054 * \param ctx context (already initialised).
1055 * \param iv IV (updated).
1056 * \param data data to encrypt (updated).
1057 * \param len data length (in bytes, MUST be multiple of 16).
1058 */
1059 void br_aes_small_cbcenc_run(const br_aes_small_cbcenc_keys *ctx, void *iv,
1060 void *data, size_t len);
1061
1062 /**
1063 * \brief CBC decryption with AES (`aes_small` implementation).
1064 *
1065 * \param ctx context (already initialised).
1066 * \param iv IV (updated).
1067 * \param data data to decrypt (updated).
1068 * \param len data length (in bytes, MUST be multiple of 16).
1069 */
1070 void br_aes_small_cbcdec_run(const br_aes_small_cbcdec_keys *ctx, void *iv,
1071 void *data, size_t len);
1072
1073 /**
1074 * \brief CTR encryption and decryption with AES (`aes_small` implementation).
1075 *
1076 * \param ctx context (already initialised).
1077 * \param iv IV (constant, 12 bytes).
1078 * \param cc initial block counter value.
1079 * \param data data to decrypt (updated).
1080 * \param len data length (in bytes).
1081 * \return new block counter value.
1082 */
1083 uint32_t br_aes_small_ctr_run(const br_aes_small_ctr_keys *ctx,
1084 const void *iv, uint32_t cc, void *data, size_t len);
1085
1086 /**
1087 * \brief CTR encryption + CBC-MAC with AES (`aes_small` implementation).
1088 *
1089 * \param ctx context (already initialised).
1090 * \param ctr counter for CTR (16 bytes, updated).
1091 * \param cbcmac IV for CBC-MAC (updated).
1092 * \param data data to encrypt (updated).
1093 * \param len data length (in bytes, MUST be a multiple of 16).
1094 */
1095 void br_aes_small_ctrcbc_encrypt(const br_aes_small_ctrcbc_keys *ctx,
1096 void *ctr, void *cbcmac, void *data, size_t len);
1097
1098 /**
1099 * \brief CTR decryption + CBC-MAC with AES (`aes_small` implementation).
1100 *
1101 * \param ctx context (already initialised).
1102 * \param ctr counter for CTR (16 bytes, updated).
1103 * \param cbcmac IV for CBC-MAC (updated).
1104 * \param data data to decrypt (updated).
1105 * \param len data length (in bytes, MUST be a multiple of 16).
1106 */
1107 void br_aes_small_ctrcbc_decrypt(const br_aes_small_ctrcbc_keys *ctx,
1108 void *ctr, void *cbcmac, void *data, size_t len);
1109
1110 /**
1111 * \brief CTR encryption/decryption with AES (`aes_small` implementation).
1112 *
1113 * \param ctx context (already initialised).
1114 * \param ctr counter for CTR (16 bytes, updated).
1115 * \param data data to MAC (updated).
1116 * \param len data length (in bytes, MUST be a multiple of 16).
1117 */
1118 void br_aes_small_ctrcbc_ctr(const br_aes_small_ctrcbc_keys *ctx,
1119 void *ctr, void *data, size_t len);
1120
1121 /**
1122 * \brief CBC-MAC with AES (`aes_small` implementation).
1123 *
1124 * \param ctx context (already initialised).
1125 * \param cbcmac IV for CBC-MAC (updated).
1126 * \param data data to MAC (unmodified).
1127 * \param len data length (in bytes, MUST be a multiple of 16).
1128 */
1129 void br_aes_small_ctrcbc_mac(const br_aes_small_ctrcbc_keys *ctx,
1130 void *cbcmac, const void *data, size_t len);
1131
1132 /*
1133 * Constant-time AES implementation. Its size is similar to that of
1134 * 'aes_big', and its performance is similar to that of 'aes_small' (faster
1135 * decryption, slower encryption). However, it is constant-time, i.e.
1136 * immune to cache-timing and similar attacks.
1137 */
1138
1139 /** \brief AES block size (16 bytes). */
1140 #define br_aes_ct_BLOCK_SIZE 16
1141
1142 /**
1143 * \brief Context for AES subkeys (`aes_ct` implementation, CBC encryption).
1144 *
1145 * First field is a pointer to the vtable; it is set by the initialisation
1146 * function. Other fields are not supposed to be accessed by user code.
1147 */
1148 typedef struct {
1149 /** \brief Pointer to vtable for this context. */
1150 const br_block_cbcenc_class *vtable;
1151 #ifndef BR_DOXYGEN_IGNORE
1152 uint32_t skey[60];
1153 unsigned num_rounds;
1154 #endif
1155 } br_aes_ct_cbcenc_keys;
1156
1157 /**
1158 * \brief Context for AES subkeys (`aes_ct` implementation, CBC decryption).
1159 *
1160 * First field is a pointer to the vtable; it is set by the initialisation
1161 * function. Other fields are not supposed to be accessed by user code.
1162 */
1163 typedef struct {
1164 /** \brief Pointer to vtable for this context. */
1165 const br_block_cbcdec_class *vtable;
1166 #ifndef BR_DOXYGEN_IGNORE
1167 uint32_t skey[60];
1168 unsigned num_rounds;
1169 #endif
1170 } br_aes_ct_cbcdec_keys;
1171
1172 /**
1173 * \brief Context for AES subkeys (`aes_ct` implementation, CTR encryption
1174 * and decryption).
1175 *
1176 * First field is a pointer to the vtable; it is set by the initialisation
1177 * function. Other fields are not supposed to be accessed by user code.
1178 */
1179 typedef struct {
1180 /** \brief Pointer to vtable for this context. */
1181 const br_block_ctr_class *vtable;
1182 #ifndef BR_DOXYGEN_IGNORE
1183 uint32_t skey[60];
1184 unsigned num_rounds;
1185 #endif
1186 } br_aes_ct_ctr_keys;
1187
1188 /**
1189 * \brief Context for AES subkeys (`aes_ct` implementation, CTR encryption
1190 * and decryption + CBC-MAC).
1191 *
1192 * First field is a pointer to the vtable; it is set by the initialisation
1193 * function. Other fields are not supposed to be accessed by user code.
1194 */
1195 typedef struct {
1196 /** \brief Pointer to vtable for this context. */
1197 const br_block_ctrcbc_class *vtable;
1198 #ifndef BR_DOXYGEN_IGNORE
1199 uint32_t skey[60];
1200 unsigned num_rounds;
1201 #endif
1202 } br_aes_ct_ctrcbc_keys;
1203
1204 /**
1205 * \brief Class instance for AES CBC encryption (`aes_ct` implementation).
1206 */
1207 extern const br_block_cbcenc_class br_aes_ct_cbcenc_vtable;
1208
1209 /**
1210 * \brief Class instance for AES CBC decryption (`aes_ct` implementation).
1211 */
1212 extern const br_block_cbcdec_class br_aes_ct_cbcdec_vtable;
1213
1214 /**
1215 * \brief Class instance for AES CTR encryption and decryption
1216 * (`aes_ct` implementation).
1217 */
1218 extern const br_block_ctr_class br_aes_ct_ctr_vtable;
1219
1220 /**
1221 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
1222 * (`aes_ct` implementation).
1223 */
1224 extern const br_block_ctrcbc_class br_aes_ct_ctrcbc_vtable;
1225
1226 /**
1227 * \brief Context initialisation (key schedule) for AES CBC encryption
1228 * (`aes_ct` implementation).
1229 *
1230 * \param ctx context to initialise.
1231 * \param key secret key.
1232 * \param len secret key length (in bytes).
1233 */
1234 void br_aes_ct_cbcenc_init(br_aes_ct_cbcenc_keys *ctx,
1235 const void *key, size_t len);
1236
1237 /**
1238 * \brief Context initialisation (key schedule) for AES CBC decryption
1239 * (`aes_ct` implementation).
1240 *
1241 * \param ctx context to initialise.
1242 * \param key secret key.
1243 * \param len secret key length (in bytes).
1244 */
1245 void br_aes_ct_cbcdec_init(br_aes_ct_cbcdec_keys *ctx,
1246 const void *key, size_t len);
1247
1248 /**
1249 * \brief Context initialisation (key schedule) for AES CTR encryption
1250 * and decryption (`aes_ct` implementation).
1251 *
1252 * \param ctx context to initialise.
1253 * \param key secret key.
1254 * \param len secret key length (in bytes).
1255 */
1256 void br_aes_ct_ctr_init(br_aes_ct_ctr_keys *ctx,
1257 const void *key, size_t len);
1258
1259 /**
1260 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
1261 * (`aes_ct` implementation).
1262 *
1263 * \param ctx context to initialise.
1264 * \param key secret key.
1265 * \param len secret key length (in bytes).
1266 */
1267 void br_aes_ct_ctrcbc_init(br_aes_ct_ctrcbc_keys *ctx,
1268 const void *key, size_t len);
1269
1270 /**
1271 * \brief CBC encryption with AES (`aes_ct` implementation).
1272 *
1273 * \param ctx context (already initialised).
1274 * \param iv IV (updated).
1275 * \param data data to encrypt (updated).
1276 * \param len data length (in bytes, MUST be multiple of 16).
1277 */
1278 void br_aes_ct_cbcenc_run(const br_aes_ct_cbcenc_keys *ctx, void *iv,
1279 void *data, size_t len);
1280
1281 /**
1282 * \brief CBC decryption with AES (`aes_ct` implementation).
1283 *
1284 * \param ctx context (already initialised).
1285 * \param iv IV (updated).
1286 * \param data data to decrypt (updated).
1287 * \param len data length (in bytes, MUST be multiple of 16).
1288 */
1289 void br_aes_ct_cbcdec_run(const br_aes_ct_cbcdec_keys *ctx, void *iv,
1290 void *data, size_t len);
1291
1292 /**
1293 * \brief CTR encryption and decryption with AES (`aes_ct` implementation).
1294 *
1295 * \param ctx context (already initialised).
1296 * \param iv IV (constant, 12 bytes).
1297 * \param cc initial block counter value.
1298 * \param data data to decrypt (updated).
1299 * \param len data length (in bytes).
1300 * \return new block counter value.
1301 */
1302 uint32_t br_aes_ct_ctr_run(const br_aes_ct_ctr_keys *ctx,
1303 const void *iv, uint32_t cc, void *data, size_t len);
1304
1305 /**
1306 * \brief CTR encryption + CBC-MAC with AES (`aes_ct` implementation).
1307 *
1308 * \param ctx context (already initialised).
1309 * \param ctr counter for CTR (16 bytes, updated).
1310 * \param cbcmac IV for CBC-MAC (updated).
1311 * \param data data to encrypt (updated).
1312 * \param len data length (in bytes, MUST be a multiple of 16).
1313 */
1314 void br_aes_ct_ctrcbc_encrypt(const br_aes_ct_ctrcbc_keys *ctx,
1315 void *ctr, void *cbcmac, void *data, size_t len);
1316
1317 /**
1318 * \brief CTR decryption + CBC-MAC with AES (`aes_ct` implementation).
1319 *
1320 * \param ctx context (already initialised).
1321 * \param ctr counter for CTR (16 bytes, updated).
1322 * \param cbcmac IV for CBC-MAC (updated).
1323 * \param data data to decrypt (updated).
1324 * \param len data length (in bytes, MUST be a multiple of 16).
1325 */
1326 void br_aes_ct_ctrcbc_decrypt(const br_aes_ct_ctrcbc_keys *ctx,
1327 void *ctr, void *cbcmac, void *data, size_t len);
1328
1329 /**
1330 * \brief CTR encryption/decryption with AES (`aes_ct` implementation).
1331 *
1332 * \param ctx context (already initialised).
1333 * \param ctr counter for CTR (16 bytes, updated).
1334 * \param data data to MAC (updated).
1335 * \param len data length (in bytes, MUST be a multiple of 16).
1336 */
1337 void br_aes_ct_ctrcbc_ctr(const br_aes_ct_ctrcbc_keys *ctx,
1338 void *ctr, void *data, size_t len);
1339
1340 /**
1341 * \brief CBC-MAC with AES (`aes_ct` implementation).
1342 *
1343 * \param ctx context (already initialised).
1344 * \param cbcmac IV for CBC-MAC (updated).
1345 * \param data data to MAC (unmodified).
1346 * \param len data length (in bytes, MUST be a multiple of 16).
1347 */
1348 void br_aes_ct_ctrcbc_mac(const br_aes_ct_ctrcbc_keys *ctx,
1349 void *cbcmac, const void *data, size_t len);
1350
1351 /*
1352 * 64-bit constant-time AES implementation. It is similar to 'aes_ct'
1353 * but uses 64-bit registers, making it about twice faster than 'aes_ct'
1354 * on 64-bit platforms, while remaining constant-time and with a similar
1355 * code size. (The doubling in performance is only for CBC decryption
1356 * and CTR mode; CBC encryption is non-parallel and cannot benefit from
1357 * the larger registers.)
1358 */
1359
1360 /** \brief AES block size (16 bytes). */
1361 #define br_aes_ct64_BLOCK_SIZE 16
1362
1363 /**
1364 * \brief Context for AES subkeys (`aes_ct64` implementation, CBC encryption).
1365 *
1366 * First field is a pointer to the vtable; it is set by the initialisation
1367 * function. Other fields are not supposed to be accessed by user code.
1368 */
1369 typedef struct {
1370 /** \brief Pointer to vtable for this context. */
1371 const br_block_cbcenc_class *vtable;
1372 #ifndef BR_DOXYGEN_IGNORE
1373 uint64_t skey[30];
1374 unsigned num_rounds;
1375 #endif
1376 } br_aes_ct64_cbcenc_keys;
1377
1378 /**
1379 * \brief Context for AES subkeys (`aes_ct64` implementation, CBC decryption).
1380 *
1381 * First field is a pointer to the vtable; it is set by the initialisation
1382 * function. Other fields are not supposed to be accessed by user code.
1383 */
1384 typedef struct {
1385 /** \brief Pointer to vtable for this context. */
1386 const br_block_cbcdec_class *vtable;
1387 #ifndef BR_DOXYGEN_IGNORE
1388 uint64_t skey[30];
1389 unsigned num_rounds;
1390 #endif
1391 } br_aes_ct64_cbcdec_keys;
1392
1393 /**
1394 * \brief Context for AES subkeys (`aes_ct64` implementation, CTR encryption
1395 * and decryption).
1396 *
1397 * First field is a pointer to the vtable; it is set by the initialisation
1398 * function. Other fields are not supposed to be accessed by user code.
1399 */
1400 typedef struct {
1401 /** \brief Pointer to vtable for this context. */
1402 const br_block_ctr_class *vtable;
1403 #ifndef BR_DOXYGEN_IGNORE
1404 uint64_t skey[30];
1405 unsigned num_rounds;
1406 #endif
1407 } br_aes_ct64_ctr_keys;
1408
1409 /**
1410 * \brief Context for AES subkeys (`aes_ct64` implementation, CTR encryption
1411 * and decryption + CBC-MAC).
1412 *
1413 * First field is a pointer to the vtable; it is set by the initialisation
1414 * function. Other fields are not supposed to be accessed by user code.
1415 */
1416 typedef struct {
1417 /** \brief Pointer to vtable for this context. */
1418 const br_block_ctrcbc_class *vtable;
1419 #ifndef BR_DOXYGEN_IGNORE
1420 uint64_t skey[30];
1421 unsigned num_rounds;
1422 #endif
1423 } br_aes_ct64_ctrcbc_keys;
1424
1425 /**
1426 * \brief Class instance for AES CBC encryption (`aes_ct64` implementation).
1427 */
1428 extern const br_block_cbcenc_class br_aes_ct64_cbcenc_vtable;
1429
1430 /**
1431 * \brief Class instance for AES CBC decryption (`aes_ct64` implementation).
1432 */
1433 extern const br_block_cbcdec_class br_aes_ct64_cbcdec_vtable;
1434
1435 /**
1436 * \brief Class instance for AES CTR encryption and decryption
1437 * (`aes_ct64` implementation).
1438 */
1439 extern const br_block_ctr_class br_aes_ct64_ctr_vtable;
1440
1441 /**
1442 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
1443 * (`aes_ct64` implementation).
1444 */
1445 extern const br_block_ctrcbc_class br_aes_ct64_ctrcbc_vtable;
1446
1447 /**
1448 * \brief Context initialisation (key schedule) for AES CBC encryption
1449 * (`aes_ct64` implementation).
1450 *
1451 * \param ctx context to initialise.
1452 * \param key secret key.
1453 * \param len secret key length (in bytes).
1454 */
1455 void br_aes_ct64_cbcenc_init(br_aes_ct64_cbcenc_keys *ctx,
1456 const void *key, size_t len);
1457
1458 /**
1459 * \brief Context initialisation (key schedule) for AES CBC decryption
1460 * (`aes_ct64` implementation).
1461 *
1462 * \param ctx context to initialise.
1463 * \param key secret key.
1464 * \param len secret key length (in bytes).
1465 */
1466 void br_aes_ct64_cbcdec_init(br_aes_ct64_cbcdec_keys *ctx,
1467 const void *key, size_t len);
1468
1469 /**
1470 * \brief Context initialisation (key schedule) for AES CTR encryption
1471 * and decryption (`aes_ct64` implementation).
1472 *
1473 * \param ctx context to initialise.
1474 * \param key secret key.
1475 * \param len secret key length (in bytes).
1476 */
1477 void br_aes_ct64_ctr_init(br_aes_ct64_ctr_keys *ctx,
1478 const void *key, size_t len);
1479
1480 /**
1481 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
1482 * (`aes_ct64` implementation).
1483 *
1484 * \param ctx context to initialise.
1485 * \param key secret key.
1486 * \param len secret key length (in bytes).
1487 */
1488 void br_aes_ct64_ctrcbc_init(br_aes_ct64_ctrcbc_keys *ctx,
1489 const void *key, size_t len);
1490
1491 /**
1492 * \brief CBC encryption with AES (`aes_ct64` implementation).
1493 *
1494 * \param ctx context (already initialised).
1495 * \param iv IV (updated).
1496 * \param data data to encrypt (updated).
1497 * \param len data length (in bytes, MUST be multiple of 16).
1498 */
1499 void br_aes_ct64_cbcenc_run(const br_aes_ct64_cbcenc_keys *ctx, void *iv,
1500 void *data, size_t len);
1501
1502 /**
1503 * \brief CBC decryption with AES (`aes_ct64` implementation).
1504 *
1505 * \param ctx context (already initialised).
1506 * \param iv IV (updated).
1507 * \param data data to decrypt (updated).
1508 * \param len data length (in bytes, MUST be multiple of 16).
1509 */
1510 void br_aes_ct64_cbcdec_run(const br_aes_ct64_cbcdec_keys *ctx, void *iv,
1511 void *data, size_t len);
1512
1513 /**
1514 * \brief CTR encryption and decryption with AES (`aes_ct64` implementation).
1515 *
1516 * \param ctx context (already initialised).
1517 * \param iv IV (constant, 12 bytes).
1518 * \param cc initial block counter value.
1519 * \param data data to decrypt (updated).
1520 * \param len data length (in bytes).
1521 * \return new block counter value.
1522 */
1523 uint32_t br_aes_ct64_ctr_run(const br_aes_ct64_ctr_keys *ctx,
1524 const void *iv, uint32_t cc, void *data, size_t len);
1525
1526 /**
1527 * \brief CTR encryption + CBC-MAC with AES (`aes_ct64` implementation).
1528 *
1529 * \param ctx context (already initialised).
1530 * \param ctr counter for CTR (16 bytes, updated).
1531 * \param cbcmac IV for CBC-MAC (updated).
1532 * \param data data to encrypt (updated).
1533 * \param len data length (in bytes, MUST be a multiple of 16).
1534 */
1535 void br_aes_ct64_ctrcbc_encrypt(const br_aes_ct64_ctrcbc_keys *ctx,
1536 void *ctr, void *cbcmac, void *data, size_t len);
1537
1538 /**
1539 * \brief CTR decryption + CBC-MAC with AES (`aes_ct64` implementation).
1540 *
1541 * \param ctx context (already initialised).
1542 * \param ctr counter for CTR (16 bytes, updated).
1543 * \param cbcmac IV for CBC-MAC (updated).
1544 * \param data data to decrypt (updated).
1545 * \param len data length (in bytes, MUST be a multiple of 16).
1546 */
1547 void br_aes_ct64_ctrcbc_decrypt(const br_aes_ct64_ctrcbc_keys *ctx,
1548 void *ctr, void *cbcmac, void *data, size_t len);
1549
1550 /**
1551 * \brief CTR encryption/decryption with AES (`aes_ct64` implementation).
1552 *
1553 * \param ctx context (already initialised).
1554 * \param ctr counter for CTR (16 bytes, updated).
1555 * \param data data to MAC (updated).
1556 * \param len data length (in bytes, MUST be a multiple of 16).
1557 */
1558 void br_aes_ct64_ctrcbc_ctr(const br_aes_ct64_ctrcbc_keys *ctx,
1559 void *ctr, void *data, size_t len);
1560
1561 /**
1562 * \brief CBC-MAC with AES (`aes_ct64` implementation).
1563 *
1564 * \param ctx context (already initialised).
1565 * \param cbcmac IV for CBC-MAC (updated).
1566 * \param data data to MAC (unmodified).
1567 * \param len data length (in bytes, MUST be a multiple of 16).
1568 */
1569 void br_aes_ct64_ctrcbc_mac(const br_aes_ct64_ctrcbc_keys *ctx,
1570 void *cbcmac, const void *data, size_t len);
1571
1572 /*
1573 * AES implementation using AES-NI opcodes (x86 platform).
1574 */
1575
1576 /** \brief AES block size (16 bytes). */
1577 #define br_aes_x86ni_BLOCK_SIZE 16
1578
1579 /**
1580 * \brief Context for AES subkeys (`aes_x86ni` implementation, CBC encryption).
1581 *
1582 * First field is a pointer to the vtable; it is set by the initialisation
1583 * function. Other fields are not supposed to be accessed by user code.
1584 */
1585 typedef struct {
1586 /** \brief Pointer to vtable for this context. */
1587 const br_block_cbcenc_class *vtable;
1588 #ifndef BR_DOXYGEN_IGNORE
1589 union {
1590 unsigned char skni[16 * 15];
1591 } skey;
1592 unsigned num_rounds;
1593 #endif
1594 } br_aes_x86ni_cbcenc_keys;
1595
1596 /**
1597 * \brief Context for AES subkeys (`aes_x86ni` implementation, CBC decryption).
1598 *
1599 * First field is a pointer to the vtable; it is set by the initialisation
1600 * function. Other fields are not supposed to be accessed by user code.
1601 */
1602 typedef struct {
1603 /** \brief Pointer to vtable for this context. */
1604 const br_block_cbcdec_class *vtable;
1605 #ifndef BR_DOXYGEN_IGNORE
1606 union {
1607 unsigned char skni[16 * 15];
1608 } skey;
1609 unsigned num_rounds;
1610 #endif
1611 } br_aes_x86ni_cbcdec_keys;
1612
1613 /**
1614 * \brief Context for AES subkeys (`aes_x86ni` implementation, CTR encryption
1615 * and decryption).
1616 *
1617 * First field is a pointer to the vtable; it is set by the initialisation
1618 * function. Other fields are not supposed to be accessed by user code.
1619 */
1620 typedef struct {
1621 /** \brief Pointer to vtable for this context. */
1622 const br_block_ctr_class *vtable;
1623 #ifndef BR_DOXYGEN_IGNORE
1624 union {
1625 unsigned char skni[16 * 15];
1626 } skey;
1627 unsigned num_rounds;
1628 #endif
1629 } br_aes_x86ni_ctr_keys;
1630
1631 /**
1632 * \brief Context for AES subkeys (`aes_x86ni` implementation, CTR encryption
1633 * and decryption + CBC-MAC).
1634 *
1635 * First field is a pointer to the vtable; it is set by the initialisation
1636 * function. Other fields are not supposed to be accessed by user code.
1637 */
1638 typedef struct {
1639 /** \brief Pointer to vtable for this context. */
1640 const br_block_ctrcbc_class *vtable;
1641 #ifndef BR_DOXYGEN_IGNORE
1642 union {
1643 unsigned char skni[16 * 15];
1644 } skey;
1645 unsigned num_rounds;
1646 #endif
1647 } br_aes_x86ni_ctrcbc_keys;
1648
1649 /**
1650 * \brief Class instance for AES CBC encryption (`aes_x86ni` implementation).
1651 *
1652 * Since this implementation might be omitted from the library, or the
1653 * AES opcode unavailable on the current CPU, a pointer to this class
1654 * instance should be obtained through `br_aes_x86ni_cbcenc_get_vtable()`.
1655 */
1656 extern const br_block_cbcenc_class br_aes_x86ni_cbcenc_vtable;
1657
1658 /**
1659 * \brief Class instance for AES CBC decryption (`aes_x86ni` implementation).
1660 *
1661 * Since this implementation might be omitted from the library, or the
1662 * AES opcode unavailable on the current CPU, a pointer to this class
1663 * instance should be obtained through `br_aes_x86ni_cbcdec_get_vtable()`.
1664 */
1665 extern const br_block_cbcdec_class br_aes_x86ni_cbcdec_vtable;
1666
1667 /**
1668 * \brief Class instance for AES CTR encryption and decryption
1669 * (`aes_x86ni` implementation).
1670 *
1671 * Since this implementation might be omitted from the library, or the
1672 * AES opcode unavailable on the current CPU, a pointer to this class
1673 * instance should be obtained through `br_aes_x86ni_ctr_get_vtable()`.
1674 */
1675 extern const br_block_ctr_class br_aes_x86ni_ctr_vtable;
1676
1677 /**
1678 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
1679 * (`aes_x86ni` implementation).
1680 *
1681 * Since this implementation might be omitted from the library, or the
1682 * AES opcode unavailable on the current CPU, a pointer to this class
1683 * instance should be obtained through `br_aes_x86ni_ctrcbc_get_vtable()`.
1684 */
1685 extern const br_block_ctrcbc_class br_aes_x86ni_ctrcbc_vtable;
1686
1687 /**
1688 * \brief Context initialisation (key schedule) for AES CBC encryption
1689 * (`aes_x86ni` implementation).
1690 *
1691 * \param ctx context to initialise.
1692 * \param key secret key.
1693 * \param len secret key length (in bytes).
1694 */
1695 void br_aes_x86ni_cbcenc_init(br_aes_x86ni_cbcenc_keys *ctx,
1696 const void *key, size_t len);
1697
1698 /**
1699 * \brief Context initialisation (key schedule) for AES CBC decryption
1700 * (`aes_x86ni` implementation).
1701 *
1702 * \param ctx context to initialise.
1703 * \param key secret key.
1704 * \param len secret key length (in bytes).
1705 */
1706 void br_aes_x86ni_cbcdec_init(br_aes_x86ni_cbcdec_keys *ctx,
1707 const void *key, size_t len);
1708
1709 /**
1710 * \brief Context initialisation (key schedule) for AES CTR encryption
1711 * and decryption (`aes_x86ni` implementation).
1712 *
1713 * \param ctx context to initialise.
1714 * \param key secret key.
1715 * \param len secret key length (in bytes).
1716 */
1717 void br_aes_x86ni_ctr_init(br_aes_x86ni_ctr_keys *ctx,
1718 const void *key, size_t len);
1719
1720 /**
1721 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
1722 * (`aes_x86ni` implementation).
1723 *
1724 * \param ctx context to initialise.
1725 * \param key secret key.
1726 * \param len secret key length (in bytes).
1727 */
1728 void br_aes_x86ni_ctrcbc_init(br_aes_x86ni_ctrcbc_keys *ctx,
1729 const void *key, size_t len);
1730
1731 /**
1732 * \brief CBC encryption with AES (`aes_x86ni` implementation).
1733 *
1734 * \param ctx context (already initialised).
1735 * \param iv IV (updated).
1736 * \param data data to encrypt (updated).
1737 * \param len data length (in bytes, MUST be multiple of 16).
1738 */
1739 void br_aes_x86ni_cbcenc_run(const br_aes_x86ni_cbcenc_keys *ctx, void *iv,
1740 void *data, size_t len);
1741
1742 /**
1743 * \brief CBC decryption with AES (`aes_x86ni` implementation).
1744 *
1745 * \param ctx context (already initialised).
1746 * \param iv IV (updated).
1747 * \param data data to decrypt (updated).
1748 * \param len data length (in bytes, MUST be multiple of 16).
1749 */
1750 void br_aes_x86ni_cbcdec_run(const br_aes_x86ni_cbcdec_keys *ctx, void *iv,
1751 void *data, size_t len);
1752
1753 /**
1754 * \brief CTR encryption and decryption with AES (`aes_x86ni` implementation).
1755 *
1756 * \param ctx context (already initialised).
1757 * \param iv IV (constant, 12 bytes).
1758 * \param cc initial block counter value.
1759 * \param data data to decrypt (updated).
1760 * \param len data length (in bytes).
1761 * \return new block counter value.
1762 */
1763 uint32_t br_aes_x86ni_ctr_run(const br_aes_x86ni_ctr_keys *ctx,
1764 const void *iv, uint32_t cc, void *data, size_t len);
1765
1766 /**
1767 * \brief CTR encryption + CBC-MAC with AES (`aes_x86ni` implementation).
1768 *
1769 * \param ctx context (already initialised).
1770 * \param ctr counter for CTR (16 bytes, updated).
1771 * \param cbcmac IV for CBC-MAC (updated).
1772 * \param data data to encrypt (updated).
1773 * \param len data length (in bytes, MUST be a multiple of 16).
1774 */
1775 void br_aes_x86ni_ctrcbc_encrypt(const br_aes_x86ni_ctrcbc_keys *ctx,
1776 void *ctr, void *cbcmac, void *data, size_t len);
1777
1778 /**
1779 * \brief CTR decryption + CBC-MAC with AES (`aes_x86ni` implementation).
1780 *
1781 * \param ctx context (already initialised).
1782 * \param ctr counter for CTR (16 bytes, updated).
1783 * \param cbcmac IV for CBC-MAC (updated).
1784 * \param data data to decrypt (updated).
1785 * \param len data length (in bytes, MUST be a multiple of 16).
1786 */
1787 void br_aes_x86ni_ctrcbc_decrypt(const br_aes_x86ni_ctrcbc_keys *ctx,
1788 void *ctr, void *cbcmac, void *data, size_t len);
1789
1790 /**
1791 * \brief CTR encryption/decryption with AES (`aes_x86ni` implementation).
1792 *
1793 * \param ctx context (already initialised).
1794 * \param ctr counter for CTR (16 bytes, updated).
1795 * \param data data to MAC (updated).
1796 * \param len data length (in bytes, MUST be a multiple of 16).
1797 */
1798 void br_aes_x86ni_ctrcbc_ctr(const br_aes_x86ni_ctrcbc_keys *ctx,
1799 void *ctr, void *data, size_t len);
1800
1801 /**
1802 * \brief CBC-MAC with AES (`aes_x86ni` implementation).
1803 *
1804 * \param ctx context (already initialised).
1805 * \param cbcmac IV for CBC-MAC (updated).
1806 * \param data data to MAC (unmodified).
1807 * \param len data length (in bytes, MUST be a multiple of 16).
1808 */
1809 void br_aes_x86ni_ctrcbc_mac(const br_aes_x86ni_ctrcbc_keys *ctx,
1810 void *cbcmac, const void *data, size_t len);
1811
1812 /**
1813 * \brief Obtain the `aes_x86ni` AES-CBC (encryption) implementation, if
1814 * available.
1815 *
1816 * This function returns a pointer to `br_aes_x86ni_cbcenc_vtable`, if
1817 * that implementation was compiled in the library _and_ the x86 AES
1818 * opcodes are available on the currently running CPU. If either of
1819 * these conditions is not met, then this function returns `NULL`.
1820 *
1821 * \return the `aes_x86ni` AES-CBC (encryption) implementation, or `NULL`.
1822 */
1823 const br_block_cbcenc_class *br_aes_x86ni_cbcenc_get_vtable(void);
1824
1825 /**
1826 * \brief Obtain the `aes_x86ni` AES-CBC (decryption) implementation, if
1827 * available.
1828 *
1829 * This function returns a pointer to `br_aes_x86ni_cbcdec_vtable`, if
1830 * that implementation was compiled in the library _and_ the x86 AES
1831 * opcodes are available on the currently running CPU. If either of
1832 * these conditions is not met, then this function returns `NULL`.
1833 *
1834 * \return the `aes_x86ni` AES-CBC (decryption) implementation, or `NULL`.
1835 */
1836 const br_block_cbcdec_class *br_aes_x86ni_cbcdec_get_vtable(void);
1837
1838 /**
1839 * \brief Obtain the `aes_x86ni` AES-CTR implementation, if available.
1840 *
1841 * This function returns a pointer to `br_aes_x86ni_ctr_vtable`, if
1842 * that implementation was compiled in the library _and_ the x86 AES
1843 * opcodes are available on the currently running CPU. If either of
1844 * these conditions is not met, then this function returns `NULL`.
1845 *
1846 * \return the `aes_x86ni` AES-CTR implementation, or `NULL`.
1847 */
1848 const br_block_ctr_class *br_aes_x86ni_ctr_get_vtable(void);
1849
1850 /**
1851 * \brief Obtain the `aes_x86ni` AES-CTR + CBC-MAC implementation, if
1852 * available.
1853 *
1854 * This function returns a pointer to `br_aes_x86ni_ctrcbc_vtable`, if
1855 * that implementation was compiled in the library _and_ the x86 AES
1856 * opcodes are available on the currently running CPU. If either of
1857 * these conditions is not met, then this function returns `NULL`.
1858 *
1859 * \return the `aes_x86ni` AES-CTR implementation, or `NULL`.
1860 */
1861 const br_block_ctrcbc_class *br_aes_x86ni_ctrcbc_get_vtable(void);
1862
1863 /*
1864 * AES implementation using POWER8 opcodes.
1865 */
1866
1867 /** \brief AES block size (16 bytes). */
1868 #define br_aes_pwr8_BLOCK_SIZE 16
1869
1870 /**
1871 * \brief Context for AES subkeys (`aes_pwr8` implementation, CBC encryption).
1872 *
1873 * First field is a pointer to the vtable; it is set by the initialisation
1874 * function. Other fields are not supposed to be accessed by user code.
1875 */
1876 typedef struct {
1877 /** \brief Pointer to vtable for this context. */
1878 const br_block_cbcenc_class *vtable;
1879 #ifndef BR_DOXYGEN_IGNORE
1880 union {
1881 unsigned char skni[16 * 15];
1882 } skey;
1883 unsigned num_rounds;
1884 #endif
1885 } br_aes_pwr8_cbcenc_keys;
1886
1887 /**
1888 * \brief Context for AES subkeys (`aes_pwr8` implementation, CBC decryption).
1889 *
1890 * First field is a pointer to the vtable; it is set by the initialisation
1891 * function. Other fields are not supposed to be accessed by user code.
1892 */
1893 typedef struct {
1894 /** \brief Pointer to vtable for this context. */
1895 const br_block_cbcdec_class *vtable;
1896 #ifndef BR_DOXYGEN_IGNORE
1897 union {
1898 unsigned char skni[16 * 15];
1899 } skey;
1900 unsigned num_rounds;
1901 #endif
1902 } br_aes_pwr8_cbcdec_keys;
1903
1904 /**
1905 * \brief Context for AES subkeys (`aes_pwr8` implementation, CTR encryption
1906 * and decryption).
1907 *
1908 * First field is a pointer to the vtable; it is set by the initialisation
1909 * function. Other fields are not supposed to be accessed by user code.
1910 */
1911 typedef struct {
1912 /** \brief Pointer to vtable for this context. */
1913 const br_block_ctr_class *vtable;
1914 #ifndef BR_DOXYGEN_IGNORE
1915 union {
1916 unsigned char skni[16 * 15];
1917 } skey;
1918 unsigned num_rounds;
1919 #endif
1920 } br_aes_pwr8_ctr_keys;
1921
1922 /**
1923 * \brief Context for AES subkeys (`aes_pwr8` implementation, CTR encryption
1924 * and decryption + CBC-MAC).
1925 *
1926 * First field is a pointer to the vtable; it is set by the initialisation
1927 * function. Other fields are not supposed to be accessed by user code.
1928 */
1929 typedef struct {
1930 /** \brief Pointer to vtable for this context. */
1931 const br_block_ctrcbc_class *vtable;
1932 #ifndef BR_DOXYGEN_IGNORE
1933 union {
1934 unsigned char skni[16 * 15];
1935 } skey;
1936 unsigned num_rounds;
1937 #endif
1938 } br_aes_pwr8_ctrcbc_keys;
1939
1940 /**
1941 * \brief Class instance for AES CBC encryption (`aes_pwr8` implementation).
1942 *
1943 * Since this implementation might be omitted from the library, or the
1944 * AES opcode unavailable on the current CPU, a pointer to this class
1945 * instance should be obtained through `br_aes_pwr8_cbcenc_get_vtable()`.
1946 */
1947 extern const br_block_cbcenc_class br_aes_pwr8_cbcenc_vtable;
1948
1949 /**
1950 * \brief Class instance for AES CBC decryption (`aes_pwr8` implementation).
1951 *
1952 * Since this implementation might be omitted from the library, or the
1953 * AES opcode unavailable on the current CPU, a pointer to this class
1954 * instance should be obtained through `br_aes_pwr8_cbcdec_get_vtable()`.
1955 */
1956 extern const br_block_cbcdec_class br_aes_pwr8_cbcdec_vtable;
1957
1958 /**
1959 * \brief Class instance for AES CTR encryption and decryption
1960 * (`aes_pwr8` implementation).
1961 *
1962 * Since this implementation might be omitted from the library, or the
1963 * AES opcode unavailable on the current CPU, a pointer to this class
1964 * instance should be obtained through `br_aes_pwr8_ctr_get_vtable()`.
1965 */
1966 extern const br_block_ctr_class br_aes_pwr8_ctr_vtable;
1967
1968 /**
1969 * \brief Class instance for AES CTR encryption/decryption + CBC-MAC
1970 * (`aes_pwr8` implementation).
1971 *
1972 * Since this implementation might be omitted from the library, or the
1973 * AES opcode unavailable on the current CPU, a pointer to this class
1974 * instance should be obtained through `br_aes_pwr8_ctrcbc_get_vtable()`.
1975 */
1976 extern const br_block_ctrcbc_class br_aes_pwr8_ctrcbc_vtable;
1977
1978 /**
1979 * \brief Context initialisation (key schedule) for AES CBC encryption
1980 * (`aes_pwr8` implementation).
1981 *
1982 * \param ctx context to initialise.
1983 * \param key secret key.
1984 * \param len secret key length (in bytes).
1985 */
1986 void br_aes_pwr8_cbcenc_init(br_aes_pwr8_cbcenc_keys *ctx,
1987 const void *key, size_t len);
1988
1989 /**
1990 * \brief Context initialisation (key schedule) for AES CBC decryption
1991 * (`aes_pwr8` implementation).
1992 *
1993 * \param ctx context to initialise.
1994 * \param key secret key.
1995 * \param len secret key length (in bytes).
1996 */
1997 void br_aes_pwr8_cbcdec_init(br_aes_pwr8_cbcdec_keys *ctx,
1998 const void *key, size_t len);
1999
2000 /**
2001 * \brief Context initialisation (key schedule) for AES CTR encryption
2002 * and decryption (`aes_pwr8` implementation).
2003 *
2004 * \param ctx context to initialise.
2005 * \param key secret key.
2006 * \param len secret key length (in bytes).
2007 */
2008 void br_aes_pwr8_ctr_init(br_aes_pwr8_ctr_keys *ctx,
2009 const void *key, size_t len);
2010
2011 /**
2012 * \brief Context initialisation (key schedule) for AES CTR + CBC-MAC
2013 * (`aes_pwr8` implementation).
2014 *
2015 * \param ctx context to initialise.
2016 * \param key secret key.
2017 * \param len secret key length (in bytes).
2018 */
2019 void br_aes_pwr8_ctrcbc_init(br_aes_pwr8_ctrcbc_keys *ctx,
2020 const void *key, size_t len);
2021
2022 /**
2023 * \brief CBC encryption with AES (`aes_pwr8` implementation).
2024 *
2025 * \param ctx context (already initialised).
2026 * \param iv IV (updated).
2027 * \param data data to encrypt (updated).
2028 * \param len data length (in bytes, MUST be multiple of 16).
2029 */
2030 void br_aes_pwr8_cbcenc_run(const br_aes_pwr8_cbcenc_keys *ctx, void *iv,
2031 void *data, size_t len);
2032
2033 /**
2034 * \brief CBC decryption with AES (`aes_pwr8` implementation).
2035 *
2036 * \param ctx context (already initialised).
2037 * \param iv IV (updated).
2038 * \param data data to decrypt (updated).
2039 * \param len data length (in bytes, MUST be multiple of 16).
2040 */
2041 void br_aes_pwr8_cbcdec_run(const br_aes_pwr8_cbcdec_keys *ctx, void *iv,
2042 void *data, size_t len);
2043
2044 /**
2045 * \brief CTR encryption and decryption with AES (`aes_pwr8` implementation).
2046 *
2047 * \param ctx context (already initialised).
2048 * \param iv IV (constant, 12 bytes).
2049 * \param cc initial block counter value.
2050 * \param data data to decrypt (updated).
2051 * \param len data length (in bytes).
2052 * \return new block counter value.
2053 */
2054 uint32_t br_aes_pwr8_ctr_run(const br_aes_pwr8_ctr_keys *ctx,
2055 const void *iv, uint32_t cc, void *data, size_t len);
2056
2057 /**
2058 * \brief CTR encryption + CBC-MAC with AES (`aes_pwr8` implementation).
2059 *
2060 * \param ctx context (already initialised).
2061 * \param ctr counter for CTR (16 bytes, updated).
2062 * \param cbcmac IV for CBC-MAC (updated).
2063 * \param data data to encrypt (updated).
2064 * \param len data length (in bytes, MUST be a multiple of 16).
2065 */
2066 void br_aes_pwr8_ctrcbc_encrypt(const br_aes_pwr8_ctrcbc_keys *ctx,
2067 void *ctr, void *cbcmac, void *data, size_t len);
2068
2069 /**
2070 * \brief CTR decryption + CBC-MAC with AES (`aes_pwr8` implementation).
2071 *
2072 * \param ctx context (already initialised).
2073 * \param ctr counter for CTR (16 bytes, updated).
2074 * \param cbcmac IV for CBC-MAC (updated).
2075 * \param data data to decrypt (updated).
2076 * \param len data length (in bytes, MUST be a multiple of 16).
2077 */
2078 void br_aes_pwr8_ctrcbc_decrypt(const br_aes_pwr8_ctrcbc_keys *ctx,
2079 void *ctr, void *cbcmac, void *data, size_t len);
2080
2081 /**
2082 * \brief CTR encryption/decryption with AES (`aes_pwr8` implementation).
2083 *
2084 * \param ctx context (already initialised).
2085 * \param ctr counter for CTR (16 bytes, updated).
2086 * \param data data to MAC (updated).
2087 * \param len data length (in bytes, MUST be a multiple of 16).
2088 */
2089 void br_aes_pwr8_ctrcbc_ctr(const br_aes_pwr8_ctrcbc_keys *ctx,
2090 void *ctr, void *data, size_t len);
2091
2092 /**
2093 * \brief CBC-MAC with AES (`aes_pwr8` implementation).
2094 *
2095 * \param ctx context (already initialised).
2096 * \param cbcmac IV for CBC-MAC (updated).
2097 * \param data data to MAC (unmodified).
2098 * \param len data length (in bytes, MUST be a multiple of 16).
2099 */
2100 void br_aes_pwr8_ctrcbc_mac(const br_aes_pwr8_ctrcbc_keys *ctx,
2101 void *cbcmac, const void *data, size_t len);
2102
2103 /**
2104 * \brief Obtain the `aes_pwr8` AES-CBC (encryption) implementation, if
2105 * available.
2106 *
2107 * This function returns a pointer to `br_aes_pwr8_cbcenc_vtable`, if
2108 * that implementation was compiled in the library _and_ the POWER8
2109 * crypto opcodes are available on the currently running CPU. If either
2110 * of these conditions is not met, then this function returns `NULL`.
2111 *
2112 * \return the `aes_pwr8` AES-CBC (encryption) implementation, or `NULL`.
2113 */
2114 const br_block_cbcenc_class *br_aes_pwr8_cbcenc_get_vtable(void);
2115
2116 /**
2117 * \brief Obtain the `aes_pwr8` AES-CBC (decryption) implementation, if
2118 * available.
2119 *
2120 * This function returns a pointer to `br_aes_pwr8_cbcdec_vtable`, if
2121 * that implementation was compiled in the library _and_ the POWER8
2122 * crypto opcodes are available on the currently running CPU. If either
2123 * of these conditions is not met, then this function returns `NULL`.
2124 *
2125 * \return the `aes_pwr8` AES-CBC (decryption) implementation, or `NULL`.
2126 */
2127 const br_block_cbcdec_class *br_aes_pwr8_cbcdec_get_vtable(void);
2128
2129 /**
2130 * \brief Obtain the `aes_pwr8` AES-CTR implementation, if available.
2131 *
2132 * This function returns a pointer to `br_aes_pwr8_ctr_vtable`, if that
2133 * implementation was compiled in the library _and_ the POWER8 crypto
2134 * opcodes are available on the currently running CPU. If either of
2135 * these conditions is not met, then this function returns `NULL`.
2136 *
2137 * \return the `aes_pwr8` AES-CTR implementation, or `NULL`.
2138 */
2139 const br_block_ctr_class *br_aes_pwr8_ctr_get_vtable(void);
2140
2141 /**
2142 * \brief Obtain the `aes_pwr8` AES-CTR + CBC-MAC implementation, if
2143 * available.
2144 *
2145 * This function returns a pointer to `br_aes_pwr8_ctrcbc_vtable`, if
2146 * that implementation was compiled in the library _and_ the POWER8 AES
2147 * opcodes are available on the currently running CPU. If either of
2148 * these conditions is not met, then this function returns `NULL`.
2149 *
2150 * \return the `aes_pwr8` AES-CTR implementation, or `NULL`.
2151 */
2152 const br_block_ctrcbc_class *br_aes_pwr8_ctrcbc_get_vtable(void);
2153
2154 /**
2155 * \brief Aggregate structure large enough to be used as context for
2156 * subkeys (CBC encryption) for all AES implementations.
2157 */
2158 typedef union {
2159 const br_block_cbcenc_class *vtable;
2160 br_aes_big_cbcenc_keys c_big;
2161 br_aes_small_cbcenc_keys c_small;
2162 br_aes_ct_cbcenc_keys c_ct;
2163 br_aes_ct64_cbcenc_keys c_ct64;
2164 br_aes_x86ni_cbcenc_keys c_x86ni;
2165 br_aes_pwr8_cbcenc_keys c_pwr8;
2166 } br_aes_gen_cbcenc_keys;
2167
2168 /**
2169 * \brief Aggregate structure large enough to be used as context for
2170 * subkeys (CBC decryption) for all AES implementations.
2171 */
2172 typedef union {
2173 const br_block_cbcdec_class *vtable;
2174 br_aes_big_cbcdec_keys c_big;
2175 br_aes_small_cbcdec_keys c_small;
2176 br_aes_ct_cbcdec_keys c_ct;
2177 br_aes_ct64_cbcdec_keys c_ct64;
2178 br_aes_x86ni_cbcdec_keys c_x86ni;
2179 br_aes_pwr8_cbcdec_keys c_pwr8;
2180 } br_aes_gen_cbcdec_keys;
2181
2182 /**
2183 * \brief Aggregate structure large enough to be used as context for
2184 * subkeys (CTR encryption and decryption) for all AES implementations.
2185 */
2186 typedef union {
2187 const br_block_ctr_class *vtable;
2188 br_aes_big_ctr_keys c_big;
2189 br_aes_small_ctr_keys c_small;
2190 br_aes_ct_ctr_keys c_ct;
2191 br_aes_ct64_ctr_keys c_ct64;
2192 br_aes_x86ni_ctr_keys c_x86ni;
2193 br_aes_pwr8_ctr_keys c_pwr8;
2194 } br_aes_gen_ctr_keys;
2195
2196 /**
2197 * \brief Aggregate structure large enough to be used as context for
2198 * subkeys (CTR encryption/decryption + CBC-MAC) for all AES implementations.
2199 */
2200 typedef union {
2201 const br_block_ctrcbc_class *vtable;
2202 br_aes_big_ctrcbc_keys c_big;
2203 br_aes_small_ctrcbc_keys c_small;
2204 br_aes_ct_ctrcbc_keys c_ct;
2205 br_aes_ct64_ctrcbc_keys c_ct64;
2206 br_aes_x86ni_ctrcbc_keys c_x86ni;
2207 br_aes_pwr8_ctrcbc_keys c_pwr8;
2208 } br_aes_gen_ctrcbc_keys;
2209
2210 /*
2211 * Traditional, table-based implementation for DES/3DES. Since tables are
2212 * used, cache-timing attacks are conceptually possible.
2213 */
2214
2215 /** \brief DES/3DES block size (8 bytes). */
2216 #define br_des_tab_BLOCK_SIZE 8
2217
2218 /**
2219 * \brief Context for DES subkeys (`des_tab` implementation, CBC encryption).
2220 *
2221 * First field is a pointer to the vtable; it is set by the initialisation
2222 * function. Other fields are not supposed to be accessed by user code.
2223 */
2224 typedef struct {
2225 /** \brief Pointer to vtable for this context. */
2226 const br_block_cbcenc_class *vtable;
2227 #ifndef BR_DOXYGEN_IGNORE
2228 uint32_t skey[96];
2229 unsigned num_rounds;
2230 #endif
2231 } br_des_tab_cbcenc_keys;
2232
2233 /**
2234 * \brief Context for DES subkeys (`des_tab` implementation, CBC decryption).
2235 *
2236 * First field is a pointer to the vtable; it is set by the initialisation
2237 * function. Other fields are not supposed to be accessed by user code.
2238 */
2239 typedef struct {
2240 /** \brief Pointer to vtable for this context. */
2241 const br_block_cbcdec_class *vtable;
2242 #ifndef BR_DOXYGEN_IGNORE
2243 uint32_t skey[96];
2244 unsigned num_rounds;
2245 #endif
2246 } br_des_tab_cbcdec_keys;
2247
2248 /**
2249 * \brief Class instance for DES CBC encryption (`des_tab` implementation).
2250 */
2251 extern const br_block_cbcenc_class br_des_tab_cbcenc_vtable;
2252
2253 /**
2254 * \brief Class instance for DES CBC decryption (`des_tab` implementation).
2255 */
2256 extern const br_block_cbcdec_class br_des_tab_cbcdec_vtable;
2257
2258 /**
2259 * \brief Context initialisation (key schedule) for DES CBC encryption
2260 * (`des_tab` implementation).
2261 *
2262 * \param ctx context to initialise.
2263 * \param key secret key.
2264 * \param len secret key length (in bytes).
2265 */
2266 void br_des_tab_cbcenc_init(br_des_tab_cbcenc_keys *ctx,
2267 const void *key, size_t len);
2268
2269 /**
2270 * \brief Context initialisation (key schedule) for DES CBC decryption
2271 * (`des_tab` implementation).
2272 *
2273 * \param ctx context to initialise.
2274 * \param key secret key.
2275 * \param len secret key length (in bytes).
2276 */
2277 void br_des_tab_cbcdec_init(br_des_tab_cbcdec_keys *ctx,
2278 const void *key, size_t len);
2279
2280 /**
2281 * \brief CBC encryption with DES (`des_tab` implementation).
2282 *
2283 * \param ctx context (already initialised).
2284 * \param iv IV (updated).
2285 * \param data data to encrypt (updated).
2286 * \param len data length (in bytes, MUST be multiple of 8).
2287 */
2288 void br_des_tab_cbcenc_run(const br_des_tab_cbcenc_keys *ctx, void *iv,
2289 void *data, size_t len);
2290
2291 /**
2292 * \brief CBC decryption with DES (`des_tab` implementation).
2293 *
2294 * \param ctx context (already initialised).
2295 * \param iv IV (updated).
2296 * \param data data to decrypt (updated).
2297 * \param len data length (in bytes, MUST be multiple of 8).
2298 */
2299 void br_des_tab_cbcdec_run(const br_des_tab_cbcdec_keys *ctx, void *iv,
2300 void *data, size_t len);
2301
2302 /*
2303 * Constant-time implementation for DES/3DES. It is substantially slower
2304 * (by a factor of about 4x), but also immune to cache-timing attacks.
2305 */
2306
2307 /** \brief DES/3DES block size (8 bytes). */
2308 #define br_des_ct_BLOCK_SIZE 8
2309
2310 /**
2311 * \brief Context for DES subkeys (`des_ct` implementation, CBC encryption).
2312 *
2313 * First field is a pointer to the vtable; it is set by the initialisation
2314 * function. Other fields are not supposed to be accessed by user code.
2315 */
2316 typedef struct {
2317 /** \brief Pointer to vtable for this context. */
2318 const br_block_cbcenc_class *vtable;
2319 #ifndef BR_DOXYGEN_IGNORE
2320 uint32_t skey[96];
2321 unsigned num_rounds;
2322 #endif
2323 } br_des_ct_cbcenc_keys;
2324
2325 /**
2326 * \brief Context for DES subkeys (`des_ct` implementation, CBC decryption).
2327 *
2328 * First field is a pointer to the vtable; it is set by the initialisation
2329 * function. Other fields are not supposed to be accessed by user code.
2330 */
2331 typedef struct {
2332 /** \brief Pointer to vtable for this context. */
2333 const br_block_cbcdec_class *vtable;
2334 #ifndef BR_DOXYGEN_IGNORE
2335 uint32_t skey[96];
2336 unsigned num_rounds;
2337 #endif
2338 } br_des_ct_cbcdec_keys;
2339
2340 /**
2341 * \brief Class instance for DES CBC encryption (`des_ct` implementation).
2342 */
2343 extern const br_block_cbcenc_class br_des_ct_cbcenc_vtable;
2344
2345 /**
2346 * \brief Class instance for DES CBC decryption (`des_ct` implementation).
2347 */
2348 extern const br_block_cbcdec_class br_des_ct_cbcdec_vtable;
2349
2350 /**
2351 * \brief Context initialisation (key schedule) for DES CBC encryption
2352 * (`des_ct` implementation).
2353 *
2354 * \param ctx context to initialise.
2355 * \param key secret key.
2356 * \param len secret key length (in bytes).
2357 */
2358 void br_des_ct_cbcenc_init(br_des_ct_cbcenc_keys *ctx,
2359 const void *key, size_t len);
2360
2361 /**
2362 * \brief Context initialisation (key schedule) for DES CBC decryption
2363 * (`des_ct` implementation).
2364 *
2365 * \param ctx context to initialise.
2366 * \param key secret key.
2367 * \param len secret key length (in bytes).
2368 */
2369 void br_des_ct_cbcdec_init(br_des_ct_cbcdec_keys *ctx,
2370 const void *key, size_t len);
2371
2372 /**
2373 * \brief CBC encryption with DES (`des_ct` implementation).
2374 *
2375 * \param ctx context (already initialised).
2376 * \param iv IV (updated).
2377 * \param data data to encrypt (updated).
2378 * \param len data length (in bytes, MUST be multiple of 8).
2379 */
2380 void br_des_ct_cbcenc_run(const br_des_ct_cbcenc_keys *ctx, void *iv,
2381 void *data, size_t len);
2382
2383 /**
2384 * \brief CBC decryption with DES (`des_ct` implementation).
2385 *
2386 * \param ctx context (already initialised).
2387 * \param iv IV (updated).
2388 * \param data data to decrypt (updated).
2389 * \param len data length (in bytes, MUST be multiple of 8).
2390 */
2391 void br_des_ct_cbcdec_run(const br_des_ct_cbcdec_keys *ctx, void *iv,
2392 void *data, size_t len);
2393
2394 /*
2395 * These structures are large enough to accommodate subkeys for all
2396 * DES/3DES implementations.
2397 */
2398
2399 /**
2400 * \brief Aggregate structure large enough to be used as context for
2401 * subkeys (CBC encryption) for all DES implementations.
2402 */
2403 typedef union {
2404 const br_block_cbcenc_class *vtable;
2405 br_des_tab_cbcenc_keys tab;
2406 br_des_ct_cbcenc_keys ct;
2407 } br_des_gen_cbcenc_keys;
2408
2409 /**
2410 * \brief Aggregate structure large enough to be used as context for
2411 * subkeys (CBC decryption) for all DES implementations.
2412 */
2413 typedef union {
2414 const br_block_cbcdec_class *vtable;
2415 br_des_tab_cbcdec_keys c_tab;
2416 br_des_ct_cbcdec_keys c_ct;
2417 } br_des_gen_cbcdec_keys;
2418
2419 /**
2420 * \brief Type for a ChaCha20 implementation.
2421 *
2422 * An implementation follows the description in RFC 7539:
2423 *
2424 * - Key is 256 bits (`key` points to exactly 32 bytes).
2425 *
2426 * - IV is 96 bits (`iv` points to exactly 12 bytes).
2427 *
2428 * - Block counter is over 32 bits and starts at value `cc`; the
2429 * resulting value is returned.
2430 *
2431 * Data (pointed to by `data`, of length `len`) is encrypted/decrypted
2432 * in place. If `len` is not a multiple of 64, then the excess bytes from
2433 * the last block processing are dropped (therefore, "chunked" processing
2434 * works only as long as each non-final chunk has a length multiple of 64).
2435 *
2436 * \param key secret key (32 bytes).
2437 * \param iv IV (12 bytes).
2438 * \param cc initial counter value.
2439 * \param data data to encrypt or decrypt.
2440 * \param len data length (in bytes).
2441 */
2442 typedef uint32_t (*br_chacha20_run)(const void *key,
2443 const void *iv, uint32_t cc, void *data, size_t len);
2444
2445 /**
2446 * \brief ChaCha20 implementation (straightforward C code, constant-time).
2447 *
2448 * \see br_chacha20_run
2449 *
2450 * \param key secret key (32 bytes).
2451 * \param iv IV (12 bytes).
2452 * \param cc initial counter value.
2453 * \param data data to encrypt or decrypt.
2454 * \param len data length (in bytes).
2455 */
2456 uint32_t br_chacha20_ct_run(const void *key,
2457 const void *iv, uint32_t cc, void *data, size_t len);
2458
2459 /**
2460 * \brief ChaCha20 implementation (SSE2 code, constant-time).
2461 *
2462 * This implementation is available only on x86 platforms, depending on
2463 * compiler support. Moreover, in 32-bit mode, it might not actually run,
2464 * if the underlying hardware does not implement the SSE2 opcode (in
2465 * 64-bit mode, SSE2 is part of the ABI, so if the code could be compiled
2466 * at all, then it can run). Use `br_chacha20_sse2_get()` to safely obtain
2467 * a pointer to that function.
2468 *
2469 * \see br_chacha20_run
2470 *
2471 * \param key secret key (32 bytes).
2472 * \param iv IV (12 bytes).
2473 * \param cc initial counter value.
2474 * \param data data to encrypt or decrypt.
2475 * \param len data length (in bytes).
2476 */
2477 uint32_t br_chacha20_sse2_run(const void *key,
2478 const void *iv, uint32_t cc, void *data, size_t len);
2479
2480 /**
2481 * \brief Obtain the `sse2` ChaCha20 implementation, if available.
2482 *
2483 * This function returns a pointer to `br_chacha20_sse2_run`, if
2484 * that implementation was compiled in the library _and_ the SSE2
2485 * opcodes are available on the currently running CPU. If either of
2486 * these conditions is not met, then this function returns `0`.
2487 *
2488 * \return the `sse2` ChaCha20 implementation, or `0`.
2489 */
2490 br_chacha20_run br_chacha20_sse2_get(void);
2491
2492 /**
2493 * \brief Type for a ChaCha20+Poly1305 AEAD implementation.
2494 *
2495 * The provided data is encrypted or decrypted with ChaCha20. The
2496 * authentication tag is computed on the concatenation of the
2497 * additional data and the ciphertext, with the padding and lengths
2498 * as described in RFC 7539 (section 2.8).
2499 *
2500 * After decryption, the caller is responsible for checking that the
2501 * computed tag matches the expected value.
2502 *
2503 * \param key secret key (32 bytes).
2504 * \param iv nonce (12 bytes).
2505 * \param data data to encrypt or decrypt.
2506 * \param len data length (in bytes).
2507 * \param aad additional authenticated data.
2508 * \param aad_len length of additional authenticated data (in bytes).
2509 * \param tag output buffer for the authentication tag.
2510 * \param ichacha implementation of ChaCha20.
2511 * \param encrypt non-zero for encryption, zero for decryption.
2512 */
2513 typedef void (*br_poly1305_run)(const void *key, const void *iv,
2514 void *data, size_t len, const void *aad, size_t aad_len,
2515 void *tag, br_chacha20_run ichacha, int encrypt);
2516
2517 /**
2518 * \brief ChaCha20+Poly1305 AEAD implementation (mixed 32-bit multiplications).
2519 *
2520 * \see br_poly1305_run
2521 *
2522 * \param key secret key (32 bytes).
2523 * \param iv nonce (12 bytes).
2524 * \param data data to encrypt or decrypt.
2525 * \param len data length (in bytes).
2526 * \param aad additional authenticated data.
2527 * \param aad_len length of additional authenticated data (in bytes).
2528 * \param tag output buffer for the authentication tag.
2529 * \param ichacha implementation of ChaCha20.
2530 * \param encrypt non-zero for encryption, zero for decryption.
2531 */
2532 void br_poly1305_ctmul_run(const void *key, const void *iv,
2533 void *data, size_t len, const void *aad, size_t aad_len,
2534 void *tag, br_chacha20_run ichacha, int encrypt);
2535
2536 /**
2537 * \brief ChaCha20+Poly1305 AEAD implementation (pure 32-bit multiplications).
2538 *
2539 * \see br_poly1305_run
2540 *
2541 * \param key secret key (32 bytes).
2542 * \param iv nonce (12 bytes).
2543 * \param data data to encrypt or decrypt.
2544 * \param len data length (in bytes).
2545 * \param aad additional authenticated data.
2546 * \param aad_len length of additional authenticated data (in bytes).
2547 * \param tag output buffer for the authentication tag.
2548 * \param ichacha implementation of ChaCha20.
2549 * \param encrypt non-zero for encryption, zero for decryption.
2550 */
2551 void br_poly1305_ctmul32_run(const void *key, const void *iv,
2552 void *data, size_t len, const void *aad, size_t aad_len,
2553 void *tag, br_chacha20_run ichacha, int encrypt);
2554
2555 /**
2556 * \brief ChaCha20+Poly1305 AEAD implementation (i15).
2557 *
2558 * This implementation relies on the generic big integer code "i15"
2559 * (which uses pure 32-bit multiplications). As such, it may save a
2560 * little code footprint in a context where "i15" is already included
2561 * (e.g. for elliptic curves or for RSA); however, it is also
2562 * substantially slower than the ctmul and ctmul32 implementations.
2563 *
2564 * \see br_poly1305_run
2565 *
2566 * \param key secret key (32 bytes).
2567 * \param iv nonce (12 bytes).
2568 * \param data data to encrypt or decrypt.
2569 * \param len data length (in bytes).
2570 * \param aad additional authenticated data.
2571 * \param aad_len length of additional authenticated data (in bytes).
2572 * \param tag output buffer for the authentication tag.
2573 * \param ichacha implementation of ChaCha20.
2574 * \param encrypt non-zero for encryption, zero for decryption.
2575 */
2576 void br_poly1305_i15_run(const void *key, const void *iv,
2577 void *data, size_t len, const void *aad, size_t aad_len,
2578 void *tag, br_chacha20_run ichacha, int encrypt);
2579
2580 /**
2581 * \brief ChaCha20+Poly1305 AEAD implementation (ctmulq).
2582 *
2583 * This implementation uses 64-bit multiplications (result over 128 bits).
2584 * It is available only on platforms that offer such a primitive (in
2585 * practice, 64-bit architectures). Use `br_poly1305_ctmulq_get()` to
2586 * dynamically obtain a pointer to that function, or 0 if not supported.
2587 *
2588 * \see br_poly1305_run
2589 *
2590 * \param key secret key (32 bytes).
2591 * \param iv nonce (12 bytes).
2592 * \param data data to encrypt or decrypt.
2593 * \param len data length (in bytes).
2594 * \param aad additional authenticated data.
2595 * \param aad_len length of additional authenticated data (in bytes).
2596 * \param tag output buffer for the authentication tag.
2597 * \param ichacha implementation of ChaCha20.
2598 * \param encrypt non-zero for encryption, zero for decryption.
2599 */
2600 void br_poly1305_ctmulq_run(const void *key, const void *iv,
2601 void *data, size_t len, const void *aad, size_t aad_len,
2602 void *tag, br_chacha20_run ichacha, int encrypt);
2603
2604 /**
2605 * \brief Get the ChaCha20+Poly1305 "ctmulq" implementation, if available.
2606 *
2607 * This function returns a pointer to the `br_poly1305_ctmulq_run()`
2608 * function if supported on the current platform; otherwise, it returns 0.
2609 *
2610 * \return the ctmulq ChaCha20+Poly1305 implementation, or 0.
2611 */
2612 br_poly1305_run br_poly1305_ctmulq_get(void);
2613
2614 #ifdef __cplusplus
2615 }
2616 #endif
2617
2618 #endif