BearSSL: bearssl_aead.h Source File

BearSSL

Loading...
Searching...
No Matches
bearssl_aead.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 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_AEAD_H__
26#define BR_BEARSSL_AEAD_H__
27
28#include <stddef.h>
29#include <stdint.h>
30
31#include "bearssl_block.h"
32#include "bearssl_hash.h"
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38/** \file bearssl_aead.h
39 *
40 * # Authenticated Encryption with Additional Data
41 *
42 * This file documents the API for AEAD encryption.
43 *
44 *
45 * ## Procedural API
46 *
47 * An AEAD algorithm processes messages and provides confidentiality
48 * (encryption) and checked integrity (MAC). It uses the following
49 * parameters:
50 *
51 * - A symmetric key. Exact size depends on the AEAD algorithm.
52 *
53 * - A nonce (IV). Size depends on the AEAD algorithm; for most
54 * algorithms, it is crucial for security that any given nonce
55 * value is never used twice for the same key and distinct
56 * messages.
57 *
58 * - Data to encrypt and protect.
59 *
60 * - Additional authenticated data, which is covered by the MAC but
61 * otherwise left untouched (i.e. not encrypted).
62 *
63 * The AEAD algorithm encrypts the data, and produces an authentication
64 * tag. It is assumed that the encrypted data, the tag, the additional
65 * authenticated data and the nonce are sent to the receiver; the
66 * additional data and the nonce may be implicit (e.g. using elements of
67 * the underlying transport protocol, such as record sequence numbers).
68 * The receiver will recompute the tag value and compare it with the one
69 * received; if they match, then the data is correct, and can be
70 * decrypted and used; otherwise, at least one of the elements was
71 * altered in transit, normally leading to wholesale rejection of the
72 * complete message.
73 *
74 * For each AEAD algorithm, identified by a symbolic name (hereafter
75 * denoted as "`xxx`"), the following functions are defined:
76 *
77 * - `br_xxx_init()`
78 *
79 * Initialise the AEAD algorithm, on a provided context structure.
80 * Exact parameters depend on the algorithm, and may include
81 * pointers to extra implementations and context structures. The
82 * secret key is provided at this point, either directly or
83 * indirectly.
84 *
85 * - `br_xxx_reset()`
86 *
87 * Start a new AEAD computation. The nonce value is provided as
88 * parameter to this function.
89 *
90 * - `br_xxx_aad_inject()`
91 *
92 * Inject some additional authenticated data. Additional data may
93 * be provided in several chunks of arbitrary length.
94 *
95 * - `br_xxx_flip()`
96 *
97 * This function MUST be called after injecting all additional
98 * authenticated data, and before beginning to encrypt the plaintext
99 * (or decrypt the ciphertext).
100 *
101 * - `br_xxx_run()`
102 *
103 * Process some plaintext (to encrypt) or ciphertext (to decrypt).
104 * Encryption/decryption is done in place. Data may be provided in
105 * several chunks of arbitrary length.
106 *
107 * - `br_xxx_get_tag()`
108 *
109 * Compute the authentication tag. All message data (encrypted or
110 * decrypted) must have been injected at that point. Also, this
111 * call may modify internal context elements, so it may be called
112 * only once for a given AEAD computation.
113 *
114 * - `br_xxx_check_tag()`
115 *
116 * An alternative to `br_xxx_get_tag()`, meant to be used by the
117 * receiver: the authentication tag is internally recomputed, and
118 * compared with the one provided as parameter.
119 *
120 * This API makes the following assumptions on the AEAD algorithm:
121 *
122 * - Encryption does not expand the size of the ciphertext; there is
123 * no padding. This is true of most modern AEAD modes such as GCM.
124 *
125 * - The additional authenticated data must be processed first,
126 * before the encrypted/decrypted data.
127 *
128 * - Nonce, plaintext and additional authenticated data all consist
129 * in an integral number of bytes. There is no provision to use
130 * elements whose length in bits is not a multiple of 8.
131 *
132 * Each AEAD algorithm has its own requirements and limits on the sizes
133 * of additional data and plaintext. This API does not provide any
134 * way to report invalid usage; it is up to the caller to ensure that
135 * the provided key, nonce, and data elements all fit the algorithm's
136 * requirements.
137 *
138 *
139 * ## Object-Oriented API
140 *
141 * Each context structure begins with a field (called `vtable`) that
142 * points to an instance of a structure that references the relevant
143 * functions through pointers. Each such structure contains the
144 * following:
145 *
146 * - `reset`
147 *
148 * Pointer to the reset function, that allows starting a new
149 * computation.
150 *
151 * - `aad_inject`
152 *
153 * Pointer to the additional authenticated data injection function.
154 *
155 * - `flip`
156 *
157 * Pointer to the function that transitions from additional data
158 * to main message data processing.
159 *
160 * - `get_tag`
161 *
162 * Pointer to the function that computes and returns the tag.
163 *
164 * - `check_tag`
165 *
166 * Pointer to the function that computes and verifies the tag against
167 * a received value.
168 *
169 * Note that there is no OOP method for context initialisation: the
170 * various AEAD algorithms have different requirements that would not
171 * map well to a single initialisation API.
172 *
173 * The OOP API is not provided for CCM, due to its specific requirements
174 * (length of plaintext must be known in advance).
175 */
176
177/**
178 * \brief Class type of an AEAD algorithm.
179 */
180typedef struct br_aead_class_ br_aead_class;
181 struct br_aead_class_ {
182
183 /**
184 * \brief Size (in bytes) of authentication tags created by
185 * this AEAD algorithm.
186 */
187 size_t tag_size;
188
189 /**
190 * \brief Reset an AEAD context.
191 *
192 * This function resets an already initialised AEAD context for
193 * a new computation run. Implementations and keys are
194 * conserved. This function can be called at any time; it
195 * cancels any ongoing AEAD computation that uses the provided
196 * context structure.
197
198 * The provided IV is a _nonce_. Each AEAD algorithm has its
199 * own requirements on IV size and contents; for most of them,
200 * it is crucial to security that each nonce value is used
201 * only once for a given secret key.
202 *
203 * \param cc AEAD context structure.
204 * \param iv AEAD nonce to use.
205 * \param len AEAD nonce length (in bytes).
206 */
207 void (*reset)(const br_aead_class **cc, const void *iv, size_t len);
208
209 /**
210 * \brief Inject additional authenticated data.
211 *
212 * The provided data is injected into a running AEAD
213 * computation. Additional data must be injected _before_ the
214 * call to `flip()`. Additional data can be injected in several
215 * chunks of arbitrary length.
216 *
217 * \param cc AEAD context structure.
218 * \param data pointer to additional authenticated data.
219 * \param len length of additional authenticated data (in bytes).
220 */
221 void (*aad_inject)(const br_aead_class **cc,
222 const void *data, size_t len);
223
224 /**
225 * \brief Finish injection of additional authenticated data.
226 *
227 * This function MUST be called before beginning the actual
228 * encryption or decryption (with `run()`), even if no
229 * additional authenticated data was injected. No additional
230 * authenticated data may be injected after this function call.
231 *
232 * \param cc AEAD context structure.
233 */
234 void (*flip)(const br_aead_class **cc);
235
236 /**
237 * \brief Encrypt or decrypt some data.
238 *
239 * Data encryption or decryption can be done after `flip()` has
240 * been called on the context. If `encrypt` is non-zero, then
241 * the provided data shall be plaintext, and it is encrypted in
242 * place. Otherwise, the data shall be ciphertext, and it is
243 * decrypted in place.
244 *
245 * Data may be provided in several chunks of arbitrary length.
246 *
247 * \param cc AEAD context structure.
248 * \param encrypt non-zero for encryption, zero for decryption.
249 * \param data data to encrypt or decrypt.
250 * \param len data length (in bytes).
251 */
252 void (*run)(const br_aead_class **cc, int encrypt,
253 void *data, size_t len);
254
255 /**
256 * \brief Compute authentication tag.
257 *
258 * Compute the AEAD authentication tag. The tag length depends
259 * on the AEAD algorithm; it is written in the provided `tag`
260 * buffer. This call terminates the AEAD run: no data may be
261 * processed with that AEAD context afterwards, until `reset()`
262 * is called to initiate a new AEAD run.
263 *
264 * The tag value must normally be sent along with the encrypted
265 * data. When decrypting, the tag value must be recomputed and
266 * compared with the received tag: if the two tag values differ,
267 * then either the tag or the encrypted data was altered in
268 * transit. As an alternative to this function, the
269 * `check_tag()` function may be used to compute and check the
270 * tag value.
271 *
272 * Tag length depends on the AEAD algorithm.
273 *
274 * \param cc AEAD context structure.
275 * \param tag destination buffer for the tag.
276 */
277 void (*get_tag)(const br_aead_class **cc, void *tag);
278
279 /**
280 * \brief Compute and check authentication tag.
281 *
282 * This function is an alternative to `get_tag()`, and is
283 * normally used on the receiving end (i.e. when decrypting
284 * messages). The tag value is recomputed and compared with the
285 * provided tag value. If they match, 1 is returned; on
286 * mismatch, 0 is returned. A returned value of 0 means that the
287 * data or the tag was altered in transit, normally leading to
288 * wholesale rejection of the complete message.
289 *
290 * Tag length depends on the AEAD algorithm.
291 *
292 * \param cc AEAD context structure.
293 * \param tag tag value to compare with.
294 * \return 1 on success (exact match of tag value), 0 otherwise.
295 */
296 uint32_t (*check_tag)(const br_aead_class **cc, const void *tag);
297
298 /**
299 * \brief Compute authentication tag (with truncation).
300 *
301 * This function is similar to `get_tag()`, except that the tag
302 * length is provided. Some AEAD algorithms allow several tag
303 * lengths, usually by truncating the normal tag. Shorter tags
304 * mechanically increase success probability of forgeries.
305 * The range of allowed tag lengths depends on the algorithm.
306 *
307 * \param cc AEAD context structure.
308 * \param tag destination buffer for the tag.
309 * \param len tag length (in bytes).
310 */
311 void (*get_tag_trunc)(const br_aead_class **cc, void *tag, size_t len);
312
313 /**
314 * \brief Compute and check authentication tag (with truncation).
315 *
316 * This function is similar to `check_tag()` except that it
317 * works over an explicit tag length. See `get_tag()` for a
318 * discussion of explicit tag lengths; the range of allowed tag
319 * lengths depends on the algorithm.
320 *
321 * \param cc AEAD context structure.
322 * \param tag tag value to compare with.
323 * \param len tag length (in bytes).
324 * \return 1 on success (exact match of tag value), 0 otherwise.
325 */
326 uint32_t (*check_tag_trunc)(const br_aead_class **cc,
327 const void *tag, size_t len);
328};
329
330/**
331 * \brief Context structure for GCM.
332 *
333 * GCM is an AEAD mode that combines a block cipher in CTR mode with a
334 * MAC based on GHASH, to provide authenticated encryption:
335 *
336 * - Any block cipher with 16-byte blocks can be used with GCM.
337 *
338 * - The nonce can have any length, from 0 up to 2^64-1 bits; however,
339 * 96-bit nonces (12 bytes) are recommended (nonces with a length
340 * distinct from 12 bytes are internally hashed, which risks reusing
341 * nonce value with a small but not always negligible probability).
342 *
343 * - Additional authenticated data may have length up to 2^64-1 bits.
344 *
345 * - Message length may range up to 2^39-256 bits at most.
346 *
347 * - The authentication tag has length 16 bytes.
348 *
349 * The GCM initialisation function receives as parameter an
350 * _initialised_ block cipher implementation context, with the secret
351 * key already set. A pointer to that context will be kept within the
352 * GCM context structure. It is up to the caller to allocate and
353 * initialise that block cipher context.
354 */
355 typedef struct {
356 /** \brief Pointer to vtable for this context. */
357 const br_aead_class *vtable;
358
359#ifndef BR_DOXYGEN_IGNORE
360 const br_block_ctr_class **bctx;
361 br_ghash gh;
362 unsigned char h[16];
363 unsigned char j0_1[12];
364 unsigned char buf[16];
365 unsigned char y[16];
366 uint32_t j0_2, jc;
367 uint64_t count_aad, count_ctr;
368#endif
369} br_gcm_context;
370
371/**
372 * \brief Initialize a GCM context.
373 *
374 * A block cipher implementation, with its initialised context structure,
375 * is provided. The block cipher MUST use 16-byte blocks in CTR mode,
376 * and its secret key MUST have been already set in the provided context.
377 * A GHASH implementation must also be provided. The parameters are linked
378 * in the GCM context.
379 *
380 * After this function has been called, the `br_gcm_reset()` function must
381 * be called, to provide the IV for GCM computation.
382 *
383 * \param ctx GCM context structure.
384 * \param bctx block cipher context (already initialised with secret key).
385 * \param gh GHASH implementation.
386 */
387 void br_gcm_init(br_gcm_context *ctx,
388 const br_block_ctr_class **bctx, br_ghash gh);
389
390/**
391 * \brief Reset a GCM context.
392 *
393 * This function resets an already initialised GCM context for a new
394 * computation run. Implementations and keys are conserved. This function
395 * can be called at any time; it cancels any ongoing GCM computation that
396 * uses the provided context structure.
397 *
398 * The provided IV is a _nonce_. It is critical to GCM security that IV
399 * values are not repeated for the same encryption key. IV can have
400 * arbitrary length (up to 2^64-1 bits), but the "normal" length is
401 * 96 bits (12 bytes).
402 *
403 * \param ctx GCM context structure.
404 * \param iv GCM nonce to use.
405 * \param len GCM nonce length (in bytes).
406 */
407 void br_gcm_reset(br_gcm_context *ctx, const void *iv, size_t len);
408
409/**
410 * \brief Inject additional authenticated data into GCM.
411 *
412 * The provided data is injected into a running GCM computation. Additional
413 * data must be injected _before_ the call to `br_gcm_flip()`.
414 * Additional data can be injected in several chunks of arbitrary length;
415 * the maximum total size of additional authenticated data is 2^64-1
416 * bits.
417 *
418 * \param ctx GCM context structure.
419 * \param data pointer to additional authenticated data.
420 * \param len length of additional authenticated data (in bytes).
421 */
422 void br_gcm_aad_inject(br_gcm_context *ctx, const void *data, size_t len);
423
424/**
425 * \brief Finish injection of additional authenticated data into GCM.
426 *
427 * This function MUST be called before beginning the actual encryption
428 * or decryption (with `br_gcm_run()`), even if no additional authenticated
429 * data was injected. No additional authenticated data may be injected
430 * after this function call.
431 *
432 * \param ctx GCM context structure.
433 */
434 void br_gcm_flip(br_gcm_context *ctx);
435
436/**
437 * \brief Encrypt or decrypt some data with GCM.
438 *
439 * Data encryption or decryption can be done after `br_gcm_flip()`
440 * has been called on the context. If `encrypt` is non-zero, then the
441 * provided data shall be plaintext, and it is encrypted in place.
442 * Otherwise, the data shall be ciphertext, and it is decrypted in place.
443 *
444 * Data may be provided in several chunks of arbitrary length. The maximum
445 * total length for data is 2^39-256 bits, i.e. about 65 gigabytes.
446 *
447 * \param ctx GCM context structure.
448 * \param encrypt non-zero for encryption, zero for decryption.
449 * \param data data to encrypt or decrypt.
450 * \param len data length (in bytes).
451 */
452 void br_gcm_run(br_gcm_context *ctx, int encrypt, void *data, size_t len);
453
454/**
455 * \brief Compute GCM authentication tag.
456 *
457 * Compute the GCM authentication tag. The tag is a 16-byte value which
458 * is written in the provided `tag` buffer. This call terminates the
459 * GCM run: no data may be processed with that GCM context afterwards,
460 * until `br_gcm_reset()` is called to initiate a new GCM run.
461 *
462 * The tag value must normally be sent along with the encrypted data.
463 * When decrypting, the tag value must be recomputed and compared with
464 * the received tag: if the two tag values differ, then either the tag
465 * or the encrypted data was altered in transit. As an alternative to
466 * this function, the `br_gcm_check_tag()` function can be used to
467 * compute and check the tag value.
468 *
469 * \param ctx GCM context structure.
470 * \param tag destination buffer for the tag (16 bytes).
471 */
472 void br_gcm_get_tag(br_gcm_context *ctx, void *tag);
473
474/**
475 * \brief Compute and check GCM authentication tag.
476 *
477 * This function is an alternative to `br_gcm_get_tag()`, normally used
478 * on the receiving end (i.e. when decrypting value). The tag value is
479 * recomputed and compared with the provided tag value. If they match, 1
480 * is returned; on mismatch, 0 is returned. A returned value of 0 means
481 * that the data or the tag was altered in transit, normally leading to
482 * wholesale rejection of the complete message.
483 *
484 * \param ctx GCM context structure.
485 * \param tag tag value to compare with (16 bytes).
486 * \return 1 on success (exact match of tag value), 0 otherwise.
487 */
488uint32_t br_gcm_check_tag(br_gcm_context *ctx, const void *tag);
489
490/**
491 * \brief Compute GCM authentication tag (with truncation).
492 *
493 * This function is similar to `br_gcm_get_tag()`, except that it allows
494 * the tag to be truncated to a smaller length. The intended tag length
495 * is provided as `len` (in bytes); it MUST be no more than 16, but
496 * it may be smaller. Note that decreasing tag length mechanically makes
497 * forgeries easier; NIST SP 800-38D specifies that the tag length shall
498 * lie between 12 and 16 bytes (inclusive), but may be truncated down to
499 * 4 or 8 bytes, for specific applications that can tolerate it. It must
500 * also be noted that successful forgeries leak information on the
501 * authentication key, making subsequent forgeries easier. Therefore,
502 * tag truncation, and in particular truncation to sizes lower than 12
503 * bytes, shall be envisioned only with great care.
504 *
505 * The tag is written in the provided `tag` buffer. This call terminates
506 * the GCM run: no data may be processed with that GCM context
507 * afterwards, until `br_gcm_reset()` is called to initiate a new GCM
508 * run.
509 *
510 * The tag value must normally be sent along with the encrypted data.
511 * When decrypting, the tag value must be recomputed and compared with
512 * the received tag: if the two tag values differ, then either the tag
513 * or the encrypted data was altered in transit. As an alternative to
514 * this function, the `br_gcm_check_tag_trunc()` function can be used to
515 * compute and check the tag value.
516 *
517 * \param ctx GCM context structure.
518 * \param tag destination buffer for the tag.
519 * \param len tag length (16 bytes or less).
520 */
521 void br_gcm_get_tag_trunc(br_gcm_context *ctx, void *tag, size_t len);
522
523/**
524 * \brief Compute and check GCM authentication tag (with truncation).
525 *
526 * This function is an alternative to `br_gcm_get_tag_trunc()`, normally used
527 * on the receiving end (i.e. when decrypting value). The tag value is
528 * recomputed and compared with the provided tag value. If they match, 1
529 * is returned; on mismatch, 0 is returned. A returned value of 0 means
530 * that the data or the tag was altered in transit, normally leading to
531 * wholesale rejection of the complete message.
532 *
533 * Tag length MUST be 16 bytes or less. The normal GCM tag length is 16
534 * bytes. See `br_check_tag_trunc()` for some discussion on the potential
535 * perils of truncating authentication tags.
536 *
537 * \param ctx GCM context structure.
538 * \param tag tag value to compare with.
539 * \param len tag length (in bytes).
540 * \return 1 on success (exact match of tag value), 0 otherwise.
541 */
542uint32_t br_gcm_check_tag_trunc(br_gcm_context *ctx,
543 const void *tag, size_t len);
544
545/**
546 * \brief Class instance for GCM.
547 */
548extern const br_aead_class br_gcm_vtable;
549
550/**
551 * \brief Context structure for EAX.
552 *
553 * EAX is an AEAD mode that combines a block cipher in CTR mode with
554 * CBC-MAC using the same block cipher and the same key, to provide
555 * authenticated encryption:
556 *
557 * - Any block cipher with 16-byte blocks can be used with EAX
558 * (technically, other block sizes are defined as well, but this
559 * is not implemented by these functions; shorter blocks also
560 * imply numerous security issues).
561 *
562 * - The nonce can have any length, as long as nonce values are
563 * not reused (thus, if nonces are randomly selected, the nonce
564 * size should be such that reuse probability is negligible).
565 *
566 * - Additional authenticated data length is unlimited.
567 *
568 * - Message length is unlimited.
569 *
570 * - The authentication tag has length 16 bytes.
571 *
572 * The EAX initialisation function receives as parameter an
573 * _initialised_ block cipher implementation context, with the secret
574 * key already set. A pointer to that context will be kept within the
575 * EAX context structure. It is up to the caller to allocate and
576 * initialise that block cipher context.
577 */
578 typedef struct {
579 /** \brief Pointer to vtable for this context. */
580 const br_aead_class *vtable;
581
582#ifndef BR_DOXYGEN_IGNORE
583 const br_block_ctrcbc_class **bctx;
584 unsigned char L2[16];
585 unsigned char L4[16];
586 unsigned char nonce[16];
587 unsigned char head[16];
588 unsigned char ctr[16];
589 unsigned char cbcmac[16];
590 unsigned char buf[16];
591 size_t ptr;
592#endif
593} br_eax_context;
594
595/**
596 * \brief EAX captured state.
597 *
598 * Some internal values computed by EAX may be captured at various
599 * points, and reused for another EAX run with the same secret key,
600 * for lower per-message overhead. Captured values do not depend on
601 * the nonce.
602 */
603 typedef struct {
604#ifndef BR_DOXYGEN_IGNORE
605 unsigned char st[3][16];
606#endif
607} br_eax_state;
608
609/**
610 * \brief Initialize an EAX context.
611 *
612 * A block cipher implementation, with its initialised context
613 * structure, is provided. The block cipher MUST use 16-byte blocks in
614 * CTR + CBC-MAC mode, and its secret key MUST have been already set in
615 * the provided context. The parameters are linked in the EAX context.
616 *
617 * After this function has been called, the `br_eax_reset()` function must
618 * be called, to provide the nonce for EAX computation.
619 *
620 * \param ctx EAX context structure.
621 * \param bctx block cipher context (already initialised with secret key).
622 */
623 void br_eax_init(br_eax_context *ctx, const br_block_ctrcbc_class **bctx);
624
625/**
626 * \brief Capture pre-AAD state.
627 *
628 * This function precomputes key-dependent data, and stores it in the
629 * provided `st` structure. This structure should then be used with
630 * `br_eax_reset_pre_aad()`, or updated with `br_eax_get_aad_mac()`
631 * and then used with `br_eax_reset_post_aad()`.
632 *
633 * The EAX context structure is unmodified by this call.
634 *
635 * \param ctx EAX context structure.
636 * \param st recipient for captured state.
637 */
638 void br_eax_capture(const br_eax_context *ctx, br_eax_state *st);
639
640/**
641 * \brief Reset an EAX context.
642 *
643 * This function resets an already initialised EAX context for a new
644 * computation run. Implementations and keys are conserved. This function
645 * can be called at any time; it cancels any ongoing EAX computation that
646 * uses the provided context structure.
647 *
648 * It is critical to EAX security that nonce values are not repeated for
649 * the same encryption key. Nonces can have arbitrary length. If nonces
650 * are randomly generated, then a nonce length of at least 128 bits (16
651 * bytes) is recommended, to make nonce reuse probability sufficiently
652 * low.
653 *
654 * \param ctx EAX context structure.
655 * \param nonce EAX nonce to use.
656 * \param len EAX nonce length (in bytes).
657 */
658 void br_eax_reset(br_eax_context *ctx, const void *nonce, size_t len);
659
660/**
661 * \brief Reset an EAX context with a pre-AAD captured state.
662 *
663 * This function is an alternative to `br_eax_reset()`, that reuses a
664 * previously captured state structure for lower per-message overhead.
665 * The state should have been populated with `br_eax_capture_state()`
666 * but not updated with `br_eax_get_aad_mac()`.
667 *
668 * After this function is called, additional authenticated data MUST
669 * be injected. At least one byte of additional authenticated data
670 * MUST be provided with `br_eax_aad_inject()`; computation result will
671 * be incorrect if `br_eax_flip()` is called right away.
672 *
673 * After injection of the AAD and call to `br_eax_flip()`, at least
674 * one message byte must be provided. Empty messages are not supported
675 * with this reset mode.
676 *
677 * \param ctx EAX context structure.
678 * \param st pre-AAD captured state.
679 * \param nonce EAX nonce to use.
680 * \param len EAX nonce length (in bytes).
681 */
682 void br_eax_reset_pre_aad(br_eax_context *ctx, const br_eax_state *st,
683 const void *nonce, size_t len);
684
685/**
686 * \brief Reset an EAX context with a post-AAD captured state.
687 *
688 * This function is an alternative to `br_eax_reset()`, that reuses a
689 * previously captured state structure for lower per-message overhead.
690 * The state should have been populated with `br_eax_capture_state()`
691 * and then updated with `br_eax_get_aad_mac()`.
692 *
693 * After this function is called, message data MUST be injected. The
694 * `br_eax_flip()` function MUST NOT be called. At least one byte of
695 * message data MUST be provided with `br_eax_run()`; empty messages
696 * are not supported with this reset mode.
697 *
698 * \param ctx EAX context structure.
699 * \param st post-AAD captured state.
700 * \param nonce EAX nonce to use.
701 * \param len EAX nonce length (in bytes).
702 */
703 void br_eax_reset_post_aad(br_eax_context *ctx, const br_eax_state *st,
704 const void *nonce, size_t len);
705
706/**
707 * \brief Inject additional authenticated data into EAX.
708 *
709 * The provided data is injected into a running EAX computation. Additional
710 * data must be injected _before_ the call to `br_eax_flip()`.
711 * Additional data can be injected in several chunks of arbitrary length;
712 * the total amount of additional authenticated data is unlimited.
713 *
714 * \param ctx EAX context structure.
715 * \param data pointer to additional authenticated data.
716 * \param len length of additional authenticated data (in bytes).
717 */
718 void br_eax_aad_inject(br_eax_context *ctx, const void *data, size_t len);
719
720/**
721 * \brief Finish injection of additional authenticated data into EAX.
722 *
723 * This function MUST be called before beginning the actual encryption
724 * or decryption (with `br_eax_run()`), even if no additional authenticated
725 * data was injected. No additional authenticated data may be injected
726 * after this function call.
727 *
728 * \param ctx EAX context structure.
729 */
730 void br_eax_flip(br_eax_context *ctx);
731
732/**
733 * \brief Obtain a copy of the MAC on additional authenticated data.
734 *
735 * This function may be called only after `br_eax_flip()`; it copies the
736 * AAD-specific MAC value into the provided state. The MAC value depends
737 * on the secret key and the additional data itself, but not on the
738 * nonce. The updated state `st` is meant to be used as parameter for a
739 * further `br_eax_reset_post_aad()` call.
740 *
741 * \param ctx EAX context structure.
742 * \param st captured state to update.
743 */
744static inline void
745br_eax_get_aad_mac(const br_eax_context *ctx, br_eax_state *st)
746{
747 memcpy(st->st[1], ctx->head, sizeof ctx->head);
748}
749
750/**
751 * \brief Encrypt or decrypt some data with EAX.
752 *
753 * Data encryption or decryption can be done after `br_eax_flip()`
754 * has been called on the context. If `encrypt` is non-zero, then the
755 * provided data shall be plaintext, and it is encrypted in place.
756 * Otherwise, the data shall be ciphertext, and it is decrypted in place.
757 *
758 * Data may be provided in several chunks of arbitrary length.
759 *
760 * \param ctx EAX context structure.
761 * \param encrypt non-zero for encryption, zero for decryption.
762 * \param data data to encrypt or decrypt.
763 * \param len data length (in bytes).
764 */
765 void br_eax_run(br_eax_context *ctx, int encrypt, void *data, size_t len);
766
767/**
768 * \brief Compute EAX authentication tag.
769 *
770 * Compute the EAX authentication tag. The tag is a 16-byte value which
771 * is written in the provided `tag` buffer. This call terminates the
772 * EAX run: no data may be processed with that EAX context afterwards,
773 * until `br_eax_reset()` is called to initiate a new EAX run.
774 *
775 * The tag value must normally be sent along with the encrypted data.
776 * When decrypting, the tag value must be recomputed and compared with
777 * the received tag: if the two tag values differ, then either the tag
778 * or the encrypted data was altered in transit. As an alternative to
779 * this function, the `br_eax_check_tag()` function can be used to
780 * compute and check the tag value.
781 *
782 * \param ctx EAX context structure.
783 * \param tag destination buffer for the tag (16 bytes).
784 */
785 void br_eax_get_tag(br_eax_context *ctx, void *tag);
786
787/**
788 * \brief Compute and check EAX authentication tag.
789 *
790 * This function is an alternative to `br_eax_get_tag()`, normally used
791 * on the receiving end (i.e. when decrypting value). The tag value is
792 * recomputed and compared with the provided tag value. If they match, 1
793 * is returned; on mismatch, 0 is returned. A returned value of 0 means
794 * that the data or the tag was altered in transit, normally leading to
795 * wholesale rejection of the complete message.
796 *
797 * \param ctx EAX context structure.
798 * \param tag tag value to compare with (16 bytes).
799 * \return 1 on success (exact match of tag value), 0 otherwise.
800 */
801uint32_t br_eax_check_tag(br_eax_context *ctx, const void *tag);
802
803/**
804 * \brief Compute EAX authentication tag (with truncation).
805 *
806 * This function is similar to `br_eax_get_tag()`, except that it allows
807 * the tag to be truncated to a smaller length. The intended tag length
808 * is provided as `len` (in bytes); it MUST be no more than 16, but
809 * it may be smaller. Note that decreasing tag length mechanically makes
810 * forgeries easier; NIST SP 800-38D specifies that the tag length shall
811 * lie between 12 and 16 bytes (inclusive), but may be truncated down to
812 * 4 or 8 bytes, for specific applications that can tolerate it. It must
813 * also be noted that successful forgeries leak information on the
814 * authentication key, making subsequent forgeries easier. Therefore,
815 * tag truncation, and in particular truncation to sizes lower than 12
816 * bytes, shall be envisioned only with great care.
817 *
818 * The tag is written in the provided `tag` buffer. This call terminates
819 * the EAX run: no data may be processed with that EAX context
820 * afterwards, until `br_eax_reset()` is called to initiate a new EAX
821 * run.
822 *
823 * The tag value must normally be sent along with the encrypted data.
824 * When decrypting, the tag value must be recomputed and compared with
825 * the received tag: if the two tag values differ, then either the tag
826 * or the encrypted data was altered in transit. As an alternative to
827 * this function, the `br_eax_check_tag_trunc()` function can be used to
828 * compute and check the tag value.
829 *
830 * \param ctx EAX context structure.
831 * \param tag destination buffer for the tag.
832 * \param len tag length (16 bytes or less).
833 */
834 void br_eax_get_tag_trunc(br_eax_context *ctx, void *tag, size_t len);
835
836/**
837 * \brief Compute and check EAX authentication tag (with truncation).
838 *
839 * This function is an alternative to `br_eax_get_tag_trunc()`, normally used
840 * on the receiving end (i.e. when decrypting value). The tag value is
841 * recomputed and compared with the provided tag value. If they match, 1
842 * is returned; on mismatch, 0 is returned. A returned value of 0 means
843 * that the data or the tag was altered in transit, normally leading to
844 * wholesale rejection of the complete message.
845 *
846 * Tag length MUST be 16 bytes or less. The normal EAX tag length is 16
847 * bytes. See `br_check_tag_trunc()` for some discussion on the potential
848 * perils of truncating authentication tags.
849 *
850 * \param ctx EAX context structure.
851 * \param tag tag value to compare with.
852 * \param len tag length (in bytes).
853 * \return 1 on success (exact match of tag value), 0 otherwise.
854 */
855uint32_t br_eax_check_tag_trunc(br_eax_context *ctx,
856 const void *tag, size_t len);
857
858/**
859 * \brief Class instance for EAX.
860 */
861extern const br_aead_class br_eax_vtable;
862
863/**
864 * \brief Context structure for CCM.
865 *
866 * CCM is an AEAD mode that combines a block cipher in CTR mode with
867 * CBC-MAC using the same block cipher and the same key, to provide
868 * authenticated encryption:
869 *
870 * - Any block cipher with 16-byte blocks can be used with CCM
871 * (technically, other block sizes are defined as well, but this
872 * is not implemented by these functions; shorter blocks also
873 * imply numerous security issues).
874 *
875 * - The authentication tag length, and plaintext length, MUST be
876 * known when starting processing data. Plaintext and ciphertext
877 * can still be provided by chunks, but the total size must match
878 * the value provided upon initialisation.
879 *
880 * - The nonce length is constrained between 7 and 13 bytes (inclusive).
881 * Furthermore, the plaintext length, when encoded, must fit over
882 * 15-nonceLen bytes; thus, if the nonce has length 13 bytes, then
883 * the plaintext length cannot exceed 65535 bytes.
884 *
885 * - Additional authenticated data length is practically unlimited
886 * (formal limit is at 2^64 bytes).
887 *
888 * - The authentication tag has length 4 to 16 bytes (even values only).
889 *
890 * The CCM initialisation function receives as parameter an
891 * _initialised_ block cipher implementation context, with the secret
892 * key already set. A pointer to that context will be kept within the
893 * CCM context structure. It is up to the caller to allocate and
894 * initialise that block cipher context.
895 */
896 typedef struct {
897#ifndef BR_DOXYGEN_IGNORE
898 const br_block_ctrcbc_class **bctx;
899 unsigned char ctr[16];
900 unsigned char cbcmac[16];
901 unsigned char tagmask[16];
902 unsigned char buf[16];
903 size_t ptr;
904 size_t tag_len;
905#endif
906} br_ccm_context;
907
908/**
909 * \brief Initialize a CCM context.
910 *
911 * A block cipher implementation, with its initialised context
912 * structure, is provided. The block cipher MUST use 16-byte blocks in
913 * CTR + CBC-MAC mode, and its secret key MUST have been already set in
914 * the provided context. The parameters are linked in the CCM context.
915 *
916 * After this function has been called, the `br_ccm_reset()` function must
917 * be called, to provide the nonce for CCM computation.
918 *
919 * \param ctx CCM context structure.
920 * \param bctx block cipher context (already initialised with secret key).
921 */
922 void br_ccm_init(br_ccm_context *ctx, const br_block_ctrcbc_class **bctx);
923
924/**
925 * \brief Reset a CCM context.
926 *
927 * This function resets an already initialised CCM context for a new
928 * computation run. Implementations and keys are conserved. This function
929 * can be called at any time; it cancels any ongoing CCM computation that
930 * uses the provided context structure.
931 *
932 * The `aad_len` parameter contains the total length, in bytes, of the
933 * additional authenticated data. It may be zero. That length MUST be
934 * exact.
935 *
936 * The `data_len` parameter contains the total length, in bytes, of the
937 * data that will be injected (plaintext or ciphertext). That length MUST
938 * be exact. Moreover, that length MUST be less than 2^(8*(15-nonce_len)).
939 *
940 * The nonce length (`nonce_len`), in bytes, must be in the 7..13 range
941 * (inclusive).
942 *
943 * The tag length (`tag_len`), in bytes, must be in the 4..16 range, and
944 * be an even integer. Short tags mechanically allow for higher forgery
945 * probabilities; hence, tag sizes smaller than 12 bytes shall be used only
946 * with care.
947 *
948 * It is critical to CCM security that nonce values are not repeated for
949 * the same encryption key. Random generation of nonces is not generally
950 * recommended, due to the relatively small maximum nonce value.
951 *
952 * Returned value is 1 on success, 0 on error. An error is reported if
953 * the tag or nonce length is out of range, or if the
954 * plaintext/ciphertext length cannot be encoded with the specified
955 * nonce length.
956 *
957 * \param ctx CCM context structure.
958 * \param nonce CCM nonce to use.
959 * \param nonce_len CCM nonce length (in bytes, 7 to 13).
960 * \param aad_len additional authenticated data length (in bytes).
961 * \param data_len plaintext/ciphertext length (in bytes).
962 * \param tag_len tag length (in bytes).
963 * \return 1 on success, 0 on error.
964 */
965 int br_ccm_reset(br_ccm_context *ctx, const void *nonce, size_t nonce_len,
966 uint64_t aad_len, uint64_t data_len, size_t tag_len);
967
968/**
969 * \brief Inject additional authenticated data into CCM.
970 *
971 * The provided data is injected into a running CCM computation. Additional
972 * data must be injected _before_ the call to `br_ccm_flip()`.
973 * Additional data can be injected in several chunks of arbitrary length,
974 * but the total amount MUST exactly match the value which was provided
975 * to `br_ccm_reset()`.
976 *
977 * \param ctx CCM context structure.
978 * \param data pointer to additional authenticated data.
979 * \param len length of additional authenticated data (in bytes).
980 */
981 void br_ccm_aad_inject(br_ccm_context *ctx, const void *data, size_t len);
982
983/**
984 * \brief Finish injection of additional authenticated data into CCM.
985 *
986 * This function MUST be called before beginning the actual encryption
987 * or decryption (with `br_ccm_run()`), even if no additional authenticated
988 * data was injected. No additional authenticated data may be injected
989 * after this function call.
990 *
991 * \param ctx CCM context structure.
992 */
993 void br_ccm_flip(br_ccm_context *ctx);
994
995/**
996 * \brief Encrypt or decrypt some data with CCM.
997 *
998 * Data encryption or decryption can be done after `br_ccm_flip()`
999 * has been called on the context. If `encrypt` is non-zero, then the
1000 * provided data shall be plaintext, and it is encrypted in place.
1001 * Otherwise, the data shall be ciphertext, and it is decrypted in place.
1002 *
1003 * Data may be provided in several chunks of arbitrary length, provided
1004 * that the total length exactly matches the length provided to the
1005 * `br_ccm_reset()` call.
1006 *
1007 * \param ctx CCM context structure.
1008 * \param encrypt non-zero for encryption, zero for decryption.
1009 * \param data data to encrypt or decrypt.
1010 * \param len data length (in bytes).
1011 */
1012 void br_ccm_run(br_ccm_context *ctx, int encrypt, void *data, size_t len);
1013
1014/**
1015 * \brief Compute CCM authentication tag.
1016 *
1017 * Compute the CCM authentication tag. This call terminates the CCM
1018 * run: all data must have been injected with `br_ccm_run()` (in zero,
1019 * one or more successive calls). After this function has been called,
1020 * no more data can br processed; a `br_ccm_reset()` call is required
1021 * to start a new message.
1022 *
1023 * The tag length was provided upon context initialisation (last call
1024 * to `br_ccm_reset()`); it is returned by this function.
1025 *
1026 * The tag value must normally be sent along with the encrypted data.
1027 * When decrypting, the tag value must be recomputed and compared with
1028 * the received tag: if the two tag values differ, then either the tag
1029 * or the encrypted data was altered in transit. As an alternative to
1030 * this function, the `br_ccm_check_tag()` function can be used to
1031 * compute and check the tag value.
1032 *
1033 * \param ctx CCM context structure.
1034 * \param tag destination buffer for the tag (up to 16 bytes).
1035 * \return the tag length (in bytes).
1036 */
1037 size_t br_ccm_get_tag(br_ccm_context *ctx, void *tag);
1038
1039/**
1040 * \brief Compute and check CCM authentication tag.
1041 *
1042 * This function is an alternative to `br_ccm_get_tag()`, normally used
1043 * on the receiving end (i.e. when decrypting value). The tag value is
1044 * recomputed and compared with the provided tag value. If they match, 1
1045 * is returned; on mismatch, 0 is returned. A returned value of 0 means
1046 * that the data or the tag was altered in transit, normally leading to
1047 * wholesale rejection of the complete message.
1048 *
1049 * \param ctx CCM context structure.
1050 * \param tag tag value to compare with (up to 16 bytes).
1051 * \return 1 on success (exact match of tag value), 0 otherwise.
1052 */
1053uint32_t br_ccm_check_tag(br_ccm_context *ctx, const void *tag);
1054
1055#ifdef __cplusplus
1056}
1057#endif
1058
1059#endif
br_eax_aad_inject
void br_eax_aad_inject(br_eax_context *ctx, const void *data, size_t len)
Inject additional authenticated data into EAX.
br_eax_check_tag
uint32_t br_eax_check_tag(br_eax_context *ctx, const void *tag)
Compute and check EAX authentication tag.
br_eax_init
void br_eax_init(br_eax_context *ctx, const br_block_ctrcbc_class **bctx)
Initialize an EAX context.
br_gcm_aad_inject
void br_gcm_aad_inject(br_gcm_context *ctx, const void *data, size_t len)
Inject additional authenticated data into GCM.
br_eax_vtable
const br_aead_class br_eax_vtable
Class instance for EAX.
br_gcm_vtable
const br_aead_class br_gcm_vtable
Class instance for GCM.
br_eax_capture
void br_eax_capture(const br_eax_context *ctx, br_eax_state *st)
Capture pre-AAD state.
br_ccm_reset
int br_ccm_reset(br_ccm_context *ctx, const void *nonce, size_t nonce_len, uint64_t aad_len, uint64_t data_len, size_t tag_len)
Reset a CCM context.
br_ccm_check_tag
uint32_t br_ccm_check_tag(br_ccm_context *ctx, const void *tag)
Compute and check CCM authentication tag.
br_eax_reset
void br_eax_reset(br_eax_context *ctx, const void *nonce, size_t len)
Reset an EAX context.
br_ccm_run
void br_ccm_run(br_ccm_context *ctx, int encrypt, void *data, size_t len)
Encrypt or decrypt some data with CCM.
br_gcm_run
void br_gcm_run(br_gcm_context *ctx, int encrypt, void *data, size_t len)
Encrypt or decrypt some data with GCM.
br_gcm_check_tag_trunc
uint32_t br_gcm_check_tag_trunc(br_gcm_context *ctx, const void *tag, size_t len)
Compute and check GCM authentication tag (with truncation).
br_ccm_init
void br_ccm_init(br_ccm_context *ctx, const br_block_ctrcbc_class **bctx)
Initialize a CCM context.
br_eax_get_tag
void br_eax_get_tag(br_eax_context *ctx, void *tag)
Compute EAX authentication tag.
br_eax_check_tag_trunc
uint32_t br_eax_check_tag_trunc(br_eax_context *ctx, const void *tag, size_t len)
Compute and check EAX authentication tag (with truncation).
br_gcm_reset
void br_gcm_reset(br_gcm_context *ctx, const void *iv, size_t len)
Reset a GCM context.
br_eax_flip
void br_eax_flip(br_eax_context *ctx)
Finish injection of additional authenticated data into EAX.
br_eax_get_aad_mac
static void br_eax_get_aad_mac(const br_eax_context *ctx, br_eax_state *st)
Obtain a copy of the MAC on additional authenticated data.
Definition bearssl_aead.h:745
br_eax_run
void br_eax_run(br_eax_context *ctx, int encrypt, void *data, size_t len)
Encrypt or decrypt some data with EAX.
br_gcm_init
void br_gcm_init(br_gcm_context *ctx, const br_block_ctr_class **bctx, br_ghash gh)
Initialize a GCM context.
br_gcm_check_tag
uint32_t br_gcm_check_tag(br_gcm_context *ctx, const void *tag)
Compute and check GCM authentication tag.
br_ccm_aad_inject
void br_ccm_aad_inject(br_ccm_context *ctx, const void *data, size_t len)
Inject additional authenticated data into CCM.
br_ccm_get_tag
size_t br_ccm_get_tag(br_ccm_context *ctx, void *tag)
Compute CCM authentication tag.
br_ccm_flip
void br_ccm_flip(br_ccm_context *ctx)
Finish injection of additional authenticated data into CCM.
br_gcm_flip
void br_gcm_flip(br_gcm_context *ctx)
Finish injection of additional authenticated data into GCM.
br_eax_reset_post_aad
void br_eax_reset_post_aad(br_eax_context *ctx, const br_eax_state *st, const void *nonce, size_t len)
Reset an EAX context with a post-AAD captured state.
br_gcm_get_tag_trunc
void br_gcm_get_tag_trunc(br_gcm_context *ctx, void *tag, size_t len)
Compute GCM authentication tag (with truncation).
br_eax_get_tag_trunc
void br_eax_get_tag_trunc(br_eax_context *ctx, void *tag, size_t len)
Compute EAX authentication tag (with truncation).
br_gcm_get_tag
void br_gcm_get_tag(br_gcm_context *ctx, void *tag)
Compute GCM authentication tag.
br_eax_reset_pre_aad
void br_eax_reset_pre_aad(br_eax_context *ctx, const br_eax_state *st, const void *nonce, size_t len)
Reset an EAX context with a pre-AAD captured state.
bearssl_block.h
bearssl_hash.h
br_ghash
void(* br_ghash)(void *y, const void *h, const void *data, size_t len)
Type for a GHASH implementation.
Definition bearssl_hash.h:1239
br_aead_class_
Class type of an AEAD algorithm.
Definition bearssl_aead.h:181
br_aead_class_::get_tag_trunc
void(* get_tag_trunc)(const br_aead_class **cc, void *tag, size_t len)
Compute authentication tag (with truncation).
Definition bearssl_aead.h:311
br_aead_class_::run
void(* run)(const br_aead_class **cc, int encrypt, void *data, size_t len)
Encrypt or decrypt some data.
Definition bearssl_aead.h:252
br_aead_class_::get_tag
void(* get_tag)(const br_aead_class **cc, void *tag)
Compute authentication tag.
Definition bearssl_aead.h:277
br_aead_class_::check_tag
uint32_t(* check_tag)(const br_aead_class **cc, const void *tag)
Compute and check authentication tag.
Definition bearssl_aead.h:296
br_aead_class_::check_tag_trunc
uint32_t(* check_tag_trunc)(const br_aead_class **cc, const void *tag, size_t len)
Compute and check authentication tag (with truncation).
Definition bearssl_aead.h:326
br_aead_class_::reset
void(* reset)(const br_aead_class **cc, const void *iv, size_t len)
Reset an AEAD context.
Definition bearssl_aead.h:207
br_aead_class_::flip
void(* flip)(const br_aead_class **cc)
Finish injection of additional authenticated data.
Definition bearssl_aead.h:234
br_aead_class_::tag_size
size_t tag_size
Size (in bytes) of authentication tags created by this AEAD algorithm.
Definition bearssl_aead.h:187
br_aead_class_::aad_inject
void(* aad_inject)(const br_aead_class **cc, const void *data, size_t len)
Inject additional authenticated data.
Definition bearssl_aead.h:221
br_ccm_context
Context structure for CCM.
Definition bearssl_aead.h:896
br_eax_context
Context structure for EAX.
Definition bearssl_aead.h:578
br_eax_context::vtable
const br_aead_class * vtable
Pointer to vtable for this context.
Definition bearssl_aead.h:580
br_eax_state
EAX captured state.
Definition bearssl_aead.h:603
br_gcm_context
Context structure for GCM.
Definition bearssl_aead.h:355
br_gcm_context::vtable
const br_aead_class * vtable
Pointer to vtable for this context.
Definition bearssl_aead.h:357