blob: cbdaaabdc75e0cf9ced6c01dadd403fa57fe356c [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
180 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000181}
Jaeden Amero041039f2018-02-19 15:28:08 +0000182
183#if !defined(MBEDTLS_DEPRECATED_REMOVED)
184void mbedtls_md2_process( mbedtls_md2_context *ctx )
185{
186 mbedtls_internal_md2_process( ctx );
187}
188#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200189#endif /* !MBEDTLS_MD2_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000190
191/*
192 * MD2 process buffer
193 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100194int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100195 const unsigned char *input,
196 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000197{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100198 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000199 size_t fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000200
201 while( ilen > 0 )
202 {
Andres Amaya Garcia6a543362017-01-17 23:04:22 +0000203 if( ilen > 16 - ctx->left )
Paul Bakker5121ce52009-01-03 21:22:43 +0000204 fill = 16 - ctx->left;
205 else
206 fill = ilen;
207
208 memcpy( ctx->buffer + ctx->left, input, fill );
209
210 ctx->left += fill;
211 input += fill;
212 ilen -= fill;
213
214 if( ctx->left == 16 )
215 {
216 ctx->left = 0;
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100217 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100218 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000219 }
220 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100221
222 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000223}
224
Jaeden Amero041039f2018-02-19 15:28:08 +0000225#if !defined(MBEDTLS_DEPRECATED_REMOVED)
226void mbedtls_md2_update( mbedtls_md2_context *ctx,
227 const unsigned char *input,
228 size_t ilen )
229{
230 mbedtls_md2_update_ret( ctx, input, ilen );
231}
232#endif
233
Paul Bakker5121ce52009-01-03 21:22:43 +0000234/*
235 * MD2 final digest
236 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100237int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100238 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000239{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100240 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000241 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000242 unsigned char x;
243
244 x = (unsigned char)( 16 - ctx->left );
245
246 for( i = ctx->left; i < 16; i++ )
247 ctx->buffer[i] = x;
248
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100249 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100250 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000251
252 memcpy( ctx->buffer, ctx->cksum, 16 );
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( output, ctx->state, 16 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100257
258 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000259}
260
Jaeden Amero041039f2018-02-19 15:28:08 +0000261#if !defined(MBEDTLS_DEPRECATED_REMOVED)
262void mbedtls_md2_finish( mbedtls_md2_context *ctx,
263 unsigned char output[16] )
264{
265 mbedtls_md2_finish_ret( ctx, output );
266}
267#endif
268
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269#endif /* !MBEDTLS_MD2_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200270
Paul Bakker5121ce52009-01-03 21:22:43 +0000271/*
272 * output = MD2( input buffer )
273 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100274int mbedtls_md2_ret( const unsigned char *input,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100275 size_t ilen,
276 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000277{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100278 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200279 mbedtls_md2_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281 mbedtls_md2_init( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100282
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100283 if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100284 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100285
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100286 if( ( ret = mbedtls_md2_update_ret( &ctx, input, ilen ) ) != 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_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100290 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100291
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100292exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293 mbedtls_md2_free( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100294
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100295 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000296}
297
Jaeden Amero041039f2018-02-19 15:28:08 +0000298#if !defined(MBEDTLS_DEPRECATED_REMOVED)
299void mbedtls_md2( const unsigned char *input,
300 size_t ilen,
301 unsigned char output[16] )
302{
303 mbedtls_md2_ret( input, ilen, output );
304}
305#endif
306
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200307#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000308
309/*
310 * RFC 1319 test vectors
311 */
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100312static const unsigned char md2_test_str[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000313{
314 { "" },
315 { "a" },
316 { "abc" },
317 { "message digest" },
318 { "abcdefghijklmnopqrstuvwxyz" },
319 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100320 { "12345678901234567890123456789012345678901234567890123456789012"
Paul Bakker5121ce52009-01-03 21:22:43 +0000321 "345678901234567890" }
322};
323
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100324static const size_t md2_test_strlen[7] =
325{
326 0, 1, 3, 14, 26, 62, 80
327};
328
Paul Bakker5121ce52009-01-03 21:22:43 +0000329static const unsigned char md2_test_sum[7][16] =
330{
331 { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
332 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
333 { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
334 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
335 { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
336 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
337 { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
338 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
339 { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
340 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
341 { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
342 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
343 { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
344 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
345};
346
347/*
348 * Checkup routine
349 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350int mbedtls_md2_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000351{
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100352 int i, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000353 unsigned char md2sum[16];
354
355 for( i = 0; i < 7; i++ )
356 {
357 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358 mbedtls_printf( " MD2 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000359
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100360 ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100361 if( ret != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100362 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000363
364 if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100365 {
366 ret = 1;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100367 goto fail;
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100368 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000369
370 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000372 }
373
374 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
377 return( 0 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100378
379fail:
380 if( verbose != 0 )
381 mbedtls_printf( "failed\n" );
382
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100383 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000384}
385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000387
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388#endif /* MBEDTLS_MD2_C */