blob: bdd67447525ba4aa35a2c03d7122f01bf1915f5e [file] [log] [blame]
Daniel Kingadc32c02016-05-16 18:25:45 -03001/**
2 * \file poly1305.c
3 *
4 * \brief Poly1305 authentication algorithm.
5 *
6 * Copyright (C) 2006-2016, ARM Limited, All Rights Reserved
7 * 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.
20 *
21 * This file is part of mbed TLS (https://tls.mbed.org)
22 */
23#if !defined(MBEDTLS_CONFIG_FILE)
24#include "mbedtls/config.h"
25#else
26#include MBEDTLS_CONFIG_FILE
27#endif
28
29#if defined(MBEDTLS_POLY1305_C)
30
Daniel Kingadc32c02016-05-16 18:25:45 -030031#include "mbedtls/poly1305.h"
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +020032#include "mbedtls/platform_util.h"
Daniel Kingadc32c02016-05-16 18:25:45 -030033
34#include <string.h>
35
36#if defined(MBEDTLS_SELF_TEST)
37#if defined(MBEDTLS_PLATFORM_C)
38#include "mbedtls/platform.h"
39#else
40#include <stdio.h>
41#define mbedtls_printf printf
42#endif /* MBEDTLS_PLATFORM_C */
43#endif /* MBEDTLS_SELF_TEST */
44
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +020045#if !defined(MBEDTLS_POLY1305_ALT)
46
Daniel Kingadc32c02016-05-16 18:25:45 -030047#define POLY1305_BLOCK_SIZE_BYTES ( 16U )
48
Daniel Kinge6e79682016-05-24 11:16:17 -030049#define BYTES_TO_U32_LE( data, offset ) \
50 ( (uint32_t) data[offset] \
51 | (uint32_t) ( (uint32_t) data[( offset ) + 1] << 8 ) \
52 | (uint32_t) ( (uint32_t) data[( offset ) + 2] << 16 ) \
53 | (uint32_t) ( (uint32_t) data[( offset ) + 3] << 24 ) \
Daniel Kingadc32c02016-05-16 18:25:45 -030054 )
55
Daniel Kingadc32c02016-05-16 18:25:45 -030056/**
57 * \brief Process blocks with Poly1305.
58 *
59 * \param ctx The Poly1305 context.
60 * \param nblocks Number of blocks to process. Note that this function
61 * only processes full blocks.
62 * \param input Buffer containing the input block(s).
63 * \param needs_padding Set to 0 if the padding bit has already been applied
64 * to the input data before calling this function.
65 * Otherwise, set this parameter to 1.
66 */
67static void mbedtls_poly1305_process( mbedtls_poly1305_context *ctx,
68 size_t nblocks,
69 const unsigned char *input,
70 uint32_t needs_padding )
71{
72 uint64_t d0, d1, d2, d3;
73 uint32_t acc0, acc1, acc2, acc3, acc4;
74 uint32_t r0, r1, r2, r3;
75 uint32_t rs1, rs2, rs3;
76 size_t offset = 0U;
77 size_t i;
78
79 r0 = ctx->r[0];
80 r1 = ctx->r[1];
81 r2 = ctx->r[2];
82 r3 = ctx->r[3];
83
84 rs1 = r1 + ( r1 >> 2U );
85 rs2 = r2 + ( r2 >> 2U );
86 rs3 = r3 + ( r3 >> 2U );
87
88 acc0 = ctx->acc[0];
89 acc1 = ctx->acc[1];
90 acc2 = ctx->acc[2];
91 acc3 = ctx->acc[3];
92 acc4 = ctx->acc[4];
93
94 /* Process full blocks */
95 for ( i = 0U; i < nblocks; i++ )
96 {
97 /* Compute: acc += block */
98 /* Note that the input block is treated as a 128-bit little-endian integer */
Daniel Kinge6e79682016-05-24 11:16:17 -030099 d0 = (uint64_t) acc0 + BYTES_TO_U32_LE( input, offset + 0 );
100 d1 = (uint64_t) acc1 + BYTES_TO_U32_LE( input, offset + 4 ) + ( d0 >> 32U );
101 d2 = (uint64_t) acc2 + BYTES_TO_U32_LE( input, offset + 8 ) + ( d1 >> 32U );
102 d3 = (uint64_t) acc3 + BYTES_TO_U32_LE( input, offset + 12 ) + ( d2 >> 32U );
103 acc0 = (uint32_t) d0;
104 acc1 = (uint32_t) d1;
105 acc2 = (uint32_t) d2;
106 acc3 = (uint32_t) d3;
107 acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding;
Daniel Kingadc32c02016-05-16 18:25:45 -0300108
109 /* Compute: acc *= r */
Daniel Kinge6e79682016-05-24 11:16:17 -0300110 d0 = ( (uint64_t) acc0 * r0 ) +
111 ( (uint64_t) acc1 * rs3 ) +
112 ( (uint64_t) acc2 * rs2 ) +
113 ( (uint64_t) acc3 * rs1 );
114 d1 = ( (uint64_t) acc0 * r1 ) +
115 ( (uint64_t) acc1 * r0 ) +
116 ( (uint64_t) acc2 * rs3 ) +
117 ( (uint64_t) acc3 * rs2 ) +
118 ( (uint64_t) acc4 * rs1 );
119 d2 = ( (uint64_t) acc0 * r2 ) +
120 ( (uint64_t) acc1 * r1 ) +
121 ( (uint64_t) acc2 * r0 ) +
122 ( (uint64_t) acc3 * rs3 ) +
123 ( (uint64_t) acc4 * rs2 );
124 d3 = ( (uint64_t) acc0 * r3 ) +
125 ( (uint64_t) acc1 * r2 ) +
126 ( (uint64_t) acc2 * r1 ) +
127 ( (uint64_t) acc3 * r0 ) +
128 ( (uint64_t) acc4 * rs3 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300129 acc4 *= r0;
130
131 /* Compute: acc %= (2^130 - 5) (partial remainder) */
132 d1 += ( d0 >> 32 );
133 d2 += ( d1 >> 32 );
134 d3 += ( d2 >> 32 );
Daniel Kinge6e79682016-05-24 11:16:17 -0300135 acc0 = (uint32_t) d0;
136 acc1 = (uint32_t) d1;
137 acc2 = (uint32_t) d2;
138 acc3 = (uint32_t) d3;
139 acc4 = (uint32_t) ( d3 >> 32 ) + acc4;
Daniel Kingadc32c02016-05-16 18:25:45 -0300140
Daniel Kinge6e79682016-05-24 11:16:17 -0300141 d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU );
Daniel Kingadc32c02016-05-16 18:25:45 -0300142 acc4 &= 3U;
Daniel Kinge6e79682016-05-24 11:16:17 -0300143 acc0 = (uint32_t) d0;
144 d0 = (uint64_t) acc1 + ( d0 >> 32U );
145 acc1 = (uint32_t) d0;
146 d0 = (uint64_t) acc2 + ( d0 >> 32U );
147 acc2 = (uint32_t) d0;
148 d0 = (uint64_t) acc3 + ( d0 >> 32U );
149 acc3 = (uint32_t) d0;
150 d0 = (uint64_t) acc4 + ( d0 >> 32U );
151 acc4 = (uint32_t) d0;
Daniel Kingadc32c02016-05-16 18:25:45 -0300152
153 offset += POLY1305_BLOCK_SIZE_BYTES;
154 }
155
156 ctx->acc[0] = acc0;
157 ctx->acc[1] = acc1;
158 ctx->acc[2] = acc2;
159 ctx->acc[3] = acc3;
160 ctx->acc[4] = acc4;
161}
162
163/**
164 * \brief Compute the Poly1305 MAC
165 *
166 * \param ctx The Poly1305 context.
167 * \param mac The buffer to where the MAC is written. Must be
168 * big enough to contain the 16-byte MAC.
169 */
170static void mbedtls_poly1305_compute_mac( const mbedtls_poly1305_context *ctx,
171 unsigned char mac[16] )
172{
173 uint64_t d;
174 uint32_t g0, g1, g2, g3, g4;
175 uint32_t acc0, acc1, acc2, acc3, acc4;
176 uint32_t mask;
177 uint32_t mask_inv;
178
179 acc0 = ctx->acc[0];
180 acc1 = ctx->acc[1];
181 acc2 = ctx->acc[2];
182 acc3 = ctx->acc[3];
183 acc4 = ctx->acc[4];
184
185 /* Before adding 's' we need to ensure that the accumulator is mod 2^130 - 5.
186 * We do this by calculating acc - (2^130 - 5), then checking if
187 * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5)
188 */
189
190 /* Calculate acc + -(2^130 - 5) */
Daniel Kinge6e79682016-05-24 11:16:17 -0300191 d = ( (uint64_t) acc0 + 5U );
192 g0 = (uint32_t) d;
193 d = ( (uint64_t) acc1 + ( d >> 32 ) );
194 g1 = (uint32_t) d;
195 d = ( (uint64_t) acc2 + ( d >> 32 ) );
196 g2 = (uint32_t) d;
197 d = ( (uint64_t) acc3 + ( d >> 32 ) );
198 g3 = (uint32_t) d;
199 g4 = acc4 + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300200
201 /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */
Daniel Kinge6e79682016-05-24 11:16:17 -0300202 mask = (uint32_t) 0U - ( g4 >> 2U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300203 mask_inv = ~mask;
204
205 /* If 131st bit is set then acc=g, otherwise, acc is unmodified */
206 acc0 = ( acc0 & mask_inv ) | ( g0 & mask );
207 acc1 = ( acc1 & mask_inv ) | ( g1 & mask );
208 acc2 = ( acc2 & mask_inv ) | ( g2 & mask );
209 acc3 = ( acc3 & mask_inv ) | ( g3 & mask );
210
211 /* Add 's' */
Daniel Kinge6e79682016-05-24 11:16:17 -0300212 d = (uint64_t) acc0 + ctx->s[0];
213 acc0 = (uint32_t) d;
214 d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U );
215 acc1 = (uint32_t) d;
216 d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U );
217 acc2 = (uint32_t) d;
218 acc3 += ctx->s[3] + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300219
220 /* Compute MAC (128 least significant bits of the accumulator) */
Daniel Kinge6e79682016-05-24 11:16:17 -0300221 mac[0] = (unsigned char) acc0;
222 mac[1] = (unsigned char) ( acc0 >> 8 );
223 mac[2] = (unsigned char) ( acc0 >> 16 );
224 mac[3] = (unsigned char) ( acc0 >> 24 );
225 mac[4] = (unsigned char) acc1;
226 mac[5] = (unsigned char) ( acc1 >> 8 );
227 mac[6] = (unsigned char) ( acc1 >> 16 );
228 mac[7] = (unsigned char) ( acc1 >> 24 );
229 mac[8] = (unsigned char) acc2;
230 mac[9] = (unsigned char) ( acc2 >> 8 );
231 mac[10] = (unsigned char) ( acc2 >> 16 );
232 mac[11] = (unsigned char) ( acc2 >> 24 );
233 mac[12] = (unsigned char) acc3;
234 mac[13] = (unsigned char) ( acc3 >> 8 );
235 mac[14] = (unsigned char) ( acc3 >> 16 );
236 mac[15] = (unsigned char) ( acc3 >> 24 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300237}
238
239void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx )
240{
241 if ( ctx != NULL )
242 {
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200243 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300244 }
245}
246
247void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx )
248{
249 if ( ctx != NULL )
250 {
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200251 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300252 }
253}
254
Manuel Pégourié-Gonnard4edd51b2018-05-07 10:21:56 +0200255int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx,
Daniel Kingadc32c02016-05-16 18:25:45 -0300256 const unsigned char key[32] )
257{
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200258 if ( ctx == NULL || key == NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300259 {
260 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
261 }
262
263 /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */
264 ctx->r[0] = BYTES_TO_U32_LE( key, 0 ) & 0x0FFFFFFFU;
265 ctx->r[1] = BYTES_TO_U32_LE( key, 4 ) & 0x0FFFFFFCU;
266 ctx->r[2] = BYTES_TO_U32_LE( key, 8 ) & 0x0FFFFFFCU;
267 ctx->r[3] = BYTES_TO_U32_LE( key, 12 ) & 0x0FFFFFFCU;
268
269 ctx->s[0] = BYTES_TO_U32_LE( key, 16 );
270 ctx->s[1] = BYTES_TO_U32_LE( key, 20 );
271 ctx->s[2] = BYTES_TO_U32_LE( key, 24 );
272 ctx->s[3] = BYTES_TO_U32_LE( key, 28 );
273
274 /* Initial accumulator state */
275 ctx->acc[0] = 0U;
276 ctx->acc[1] = 0U;
277 ctx->acc[2] = 0U;
278 ctx->acc[3] = 0U;
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200279 ctx->acc[4] = 0U;
280
281 /* Queue initially empty */
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200282 mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200283 ctx->queue_len = 0U;
Daniel Kingadc32c02016-05-16 18:25:45 -0300284
Daniel Kinge6e79682016-05-24 11:16:17 -0300285 return( 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300286}
287
288int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx,
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200289 const unsigned char *input,
290 size_t ilen )
Daniel Kingadc32c02016-05-16 18:25:45 -0300291{
292 size_t offset = 0U;
293 size_t remaining = ilen;
294 size_t queue_free_len;
295 size_t nblocks;
296
Daniel Kinga310c5e2016-05-17 15:56:26 -0300297 if ( ctx == NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300298 {
299 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
300 }
Daniel Kinga310c5e2016-05-17 15:56:26 -0300301 else if ( ( ilen > 0U ) && ( input == NULL ) )
302 {
303 /* input pointer is allowed to be NULL only if ilen == 0 */
304 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
305 }
Daniel Kingadc32c02016-05-16 18:25:45 -0300306
Daniel Kinga310c5e2016-05-17 15:56:26 -0300307 if ( ( remaining > 0U ) && ( ctx->queue_len > 0U ) )
Daniel Kingadc32c02016-05-16 18:25:45 -0300308 {
309 queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
310
311 if ( ilen < queue_free_len )
312 {
313 /* Not enough data to complete the block.
314 * Store this data with the other leftovers.
315 */
316 memcpy( &ctx->queue[ctx->queue_len],
317 input,
318 ilen );
319
320 ctx->queue_len += ilen;
321
322 remaining = 0U;
323 }
324 else
325 {
326 /* Enough data to produce a complete block */
327 memcpy( &ctx->queue[ctx->queue_len],
328 input,
329 queue_free_len );
330
331 ctx->queue_len = 0U;
332
333 mbedtls_poly1305_process( ctx,
334 1U,
335 ctx->queue,
336 1U ); /* add padding bit */
337
338 offset += queue_free_len;
339 remaining -= queue_free_len;
340 }
341 }
342
343 if ( remaining >= POLY1305_BLOCK_SIZE_BYTES )
344 {
345 nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES;
346
347 mbedtls_poly1305_process( ctx, nblocks, &input[offset], 1U );
348
349 offset += nblocks * POLY1305_BLOCK_SIZE_BYTES;
350 remaining %= POLY1305_BLOCK_SIZE_BYTES;
351 }
352
353 if ( remaining > 0U )
354 {
355 /* Store partial block */
356 ctx->queue_len = remaining;
357 memcpy( ctx->queue, &input[offset], remaining );
358 }
359
360 return( 0 );
361}
362
363int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx,
364 unsigned char mac[16] )
365{
366 if ( ( ctx == NULL ) || ( mac == NULL ) )
367 {
368 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
369 }
370
371 /* Process any leftover data */
372 if ( ctx->queue_len > 0U )
373 {
374 /* Add padding bit */
375 ctx->queue[ctx->queue_len] = 1U;
376 ctx->queue_len++;
377
378 /* Pad with zeroes */
379 memset( &ctx->queue[ctx->queue_len],
380 0,
381 POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
382
383 mbedtls_poly1305_process( ctx,
384 1U, /* Process 1 block */
385 ctx->queue,
386 0U ); /* Don't add padding bit (it was just added above) */
387 }
388
389 mbedtls_poly1305_compute_mac( ctx, mac );
390
391 return( 0 );
392}
393
Daniel Kingadc32c02016-05-16 18:25:45 -0300394int mbedtls_poly1305_mac( const unsigned char key[32],
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200395 const unsigned char *input,
396 size_t ilen,
397 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300398{
399 mbedtls_poly1305_context ctx;
400 int result;
401
402 mbedtls_poly1305_init( &ctx );
403
Manuel Pégourié-Gonnard4edd51b2018-05-07 10:21:56 +0200404 result = mbedtls_poly1305_starts( &ctx, key );
Daniel Kingadc32c02016-05-16 18:25:45 -0300405 if ( result != 0 )
406 goto cleanup;
407
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200408 result = mbedtls_poly1305_update( &ctx, input, ilen );
Daniel Kingadc32c02016-05-16 18:25:45 -0300409 if ( result != 0 )
410 goto cleanup;
411
412 result = mbedtls_poly1305_finish( &ctx, mac );
413
414cleanup:
415 mbedtls_poly1305_free( &ctx );
Manuel Pégourié-Gonnarda8fa8b82018-05-10 10:12:36 +0200416 return( result );
Daniel Kingadc32c02016-05-16 18:25:45 -0300417}
418
Manuel Pégourié-Gonnard95d0bdb2018-05-07 09:58:35 +0200419#endif /* MBEDTLS_POLY1305_ALT */
420
Daniel Kingadc32c02016-05-16 18:25:45 -0300421#if defined(MBEDTLS_SELF_TEST)
422
423static const unsigned char test_keys[2][32] =
424{
425 {
426 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33,
427 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8,
428 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd,
429 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b
430 },
431 {
432 0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a,
433 0xf3, 0x33, 0x88, 0x86, 0x04, 0xf6, 0xb5, 0xf0,
434 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, 0x80, 0x09,
435 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0
436 }
437};
438
439static const unsigned char test_data[2][127] =
440{
441 {
442 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72,
443 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f,
444 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65,
445 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f,
446 0x75, 0x70
447 },
448 {
449 0x27, 0x54, 0x77, 0x61, 0x73, 0x20, 0x62, 0x72,
450 0x69, 0x6c, 0x6c, 0x69, 0x67, 0x2c, 0x20, 0x61,
451 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
452 0x6c, 0x69, 0x74, 0x68, 0x79, 0x20, 0x74, 0x6f,
453 0x76, 0x65, 0x73, 0x0a, 0x44, 0x69, 0x64, 0x20,
454 0x67, 0x79, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64,
455 0x20, 0x67, 0x69, 0x6d, 0x62, 0x6c, 0x65, 0x20,
456 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77,
457 0x61, 0x62, 0x65, 0x3a, 0x0a, 0x41, 0x6c, 0x6c,
458 0x20, 0x6d, 0x69, 0x6d, 0x73, 0x79, 0x20, 0x77,
459 0x65, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
460 0x62, 0x6f, 0x72, 0x6f, 0x67, 0x6f, 0x76, 0x65,
461 0x73, 0x2c, 0x0a, 0x41, 0x6e, 0x64, 0x20, 0x74,
462 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x6d, 0x65, 0x20,
463 0x72, 0x61, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x75,
464 0x74, 0x67, 0x72, 0x61, 0x62, 0x65, 0x2e
465 }
466};
467
468static const size_t test_data_len[2] =
469{
470 34U,
471 127U
472};
473
474static const unsigned char test_mac[2][16] =
475{
476 {
477 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6,
478 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9
479 },
480 {
481 0x45, 0x41, 0x66, 0x9a, 0x7e, 0xaa, 0xee, 0x61,
482 0xe7, 0x08, 0xdc, 0x7c, 0xbc, 0xc5, 0xeb, 0x62
483 }
484};
485
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200486#define ASSERT( cond, args ) \
487 do \
488 { \
489 if( ! ( cond ) ) \
490 { \
491 if( verbose != 0 ) \
492 mbedtls_printf args; \
493 \
494 return( -1 ); \
495 } \
496 } \
497 while( 0 )
498
Daniel Kingadc32c02016-05-16 18:25:45 -0300499int mbedtls_poly1305_self_test( int verbose )
500{
Daniel Kinge6e79682016-05-24 11:16:17 -0300501 unsigned char mac[16];
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200502 unsigned i;
Daniel Kingadc32c02016-05-16 18:25:45 -0300503 int result;
504
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200505 for( i = 0U; i < 2U; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -0300506 {
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200507 if( verbose != 0 )
Manuel Pégourié-Gonnardb7e99002018-05-07 10:14:18 +0200508 mbedtls_printf( " Poly1305 test %u ", i );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300509
Daniel Kingadc32c02016-05-16 18:25:45 -0300510 result = mbedtls_poly1305_mac( test_keys[i],
Daniel Kinge6e79682016-05-24 11:16:17 -0300511 test_data[i],
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200512 test_data_len[i],
Daniel Kinge6e79682016-05-24 11:16:17 -0300513 mac );
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200514 ASSERT( 0 == result, ( "error code: %i\n", result ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300515
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200516 ASSERT( 0 == memcmp( mac, test_mac[i], 16U ), ( "failed (mac)\n" ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300517
Manuel Pégourié-Gonnardc0dfcd42018-05-10 11:42:07 +0200518 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300519 mbedtls_printf( "passed\n" );
Daniel Kingdedf4a32016-05-18 10:07:53 -0300520 }
521
522 if( verbose != 0 )
Daniel Kingdedf4a32016-05-18 10:07:53 -0300523 mbedtls_printf( "\n" );
Daniel Kingadc32c02016-05-16 18:25:45 -0300524
525 return( 0 );
526}
527
528#endif /* MBEDTLS_SELF_TEST */
529
530#endif /* MBEDTLS_POLY1305_C */