blob: f0d4cb63f82385f084e977bdb8631c1442df326e [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
31#if defined(MBEDTLS_SELF_TEST)
32#if defined(MBEDTLS_PLATFORM_C)
33#include "mbedtls/platform.h"
34#else
35#include <stdio.h>
36#define mbedtls_printf printf
37#endif /* MBEDTLS_PLATFORM_C */
38#endif /* MBEDTLS_SELF_TEST */
39
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +020040#if !defined(MBEDTLS_POLY1305_ALT)
41
Manuel Pégourié-Gonnard21a65e02018-06-07 11:54:17 +020042#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
43 !defined(inline) && !defined(__cplusplus)
44#define inline __inline
45#endif
46
Daniel Kingadc32c02016-05-16 18:25:45 -030047#define POLY1305_BLOCK_SIZE_BYTES ( 16U )
48
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +020049/*
50 * Our implementation is tuned for 32-bit platforms with a 64-bit multiplier.
51 * However we provided an alternative for platforms without such a multiplier.
52 */
53#if defined(MBEDTLS_NO_64BIT_MULTIPLICATION)
54static uint64_t mul64( uint32_t a, uint32_t b )
55{
56 /* a = al + 2**16 ah, b = bl + 2**16 bh */
57 const uint16_t al = (uint16_t) a;
Joe Subbiani51b147a2021-07-16 17:47:17 +010058 const uint16_t bl = (uint16_t) b;
Joe Subbiani4919bb42021-07-16 17:14:07 +010059 const uint16_t ah = a >> 16;
60 const uint16_t bh = b >> 16;
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +020061
62 /* ab = al*bl + 2**16 (ah*bl + bl*bh) + 2**32 ah*bh */
63 const uint32_t lo = (uint32_t) al * bl;
64 const uint64_t me = (uint64_t)( (uint32_t) ah * bl ) + (uint32_t) al * bh;
65 const uint32_t hi = (uint32_t) ah * bh;
66
67 return( lo + ( me << 16 ) + ( (uint64_t) hi << 32 ) );
68}
69#else
70static inline uint64_t mul64( uint32_t a, uint32_t b )
71{
72 return( (uint64_t) a * b );
73}
74#endif
75
76
Daniel Kingadc32c02016-05-16 18:25:45 -030077/**
78 * \brief Process blocks with Poly1305.
79 *
80 * \param ctx The Poly1305 context.
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020081 * \param nblocks Number of blocks to process. Note that this
82 * function only processes full blocks.
Daniel Kingadc32c02016-05-16 18:25:45 -030083 * \param input Buffer containing the input block(s).
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020084 * \param needs_padding Set to 0 if the padding bit has already been
85 * applied to the input data before calling this
86 * function. Otherwise, set this parameter to 1.
Daniel Kingadc32c02016-05-16 18:25:45 -030087 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +020088static void poly1305_process( mbedtls_poly1305_context *ctx,
89 size_t nblocks,
90 const unsigned char *input,
91 uint32_t needs_padding )
Daniel Kingadc32c02016-05-16 18:25:45 -030092{
93 uint64_t d0, d1, d2, d3;
94 uint32_t acc0, acc1, acc2, acc3, acc4;
95 uint32_t r0, r1, r2, r3;
96 uint32_t rs1, rs2, rs3;
97 size_t offset = 0U;
98 size_t i;
99
100 r0 = ctx->r[0];
101 r1 = ctx->r[1];
102 r2 = ctx->r[2];
103 r3 = ctx->r[3];
104
105 rs1 = r1 + ( r1 >> 2U );
106 rs2 = r2 + ( r2 >> 2U );
107 rs3 = r3 + ( r3 >> 2U );
108
109 acc0 = ctx->acc[0];
110 acc1 = ctx->acc[1];
111 acc2 = ctx->acc[2];
112 acc3 = ctx->acc[3];
113 acc4 = ctx->acc[4];
114
115 /* Process full blocks */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200116 for( i = 0U; i < nblocks; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -0300117 {
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200118 /* The input block is treated as a 128-bit little-endian integer */
Joe Subbiani6a506312021-07-07 16:56:29 +0100119 d0 = MBEDTLS_GET_UINT32_LE( input, offset + 0 );
120 d1 = MBEDTLS_GET_UINT32_LE( input, offset + 4 );
121 d2 = MBEDTLS_GET_UINT32_LE( input, offset + 8 );
122 d3 = MBEDTLS_GET_UINT32_LE( input, offset + 12 );
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200123
124 /* Compute: acc += (padded) block as a 130-bit integer */
125 d0 += (uint64_t) acc0;
126 d1 += (uint64_t) acc1 + ( d0 >> 32U );
127 d2 += (uint64_t) acc2 + ( d1 >> 32U );
128 d3 += (uint64_t) acc3 + ( d2 >> 32U );
Daniel Kinge6e79682016-05-24 11:16:17 -0300129 acc0 = (uint32_t) d0;
130 acc1 = (uint32_t) d1;
131 acc2 = (uint32_t) d2;
132 acc3 = (uint32_t) d3;
133 acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding;
Daniel Kingadc32c02016-05-16 18:25:45 -0300134
135 /* Compute: acc *= r */
Manuel Pégourié-Gonnard2adb3752018-06-07 10:51:44 +0200136 d0 = mul64( acc0, r0 ) +
137 mul64( acc1, rs3 ) +
138 mul64( acc2, rs2 ) +
139 mul64( acc3, rs1 );
140 d1 = mul64( acc0, r1 ) +
141 mul64( acc1, r0 ) +
142 mul64( acc2, rs3 ) +
143 mul64( acc3, rs2 ) +
144 mul64( acc4, rs1 );
145 d2 = mul64( acc0, r2 ) +
146 mul64( acc1, r1 ) +
147 mul64( acc2, r0 ) +
148 mul64( acc3, rs3 ) +
149 mul64( acc4, rs2 );
150 d3 = mul64( acc0, r3 ) +
151 mul64( acc1, r2 ) +
152 mul64( acc2, r1 ) +
153 mul64( acc3, r0 ) +
154 mul64( acc4, rs3 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300155 acc4 *= r0;
156
157 /* Compute: acc %= (2^130 - 5) (partial remainder) */
158 d1 += ( d0 >> 32 );
159 d2 += ( d1 >> 32 );
160 d3 += ( d2 >> 32 );
Daniel Kinge6e79682016-05-24 11:16:17 -0300161 acc0 = (uint32_t) d0;
162 acc1 = (uint32_t) d1;
163 acc2 = (uint32_t) d2;
164 acc3 = (uint32_t) d3;
165 acc4 = (uint32_t) ( d3 >> 32 ) + acc4;
Daniel Kingadc32c02016-05-16 18:25:45 -0300166
Daniel Kinge6e79682016-05-24 11:16:17 -0300167 d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU );
Daniel Kingadc32c02016-05-16 18:25:45 -0300168 acc4 &= 3U;
Daniel Kinge6e79682016-05-24 11:16:17 -0300169 acc0 = (uint32_t) d0;
170 d0 = (uint64_t) acc1 + ( d0 >> 32U );
171 acc1 = (uint32_t) d0;
172 d0 = (uint64_t) acc2 + ( d0 >> 32U );
173 acc2 = (uint32_t) d0;
174 d0 = (uint64_t) acc3 + ( d0 >> 32U );
175 acc3 = (uint32_t) d0;
176 d0 = (uint64_t) acc4 + ( d0 >> 32U );
177 acc4 = (uint32_t) d0;
Daniel Kingadc32c02016-05-16 18:25:45 -0300178
179 offset += POLY1305_BLOCK_SIZE_BYTES;
180 }
181
182 ctx->acc[0] = acc0;
183 ctx->acc[1] = acc1;
184 ctx->acc[2] = acc2;
185 ctx->acc[3] = acc3;
186 ctx->acc[4] = acc4;
187}
188
189/**
190 * \brief Compute the Poly1305 MAC
191 *
192 * \param ctx The Poly1305 context.
193 * \param mac The buffer to where the MAC is written. Must be
194 * big enough to contain the 16-byte MAC.
195 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200196static void poly1305_compute_mac( const mbedtls_poly1305_context *ctx,
197 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300198{
199 uint64_t d;
200 uint32_t g0, g1, g2, g3, g4;
201 uint32_t acc0, acc1, acc2, acc3, acc4;
202 uint32_t mask;
203 uint32_t mask_inv;
204
205 acc0 = ctx->acc[0];
206 acc1 = ctx->acc[1];
207 acc2 = ctx->acc[2];
208 acc3 = ctx->acc[3];
209 acc4 = ctx->acc[4];
210
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200211 /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5.
Daniel Kingadc32c02016-05-16 18:25:45 -0300212 * We do this by calculating acc - (2^130 - 5), then checking if
213 * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5)
214 */
215
216 /* Calculate acc + -(2^130 - 5) */
Daniel Kinge6e79682016-05-24 11:16:17 -0300217 d = ( (uint64_t) acc0 + 5U );
218 g0 = (uint32_t) d;
219 d = ( (uint64_t) acc1 + ( d >> 32 ) );
220 g1 = (uint32_t) d;
221 d = ( (uint64_t) acc2 + ( d >> 32 ) );
222 g2 = (uint32_t) d;
223 d = ( (uint64_t) acc3 + ( d >> 32 ) );
224 g3 = (uint32_t) d;
225 g4 = acc4 + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300226
227 /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */
Daniel Kinge6e79682016-05-24 11:16:17 -0300228 mask = (uint32_t) 0U - ( g4 >> 2U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300229 mask_inv = ~mask;
230
231 /* If 131st bit is set then acc=g, otherwise, acc is unmodified */
232 acc0 = ( acc0 & mask_inv ) | ( g0 & mask );
233 acc1 = ( acc1 & mask_inv ) | ( g1 & mask );
234 acc2 = ( acc2 & mask_inv ) | ( g2 & mask );
235 acc3 = ( acc3 & mask_inv ) | ( g3 & mask );
236
237 /* Add 's' */
Daniel Kinge6e79682016-05-24 11:16:17 -0300238 d = (uint64_t) acc0 + ctx->s[0];
239 acc0 = (uint32_t) d;
240 d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U );
241 acc1 = (uint32_t) d;
242 d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U );
243 acc2 = (uint32_t) d;
244 acc3 += ctx->s[3] + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300245
246 /* Compute MAC (128 least significant bits of the accumulator) */
Joe Subbiani6dd73642021-07-19 11:56:54 +0100247 MBEDTLS_PUT_UINT32_LE( acc0, mac, 0 );
248 MBEDTLS_PUT_UINT32_LE( acc1, mac, 4 );
249 MBEDTLS_PUT_UINT32_LE( acc2, mac, 8 );
250 MBEDTLS_PUT_UINT32_LE( acc3, mac, 12 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300251}
252
253void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx )
254{
Hanno Becker305e4e42018-12-11 15:03:16 +0000255 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300256}
257
258void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx )
259{
Hanno Becker236ea162018-12-12 14:00:34 +0000260 if( ctx == NULL )
Hanno Becker305e4e42018-12-11 15:03:16 +0000261 return;
262
263 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300264}
265
Manuel Pégourié-Gonnard4edd51b2018-05-07 10:21:56 +0200266int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx,
Daniel Kingadc32c02016-05-16 18:25:45 -0300267 const unsigned char key[32] )
268{
Daniel Kingadc32c02016-05-16 18:25:45 -0300269 /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */
Joe Subbiani6a506312021-07-07 16:56:29 +0100270 ctx->r[0] = MBEDTLS_GET_UINT32_LE( key, 0 ) & 0x0FFFFFFFU;
271 ctx->r[1] = MBEDTLS_GET_UINT32_LE( key, 4 ) & 0x0FFFFFFCU;
272 ctx->r[2] = MBEDTLS_GET_UINT32_LE( key, 8 ) & 0x0FFFFFFCU;
273 ctx->r[3] = MBEDTLS_GET_UINT32_LE( key, 12 ) & 0x0FFFFFFCU;
Daniel Kingadc32c02016-05-16 18:25:45 -0300274
Joe Subbiani6a506312021-07-07 16:56:29 +0100275 ctx->s[0] = MBEDTLS_GET_UINT32_LE( key, 16 );
276 ctx->s[1] = MBEDTLS_GET_UINT32_LE( key, 20 );
277 ctx->s[2] = MBEDTLS_GET_UINT32_LE( key, 24 );
278 ctx->s[3] = MBEDTLS_GET_UINT32_LE( key, 28 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300279
280 /* Initial accumulator state */
281 ctx->acc[0] = 0U;
282 ctx->acc[1] = 0U;
283 ctx->acc[2] = 0U;
284 ctx->acc[3] = 0U;
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200285 ctx->acc[4] = 0U;
286
287 /* Queue initially empty */
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200288 mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200289 ctx->queue_len = 0U;
Daniel Kingadc32c02016-05-16 18:25:45 -0300290
Daniel Kinge6e79682016-05-24 11:16:17 -0300291 return( 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300292}
293
294int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx,
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200295 const unsigned char *input,
296 size_t ilen )
Daniel Kingadc32c02016-05-16 18:25:45 -0300297{
298 size_t offset = 0U;
299 size_t remaining = ilen;
300 size_t queue_free_len;
301 size_t nblocks;
Daniel Kingadc32c02016-05-16 18:25:45 -0300302
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200303 if( ( remaining > 0U ) && ( ctx->queue_len > 0U ) )
Daniel Kingadc32c02016-05-16 18:25:45 -0300304 {
305 queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
306
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200307 if( ilen < queue_free_len )
Daniel Kingadc32c02016-05-16 18:25:45 -0300308 {
309 /* Not enough data to complete the block.
310 * Store this data with the other leftovers.
311 */
312 memcpy( &ctx->queue[ctx->queue_len],
313 input,
314 ilen );
315
316 ctx->queue_len += ilen;
317
318 remaining = 0U;
319 }
320 else
321 {
322 /* Enough data to produce a complete block */
323 memcpy( &ctx->queue[ctx->queue_len],
324 input,
325 queue_free_len );
326
327 ctx->queue_len = 0U;
328
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200329 poly1305_process( ctx, 1U, ctx->queue, 1U ); /* add padding bit */
Daniel Kingadc32c02016-05-16 18:25:45 -0300330
331 offset += queue_free_len;
332 remaining -= queue_free_len;
333 }
334 }
335
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200336 if( remaining >= POLY1305_BLOCK_SIZE_BYTES )
Daniel Kingadc32c02016-05-16 18:25:45 -0300337 {
338 nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES;
339
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200340 poly1305_process( ctx, nblocks, &input[offset], 1U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300341
342 offset += nblocks * POLY1305_BLOCK_SIZE_BYTES;
343 remaining %= POLY1305_BLOCK_SIZE_BYTES;
344 }
345
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200346 if( remaining > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300347 {
348 /* Store partial block */
349 ctx->queue_len = remaining;
350 memcpy( ctx->queue, &input[offset], remaining );
351 }
352
353 return( 0 );
354}
355
356int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx,
357 unsigned char mac[16] )
358{
Daniel Kingadc32c02016-05-16 18:25:45 -0300359 /* Process any leftover data */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200360 if( ctx->queue_len > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300361 {
362 /* Add padding bit */
363 ctx->queue[ctx->queue_len] = 1U;
364 ctx->queue_len++;
365
366 /* Pad with zeroes */
367 memset( &ctx->queue[ctx->queue_len],
368 0,
369 POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
370
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200371 poly1305_process( ctx, 1U, /* Process 1 block */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200372 ctx->queue, 0U ); /* Already padded above */
Daniel Kingadc32c02016-05-16 18:25:45 -0300373 }
374
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200375 poly1305_compute_mac( ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300376
377 return( 0 );
378}
379
Daniel Kingadc32c02016-05-16 18:25:45 -0300380int mbedtls_poly1305_mac( const unsigned char key[32],
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200381 const unsigned char *input,
382 size_t ilen,
383 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300384{
385 mbedtls_poly1305_context ctx;
Janos Follath24eed8d2019-11-22 13:21:35 +0000386 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Daniel Kingadc32c02016-05-16 18:25:45 -0300387
388 mbedtls_poly1305_init( &ctx );
389
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200390 ret = mbedtls_poly1305_starts( &ctx, key );
391 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300392 goto cleanup;
393
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200394 ret = mbedtls_poly1305_update( &ctx, input, ilen );
395 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300396 goto cleanup;
397
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200398 ret = mbedtls_poly1305_finish( &ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300399
400cleanup:
401 mbedtls_poly1305_free( &ctx );
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200402 return( ret );
Daniel Kingadc32c02016-05-16 18:25:45 -0300403}
404
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +0200405#endif /* MBEDTLS_POLY1305_ALT */
406
Daniel Kingadc32c02016-05-16 18:25:45 -0300407#if defined(MBEDTLS_SELF_TEST)
408
409static const unsigned char test_keys[2][32] =
410{
411 {
412 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33,
413 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8,
414 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd,
415 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b
416 },
417 {
418 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
419 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
420 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
421 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
422 }
423};
424
425static const unsigned char test_data[2][127] =
426{
427 {
428 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72,
429 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f,
430 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65,
431 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f,
432 0x75, 0x70
433 },
434 {
435 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72,
436 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61,
437 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
438 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f,
439 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20,
440 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64,
441 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20,
442 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77,
443 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c,
444 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77,
445 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
446 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65,
447 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74,
448 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20,
449 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75,
450 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e
451 }
452};
453
454static const size_t test_data_len[2] =
455{
456 34U,
457 127U
458};
459
460static const unsigned char test_mac[2][16] =
461{
462 {
463 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6,
464 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9
465 },
466 {
467 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61,
468 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62
469 }
470};
471
Ouss4e0b26872020-08-11 16:07:09 +0100472/* Make sure no other definition is already present. */
473#undef ASSERT
474
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200475#define ASSERT( cond, args ) \
476 do \
477 { \
478 if( ! ( cond ) ) \
479 { \
480 if( verbose != 0 ) \
481 mbedtls_printf args; \
482 \
483 return( -1 ); \
484 } \
485 } \
486 while( 0 )
487
Daniel Kingadc32c02016-05-16 18:25:45 -0300488int mbedtls_poly1305_self_test( int verbose )
489{
Daniel Kinge6e79682016-05-24 11:16:17 -0300490 unsigned char mac[16];
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200491 unsigned i;
Janos Follath24eed8d2019-11-22 13:21:35 +0000492 int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
Daniel Kingadc32c02016-05-16 18:25:45 -0300493
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200494 for( i = 0U; i < 2U; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -0300495 {
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200496 if( verbose != 0 )
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200497 mbedtls_printf( " Poly1305 test %u ", i );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300498
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200499 ret = mbedtls_poly1305_mac( test_keys[i],
500 test_data[i],
501 test_data_len[i],
502 mac );
503 ASSERT( 0 == ret, ( "error code: %i\n", ret ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300504
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200505 ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failed (mac)\n" ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300506
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200507 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300508 mbedtls_printf( "passed\n" );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300509 }
510
511 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300512 mbedtls_printf( "\n" );
Daniel Kingadc32c02016-05-16 18:25:45 -0300513
514 return( 0 );
515}
516
517#endif /* MBEDTLS_SELF_TEST */
518
519#endif /* MBEDTLS_POLY1305_C */