blob: 293ada30451e08a492beeeee9b69346918be52a9 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1115/1319 compliant MD2 implementation
3 *
Bence Szépkúti44bfbe32020-08-19 16:54:51 +02004 * Copyright The Mbed TLS Contributors
Bence Szépkúti4e9f7122020-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úti4e9f7122020-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 * **********
Paul Bakker5121ce52009-01-03 21:22:43 +000045 */
46/*
47 * The MD2 algorithm was designed by Ron Rivest in 1989.
48 *
49 * http://www.ietf.org/rfc/rfc1115.txt
50 * http://www.ietf.org/rfc/rfc1319.txt
51 */
52
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000054#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020055#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020057#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020059#if defined(MBEDTLS_MD2_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000060
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000061#include "mbedtls/md2.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000062
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000063#include <string.h>
64
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065#if defined(MBEDTLS_SELF_TEST)
66#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000067#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010068#else
Rich Evans00ab4702015-02-06 13:43:58 +000069#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020070#define mbedtls_printf printf
71#endif /* MBEDTLS_PLATFORM_C */
72#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010073
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020074#if !defined(MBEDTLS_MD2_ALT)
75
Paul Bakker34617722014-06-13 17:20:13 +020076/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020078 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
79}
80
Paul Bakker5121ce52009-01-03 21:22:43 +000081static const unsigned char PI_SUBST[256] =
82{
83 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
84 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
85 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
86 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
87 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
88 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
89 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
90 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
91 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
92 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
93 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
94 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
95 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
96 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
97 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
98 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
99 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
100 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
101 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
102 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
103 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
104 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
105 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
106 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
107 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
108 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
109};
110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111void mbedtls_md2_init( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200112{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200113 memset( ctx, 0, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200114}
115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116void mbedtls_md2_free( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200117{
118 if( ctx == NULL )
119 return;
120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 mbedtls_zeroize( ctx, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200122}
123
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200124void mbedtls_md2_clone( mbedtls_md2_context *dst,
125 const mbedtls_md2_context *src )
126{
127 *dst = *src;
128}
129
Paul Bakker5121ce52009-01-03 21:22:43 +0000130/*
131 * MD2 context setup
132 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100133int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000134{
Paul Bakker2fd71f02009-07-11 20:40:58 +0000135 memset( ctx->cksum, 0, 16 );
136 memset( ctx->state, 0, 46 );
137 memset( ctx->buffer, 0, 16 );
138 ctx->left = 0;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100139
140 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000141}
142
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000143#if !defined(MBEDTLS_DEPRECATED_REMOVED)
144void mbedtls_md2_starts( mbedtls_md2_context *ctx )
145{
146 mbedtls_md2_starts_ret( ctx );
147}
148#endif
149
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150#if !defined(MBEDTLS_MD2_PROCESS_ALT)
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100151int mbedtls_internal_md2_process( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000152{
153 int i, j;
154 unsigned char t = 0;
155
156 for( i = 0; i < 16; i++ )
157 {
158 ctx->state[i + 16] = ctx->buffer[i];
159 ctx->state[i + 32] =
160 (unsigned char)( ctx->buffer[i] ^ ctx->state[i]);
161 }
162
163 for( i = 0; i < 18; i++ )
164 {
165 for( j = 0; j < 48; j++ )
166 {
167 ctx->state[j] = (unsigned char)
168 ( ctx->state[j] ^ PI_SUBST[t] );
169 t = ctx->state[j];
170 }
171
172 t = (unsigned char)( t + i );
173 }
174
175 t = ctx->cksum[15];
176
177 for( i = 0; i < 16; i++ )
178 {
179 ctx->cksum[i] = (unsigned char)
180 ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );
181 t = ctx->cksum[i];
182 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100183
184 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000185}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000186
187#if !defined(MBEDTLS_DEPRECATED_REMOVED)
188void mbedtls_md2_process( mbedtls_md2_context *ctx )
189{
190 mbedtls_internal_md2_process( ctx );
191}
192#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200193#endif /* !MBEDTLS_MD2_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000194
195/*
196 * MD2 process buffer
197 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100198int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100199 const unsigned char *input,
200 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000201{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100202 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000203 size_t fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000204
205 while( ilen > 0 )
206 {
Andres Amaya Garcia6a543362017-01-17 23:04:22 +0000207 if( ilen > 16 - ctx->left )
Paul Bakker5121ce52009-01-03 21:22:43 +0000208 fill = 16 - ctx->left;
209 else
210 fill = ilen;
211
212 memcpy( ctx->buffer + ctx->left, input, fill );
213
214 ctx->left += fill;
215 input += fill;
216 ilen -= fill;
217
218 if( ctx->left == 16 )
219 {
220 ctx->left = 0;
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100221 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100222 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000223 }
224 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100225
226 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000227}
228
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000229#if !defined(MBEDTLS_DEPRECATED_REMOVED)
230void mbedtls_md2_update( mbedtls_md2_context *ctx,
231 const unsigned char *input,
232 size_t ilen )
233{
234 mbedtls_md2_update_ret( ctx, input, ilen );
235}
236#endif
237
Paul Bakker5121ce52009-01-03 21:22:43 +0000238/*
239 * MD2 final digest
240 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100241int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100242 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000243{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100244 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000245 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000246 unsigned char x;
247
248 x = (unsigned char)( 16 - ctx->left );
249
250 for( i = ctx->left; i < 16; i++ )
251 ctx->buffer[i] = x;
252
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100253 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100254 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000255
256 memcpy( ctx->buffer, ctx->cksum, 16 );
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100257 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100258 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000259
260 memcpy( output, ctx->state, 16 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100261
262 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000263}
264
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000265#if !defined(MBEDTLS_DEPRECATED_REMOVED)
266void mbedtls_md2_finish( mbedtls_md2_context *ctx,
267 unsigned char output[16] )
268{
269 mbedtls_md2_finish_ret( ctx, output );
270}
271#endif
272
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200273#endif /* !MBEDTLS_MD2_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200274
Paul Bakker5121ce52009-01-03 21:22:43 +0000275/*
276 * output = MD2( input buffer )
277 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100278int mbedtls_md2_ret( const unsigned char *input,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100279 size_t ilen,
280 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000281{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100282 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283 mbedtls_md2_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 mbedtls_md2_init( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100286
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100287 if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100288 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100289
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100290 if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100291 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100292
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100293 if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100294 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100295
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100296exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297 mbedtls_md2_free( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100298
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100299 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000300}
301
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000302#if !defined(MBEDTLS_DEPRECATED_REMOVED)
303void mbedtls_md2( const unsigned char *input,
304 size_t ilen,
305 unsigned char output[16] )
306{
307 mbedtls_md2_ret( input, ilen, output );
308}
309#endif
310
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200311#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000312
313/*
314 * RFC 1319 test vectors
315 */
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100316static const unsigned char md2_test_str[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000317{
318 { "" },
319 { "a" },
320 { "abc" },
321 { "message digest" },
322 { "abcdefghijklmnopqrstuvwxyz" },
323 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100324 { "12345678901234567890123456789012345678901234567890123456789012"
Paul Bakker5121ce52009-01-03 21:22:43 +0000325 "345678901234567890" }
326};
327
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100328static const size_t md2_test_strlen[7] =
329{
330 0, 1, 3, 14, 26, 62, 80
331};
332
Paul Bakker5121ce52009-01-03 21:22:43 +0000333static const unsigned char md2_test_sum[7][16] =
334{
335 { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
336 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
337 { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
338 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
339 { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
340 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
341 { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
342 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
343 { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
344 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
345 { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
346 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
347 { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
348 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
349};
350
351/*
352 * Checkup routine
353 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354int mbedtls_md2_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000355{
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100356 int i, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000357 unsigned char md2sum[16];
358
359 for( i = 0; i < 7; i++ )
360 {
361 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200362 mbedtls_printf( " MD2 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100364 ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100365 if( ret != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100366 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000367
368 if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100369 {
370 ret = 1;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100371 goto fail;
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100372 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000373
374 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 }
377
378 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200379 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000380
381 return( 0 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100382
383fail:
384 if( verbose != 0 )
385 mbedtls_printf( "failed\n" );
386
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100387 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000388}
389
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392#endif /* MBEDTLS_MD2_C */