blob: eb4d0d03f105f2950a978ae32a61e22ac46935c7 [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
gabor-mezei-armcb3a7422020-08-19 14:03:06 +0200184 /* Zeroise variables to clear sensitive data from memory. */
185 mbedtls_zeroize( &t, sizeof( t ) );
186
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100187 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000188}
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000189
190#if !defined(MBEDTLS_DEPRECATED_REMOVED)
191void mbedtls_md2_process( mbedtls_md2_context *ctx )
192{
193 mbedtls_internal_md2_process( ctx );
194}
195#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200196#endif /* !MBEDTLS_MD2_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000197
198/*
199 * MD2 process buffer
200 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100201int mbedtls_md2_update_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100202 const unsigned char *input,
203 size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000204{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100205 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000206 size_t fill;
Paul Bakker5121ce52009-01-03 21:22:43 +0000207
208 while( ilen > 0 )
209 {
Andres Amaya Garcia6a543362017-01-17 23:04:22 +0000210 if( ilen > 16 - ctx->left )
Paul Bakker5121ce52009-01-03 21:22:43 +0000211 fill = 16 - ctx->left;
212 else
213 fill = ilen;
214
215 memcpy( ctx->buffer + ctx->left, input, fill );
216
217 ctx->left += fill;
218 input += fill;
219 ilen -= fill;
220
221 if( ctx->left == 16 )
222 {
223 ctx->left = 0;
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100224 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100225 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000226 }
227 }
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100228
229 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000230}
231
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000232#if !defined(MBEDTLS_DEPRECATED_REMOVED)
233void mbedtls_md2_update( mbedtls_md2_context *ctx,
234 const unsigned char *input,
235 size_t ilen )
236{
237 mbedtls_md2_update_ret( ctx, input, ilen );
238}
239#endif
240
Paul Bakker5121ce52009-01-03 21:22:43 +0000241/*
242 * MD2 final digest
243 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100244int mbedtls_md2_finish_ret( mbedtls_md2_context *ctx,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100245 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000246{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100247 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000248 size_t i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000249 unsigned char x;
250
251 x = (unsigned char)( 16 - ctx->left );
252
253 for( i = ctx->left; i < 16; i++ )
254 ctx->buffer[i] = x;
255
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( ctx->buffer, ctx->cksum, 16 );
Andres Amaya Garciacccfe082017-06-28 10:36:39 +0100260 if( ( ret = mbedtls_internal_md2_process( ctx ) ) != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100261 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000262
263 memcpy( output, ctx->state, 16 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100264
265 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000266}
267
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000268#if !defined(MBEDTLS_DEPRECATED_REMOVED)
269void mbedtls_md2_finish( mbedtls_md2_context *ctx,
270 unsigned char output[16] )
271{
272 mbedtls_md2_finish_ret( ctx, output );
273}
274#endif
275
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276#endif /* !MBEDTLS_MD2_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200277
Paul Bakker5121ce52009-01-03 21:22:43 +0000278/*
279 * output = MD2( input buffer )
280 */
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100281int mbedtls_md2_ret( const unsigned char *input,
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100282 size_t ilen,
283 unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000284{
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100285 int ret;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286 mbedtls_md2_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000287
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 mbedtls_md2_init( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100289
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100290 if( ( ret = mbedtls_md2_starts_ret( &ctx ) ) != 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_update_ret( &ctx, input, ilen ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100294 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100295
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100296 if( ( ret = mbedtls_md2_finish_ret( &ctx, output ) ) != 0 )
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100297 goto exit;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100298
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100299exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 mbedtls_md2_free( &ctx );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100301
Andres Amaya Garcia0963e6c2017-07-20 14:34:08 +0100302 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000303}
304
Jaeden Ameroa53ff8d2018-02-19 15:28:08 +0000305#if !defined(MBEDTLS_DEPRECATED_REMOVED)
306void mbedtls_md2( const unsigned char *input,
307 size_t ilen,
308 unsigned char output[16] )
309{
310 mbedtls_md2_ret( input, ilen, output );
311}
312#endif
313
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000315
316/*
317 * RFC 1319 test vectors
318 */
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100319static const unsigned char md2_test_str[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000320{
321 { "" },
322 { "a" },
323 { "abc" },
324 { "message digest" },
325 { "abcdefghijklmnopqrstuvwxyz" },
326 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100327 { "12345678901234567890123456789012345678901234567890123456789012"
Paul Bakker5121ce52009-01-03 21:22:43 +0000328 "345678901234567890" }
329};
330
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100331static const size_t md2_test_strlen[7] =
332{
333 0, 1, 3, 14, 26, 62, 80
334};
335
Paul Bakker5121ce52009-01-03 21:22:43 +0000336static const unsigned char md2_test_sum[7][16] =
337{
338 { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,
339 0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },
340 { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,
341 0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },
342 { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,
343 0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },
344 { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,
345 0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },
346 { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,
347 0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },
348 { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,
349 0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },
350 { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,
351 0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }
352};
353
354/*
355 * Checkup routine
356 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357int mbedtls_md2_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000358{
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100359 int i, ret = 0;
Paul Bakker5121ce52009-01-03 21:22:43 +0000360 unsigned char md2sum[16];
361
362 for( i = 0; i < 7; i++ )
363 {
364 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200365 mbedtls_printf( " MD2 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000366
Gilles Peskine9e4f77c2018-01-22 11:48:08 +0100367 ret = mbedtls_md2_ret( md2_test_str[i], md2_test_strlen[i], md2sum );
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100368 if( ret != 0 )
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100369 goto fail;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370
371 if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100372 {
373 ret = 1;
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100374 goto fail;
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100375 }
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
377 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200378 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000379 }
380
381 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 return( 0 );
Andres Amaya Garcia1d852132017-04-28 16:21:40 +0100385
386fail:
387 if( verbose != 0 )
388 mbedtls_printf( "failed\n" );
389
Andres Amaya Garcia2d0aa8b2017-07-21 14:57:26 +0100390 return( ret );
Paul Bakker5121ce52009-01-03 21:22:43 +0000391}
392
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200393#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200395#endif /* MBEDTLS_MD2_C */