blob: fdcb630a1f417528b019ee8311122c08dbbc646e [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1115/1319 compliant MD2 implementation
3 *
Bence Szépkútia2947ac2020-08-19 16:37:36 +02004 * Copyright The Mbed TLS Contributors
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 * **********
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"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050062#include "mbedtls/platform_util.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000063
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000064#include <string.h>
65
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020066#if defined(MBEDTLS_SELF_TEST)
67#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000068#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010069#else
Rich Evans00ab4702015-02-06 13:43:58 +000070#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071#define mbedtls_printf printf
72#endif /* MBEDTLS_PLATFORM_C */
73#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010074
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020075#if !defined(MBEDTLS_MD2_ALT)
76
Paul Bakker5121ce52009-01-03 21:22:43 +000077static const unsigned char PI_SUBST[256] =
78{
79 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
80 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
81 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
82 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
83 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
84 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
85 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
86 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
87 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
88 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
89 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
90 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
91 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
92 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
93 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
94 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
95 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
96 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
97 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
98 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
99 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
100 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
101 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
102 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
103 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
104 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
105};
106
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200107void mbedtls_md2_init( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200108{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 memset( ctx, 0, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200110}
111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112void mbedtls_md2_free( mbedtls_md2_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +0200113{
114 if( ctx == NULL )
115 return;
116
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500117 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_md2_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +0200118}
119
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +0200120void mbedtls_md2_clone( mbedtls_md2_context *dst,
121 const mbedtls_md2_context *src )
122{
123 *dst = *src;
124}
125
Paul Bakker5121ce52009-01-03 21:22:43 +0000126/*
127 * MD2 context setup
128 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100129int mbedtls_md2_starts_ret( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000130{
Paul Bakker2fd71f02009-07-11 20:40:58 +0000131 memset( ctx->cksum, 0, 16 );
132 memset( ctx->state, 0, 46 );
133 memset( ctx->buffer, 0, 16 );
134 ctx->left = 0;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100135
136 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000137}
138
Jaeden Amero041039f2018-02-19 15:28:08 +0000139#if !defined(MBEDTLS_DEPRECATED_REMOVED)
140void mbedtls_md2_starts( mbedtls_md2_context *ctx )
141{
142 mbedtls_md2_starts_ret( ctx );
143}
144#endif
145
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146#if !defined(MBEDTLS_MD2_PROCESS_ALT)
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100147int mbedtls_internal_md2_process( mbedtls_md2_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000148{
149 int i, j;
150 unsigned char t = 0;
151
152 for( i = 0; i < 16; i++ )
153 {
154 ctx->state[i + 16] = ctx->buffer[i];
155 ctx->state[i + 32] =
156 (unsigned char)( ctx->buffer[i] ^ ctx->state[i]);
157 }
158
159 for( i = 0; i < 18; i++ )
160 {
161 for( j = 0; j < 48; j++ )
162 {
163 ctx->state[j] = (unsigned char)
164 ( ctx->state[j] ^ PI_SUBST[t] );
165 t = ctx->state[j];
166 }
167
168 t = (unsigned char)( t + i );
169 }
170
171 t = ctx->cksum[15];
172
173 for( i = 0; i < 16; i++ )
174 {
175 ctx->cksum[i] = (unsigned char)
176 ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );
177 t = ctx->cksum[i];
178 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100179
gabor-mezei-armf21639f2020-08-19 14:03:06 +0200180 /* Zeroise variables to clear sensitive data from memory. */
181 mbedtls_platform_zeroize( &t, sizeof( t ) );
182
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100183 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000184}
Jaeden Amero041039f2018-02-19 15:28:08 +0000185
186#if !defined(MBEDTLS_DEPRECATED_REMOVED)
187void mbedtls_md2_process( mbedtls_md2_context *ctx )
188{
189 mbedtls_internal_md2_process( ctx );
190}
191#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192#endif /* !MBEDTLS_MD2_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000193
194/*
195 * MD2 process buffer
196 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100197int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100198 const unsigned char *input,
199 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000200{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100201 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000202 size_t fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000203
204 while( ilen > 0 )
205 {
Andres Amaya Garcia6a543362017-01-17 23:04:22 +0000206 if( ilen > 16 - ctx->left )
Paul Bakker5121ce52009-01-03 21:22:43 +0000207 fill = 16 - ctx->left;
208 else
209 fill = ilen;
210
211 memcpy( ctx->buffer + ctx->left, input, fill );
212
213 ctx->left += fill;
214 input += fill;
215 ilen -= fill;
216
217 if( ctx->left == 16 )
218 {
219 ctx->left = 0;
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100220 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100221 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000222 }
223 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100224
225 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000226}
227
Jaeden Amero041039f2018-02-19 15:28:08 +0000228#if !defined(MBEDTLS_DEPRECATED_REMOVED)
229void mbedtls_md2_update( mbedtls_md2_context *ctx,
230 const unsigned char *input,
231 size_t ilen )
232{
233 mbedtls_md2_update_ret( ctx, input, ilen );
234}
235#endif
236
Paul Bakker5121ce52009-01-03 21:22:43 +0000237/*
238 * MD2 final digest
239 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100240int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100241 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000242{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100243 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000244 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000245 unsigned char x;
246
247 x = (unsigned char)( 16 - ctx->left );
248
249 for( i = ctx->left; i < 16; i++ )
250 ctx->buffer[i] = x;
251
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100252 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100253 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000254
255 memcpy( ctx->buffer, ctx->cksum, 16 );
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100256 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100257 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000258
259 memcpy( output, ctx->state, 16 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100260
261 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000262}
263
Jaeden Amero041039f2018-02-19 15:28:08 +0000264#if !defined(MBEDTLS_DEPRECATED_REMOVED)
265void mbedtls_md2_finish( mbedtls_md2_context *ctx,
266 unsigned char output[16] )
267{
268 mbedtls_md2_finish_ret( ctx, output );
269}
270#endif
271
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272#endif /* !MBEDTLS_MD2_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200273
Paul Bakker5121ce52009-01-03 21:22:43 +0000274/*
275 * output = MD2( input buffer )
276 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100277int mbedtls_md2_ret( const unsigned char *input,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100278 size_t ilen,
279 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000280{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100281 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282 mbedtls_md2_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000283
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 mbedtls_md2_init( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100285
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100286 if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100287 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100288
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100289 if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100290 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100291
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100292 if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100293 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100294
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100295exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200296 mbedtls_md2_free( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100297
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100298 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000299}
300
Jaeden Amero041039f2018-02-19 15:28:08 +0000301#if !defined(MBEDTLS_DEPRECATED_REMOVED)
302void mbedtls_md2( const unsigned char *input,
303 size_t ilen,
304 unsigned char output[16] )
305{
306 mbedtls_md2_ret( input, ilen, output );
307}
308#endif
309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000311
312/*
313 * RFC 1319 test vectors
314 */
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100315static const unsigned char md2_test_str[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000316{
317 { "" },
318 { "a" },
319 { "abc" },
320 { "message digest" },
321 { "abcdefghijklmnopqrstuvwxyz" },
322 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100323 { "12345678901234567890123456789012345678901234567890123456789012"
Paul Bakker5121ce52009-01-03 21:22:43 +0000324 "345678901234567890" }
325};
326
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100327static const size_t md2_test_strlen[7] =
328{
329 0, 1, 3, 14, 26, 62, 80
330};
331
Paul Bakker5121ce52009-01-03 21:22:43 +0000332static const unsigned char md2_test_sum[7][16] =
333{
334 { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
335 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
336 { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
337 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
338 { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
339 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
340 { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
341 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
342 { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
343 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
344 { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
345 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
346 { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
347 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
348};
349
350/*
351 * Checkup routine
352 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200353int mbedtls_md2_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000354{
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100355 int i, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000356 unsigned char md2sum[16];
357
358 for( i = 0; i < 7; i++ )
359 {
360 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 mbedtls_printf( " MD2 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000362
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100363 ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100364 if( ret != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100365 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
367 if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100368 {
369 ret = 1;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100370 goto fail;
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100371 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000372
373 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200374 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000375 }
376
377 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200378 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000379
380 return( 0 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100381
382fail:
383 if( verbose != 0 )
384 mbedtls_printf( "failed\n" );
385
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100386 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000387}
388
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391#endif /* MBEDTLS_MD2_C */