Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bearssl/inc/bearssl_block.h
39586 views
1
/*
2
* Copyright (c) 2016 Thomas Pornin <[email protected]>
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
2619
2620