blob: 61bcaa6b6465fd1aacaec03b65c0b88de573f6e0 [file] [log] [blame]
Daniel Kingadc32c02016-05-16 18:25:45 -03001/**
2 * \file poly1305.h
3 *
Manuel Pégourié-Gonnardc7bc9e12018-06-18 10:30:30 +02004 * \brief This file contains Poly1305 definitions and functions.
Daniel Kingadc32c02016-05-16 18:25:45 -03005 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +02006 * Poly1305 is a one-time message authenticator that can be used to
7 * authenticate messages. Poly1305-AES was created by Daniel
8 * Bernstein https://cr.yp.to/mac/poly1305-20050329.pdf The generic
9 * Poly1305 algorithm (not tied to AES) was also standardized in RFC
10 * 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
Dave Rodgman16799db2023-11-02 19:47:20 +000017 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Daniel Kingadc32c02016-05-16 18:25:45 -030018 */
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020019
Daniel Kingadc32c02016-05-16 18:25:45 -030020#ifndef MBEDTLS_POLY1305_H
21#define MBEDTLS_POLY1305_H
Mateusz Starzyk846f0212021-05-19 19:44:07 +020022#include "mbedtls/private_access.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030023
Bence Szépkútic662b362021-05-27 11:25:03 +020024#include "mbedtls/build_info.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030025
26#include <stdint.h>
27#include <stddef.h>
28
Gilles Peskined2971572021-07-26 18:48:10 +020029/** Invalid input parameter(s). */
30#define MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA -0x0057
Ron Eldor9924bdc2018-10-04 10:59:13 +030031
Manuel Pégourié-Gonnard823b7a02018-05-07 10:10:30 +020032#ifdef __cplusplus
33extern "C" {
34#endif
35
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +020036#if !defined(MBEDTLS_POLY1305_ALT)
37
Gilles Peskine449bd832023-01-11 14:50:10 +010038typedef struct mbedtls_poly1305_context {
Mateusz Starzyk846f0212021-05-19 19:44:07 +020039 uint32_t MBEDTLS_PRIVATE(r)[4]; /** The value for 'r' (low 128 bits of the key). */
40 uint32_t MBEDTLS_PRIVATE(s)[4]; /** The value for 's' (high 128 bits of the key). */
41 uint32_t MBEDTLS_PRIVATE(acc)[5]; /** The accumulator number. */
42 uint8_t MBEDTLS_PRIVATE(queue)[16]; /** The current partial block of data. */
43 size_t MBEDTLS_PRIVATE(queue_len); /** The number of bytes stored in 'queue'. */
Daniel Kingadc32c02016-05-16 18:25:45 -030044}
45mbedtls_poly1305_context;
46
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +020047#else /* MBEDTLS_POLY1305_ALT */
48#include "poly1305_alt.h"
49#endif /* MBEDTLS_POLY1305_ALT */
50
Daniel Kingadc32c02016-05-16 18:25:45 -030051/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020052 * \brief This function initializes the specified Poly1305 context.
Daniel Kingadc32c02016-05-16 18:25:45 -030053 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020054 * It must be the first API called before using
55 * the context.
56 *
57 * It is usually followed by a call to
58 * \c mbedtls_poly1305_starts(), then one or more calls to
59 * \c mbedtls_poly1305_update(), then one call to
60 * \c mbedtls_poly1305_finish(), then finally
61 * \c mbedtls_poly1305_free().
62 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050063 * \param ctx The Poly1305 context to initialize. This must
64 * not be \c NULL.
Daniel Kingadc32c02016-05-16 18:25:45 -030065 */
Gilles Peskine449bd832023-01-11 14:50:10 +010066void mbedtls_poly1305_init(mbedtls_poly1305_context *ctx);
Daniel Kingadc32c02016-05-16 18:25:45 -030067
68/**
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050069 * \brief This function releases and clears the specified
70 * Poly1305 context.
Daniel Kingadc32c02016-05-16 18:25:45 -030071 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050072 * \param ctx The Poly1305 context to clear. This may be \c NULL, in which
73 * case this function is a no-op. If it is not \c NULL, it must
74 * point to an initialized Poly1305 context.
Daniel Kingadc32c02016-05-16 18:25:45 -030075 */
Gilles Peskine449bd832023-01-11 14:50:10 +010076void mbedtls_poly1305_free(mbedtls_poly1305_context *ctx);
Daniel Kingadc32c02016-05-16 18:25:45 -030077
78/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020079 * \brief This function sets the one-time authentication key.
Daniel Kingadc32c02016-05-16 18:25:45 -030080 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020081 * \warning The key must be unique and unpredictable for each
82 * invocation of Poly1305.
Daniel Kingadc32c02016-05-16 18:25:45 -030083 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020084 * \param ctx The Poly1305 context to which the key should be bound.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050085 * This must be initialized.
86 * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key.
Daniel Kingadc32c02016-05-16 18:25:45 -030087 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020088 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050089 * \return A negative error code on failure.
Daniel Kingadc32c02016-05-16 18:25:45 -030090 */
Gilles Peskine449bd832023-01-11 14:50:10 +010091int mbedtls_poly1305_starts(mbedtls_poly1305_context *ctx,
92 const unsigned char key[32]);
Daniel Kingadc32c02016-05-16 18:25:45 -030093
94/**
Manuel Pégourié-Gonnardd2db09f2018-06-04 12:31:12 +020095 * \brief This functions feeds an input buffer into an ongoing
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +020096 * Poly1305 computation.
Daniel Kingadc32c02016-05-16 18:25:45 -030097 *
Manuel Pégourié-Gonnardc7bc9e12018-06-18 10:30:30 +020098 * It is called between \c mbedtls_cipher_poly1305_starts() and
99 * \c mbedtls_cipher_poly1305_finish().
100 * It can be called repeatedly to process a stream of data.
Daniel Kingadc32c02016-05-16 18:25:45 -0300101 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200102 * \param ctx The Poly1305 context to use for the Poly1305 operation.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500103 * This must be initialized and bound to a key.
104 * \param ilen The length of the input data in Bytes.
105 * Any value is accepted.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200106 * \param input The buffer holding the input data.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500107 * This pointer can be \c NULL if `ilen == 0`.
Daniel Kingadc32c02016-05-16 18:25:45 -0300108 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200109 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500110 * \return A negative error code on failure.
Daniel Kingadc32c02016-05-16 18:25:45 -0300111 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100112int mbedtls_poly1305_update(mbedtls_poly1305_context *ctx,
113 const unsigned char *input,
114 size_t ilen);
Daniel Kingadc32c02016-05-16 18:25:45 -0300115
116/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200117 * \brief This function generates the Poly1305 Message
118 * Authentication Code (MAC).
Daniel Kingadc32c02016-05-16 18:25:45 -0300119 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200120 * \param ctx The Poly1305 context to use for the Poly1305 operation.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500121 * This must be initialized and bound to a key.
122 * \param mac The buffer to where the MAC is written. This must
123 * be a writable buffer of length \c 16 Bytes.
Daniel Kingadc32c02016-05-16 18:25:45 -0300124 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200125 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500126 * \return A negative error code on failure.
Daniel Kingadc32c02016-05-16 18:25:45 -0300127 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100128int mbedtls_poly1305_finish(mbedtls_poly1305_context *ctx,
129 unsigned char mac[16]);
Daniel Kingadc32c02016-05-16 18:25:45 -0300130
Daniel Kingadc32c02016-05-16 18:25:45 -0300131/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200132 * \brief This function calculates the Poly1305 MAC of the input
133 * buffer with the provided key.
Daniel Kingadc32c02016-05-16 18:25:45 -0300134 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200135 * \warning The key must be unique and unpredictable for each
136 * invocation of Poly1305.
Daniel Kingadc32c02016-05-16 18:25:45 -0300137 *
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500138 * \param key The buffer containing the \c 32 Byte (\c 256 Bit) key.
139 * \param ilen The length of the input data in Bytes.
140 * Any value is accepted.
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200141 * \param input The buffer holding the input data.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500142 * This pointer can be \c NULL if `ilen == 0`.
143 * \param mac The buffer to where the MAC is written. This must be
144 * a writable buffer of length \c 16 Bytes.
Daniel Kingadc32c02016-05-16 18:25:45 -0300145 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200146 * \return \c 0 on success.
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500147 * \return A negative error code on failure.
Daniel Kingadc32c02016-05-16 18:25:45 -0300148 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100149int mbedtls_poly1305_mac(const unsigned char key[32],
150 const unsigned char *input,
151 size_t ilen,
152 unsigned char mac[16]);
Daniel Kingadc32c02016-05-16 18:25:45 -0300153
Manuel Pégourié-Gonnardc22e61a2018-05-24 13:51:05 +0200154#if defined(MBEDTLS_SELF_TEST)
Daniel Kingadc32c02016-05-16 18:25:45 -0300155/**
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200156 * \brief The Poly1305 checkup routine.
Daniel Kingadc32c02016-05-16 18:25:45 -0300157 *
Manuel Pégourié-Gonnardb500f8b2018-05-08 12:43:48 +0200158 * \return \c 0 on success.
159 * \return \c 1 on failure.
Daniel Kingadc32c02016-05-16 18:25:45 -0300160 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100161int mbedtls_poly1305_self_test(int verbose);
Manuel Pégourié-Gonnardc22e61a2018-05-24 13:51:05 +0200162#endif /* MBEDTLS_SELF_TEST */
Daniel Kingadc32c02016-05-16 18:25:45 -0300163
Manuel Pégourié-Gonnard823b7a02018-05-07 10:10:30 +0200164#ifdef __cplusplus
165}
166#endif
167
Daniel Kingadc32c02016-05-16 18:25:45 -0300168#endif /* MBEDTLS_POLY1305_H */