blob: 41e83f3f35436f530cb396178d88abc2231fddbd [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.
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020060 * \param nblocks Number of blocks to process. Note that this
61 * function only processes full blocks.
Daniel Kingadc32c02016-05-16 18:25:45 -030062 * \param input Buffer containing the input block(s).
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020063 * \param needs_padding Set to 0 if the padding bit has already been
64 * applied to the input data before calling this
65 * function. Otherwise, set this parameter to 1.
Daniel Kingadc32c02016-05-16 18:25:45 -030066 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +020067static void poly1305_process( mbedtls_poly1305_context *ctx,
68 size_t nblocks,
69 const unsigned char *input,
70 uint32_t needs_padding )
Daniel Kingadc32c02016-05-16 18:25:45 -030071{
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 */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020095 for( i = 0U; i < nblocks; i++ )
Daniel Kingadc32c02016-05-16 18:25:45 -030096 {
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +020097 /* The input block is treated as a 128-bit little-endian integer */
98 d0 = BYTES_TO_U32_LE( input, offset + 0 );
99 d1 = BYTES_TO_U32_LE( input, offset + 4 );
100 d2 = BYTES_TO_U32_LE( input, offset + 8 );
101 d3 = BYTES_TO_U32_LE( input, offset + 12 );
102
103 /* Compute: acc += (padded) block as a 130-bit integer */
104 d0 += (uint64_t) acc0;
105 d1 += (uint64_t) acc1 + ( d0 >> 32U );
106 d2 += (uint64_t) acc2 + ( d1 >> 32U );
107 d3 += (uint64_t) acc3 + ( d2 >> 32U );
Daniel Kinge6e79682016-05-24 11:16:17 -0300108 acc0 = (uint32_t) d0;
109 acc1 = (uint32_t) d1;
110 acc2 = (uint32_t) d2;
111 acc3 = (uint32_t) d3;
112 acc4 += (uint32_t) ( d3 >> 32U ) + needs_padding;
Daniel Kingadc32c02016-05-16 18:25:45 -0300113
114 /* Compute: acc *= r */
Daniel Kinge6e79682016-05-24 11:16:17 -0300115 d0 = ( (uint64_t) acc0 * r0 ) +
116 ( (uint64_t) acc1 * rs3 ) +
117 ( (uint64_t) acc2 * rs2 ) +
118 ( (uint64_t) acc3 * rs1 );
119 d1 = ( (uint64_t) acc0 * r1 ) +
120 ( (uint64_t) acc1 * r0 ) +
121 ( (uint64_t) acc2 * rs3 ) +
122 ( (uint64_t) acc3 * rs2 ) +
123 ( (uint64_t) acc4 * rs1 );
124 d2 = ( (uint64_t) acc0 * r2 ) +
125 ( (uint64_t) acc1 * r1 ) +
126 ( (uint64_t) acc2 * r0 ) +
127 ( (uint64_t) acc3 * rs3 ) +
128 ( (uint64_t) acc4 * rs2 );
129 d3 = ( (uint64_t) acc0 * r3 ) +
130 ( (uint64_t) acc1 * r2 ) +
131 ( (uint64_t) acc2 * r1 ) +
132 ( (uint64_t) acc3 * r0 ) +
133 ( (uint64_t) acc4 * rs3 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300134 acc4 *= r0;
135
136 /* Compute: acc %= (2^130 - 5) (partial remainder) */
137 d1 += ( d0 >> 32 );
138 d2 += ( d1 >> 32 );
139 d3 += ( d2 >> 32 );
Daniel Kinge6e79682016-05-24 11:16:17 -0300140 acc0 = (uint32_t) d0;
141 acc1 = (uint32_t) d1;
142 acc2 = (uint32_t) d2;
143 acc3 = (uint32_t) d3;
144 acc4 = (uint32_t) ( d3 >> 32 ) + acc4;
Daniel Kingadc32c02016-05-16 18:25:45 -0300145
Daniel Kinge6e79682016-05-24 11:16:17 -0300146 d0 = (uint64_t) acc0 + ( acc4 >> 2 ) + ( acc4 & 0xFFFFFFFCU );
Daniel Kingadc32c02016-05-16 18:25:45 -0300147 acc4 &= 3U;
Daniel Kinge6e79682016-05-24 11:16:17 -0300148 acc0 = (uint32_t) d0;
149 d0 = (uint64_t) acc1 + ( d0 >> 32U );
150 acc1 = (uint32_t) d0;
151 d0 = (uint64_t) acc2 + ( d0 >> 32U );
152 acc2 = (uint32_t) d0;
153 d0 = (uint64_t) acc3 + ( d0 >> 32U );
154 acc3 = (uint32_t) d0;
155 d0 = (uint64_t) acc4 + ( d0 >> 32U );
156 acc4 = (uint32_t) d0;
Daniel Kingadc32c02016-05-16 18:25:45 -0300157
158 offset += POLY1305_BLOCK_SIZE_BYTES;
159 }
160
161 ctx->acc[0] = acc0;
162 ctx->acc[1] = acc1;
163 ctx->acc[2] = acc2;
164 ctx->acc[3] = acc3;
165 ctx->acc[4] = acc4;
166}
167
168/**
169 * \brief Compute the Poly1305 MAC
170 *
171 * \param ctx The Poly1305 context.
172 * \param mac The buffer to where the MAC is written. Must be
173 * big enough to contain the 16-byte MAC.
174 */
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200175static void poly1305_compute_mac( const mbedtls_poly1305_context *ctx,
176 unsigned char mac[16] )
Daniel Kingadc32c02016-05-16 18:25:45 -0300177{
178 uint64_t d;
179 uint32_t g0, g1, g2, g3, g4;
180 uint32_t acc0, acc1, acc2, acc3, acc4;
181 uint32_t mask;
182 uint32_t mask_inv;
183
184 acc0 = ctx->acc[0];
185 acc1 = ctx->acc[1];
186 acc2 = ctx->acc[2];
187 acc3 = ctx->acc[3];
188 acc4 = ctx->acc[4];
189
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200190 /* Before adding 's' we ensure that the accumulator is mod 2^130 - 5.
Daniel Kingadc32c02016-05-16 18:25:45 -0300191 * We do this by calculating acc - (2^130 - 5), then checking if
192 * the 131st bit is set. If it is, then reduce: acc -= (2^130 - 5)
193 */
194
195 /* Calculate acc + -(2^130 - 5) */
Daniel Kinge6e79682016-05-24 11:16:17 -0300196 d = ( (uint64_t) acc0 + 5U );
197 g0 = (uint32_t) d;
198 d = ( (uint64_t) acc1 + ( d >> 32 ) );
199 g1 = (uint32_t) d;
200 d = ( (uint64_t) acc2 + ( d >> 32 ) );
201 g2 = (uint32_t) d;
202 d = ( (uint64_t) acc3 + ( d >> 32 ) );
203 g3 = (uint32_t) d;
204 g4 = acc4 + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300205
206 /* mask == 0xFFFFFFFF if 131st bit is set, otherwise mask == 0 */
Daniel Kinge6e79682016-05-24 11:16:17 -0300207 mask = (uint32_t) 0U - ( g4 >> 2U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300208 mask_inv = ~mask;
209
210 /* If 131st bit is set then acc=g, otherwise, acc is unmodified */
211 acc0 = ( acc0 & mask_inv ) | ( g0 & mask );
212 acc1 = ( acc1 & mask_inv ) | ( g1 & mask );
213 acc2 = ( acc2 & mask_inv ) | ( g2 & mask );
214 acc3 = ( acc3 & mask_inv ) | ( g3 & mask );
215
216 /* Add 's' */
Daniel Kinge6e79682016-05-24 11:16:17 -0300217 d = (uint64_t) acc0 + ctx->s[0];
218 acc0 = (uint32_t) d;
219 d = (uint64_t) acc1 + ctx->s[1] + ( d >> 32U );
220 acc1 = (uint32_t) d;
221 d = (uint64_t) acc2 + ctx->s[2] + ( d >> 32U );
222 acc2 = (uint32_t) d;
223 acc3 += ctx->s[3] + (uint32_t) ( d >> 32U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300224
225 /* Compute MAC (128 least significant bits of the accumulator) */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200226 mac[ 0] = (unsigned char)( acc0 );
227 mac[ 1] = (unsigned char)( acc0 >> 8 );
228 mac[ 2] = (unsigned char)( acc0 >> 16 );
229 mac[ 3] = (unsigned char)( acc0 >> 24 );
230 mac[ 4] = (unsigned char)( acc1 );
231 mac[ 5] = (unsigned char)( acc1 >> 8 );
232 mac[ 6] = (unsigned char)( acc1 >> 16 );
233 mac[ 7] = (unsigned char)( acc1 >> 24 );
234 mac[ 8] = (unsigned char)( acc2 );
235 mac[ 9] = (unsigned char)( acc2 >> 8 );
236 mac[10] = (unsigned char)( acc2 >> 16 );
237 mac[11] = (unsigned char)( acc2 >> 24 );
238 mac[12] = (unsigned char)( acc3 );
239 mac[13] = (unsigned char)( acc3 >> 8 );
240 mac[14] = (unsigned char)( acc3 >> 16 );
241 mac[15] = (unsigned char)( acc3 >> 24 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300242}
243
244void mbedtls_poly1305_init( mbedtls_poly1305_context *ctx )
245{
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200246 if( ctx != NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300247 {
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200248 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300249 }
250}
251
252void mbedtls_poly1305_free( mbedtls_poly1305_context *ctx )
253{
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200254 if( ctx != NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300255 {
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200256 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_poly1305_context ) );
Daniel Kingadc32c02016-05-16 18:25:45 -0300257 }
258}
259
Manuel Pégourié-Gonnard4edd51b2018-05-07 10:21:56 +0200260int mbedtls_poly1305_starts( mbedtls_poly1305_context *ctx,
Daniel Kingadc32c02016-05-16 18:25:45 -0300261 const unsigned char key[32] )
262{
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200263 if( ctx == NULL || key == NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300264 {
265 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
266 }
267
268 /* r &= 0x0ffffffc0ffffffc0ffffffc0fffffff */
269 ctx->r[0] = BYTES_TO_U32_LE( key, 0 ) & 0x0FFFFFFFU;
270 ctx->r[1] = BYTES_TO_U32_LE( key, 4 ) & 0x0FFFFFFCU;
271 ctx->r[2] = BYTES_TO_U32_LE( key, 8 ) & 0x0FFFFFFCU;
272 ctx->r[3] = BYTES_TO_U32_LE( key, 12 ) & 0x0FFFFFFCU;
273
274 ctx->s[0] = BYTES_TO_U32_LE( key, 16 );
275 ctx->s[1] = BYTES_TO_U32_LE( key, 20 );
276 ctx->s[2] = BYTES_TO_U32_LE( key, 24 );
277 ctx->s[3] = BYTES_TO_U32_LE( key, 28 );
278
279 /* Initial accumulator state */
280 ctx->acc[0] = 0U;
281 ctx->acc[1] = 0U;
282 ctx->acc[2] = 0U;
283 ctx->acc[3] = 0U;
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200284 ctx->acc[4] = 0U;
285
286 /* Queue initially empty */
Manuel Pégourié-Gonnardfb78c902018-05-24 13:46:15 +0200287 mbedtls_platform_zeroize( ctx->queue, sizeof( ctx->queue ) );
Manuel Pégourié-Gonnard14656022018-05-09 12:51:54 +0200288 ctx->queue_len = 0U;
Daniel Kingadc32c02016-05-16 18:25:45 -0300289
Daniel Kinge6e79682016-05-24 11:16:17 -0300290 return( 0 );
Daniel Kingadc32c02016-05-16 18:25:45 -0300291}
292
293int mbedtls_poly1305_update( mbedtls_poly1305_context *ctx,
Manuel Pégourié-Gonnardb1ac5e72018-05-09 09:25:00 +0200294 const unsigned char *input,
295 size_t ilen )
Daniel Kingadc32c02016-05-16 18:25:45 -0300296{
297 size_t offset = 0U;
298 size_t remaining = ilen;
299 size_t queue_free_len;
300 size_t nblocks;
301
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200302 if( ctx == NULL )
Daniel Kingadc32c02016-05-16 18:25:45 -0300303 {
304 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
305 }
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200306 else if( ( ilen > 0U ) && ( input == NULL ) )
Daniel Kinga310c5e2016-05-17 15:56:26 -0300307 {
308 /* input pointer is allowed to be NULL only if ilen == 0 */
309 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
310 }
Daniel Kingadc32c02016-05-16 18:25:45 -0300311
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200312 if( ( remaining > 0U ) && ( ctx->queue_len > 0U ) )
Daniel Kingadc32c02016-05-16 18:25:45 -0300313 {
314 queue_free_len = ( POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
315
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200316 if( ilen < queue_free_len )
Daniel Kingadc32c02016-05-16 18:25:45 -0300317 {
318 /* Not enough data to complete the block.
319 * Store this data with the other leftovers.
320 */
321 memcpy( &ctx->queue[ctx->queue_len],
322 input,
323 ilen );
324
325 ctx->queue_len += ilen;
326
327 remaining = 0U;
328 }
329 else
330 {
331 /* Enough data to produce a complete block */
332 memcpy( &ctx->queue[ctx->queue_len],
333 input,
334 queue_free_len );
335
336 ctx->queue_len = 0U;
337
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200338 poly1305_process( ctx, 1U, ctx->queue, 1U ); /* add padding bit */
Daniel Kingadc32c02016-05-16 18:25:45 -0300339
340 offset += queue_free_len;
341 remaining -= queue_free_len;
342 }
343 }
344
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200345 if( remaining >= POLY1305_BLOCK_SIZE_BYTES )
Daniel Kingadc32c02016-05-16 18:25:45 -0300346 {
347 nblocks = remaining / POLY1305_BLOCK_SIZE_BYTES;
348
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200349 poly1305_process( ctx, nblocks, &input[offset], 1U );
Daniel Kingadc32c02016-05-16 18:25:45 -0300350
351 offset += nblocks * POLY1305_BLOCK_SIZE_BYTES;
352 remaining %= POLY1305_BLOCK_SIZE_BYTES;
353 }
354
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200355 if( remaining > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300356 {
357 /* Store partial block */
358 ctx->queue_len = remaining;
359 memcpy( ctx->queue, &input[offset], remaining );
360 }
361
362 return( 0 );
363}
364
365int mbedtls_poly1305_finish( mbedtls_poly1305_context *ctx,
366 unsigned char mac[16] )
367{
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200368 if( ( ctx == NULL ) || ( mac == NULL ) )
Daniel Kingadc32c02016-05-16 18:25:45 -0300369 {
370 return( MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA );
371 }
372
373 /* Process any leftover data */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200374 if( ctx->queue_len > 0U )
Daniel Kingadc32c02016-05-16 18:25:45 -0300375 {
376 /* Add padding bit */
377 ctx->queue[ctx->queue_len] = 1U;
378 ctx->queue_len++;
379
380 /* Pad with zeroes */
381 memset( &ctx->queue[ctx->queue_len],
382 0,
383 POLY1305_BLOCK_SIZE_BYTES - ctx->queue_len );
384
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200385 poly1305_process( ctx, 1U, /* Process 1 block */
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200386 ctx->queue, 0U ); /* Already padded above */
Daniel Kingadc32c02016-05-16 18:25:45 -0300387 }
388
Manuel Pégourié-Gonnard9620f9b2018-05-24 16:52:19 +0200389 poly1305_compute_mac( ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300390
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;
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200400 int ret;
Daniel Kingadc32c02016-05-16 18:25:45 -0300401
402 mbedtls_poly1305_init( &ctx );
403
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200404 ret = mbedtls_poly1305_starts( &ctx, key );
405 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300406 goto cleanup;
407
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200408 ret = mbedtls_poly1305_update( &ctx, input, ilen );
409 if( ret != 0 )
Daniel Kingadc32c02016-05-16 18:25:45 -0300410 goto cleanup;
411
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200412 ret = mbedtls_poly1305_finish( &ctx, mac );
Daniel Kingadc32c02016-05-16 18:25:45 -0300413
414cleanup:
415 mbedtls_poly1305_free( &ctx );
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200416 return( ret );
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;
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200503 int ret;
Daniel Kingadc32c02016-05-16 18:25:45 -0300504
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
Manuel Pégourié-Gonnard17297892018-05-24 17:53:41 +0200510 ret = mbedtls_poly1305_mac( test_keys[i],
511 test_data[i],
512 test_data_len[i],
513 mac );
514 ASSERT( 0 == ret, ( "error code: %i\n", ret ) );
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 */