blob: f38f48a4572b398273a02894a3fab2fc886d5615 [file] [log] [blame]
Daniel Kingadc32c02016-05-16 18:25:45 -03001/**
2 * \file poly1305.c
3 *
4 * \brief Poly1305 authentication algorithm.
5 *
Bence Szépkúti1e148272020-08-07 13:07:28 +02006 * Copyright The Mbed TLS Contributors
Daniel Kingadc32c02016-05-16 18:25:45 -03007 * SPDX-License-Identifier: Apache-2.0
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
10 * not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 * http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
Daniel Kingadc32c02016-05-16 18:25:45 -030020 */
Gilles Peskinedb09ef62020-06-03 01:43:33 +020021#include "common.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030022
23#if defined(MBEDTLS_POLY1305_C)
24
Daniel Kingadc32c02016-05-16 18:25:45 -030025#include "mbedtls/poly1305.h"
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +020026#include "mbedtls/platform_util.h"
Janos Follath24eed8d2019-11-22 13:21:35 +000027#include "mbedtls/error.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030028
29#include <string.h>
30
Daniel Kingadc32c02016-05-16 18:25:45 -030031#include "mbedtls/platform.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030032
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +020033#if !defined(MBEDTLS_POLY1305_ALT)
34
Manuel Pégourié-Gonnard21a65e02018-06-07 11:54:17 +020035#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
36 !defined(inline) && !defined(__cplusplus)
37#define inline __inline
38#endif
39
Hanno Becker305e4e42018-12-11 15:03:16 +000040/* Parameter validation macros */
41#define POLY1305_VALIDATE_RET( cond ) \
42 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA )
43#define POLY1305_VALIDATE( cond ) \
44 MBEDTLS_INTERNAL_VALIDATE( cond )
45
Daniel Kingadc32c02016-05-16 18:25:45 -030046#define POLY1305_BLOCK_SIZE_BYTES ( 16U )
47
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +020048/*
49 * Our implementation is tuned for 32-bit platforms with a 64-bit multiplier.
50 * However we provided an alternative for platforms without such a multiplier.
51 */
52#if defined(MBEDTLS_NO_64BIT_MULTIPLICATION)
53static uint64_t mul64( uint32_t a, uint32_t b )
54{
55 /* a = al + 2**16 ah, b = bl + 2**16 bh */
56 const uint16_t al = (uint16_t) a;
Joe Subbiani197e9ed2021-07-16 17:47:17 +010057 const uint16_t bl = (uint16_t) b;
Joe Subbiani281956d2021-07-16 17:14:07 +010058 const uint16_t ah = a >> 16;
59 const uint16_t bh = b >> 16;
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +020060
61 /* ab = al*bl + 2**16 (ah*bl + bl*bh) + 2**32 ah*bh */
62 const uint32_t lo = (uint32_t) al * bl;
63 const uint64_t me = (uint64_t)( (uint32_t) ah * bl ) + (uint32_t) al * bh;
64 const uint32_t hi = (uint32_t) ah * bh;
65
66 return( lo + ( me << 16 ) + ( (uint64_t) hi << 32 ) );
67}
68#else
69static inline uint64_t mul64( uint32_t a, uint32_t b )
70{
71 return( (uint64_t) a * b );
72}
73#endif
74
75
Daniel Kingadc32c02016-05-16 18:25:45 -030076/**
77 * \brief Process blocks with Poly1305.
78 *
79 * \param ctx The Poly1305 context.
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020080 * \param nblocks Number of blocks to process. Note that this
81 * function only processes full blocks.
Daniel Kingadc32c02016-05-16 18:25:45 -030082 * \param input Buffer containing the input block(s).
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020083 * \param needs_padding Set to 0 if the padding bit has already been
84 * applied to the input data before calling this
85 * function. Otherwise, set this parameter to 1.
Daniel Kingadc32c02016-05-16 18:25:45 -030086 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +020087static void poly1305_process( mbedtls_poly1305_context *ctx,
88 size_t nblocks,
89 const unsigned char *input,
90 uint32_t needs_padding )
Daniel Kingadc32c02016-05-16 18:25:45 -030091{
92 uint64_t d0, d1, d2, d3;
93 uint32_t acc0, acc1, acc2, acc3, acc4;
94 uint32_t r0, r1, r2, r3;
95 uint32_t rs1, rs2, rs3;
96 size_t offset = 0U;
97 size_t i;
98
99 r0 = ctx->r[0];
100 r1 = ctx->r[1];
101 r2 = ctx->r[2];
102 r3 = ctx->r[3];
103
104 rs1 = r1 + ( r1 >> 2U );
105 rs2 = r2 + ( r2 >> 2U );
106 rs3 = r3 + ( r3 >> 2U );
107
108 acc0 = ctx->acc[0];
109 acc1 = ctx->acc[1];
110 acc2 = ctx->acc[2];
111 acc3 = ctx->acc[3];
112 acc4 = ctx->acc[4];
113
114 /* Process full blocks */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200115 for( i = 0U; i < nblocks; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -0300116 {
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200117 /* The input block is treated as a 128-bit little-endian integer */
Joe Subbiani9231d5f2021-07-07 16:56:29 +0100118 d0 = MBEDTLS_GET_UINT32_LE( input, offset + 0 );
119 d1 = MBEDTLS_GET_UINT32_LE( input, offset + 4 );
120 d2 = MBEDTLS_GET_UINT32_LE( input, offset + 8 );
121 d3 = MBEDTLS_GET_UINT32_LE( input, offset + 12 );
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200122
123 /* Compute: acc += (padded) block as a 130-bit integer */
124 d0 += (uint64_t) acc0;
125 d1 += (uint64_t) acc1 + ( d0 >> 32U );
126 d2 += (uint64_t) acc2 + ( d1 >> 32U );
127 d3 += (uint64_t) acc3 + ( d2 >> 32U );
Daniel Kinge6e79682016-05-24 11:16:17 -0300128 acc0 = (uint32_t) d0;
129 acc1 = (uint32_t) d1;
130 acc2 = (uint32_t) d2;
131 acc3 = (uint32_t) d3;
132 acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding;
Daniel Kingadc32c02016-05-16 18:25:45 -0300133
134 /* Compute: acc *= r */
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200135 d0 = mul64( acc0, r0 ) +
136 mul64( acc1, rs3 ) +
137 mul64( acc2, rs2 ) +
138 mul64( acc3, rs1 );
139 d1 = mul64( acc0, r1 ) +
140 mul64( acc1, r0 ) +
141 mul64( acc2, rs3 ) +
142 mul64( acc3, rs2 ) +
143 mul64( acc4, rs1 );
144 d2 = mul64( acc0, r2 ) +
145 mul64( acc1, r1 ) +
146 mul64( acc2, r0 ) +
147 mul64( acc3, rs3 ) +
148 mul64( acc4, rs2 );
149 d3 = mul64( acc0, r3 ) +
150 mul64( acc1, r2 ) +
151 mul64( acc2, r1 ) +
152 mul64( acc3, r0 ) +
153 mul64( acc4, rs3 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300154 acc4 *= r0;
155
156 /* Compute: acc %= (2^130 - 5) (partial remainder) */
157 d1 += ( d0 >> 32 );
158 d2 += ( d1 >> 32 );
159 d3 += ( d2 >> 32 );
Daniel Kinge6e79682016-05-24 11:16:17 -0300160 acc0 = (uint32_t) d0;
161 acc1 = (uint32_t) d1;
162 acc2 = (uint32_t) d2;
163 acc3 = (uint32_t) d3;
164 acc4 = (uint32_t) ( d3 >> 32 ) + acc4;
Daniel Kingadc32c02016-05-16 18:25:45 -0300165
Daniel Kinge6e79682016-05-24 11:16:17 -0300166 d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU );
Daniel Kingadc32c02016-05-16 18:25:45 -0300167 acc4 &= 3U;
Daniel Kinge6e79682016-05-24 11:16:17 -0300168 acc0 = (uint32_t) d0;
169 d0 = (uint64_t) acc1 + ( d0 >> 32U );
170 acc1 = (uint32_t) d0;
171 d0 = (uint64_t) acc2 + ( d0 >> 32U );
172 acc2 = (uint32_t) d0;
173 d0 = (uint64_t) acc3 + ( d0 >> 32U );
174 acc3 = (uint32_t) d0;
175 d0 = (uint64_t) acc4 + ( d0 >> 32U );
176 acc4 = (uint32_t) d0;
Daniel Kingadc32c02016-05-16 18:25:45 -0300177
178 offset += POLY1305_BLOCK_SIZE_BYTES;
179 }
180
181 ctx->acc[0] = acc0;
182 ctx->acc[1] = acc1;
183 ctx->acc[2] = acc2;
184 ctx->acc[3] = acc3;
185 ctx->acc[4] = acc4;
186}
187
188/**
189 * \brief Compute the Poly1305 MAC
190 *
191 * \param ctx The Poly1305 context.
192 * \param mac The buffer to where the MAC is written. Must be
193 * big enough to contain the 16-byte MAC.
194 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200195static void poly1305_compute_mac( const mbedtls_poly1305_context *ctx,
196 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300197{
198 uint64_t d;
199 uint32_t g0, g1, g2, g3, g4;
200 uint32_t acc0, acc1, acc2, acc3, acc4;
201 uint32_t mask;
202 uint32_t mask_inv;
203
204 acc0 = ctx->acc[0];
205 acc1 = ctx->acc[1];
206 acc2 = ctx->acc[2];
207 acc3 = ctx->acc[3];
208 acc4 = ctx->acc[4];
209
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200210 /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5.
Daniel Kingadc32c02016-05-16 18:25:45 -0300211 * We do this by calculating acc - (2^130 - 5), then checking if
212 * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5)
213 */
214
215 /* Calculate acc + -(2^130 - 5) */
Daniel Kinge6e79682016-05-24 11:16:17 -0300216 d = ( (uint64_t) acc0 + 5U );
217 g0 = (uint32_t) d;
218 d = ( (uint64_t) acc1 + ( d >> 32 ) );
219 g1 = (uint32_t) d;
220 d = ( (uint64_t) acc2 + ( d >> 32 ) );
221 g2 = (uint32_t) d;
222 d = ( (uint64_t) acc3 + ( d >> 32 ) );
223 g3 = (uint32_t) d;
224 g4 = acc4 + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300225
226 /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */
Daniel Kinge6e79682016-05-24 11:16:17 -0300227 mask = (uint32_t) 0U - ( g4 >> 2U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300228 mask_inv = ~mask;
229
230 /* If 131st bit is set then acc=g, otherwise, acc is unmodified */
231 acc0 = ( acc0 & mask_inv ) | ( g0 & mask );
232 acc1 = ( acc1 & mask_inv ) | ( g1 & mask );
233 acc2 = ( acc2 & mask_inv ) | ( g2 & mask );
234 acc3 = ( acc3 & mask_inv ) | ( g3 & mask );
235
236 /* Add 's' */
Daniel Kinge6e79682016-05-24 11:16:17 -0300237 d = (uint64_t) acc0 + ctx->s[0];
238 acc0 = (uint32_t) d;
239 d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U );
240 acc1 = (uint32_t) d;
241 d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U );
242 acc2 = (uint32_t) d;
243 acc3 += ctx->s[3] + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300244
245 /* Compute MAC (128 least significant bits of the accumulator) */
Joe Subbianic54e9082021-07-19 11:56:54 +0100246 MBEDTLS_PUT_UINT32_LE( acc0, mac, 0 );
247 MBEDTLS_PUT_UINT32_LE( acc1, mac, 4 );
248 MBEDTLS_PUT_UINT32_LE( acc2, mac, 8 );
249 MBEDTLS_PUT_UINT32_LE( acc3, mac, 12 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300250}
251
252void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx )
253{
Hanno Becker305e4e42018-12-11 15:03:16 +0000254 POLY1305_VALIDATE( ctx != NULL );
255
256 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300257}
258
259void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx )
260{
Hanno Becker236ea162018-12-12 14:00:34 +0000261 if( ctx == NULL )
Hanno Becker305e4e42018-12-11 15:03:16 +0000262 return;
263
264 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300265}
266
Manuel Pégourié-Gonnard4edd51b2018-05-07 10:21:56 +0200267int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx,
Daniel Kingadc32c02016-05-16 18:25:45 -0300268 const unsigned char key[32] )
269{
Hanno Becker305e4e42018-12-11 15:03:16 +0000270 POLY1305_VALIDATE_RET( ctx != NULL );
271 POLY1305_VALIDATE_RET( key != NULL );
Daniel Kingadc32c02016-05-16 18:25:45 -0300272
273 /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */
Joe Subbiani9231d5f2021-07-07 16:56:29 +0100274 ctx->r[0] = MBEDTLS_GET_UINT32_LE( key, 0 ) & 0x0FFFFFFFU;
275 ctx->r[1] = MBEDTLS_GET_UINT32_LE( key, 4 ) & 0x0FFFFFFCU;
276 ctx->r[2] = MBEDTLS_GET_UINT32_LE( key, 8 ) & 0x0FFFFFFCU;
277 ctx->r[3] = MBEDTLS_GET_UINT32_LE( key, 12 ) & 0x0FFFFFFCU;
Daniel Kingadc32c02016-05-16 18:25:45 -0300278
Joe Subbiani9231d5f2021-07-07 16:56:29 +0100279 ctx->s[0] = MBEDTLS_GET_UINT32_LE( key, 16 );
280 ctx->s[1] = MBEDTLS_GET_UINT32_LE( key, 20 );
281 ctx->s[2] = MBEDTLS_GET_UINT32_LE( key, 24 );
282 ctx->s[3] = MBEDTLS_GET_UINT32_LE( key, 28 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300283
284 /* Initial accumulator state */
285 ctx->acc[0] = 0U;
286 ctx->acc[1] = 0U;
287 ctx->acc[2] = 0U;
288 ctx->acc[3] = 0U;
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200289 ctx->acc[4] = 0U;
290
291 /* Queue initially empty */
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200292 mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200293 ctx->queue_len = 0U;
Daniel Kingadc32c02016-05-16 18:25:45 -0300294
Daniel Kinge6e79682016-05-24 11:16:17 -0300295 return( 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300296}
297
298int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx,
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200299 const unsigned char *input,
300 size_t ilen )
Daniel Kingadc32c02016-05-16 18:25:45 -0300301{
302 size_t offset = 0U;
303 size_t remaining = ilen;
304 size_t queue_free_len;
305 size_t nblocks;
Hanno Becker305e4e42018-12-11 15:03:16 +0000306 POLY1305_VALIDATE_RET( ctx != NULL );
307 POLY1305_VALIDATE_RET( ilen == 0 || input != NULL );
Daniel Kingadc32c02016-05-16 18:25:45 -0300308
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200309 if( ( remaining > 0U ) && ( ctx->queue_len > 0U ) )
Daniel Kingadc32c02016-05-16 18:25:45 -0300310 {
311 queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
312
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200313 if( ilen < queue_free_len )
Daniel Kingadc32c02016-05-16 18:25:45 -0300314 {
315 /* Not enough data to complete the block.
316 * Store this data with the other leftovers.
317 */
318 memcpy( &ctx->queue[ctx->queue_len],
319 input,
320 ilen );
321
322 ctx->queue_len += ilen;
323
324 remaining = 0U;
325 }
326 else
327 {
328 /* Enough data to produce a complete block */
329 memcpy( &ctx->queue[ctx->queue_len],
330 input,
331 queue_free_len );
332
333 ctx->queue_len = 0U;
334
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200335 poly1305_process( ctx, 1U, ctx->queue, 1U ); /* add padding bit */
Daniel Kingadc32c02016-05-16 18:25:45 -0300336
337 offset += queue_free_len;
338 remaining -= queue_free_len;
339 }
340 }
341
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200342 if( remaining >= POLY1305_BLOCK_SIZE_BYTES )
Daniel Kingadc32c02016-05-16 18:25:45 -0300343 {
344 nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES;
345
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200346 poly1305_process( ctx, nblocks, &input[offset], 1U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300347
348 offset += nblocks * POLY1305_BLOCK_SIZE_BYTES;
349 remaining %= POLY1305_BLOCK_SIZE_BYTES;
350 }
351
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200352 if( remaining > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300353 {
354 /* Store partial block */
355 ctx->queue_len = remaining;
356 memcpy( ctx->queue, &input[offset], remaining );
357 }
358
359 return( 0 );
360}
361
362int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx,
363 unsigned char mac[16] )
364{
Hanno Becker305e4e42018-12-11 15:03:16 +0000365 POLY1305_VALIDATE_RET( ctx != NULL );
366 POLY1305_VALIDATE_RET( mac != NULL );
Daniel Kingadc32c02016-05-16 18:25:45 -0300367
368 /* Process any leftover data */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200369 if( ctx->queue_len > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300370 {
371 /* Add padding bit */
372 ctx->queue[ctx->queue_len] = 1U;
373 ctx->queue_len++;
374
375 /* Pad with zeroes */
376 memset( &ctx->queue[ctx->queue_len],
377 0,
378 POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
379
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200380 poly1305_process( ctx, 1U, /* Process 1 block */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200381 ctx->queue, 0U ); /* Already padded above */
Daniel Kingadc32c02016-05-16 18:25:45 -0300382 }
383
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200384 poly1305_compute_mac( ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300385
386 return( 0 );
387}
388
Daniel Kingadc32c02016-05-16 18:25:45 -0300389int mbedtls_poly1305_mac( const unsigned char key[32],
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200390 const unsigned char *input,
391 size_t ilen,
392 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300393{
394 mbedtls_poly1305_context ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +0000395 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Hanno Becker305e4e42018-12-11 15:03:16 +0000396 POLY1305_VALIDATE_RET( key != NULL );
397 POLY1305_VALIDATE_RET( mac != NULL );
398 POLY1305_VALIDATE_RET( ilen == 0 || input != NULL );
Daniel Kingadc32c02016-05-16 18:25:45 -0300399
400 mbedtls_poly1305_init( &ctx );
401
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200402 ret = mbedtls_poly1305_starts( &ctx, key );
403 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300404 goto cleanup;
405
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200406 ret = mbedtls_poly1305_update( &ctx, input, ilen );
407 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300408 goto cleanup;
409
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200410 ret = mbedtls_poly1305_finish( &ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300411
412cleanup:
413 mbedtls_poly1305_free( &ctx );
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200414 return( ret );
Daniel Kingadc32c02016-05-16 18:25:45 -0300415}
416
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +0200417#endif /* MBEDTLS_POLY1305_ALT */
418
Daniel Kingadc32c02016-05-16 18:25:45 -0300419#if defined(MBEDTLS_SELF_TEST)
420
421static const unsigned char test_keys[2][32] =
422{
423 {
424 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33,
425 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8,
426 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd,
427 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b
428 },
429 {
430 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
431 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
432 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
433 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
434 }
435};
436
437static const unsigned char test_data[2][127] =
438{
439 {
440 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72,
441 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f,
442 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65,
443 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f,
444 0x75, 0x70
445 },
446 {
447 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72,
448 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61,
449 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
450 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f,
451 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20,
452 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64,
453 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20,
454 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77,
455 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c,
456 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77,
457 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
458 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65,
459 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74,
460 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20,
461 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75,
462 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e
463 }
464};
465
466static const size_t test_data_len[2] =
467{
468 34U,
469 127U
470};
471
472static const unsigned char test_mac[2][16] =
473{
474 {
475 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6,
476 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9
477 },
478 {
479 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61,
480 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62
481 }
482};
483
Ouss4e0b26872020-08-11 16:07:09 +0100484/* Make sure no other definition is already present. */
485#undef ASSERT
486
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200487#define ASSERT( cond, args ) \
488 do \
489 { \
490 if( ! ( cond ) ) \
491 { \
492 if( verbose != 0 ) \
493 mbedtls_printf args; \
494 \
495 return( -1 ); \
496 } \
497 } \
498 while( 0 )
499
Daniel Kingadc32c02016-05-16 18:25:45 -0300500int mbedtls_poly1305_self_test( int verbose )
501{
Daniel Kinge6e79682016-05-24 11:16:17 -0300502 unsigned char mac[16];
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200503 unsigned i;
Janos Follath24eed8d2019-11-22 13:21:35 +0000504 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Daniel Kingadc32c02016-05-16 18:25:45 -0300505
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200506 for( i = 0U; i < 2U; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -0300507 {
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200508 if( verbose != 0 )
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200509 mbedtls_printf( " Poly1305 test %u ", i );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300510
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200511 ret = mbedtls_poly1305_mac( test_keys[i],
512 test_data[i],
513 test_data_len[i],
514 mac );
515 ASSERT( 0 == ret, ( "error code: %i\n", ret ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300516
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200517 ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failed (mac)\n" ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300518
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200519 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300520 mbedtls_printf( "passed\n" );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300521 }
522
523 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300524 mbedtls_printf( "\n" );
Daniel Kingadc32c02016-05-16 18:25:45 -0300525
526 return( 0 );
527}
528
529#endif /* MBEDTLS_SELF_TEST */
530
531#endif /* MBEDTLS_POLY1305_C */