blob: d772039b799430820337800f715651a5fd22ddcf [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1115/1319 compliant MD2 implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Bence Szépkútif744bd72020-06-05 13:02:18 +02005 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
6 *
7 * This file is provided under the Apache License 2.0, or the
8 * GNU General Public License v2.0 or later.
9 *
10 * **********
11 * Apache License 2.0:
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020012 *
13 * Licensed under the Apache License, Version 2.0 (the "License"); you may
14 * not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
Paul Bakkerb96f1542010-07-18 20:36:00 +000024 *
Bence Szépkútif744bd72020-06-05 13:02:18 +020025 * **********
26 *
27 * **********
28 * GNU General Public License v2.0 or later:
29 *
30 * This program is free software; you can redistribute it and/or modify
31 * it under the terms of the GNU General Public License as published by
32 * the Free Software Foundation; either version 2 of the License, or
33 * (at your option) any later version.
34 *
35 * This program is distributed in the hope that it will be useful,
36 * but WITHOUT ANY WARRANTY; without even the implied warranty of
37 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
38 * GNU General Public License for more details.
39 *
40 * You should have received a copy of the GNU General Public License along
41 * with this program; if not, write to the Free Software Foundation, Inc.,
42 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
43 *
44 * **********
45 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000046 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker5121ce52009-01-03 21:22:43 +000047 */
48/*
49 * The MD2 algorithm was designed by Ron Rivest in 1989.
50 *
51 * http://www.ietf.org/rfc/rfc1115.txt
52 * http://www.ietf.org/rfc/rfc1319.txt
53 */
54
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000056#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020057#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020058#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020059#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000060
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if defined(MBEDTLS_MD2_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000062
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000063#include "mbedtls/md2.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050064#include "mbedtls/platform_util.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000065
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000066#include <string.h>
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068#if defined(MBEDTLS_SELF_TEST)
69#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000070#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010071#else
Rich Evans00ab4702015-02-06 13:43:58 +000072#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#define mbedtls_printf printf
74#endif /* MBEDTLS_PLATFORM_C */
75#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010076
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020077#if !defined(MBEDTLS_MD2_ALT)
78
Paul Bakker5121ce52009-01-03 21:22:43 +000079static const unsigned char PI_SUBST[256] =
80{
81 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
82 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
83 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
84 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
85 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
86 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
87 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
88 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
89 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
90 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
91 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
92 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
93 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
94 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
95 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
96 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
97 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
98 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
99 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
100 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
101 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
102 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
103 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
104 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
105 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
106 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
107};
108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109void mbedtls_md2_init( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200110{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111 memset( ctx, 0, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200112}
113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114void mbedtls_md2_free( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200115{
116 if( ctx == NULL )
117 return;
118
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500119 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200120}
121
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200122void mbedtls_md2_clone( mbedtls_md2_context *dst,
123 const mbedtls_md2_context *src )
124{
125 *dst = *src;
126}
127
Paul Bakker5121ce52009-01-03 21:22:43 +0000128/*
129 * MD2 context setup
130 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100131int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000132{
Paul Bakker2fd71f02009-07-11 20:40:58 +0000133 memset( ctx->cksum, 0, 16 );
134 memset( ctx->state, 0, 46 );
135 memset( ctx->buffer, 0, 16 );
136 ctx->left = 0;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100137
138 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000139}
140
Jaeden Amero041039f2018-02-19 15:28:08 +0000141#if !defined(MBEDTLS_DEPRECATED_REMOVED)
142void mbedtls_md2_starts( mbedtls_md2_context *ctx )
143{
144 mbedtls_md2_starts_ret( ctx );
145}
146#endif
147
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200148#if !defined(MBEDTLS_MD2_PROCESS_ALT)
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100149int mbedtls_internal_md2_process( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000150{
151 int i, j;
152 unsigned char t = 0;
153
154 for( i = 0; i < 16; i++ )
155 {
156 ctx->state[i + 16] = ctx->buffer[i];
157 ctx->state[i + 32] =
158 (unsigned char)( ctx->buffer[i] ^ ctx->state[i]);
159 }
160
161 for( i = 0; i < 18; i++ )
162 {
163 for( j = 0; j < 48; j++ )
164 {
165 ctx->state[j] = (unsigned char)
166 ( ctx->state[j] ^ PI_SUBST[t] );
167 t = ctx->state[j];
168 }
169
170 t = (unsigned char)( t + i );
171 }
172
173 t = ctx->cksum[15];
174
175 for( i = 0; i < 16; i++ )
176 {
177 ctx->cksum[i] = (unsigned char)
178 ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );
179 t = ctx->cksum[i];
180 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100181
182 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000183}
Jaeden Amero041039f2018-02-19 15:28:08 +0000184
185#if !defined(MBEDTLS_DEPRECATED_REMOVED)
186void mbedtls_md2_process( mbedtls_md2_context *ctx )
187{
188 mbedtls_internal_md2_process( ctx );
189}
190#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200191#endif /* !MBEDTLS_MD2_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000192
193/*
194 * MD2 process buffer
195 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100196int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100197 const unsigned char *input,
198 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000199{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100200 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000201 size_t fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000202
203 while( ilen > 0 )
204 {
Andres Amaya Garcia6a543362017-01-17 23:04:22 +0000205 if( ilen > 16 - ctx->left )
Paul Bakker5121ce52009-01-03 21:22:43 +0000206 fill = 16 - ctx->left;
207 else
208 fill = ilen;
209
210 memcpy( ctx->buffer + ctx->left, input, fill );
211
212 ctx->left += fill;
213 input += fill;
214 ilen -= fill;
215
216 if( ctx->left == 16 )
217 {
218 ctx->left = 0;
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100219 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100220 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000221 }
222 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100223
224 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000225}
226
Jaeden Amero041039f2018-02-19 15:28:08 +0000227#if !defined(MBEDTLS_DEPRECATED_REMOVED)
228void mbedtls_md2_update( mbedtls_md2_context *ctx,
229 const unsigned char *input,
230 size_t ilen )
231{
232 mbedtls_md2_update_ret( ctx, input, ilen );
233}
234#endif
235
Paul Bakker5121ce52009-01-03 21:22:43 +0000236/*
237 * MD2 final digest
238 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100239int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100240 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000241{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100242 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000243 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000244 unsigned char x;
245
246 x = (unsigned char)( 16 - ctx->left );
247
248 for( i = ctx->left; i < 16; i++ )
249 ctx->buffer[i] = x;
250
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100251 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100252 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000253
254 memcpy( ctx->buffer, ctx->cksum, 16 );
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100255 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100256 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000257
258 memcpy( output, ctx->state, 16 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100259
260 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000261}
262
Jaeden Amero041039f2018-02-19 15:28:08 +0000263#if !defined(MBEDTLS_DEPRECATED_REMOVED)
264void mbedtls_md2_finish( mbedtls_md2_context *ctx,
265 unsigned char output[16] )
266{
267 mbedtls_md2_finish_ret( ctx, output );
268}
269#endif
270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271#endif /* !MBEDTLS_MD2_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200272
Paul Bakker5121ce52009-01-03 21:22:43 +0000273/*
274 * output = MD2( input buffer )
275 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100276int mbedtls_md2_ret( const unsigned char *input,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100277 size_t ilen,
278 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000279{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100280 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281 mbedtls_md2_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000282
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 mbedtls_md2_init( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100284
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100285 if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100286 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100287
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100288 if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100289 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100290
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100291 if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100292 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100293
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100294exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 mbedtls_md2_free( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100296
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100297 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000298}
299
Jaeden Amero041039f2018-02-19 15:28:08 +0000300#if !defined(MBEDTLS_DEPRECATED_REMOVED)
301void mbedtls_md2( const unsigned char *input,
302 size_t ilen,
303 unsigned char output[16] )
304{
305 mbedtls_md2_ret( input, ilen, output );
306}
307#endif
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000310
311/*
312 * RFC 1319 test vectors
313 */
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100314static const unsigned char md2_test_str[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000315{
316 { "" },
317 { "a" },
318 { "abc" },
319 { "message digest" },
320 { "abcdefghijklmnopqrstuvwxyz" },
321 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100322 { "12345678901234567890123456789012345678901234567890123456789012"
Paul Bakker5121ce52009-01-03 21:22:43 +0000323 "345678901234567890" }
324};
325
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100326static const size_t md2_test_strlen[7] =
327{
328 0, 1, 3, 14, 26, 62, 80
329};
330
Paul Bakker5121ce52009-01-03 21:22:43 +0000331static const unsigned char md2_test_sum[7][16] =
332{
333 { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
334 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
335 { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
336 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
337 { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
338 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
339 { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
340 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
341 { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
342 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
343 { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
344 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
345 { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
346 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
347};
348
349/*
350 * Checkup routine
351 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352int mbedtls_md2_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000353{
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100354 int i, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000355 unsigned char md2sum[16];
356
357 for( i = 0; i < 7; i++ )
358 {
359 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360 mbedtls_printf( " MD2 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000361
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100362 ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100363 if( ret != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100364 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000365
366 if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100367 {
368 ret = 1;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100369 goto fail;
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100370 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
372 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000374 }
375
376 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
379 return( 0 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100380
381fail:
382 if( verbose != 0 )
383 mbedtls_printf( "failed\n" );
384
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100385 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000386}
387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390#endif /* MBEDTLS_MD2_C */