blob: 599debc4734c46649636ae1f8e50c44e2d5b938d [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1321 compliant MD5 implementation
3 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00004 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +00006 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkerb96f1542010-07-18 20:36:00 +00007 *
Paul Bakker5121ce52009-01-03 21:22:43 +00008 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22/*
23 * The MD5 algorithm was designed by Ron Rivest in 1991.
24 *
25 * http://www.ietf.org/rfc/rfc1321.txt
26 */
27
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000029#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020031#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020032#endif
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020034#if defined(MBEDTLS_MD5_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000036#include "mbedtls/md5.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Rich Evans00ab4702015-02-06 13:43:58 +000038#include <string.h>
39
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_SELF_TEST)
41#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/platform.h"
Paul Bakker7dc4c442014-02-01 22:50:26 +010043#else
Rich Evans00ab4702015-02-06 13:43:58 +000044#include <stdio.h>
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045#define mbedtls_printf printf
46#endif /* MBEDTLS_PLATFORM_C */
47#endif /* MBEDTLS_SELF_TEST */
Paul Bakker7dc4c442014-02-01 22:50:26 +010048
Paul Bakker34617722014-06-13 17:20:13 +020049/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020051 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
52}
53
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020054#if !defined(MBEDTLS_MD5_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020055
Paul Bakker5121ce52009-01-03 21:22:43 +000056/*
57 * 32-bit integer manipulation macros (little endian)
58 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000059#ifndef GET_UINT32_LE
60#define GET_UINT32_LE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000061{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000062 (n) = ( (uint32_t) (b)[(i) ] ) \
63 | ( (uint32_t) (b)[(i) + 1] << 8 ) \
64 | ( (uint32_t) (b)[(i) + 2] << 16 ) \
65 | ( (uint32_t) (b)[(i) + 3] << 24 ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000066}
67#endif
68
Paul Bakker5c2364c2012-10-01 14:41:15 +000069#ifndef PUT_UINT32_LE
Manuel Pégourié-Gonnardceedb822015-01-23 15:02:43 +000070#define PUT_UINT32_LE(n,b,i) \
71{ \
72 (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \
73 (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \
74 (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \
75 (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000076}
77#endif
78
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079void mbedtls_md5_init( mbedtls_md5_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020080{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081 memset( ctx, 0, sizeof( mbedtls_md5_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020082}
83
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020084void mbedtls_md5_free( mbedtls_md5_context *ctx )
Paul Bakker5b4af392014-06-26 12:09:34 +020085{
86 if( ctx == NULL )
87 return;
88
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020089 mbedtls_zeroize( ctx, sizeof( mbedtls_md5_context ) );
Paul Bakker5b4af392014-06-26 12:09:34 +020090}
91
Paul Bakker5121ce52009-01-03 21:22:43 +000092/*
93 * MD5 context setup
94 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020095void mbedtls_md5_starts( mbedtls_md5_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +000096{
97 ctx->total[0] = 0;
98 ctx->total[1] = 0;
99
100 ctx->state[0] = 0x67452301;
101 ctx->state[1] = 0xEFCDAB89;
102 ctx->state[2] = 0x98BADCFE;
103 ctx->state[3] = 0x10325476;
104}
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106#if !defined(MBEDTLS_MD5_PROCESS_ALT)
107void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000108{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000109 uint32_t X[16], A, B, C, D;
Paul Bakker5121ce52009-01-03 21:22:43 +0000110
Paul Bakker5c2364c2012-10-01 14:41:15 +0000111 GET_UINT32_LE( X[ 0], data, 0 );
112 GET_UINT32_LE( X[ 1], data, 4 );
113 GET_UINT32_LE( X[ 2], data, 8 );
114 GET_UINT32_LE( X[ 3], data, 12 );
115 GET_UINT32_LE( X[ 4], data, 16 );
116 GET_UINT32_LE( X[ 5], data, 20 );
117 GET_UINT32_LE( X[ 6], data, 24 );
118 GET_UINT32_LE( X[ 7], data, 28 );
119 GET_UINT32_LE( X[ 8], data, 32 );
120 GET_UINT32_LE( X[ 9], data, 36 );
121 GET_UINT32_LE( X[10], data, 40 );
122 GET_UINT32_LE( X[11], data, 44 );
123 GET_UINT32_LE( X[12], data, 48 );
124 GET_UINT32_LE( X[13], data, 52 );
125 GET_UINT32_LE( X[14], data, 56 );
126 GET_UINT32_LE( X[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000127
128#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
129
130#define P(a,b,c,d,k,s,t) \
131{ \
132 a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
133}
134
135 A = ctx->state[0];
136 B = ctx->state[1];
137 C = ctx->state[2];
138 D = ctx->state[3];
139
140#define F(x,y,z) (z ^ (x & (y ^ z)))
141
142 P( A, B, C, D, 0, 7, 0xD76AA478 );
143 P( D, A, B, C, 1, 12, 0xE8C7B756 );
144 P( C, D, A, B, 2, 17, 0x242070DB );
145 P( B, C, D, A, 3, 22, 0xC1BDCEEE );
146 P( A, B, C, D, 4, 7, 0xF57C0FAF );
147 P( D, A, B, C, 5, 12, 0x4787C62A );
148 P( C, D, A, B, 6, 17, 0xA8304613 );
149 P( B, C, D, A, 7, 22, 0xFD469501 );
150 P( A, B, C, D, 8, 7, 0x698098D8 );
151 P( D, A, B, C, 9, 12, 0x8B44F7AF );
152 P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
153 P( B, C, D, A, 11, 22, 0x895CD7BE );
154 P( A, B, C, D, 12, 7, 0x6B901122 );
155 P( D, A, B, C, 13, 12, 0xFD987193 );
156 P( C, D, A, B, 14, 17, 0xA679438E );
157 P( B, C, D, A, 15, 22, 0x49B40821 );
158
159#undef F
160
161#define F(x,y,z) (y ^ (z & (x ^ y)))
162
163 P( A, B, C, D, 1, 5, 0xF61E2562 );
164 P( D, A, B, C, 6, 9, 0xC040B340 );
165 P( C, D, A, B, 11, 14, 0x265E5A51 );
166 P( B, C, D, A, 0, 20, 0xE9B6C7AA );
167 P( A, B, C, D, 5, 5, 0xD62F105D );
168 P( D, A, B, C, 10, 9, 0x02441453 );
169 P( C, D, A, B, 15, 14, 0xD8A1E681 );
170 P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
171 P( A, B, C, D, 9, 5, 0x21E1CDE6 );
172 P( D, A, B, C, 14, 9, 0xC33707D6 );
173 P( C, D, A, B, 3, 14, 0xF4D50D87 );
174 P( B, C, D, A, 8, 20, 0x455A14ED );
175 P( A, B, C, D, 13, 5, 0xA9E3E905 );
176 P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
177 P( C, D, A, B, 7, 14, 0x676F02D9 );
178 P( B, C, D, A, 12, 20, 0x8D2A4C8A );
179
180#undef F
Paul Bakker9af723c2014-05-01 13:03:14 +0200181
Paul Bakker5121ce52009-01-03 21:22:43 +0000182#define F(x,y,z) (x ^ y ^ z)
183
184 P( A, B, C, D, 5, 4, 0xFFFA3942 );
185 P( D, A, B, C, 8, 11, 0x8771F681 );
186 P( C, D, A, B, 11, 16, 0x6D9D6122 );
187 P( B, C, D, A, 14, 23, 0xFDE5380C );
188 P( A, B, C, D, 1, 4, 0xA4BEEA44 );
189 P( D, A, B, C, 4, 11, 0x4BDECFA9 );
190 P( C, D, A, B, 7, 16, 0xF6BB4B60 );
191 P( B, C, D, A, 10, 23, 0xBEBFBC70 );
192 P( A, B, C, D, 13, 4, 0x289B7EC6 );
193 P( D, A, B, C, 0, 11, 0xEAA127FA );
194 P( C, D, A, B, 3, 16, 0xD4EF3085 );
195 P( B, C, D, A, 6, 23, 0x04881D05 );
196 P( A, B, C, D, 9, 4, 0xD9D4D039 );
197 P( D, A, B, C, 12, 11, 0xE6DB99E5 );
198 P( C, D, A, B, 15, 16, 0x1FA27CF8 );
199 P( B, C, D, A, 2, 23, 0xC4AC5665 );
200
201#undef F
202
203#define F(x,y,z) (y ^ (x | ~z))
204
205 P( A, B, C, D, 0, 6, 0xF4292244 );
206 P( D, A, B, C, 7, 10, 0x432AFF97 );
207 P( C, D, A, B, 14, 15, 0xAB9423A7 );
208 P( B, C, D, A, 5, 21, 0xFC93A039 );
209 P( A, B, C, D, 12, 6, 0x655B59C3 );
210 P( D, A, B, C, 3, 10, 0x8F0CCC92 );
211 P( C, D, A, B, 10, 15, 0xFFEFF47D );
212 P( B, C, D, A, 1, 21, 0x85845DD1 );
213 P( A, B, C, D, 8, 6, 0x6FA87E4F );
214 P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
215 P( C, D, A, B, 6, 15, 0xA3014314 );
216 P( B, C, D, A, 13, 21, 0x4E0811A1 );
217 P( A, B, C, D, 4, 6, 0xF7537E82 );
218 P( D, A, B, C, 11, 10, 0xBD3AF235 );
219 P( C, D, A, B, 2, 15, 0x2AD7D2BB );
220 P( B, C, D, A, 9, 21, 0xEB86D391 );
221
222#undef F
223
224 ctx->state[0] += A;
225 ctx->state[1] += B;
226 ctx->state[2] += C;
227 ctx->state[3] += D;
228}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200229#endif /* !MBEDTLS_MD5_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000230
231/*
232 * MD5 process buffer
233 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200234void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000235{
Paul Bakker23986e52011-04-24 08:57:21 +0000236 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000237 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000238
Brian White12895d12014-04-11 11:29:42 -0400239 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000240 return;
241
242 left = ctx->total[0] & 0x3F;
243 fill = 64 - left;
244
Paul Bakker5c2364c2012-10-01 14:41:15 +0000245 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000246 ctx->total[0] &= 0xFFFFFFFF;
247
Paul Bakker5c2364c2012-10-01 14:41:15 +0000248 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000249 ctx->total[1]++;
250
251 if( left && ilen >= fill )
252 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200253 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254 mbedtls_md5_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000255 input += fill;
256 ilen -= fill;
257 left = 0;
258 }
259
260 while( ilen >= 64 )
261 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 mbedtls_md5_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000263 input += 64;
264 ilen -= 64;
265 }
266
267 if( ilen > 0 )
268 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200269 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000270 }
271}
272
273static const unsigned char md5_padding[64] =
274{
275 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
277 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
279};
280
281/*
282 * MD5 final digest
283 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000285{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000286 uint32_t last, padn;
287 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000288 unsigned char msglen[8];
289
290 high = ( ctx->total[0] >> 29 )
291 | ( ctx->total[1] << 3 );
292 low = ( ctx->total[0] << 3 );
293
Paul Bakker5c2364c2012-10-01 14:41:15 +0000294 PUT_UINT32_LE( low, msglen, 0 );
295 PUT_UINT32_LE( high, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000296
297 last = ctx->total[0] & 0x3F;
298 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 mbedtls_md5_update( ctx, md5_padding, padn );
301 mbedtls_md5_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
Paul Bakker5c2364c2012-10-01 14:41:15 +0000303 PUT_UINT32_LE( ctx->state[0], output, 0 );
304 PUT_UINT32_LE( ctx->state[1], output, 4 );
305 PUT_UINT32_LE( ctx->state[2], output, 8 );
306 PUT_UINT32_LE( ctx->state[3], output, 12 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000307}
308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#endif /* !MBEDTLS_MD5_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200310
Paul Bakker5121ce52009-01-03 21:22:43 +0000311/*
312 * output = MD5( input buffer )
313 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200314void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000315{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200316 mbedtls_md5_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318 mbedtls_md5_init( &ctx );
319 mbedtls_md5_starts( &ctx );
320 mbedtls_md5_update( &ctx, input, ilen );
321 mbedtls_md5_finish( &ctx, output );
322 mbedtls_md5_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000323}
324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200325#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000326/*
327 * RFC 1321 test vectors
328 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000329static const unsigned char md5_test_buf[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000330{
Paul Bakker9af723c2014-05-01 13:03:14 +0200331 { "" },
Paul Bakker5121ce52009-01-03 21:22:43 +0000332 { "a" },
333 { "abc" },
334 { "message digest" },
335 { "abcdefghijklmnopqrstuvwxyz" },
336 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
337 { "12345678901234567890123456789012345678901234567890123456789012" \
338 "345678901234567890" }
339};
340
341static const int md5_test_buflen[7] =
342{
343 0, 1, 3, 14, 26, 62, 80
344};
345
346static const unsigned char md5_test_sum[7][16] =
347{
348 { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,
349 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },
350 { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,
351 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },
352 { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
353 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },
354 { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,
355 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },
356 { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,
357 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },
358 { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,
359 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },
360 { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,
361 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }
362};
363
364/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000365 * Checkup routine
366 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200367int mbedtls_md5_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000368{
Manuel Pégourié-Gonnard4da88c52015-03-24 18:23:20 +0100369 int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000370 unsigned char md5sum[16];
Paul Bakker5121ce52009-01-03 21:22:43 +0000371
372 for( i = 0; i < 7; i++ )
373 {
374 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 mbedtls_printf( " MD5 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000376
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200377 mbedtls_md5( md5_test_buf[i], md5_test_buflen[i], md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000378
379 if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 )
380 {
381 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200382 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000383
384 return( 1 );
385 }
386
387 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000389 }
390
391 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000393
Paul Bakker5121ce52009-01-03 21:22:43 +0000394 return( 0 );
395}
396
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399#endif /* MBEDTLS_MD5_C */