blob: 1007f95bbb12716f2e5d4e77dfb16938e49ddc81 [file] [log] [blame]
Daniel Kingb8025c52016-05-17 14:43:01 -03001/**
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02002 * \file chachapoly.h
Daniel Kingb8025c52016-05-17 14:43:01 -03003 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +02004 * \brief This file contains the AEAD-ChaCha20-Poly1305 definitions and
5 * functions.
Daniel Kingb8025c52016-05-17 14:43:01 -03006 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +02007 * ChaCha20-Poly1305 is an algorithm for Authenticated Encryption
8 * with Associated Data (AEAD) that can be used to encrypt and
9 * authenticate data. It is based on ChaCha20 and Poly1305 by Daniel
10 * Bernstein and was standardized in RFC 7539.
11 *
12 * \author Daniel King <damaki.gh@gmail.com>
13 */
14
Bence Szépkúti86974652020-06-15 11:59:37 +020015/*
Bence Szépkúti1e148272020-08-07 13:07:28 +020016 * Copyright The Mbed TLS Contributors
Daniel Kingb8025c52016-05-17 14:43:01 -030017 * SPDX-License-Identifier: Apache-2.0
18 *
19 * Licensed under the Apache License, Version 2.0 (the "License"); you may
20 * not use this file except in compliance with the License.
21 * You may obtain a copy of the License at
22 *
23 * http://www.apache.org/licenses/LICENSE-2.0
24 *
25 * Unless required by applicable law or agreed to in writing, software
26 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
27 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28 * See the License for the specific language governing permissions and
29 * limitations under the License.
Daniel Kingb8025c52016-05-17 14:43:01 -030030 */
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020031
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020032#ifndef MBEDTLS_CHACHAPOLY_H
33#define MBEDTLS_CHACHAPOLY_H
Daniel Kingb8025c52016-05-17 14:43:01 -030034
35#if !defined(MBEDTLS_CONFIG_FILE)
Jaeden Ameroc49fbbf2019-07-04 20:01:14 +010036#include "mbedtls/config.h"
Daniel Kingb8025c52016-05-17 14:43:01 -030037#else
38#include MBEDTLS_CONFIG_FILE
39#endif
40
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +020041/* for shared error codes */
Jaeden Ameroc49fbbf2019-07-04 20:01:14 +010042#include "mbedtls/poly1305.h"
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +020043
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +020044#define MBEDTLS_ERR_CHACHAPOLY_BAD_STATE -0x0054 /**< The requested operation is not permitted in the current state. */
45#define MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED -0x0056 /**< Authenticated decryption failed: data was not authentic. */
Daniel Kingb8025c52016-05-17 14:43:01 -030046
Manuel Pégourié-Gonnard823b7a02018-05-07 10:10:30 +020047#ifdef __cplusplus
48extern "C" {
49#endif
50
Daniel Kingb8025c52016-05-17 14:43:01 -030051typedef enum
52{
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020053 MBEDTLS_CHACHAPOLY_ENCRYPT, /**< The mode value for performing encryption. */
54 MBEDTLS_CHACHAPOLY_DECRYPT /**< The mode value for performing decryption. */
Daniel Kingb8025c52016-05-17 14:43:01 -030055}
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020056mbedtls_chachapoly_mode_t;
Daniel Kingb8025c52016-05-17 14:43:01 -030057
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020058#if !defined(MBEDTLS_CHACHAPOLY_ALT)
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +020059
Jaeden Ameroc49fbbf2019-07-04 20:01:14 +010060#include "mbedtls/chacha20.h"
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +020061
Dawid Drozd428cc522018-07-24 10:02:47 +020062typedef struct mbedtls_chachapoly_context
Daniel Kingb8025c52016-05-17 14:43:01 -030063{
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020064 mbedtls_chacha20_context chacha20_ctx; /**< The ChaCha20 context. */
65 mbedtls_poly1305_context poly1305_ctx; /**< The Poly1305 context. */
66 uint64_t aad_len; /**< The length (bytes) of the Additional Authenticated Data. */
67 uint64_t ciphertext_len; /**< The length (bytes) of the ciphertext. */
68 int state; /**< The current state of the context. */
69 mbedtls_chachapoly_mode_t mode; /**< Cipher mode (encrypt or decrypt). */
Daniel Kingb8025c52016-05-17 14:43:01 -030070}
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020071mbedtls_chachapoly_context;
Daniel Kingb8025c52016-05-17 14:43:01 -030072
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020073#else /* !MBEDTLS_CHACHAPOLY_ALT */
74#include "chachapoly_alt.h"
75#endif /* !MBEDTLS_CHACHAPOLY_ALT */
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +020076
Daniel Kingb8025c52016-05-17 14:43:01 -030077/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020078 * \brief This function initializes the specified ChaCha20-Poly1305 context.
Daniel Kingb8025c52016-05-17 14:43:01 -030079 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020080 * It must be the first API called before using
81 * the context. It must be followed by a call to
82 * \c mbedtls_chachapoly_setkey() before any operation can be
83 * done, and to \c mbedtls_chachapoly_free() once all
84 * operations with that context have been finished.
85 *
86 * In order to encrypt or decrypt full messages at once, for
87 * each message you should make a single call to
88 * \c mbedtls_chachapoly_crypt_and_tag() or
89 * \c mbedtls_chachapoly_auth_decrypt().
90 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +020091 * In order to encrypt messages piecewise, for each
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020092 * message you should make a call to
93 * \c mbedtls_chachapoly_starts(), then 0 or more calls to
94 * \c mbedtls_chachapoly_update_aad(), then 0 or more calls to
95 * \c mbedtls_chachapoly_update(), then one call to
96 * \c mbedtls_chachapoly_finish().
97 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +020098 * \warning Decryption with the piecewise API is discouraged! Always
99 * use \c mbedtls_chachapoly_auth_decrypt() when possible!
100 *
101 * If however this is not possible because the data is too
102 * large to fit in memory, you need to:
103 *
104 * - call \c mbedtls_chachapoly_starts() and (if needed)
105 * \c mbedtls_chachapoly_update_aad() as above,
106 * - call \c mbedtls_chachapoly_update() multiple times and
107 * ensure its output (the plaintext) is NOT used in any other
108 * way than placing it in temporary storage at this point,
109 * - call \c mbedtls_chachapoly_finish() to compute the
110 * authentication tag and compared it in constant time to the
111 * tag received with the ciphertext.
112 *
113 * If the tags are not equal, you must immediately discard
114 * all previous outputs of \c mbedtls_chachapoly_update(),
115 * otherwise you can now safely use the plaintext.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200116 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500117 * \param ctx The ChachaPoly context to initialize. Must not be \c NULL.
Daniel Kingb8025c52016-05-17 14:43:01 -0300118 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200119void mbedtls_chachapoly_init( mbedtls_chachapoly_context *ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -0300120
121/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500122 * \brief This function releases and clears the specified
123 * ChaCha20-Poly1305 context.
Daniel Kingb8025c52016-05-17 14:43:01 -0300124 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500125 * \param ctx The ChachaPoly context to clear. This may be \c NULL, in which
126 * case this function is a no-op.
Daniel Kingb8025c52016-05-17 14:43:01 -0300127 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200128void mbedtls_chachapoly_free( mbedtls_chachapoly_context *ctx );
Daniel Kingb8025c52016-05-17 14:43:01 -0300129
130/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500131 * \brief This function sets the ChaCha20-Poly1305
132 * symmetric encryption key.
Daniel Kingb8025c52016-05-17 14:43:01 -0300133 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200134 * \param ctx The ChaCha20-Poly1305 context to which the key should be
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500135 * bound. This must be initialized.
136 * \param key The \c 256 Bit (\c 32 Bytes) key.
Daniel Kingb8025c52016-05-17 14:43:01 -0300137 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200138 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500139 * \return A negative error code on failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300140 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200141int mbedtls_chachapoly_setkey( mbedtls_chachapoly_context *ctx,
142 const unsigned char key[32] );
Daniel Kingb8025c52016-05-17 14:43:01 -0300143
144/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200145 * \brief This function starts a ChaCha20-Poly1305 encryption or
146 * decryption operation.
Daniel Kingb8025c52016-05-17 14:43:01 -0300147 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200148 * \warning You must never use the same nonce twice with the same key.
149 * This would void any confidentiality and authenticity
150 * guarantees for the messages encrypted with the same nonce
151 * and key.
Daniel Kingb8025c52016-05-17 14:43:01 -0300152 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200153 * \note If the context is being used for AAD only (no data to
154 * encrypt or decrypt) then \p mode can be set to any value.
Daniel Kingb8025c52016-05-17 14:43:01 -0300155 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +0200156 * \warning Decryption with the piecewise API is discouraged, see the
157 * warning on \c mbedtls_chachapoly_init().
158 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500159 * \param ctx The ChaCha20-Poly1305 context. This must be initialized
160 * and bound to a key.
161 * \param nonce The nonce/IV to use for the message.
162 * This must be a redable buffer of length \c 12 Bytes.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200163 * \param mode The operation to perform: #MBEDTLS_CHACHAPOLY_ENCRYPT or
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +0200164 * #MBEDTLS_CHACHAPOLY_DECRYPT (discouraged, see warning).
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200165 *
166 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500167 * \return A negative error code on failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300168 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200169int mbedtls_chachapoly_starts( mbedtls_chachapoly_context *ctx,
170 const unsigned char nonce[12],
171 mbedtls_chachapoly_mode_t mode );
Daniel Kingb8025c52016-05-17 14:43:01 -0300172
173/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200174 * \brief This function feeds additional data to be authenticated
175 * into an ongoing ChaCha20-Poly1305 operation.
Daniel Kingb8025c52016-05-17 14:43:01 -0300176 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200177 * The Additional Authenticated Data (AAD), also called
178 * Associated Data (AD) is only authenticated but not
179 * encrypted nor included in the encrypted output. It is
Manuel Pégourié-Gonnardc7bc9e12018-06-18 10:30:30 +0200180 * usually transmitted separately from the ciphertext or
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200181 * computed locally by each party.
Daniel Kingb8025c52016-05-17 14:43:01 -0300182 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200183 * \note This function is called before data is encrypted/decrypted.
184 * I.e. call this function to process the AAD before calling
185 * \c mbedtls_chachapoly_update().
Daniel Kingb8025c52016-05-17 14:43:01 -0300186 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200187 * You may call this function multiple times to process
188 * an arbitrary amount of AAD. It is permitted to call
189 * this function 0 times, if no AAD is used.
Daniel Kingb8025c52016-05-17 14:43:01 -0300190 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200191 * This function cannot be called any more if data has
192 * been processed by \c mbedtls_chachapoly_update(),
193 * or if the context has been finished.
Daniel Kingb8025c52016-05-17 14:43:01 -0300194 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +0200195 * \warning Decryption with the piecewise API is discouraged, see the
196 * warning on \c mbedtls_chachapoly_init().
197 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500198 * \param ctx The ChaCha20-Poly1305 context. This must be initialized
199 * and bound to a key.
200 * \param aad_len The length in Bytes of the AAD. The length has no
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200201 * restrictions.
202 * \param aad Buffer containing the AAD.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500203 * This pointer can be \c NULL if `aad_len == 0`.
Daniel Kingb8025c52016-05-17 14:43:01 -0300204 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200205 * \return \c 0 on success.
Manuel Pégourié-Gonnard3798b6b2018-05-24 13:27:45 +0200206 * \return #MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200207 * if \p ctx or \p aad are NULL.
208 * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE
209 * if the operations has not been started or has been
210 * finished, or if the AAD has been finished.
Daniel Kingb8025c52016-05-17 14:43:01 -0300211 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200212int mbedtls_chachapoly_update_aad( mbedtls_chachapoly_context *ctx,
Manuel Pégourié-Gonnard5ef92d32018-05-09 09:34:25 +0200213 const unsigned char *aad,
214 size_t aad_len );
Daniel Kingb8025c52016-05-17 14:43:01 -0300215
216/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200217 * \brief Thus function feeds data to be encrypted or decrypted
218 * into an on-going ChaCha20-Poly1305
219 * operation.
Daniel Kingb8025c52016-05-17 14:43:01 -0300220 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200221 * The direction (encryption or decryption) depends on the
222 * mode that was given when calling
223 * \c mbedtls_chachapoly_starts().
Daniel Kingb8025c52016-05-17 14:43:01 -0300224 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200225 * You may call this function multiple times to process
226 * an arbitrary amount of data. It is permitted to call
227 * this function 0 times, if no data is to be encrypted
228 * or decrypted.
Daniel Kingb8025c52016-05-17 14:43:01 -0300229 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +0200230 * \warning Decryption with the piecewise API is discouraged, see the
231 * warning on \c mbedtls_chachapoly_init().
232 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500233 * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200234 * \param len The length (in bytes) of the data to encrypt or decrypt.
235 * \param input The buffer containing the data to encrypt or decrypt.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500236 * This pointer can be \c NULL if `len == 0`.
237 * \param output The buffer to where the encrypted or decrypted data is
238 * written. This must be able to hold \p len bytes.
239 * This pointer can be \c NULL if `len == 0`.
Daniel Kingb8025c52016-05-17 14:43:01 -0300240 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200241 * \return \c 0 on success.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200242 * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE
243 * if the operation has not been started or has been
244 * finished.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500245 * \return Another negative error code on other kinds of failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300246 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200247int mbedtls_chachapoly_update( mbedtls_chachapoly_context *ctx,
248 size_t len,
249 const unsigned char *input,
250 unsigned char *output );
Daniel Kingb8025c52016-05-17 14:43:01 -0300251
252/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200253 * \brief This function finished the ChaCha20-Poly1305 operation and
254 * generates the MAC (authentication tag).
Daniel Kingb8025c52016-05-17 14:43:01 -0300255 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500256 * \param ctx The ChaCha20-Poly1305 context to use. This must be initialized.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200257 * \param mac The buffer to where the 128-bit (16 bytes) MAC is written.
Daniel Kingb8025c52016-05-17 14:43:01 -0300258 *
Manuel Pégourié-Gonnardbe78b072018-05-24 19:33:59 +0200259 * \warning Decryption with the piecewise API is discouraged, see the
260 * warning on \c mbedtls_chachapoly_init().
261 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200262 * \return \c 0 on success.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200263 * \return #MBEDTLS_ERR_CHACHAPOLY_BAD_STATE
264 * if the operation has not been started or has been
265 * finished.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500266 * \return Another negative error code on other kinds of failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300267 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200268int mbedtls_chachapoly_finish( mbedtls_chachapoly_context *ctx,
269 unsigned char mac[16] );
Daniel Kingb8025c52016-05-17 14:43:01 -0300270
Daniel Kingb8025c52016-05-17 14:43:01 -0300271/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200272 * \brief This function performs a complete ChaCha20-Poly1305
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200273 * authenticated encryption with the previously-set key.
Daniel Kingb8025c52016-05-17 14:43:01 -0300274 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200275 * \note Before using this function, you must set the key with
276 * \c mbedtls_chachapoly_setkey().
Daniel Kingb8025c52016-05-17 14:43:01 -0300277 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200278 * \warning You must never use the same nonce twice with the same key.
279 * This would void any confidentiality and authenticity
280 * guarantees for the messages encrypted with the same nonce
281 * and key.
282 *
283 * \param ctx The ChaCha20-Poly1305 context to use (holds the key).
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500284 * This must be initialized.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200285 * \param length The length (in bytes) of the data to encrypt or decrypt.
286 * \param nonce The 96-bit (12 bytes) nonce/IV to use.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500287 * \param aad The buffer containing the additional authenticated
288 * data (AAD). This pointer can be \c NULL if `aad_len == 0`.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200289 * \param aad_len The length (in bytes) of the AAD data to process.
290 * \param input The buffer containing the data to encrypt or decrypt.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500291 * This pointer can be \c NULL if `ilen == 0`.
292 * \param output The buffer to where the encrypted or decrypted data
293 * is written. This pointer can be \c NULL if `ilen == 0`.
294 * \param tag The buffer to where the computed 128-bit (16 bytes) MAC
295 * is written. This must not be \c NULL.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200296 *
297 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500298 * \return A negative error code on failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300299 */
Manuel Pégourié-Gonnard3dc62a02018-06-04 12:18:19 +0200300int mbedtls_chachapoly_encrypt_and_tag( mbedtls_chachapoly_context *ctx,
301 size_t length,
302 const unsigned char nonce[12],
303 const unsigned char *aad,
304 size_t aad_len,
305 const unsigned char *input,
306 unsigned char *output,
307 unsigned char tag[16] );
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200308
309/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200310 * \brief This function performs a complete ChaCha20-Poly1305
311 * authenticated decryption with the previously-set key.
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200312 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200313 * \note Before using this function, you must set the key with
314 * \c mbedtls_chachapoly_setkey().
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200315 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200316 * \param ctx The ChaCha20-Poly1305 context to use (holds the key).
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500317 * \param length The length (in Bytes) of the data to decrypt.
318 * \param nonce The \c 96 Bit (\c 12 bytes) nonce/IV to use.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200319 * \param aad The buffer containing the additional authenticated data (AAD).
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500320 * This pointer can be \c NULL if `aad_len == 0`.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200321 * \param aad_len The length (in bytes) of the AAD data to process.
322 * \param tag The buffer holding the authentication tag.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500323 * This must be a readable buffer of length \c 16 Bytes.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200324 * \param input The buffer containing the data to decrypt.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500325 * This pointer can be \c NULL if `ilen == 0`.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200326 * \param output The buffer to where the decrypted data is written.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500327 * This pointer can be \c NULL if `ilen == 0`.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200328 *
329 * \return \c 0 on success.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200330 * \return #MBEDTLS_ERR_CHACHAPOLY_AUTH_FAILED
331 * if the data was not authentic.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500332 * \return Another negative error code on other kinds of failure.
Manuel Pégourié-Gonnard346b8d52018-05-07 12:56:36 +0200333 */
334int mbedtls_chachapoly_auth_decrypt( mbedtls_chachapoly_context *ctx,
335 size_t length,
336 const unsigned char nonce[12],
337 const unsigned char *aad,
338 size_t aad_len,
339 const unsigned char tag[16],
340 const unsigned char *input,
341 unsigned char *output );
Daniel Kingb8025c52016-05-17 14:43:01 -0300342
Manuel Pégourié-Gonnardc22e61a2018-05-24 13:51:05 +0200343#if defined(MBEDTLS_SELF_TEST)
Daniel Kingb8025c52016-05-17 14:43:01 -0300344/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200345 * \brief The ChaCha20-Poly1305 checkup routine.
Daniel Kingb8025c52016-05-17 14:43:01 -0300346 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200347 * \return \c 0 on success.
348 * \return \c 1 on failure.
Daniel Kingb8025c52016-05-17 14:43:01 -0300349 */
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200350int mbedtls_chachapoly_self_test( int verbose );
Manuel Pégourié-Gonnardc22e61a2018-05-24 13:51:05 +0200351#endif /* MBEDTLS_SELF_TEST */
Daniel Kingb8025c52016-05-17 14:43:01 -0300352
Manuel Pégourié-Gonnard823b7a02018-05-07 10:10:30 +0200353#ifdef __cplusplus
354}
355#endif
356
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200357#endif /* MBEDTLS_CHACHAPOLY_H */