@pulse-compute/crypto 1.0.0-beta.4 → 1.0.0-beta.6

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