blob: 42c7c343c9d5c4039acdabdc6582d1d2f510c6f5 [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * RFC 1321 compliant MD5 implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, 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
Manuel Pégourié-Gonnard8b2641d2015-08-27 20:03:46 +020049#if !defined(MBEDTLS_MD5_ALT)
50
Paul Bakker34617722014-06-13 17:20:13 +020051/* Implementation that should never be optimized out by the compiler */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052static void mbedtls_zeroize( void *v, size_t n ) {
Paul Bakker34617722014-06-13 17:20:13 +020053 volatile unsigned char *p = v; while( n-- ) *p++ = 0;
54}
55
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
Manuel Pégourié-Gonnard16d412f2015-07-06 15:26:26 +020092void mbedtls_md5_clone( mbedtls_md5_context *dst,
93 const mbedtls_md5_context *src )
94{
95 *dst = *src;
96}
97
Paul Bakker5121ce52009-01-03 21:22:43 +000098/*
99 * MD5 context setup
100 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101void mbedtls_md5_starts( mbedtls_md5_context *ctx )
Paul Bakker5121ce52009-01-03 21:22:43 +0000102{
103 ctx->total[0] = 0;
104 ctx->total[1] = 0;
105
106 ctx->state[0] = 0x67452301;
107 ctx->state[1] = 0xEFCDAB89;
108 ctx->state[2] = 0x98BADCFE;
109 ctx->state[3] = 0x10325476;
110}
111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112#if !defined(MBEDTLS_MD5_PROCESS_ALT)
113void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000114{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000115 uint32_t X[16], A, B, C, D;
Paul Bakker5121ce52009-01-03 21:22:43 +0000116
Paul Bakker5c2364c2012-10-01 14:41:15 +0000117 GET_UINT32_LE( X[ 0], data, 0 );
118 GET_UINT32_LE( X[ 1], data, 4 );
119 GET_UINT32_LE( X[ 2], data, 8 );
120 GET_UINT32_LE( X[ 3], data, 12 );
121 GET_UINT32_LE( X[ 4], data, 16 );
122 GET_UINT32_LE( X[ 5], data, 20 );
123 GET_UINT32_LE( X[ 6], data, 24 );
124 GET_UINT32_LE( X[ 7], data, 28 );
125 GET_UINT32_LE( X[ 8], data, 32 );
126 GET_UINT32_LE( X[ 9], data, 36 );
127 GET_UINT32_LE( X[10], data, 40 );
128 GET_UINT32_LE( X[11], data, 44 );
129 GET_UINT32_LE( X[12], data, 48 );
130 GET_UINT32_LE( X[13], data, 52 );
131 GET_UINT32_LE( X[14], data, 56 );
132 GET_UINT32_LE( X[15], data, 60 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000133
134#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
135
136#define P(a,b,c,d,k,s,t) \
137{ \
138 a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
139}
140
141 A = ctx->state[0];
142 B = ctx->state[1];
143 C = ctx->state[2];
144 D = ctx->state[3];
145
146#define F(x,y,z) (z ^ (x & (y ^ z)))
147
148 P( A, B, C, D, 0, 7, 0xD76AA478 );
149 P( D, A, B, C, 1, 12, 0xE8C7B756 );
150 P( C, D, A, B, 2, 17, 0x242070DB );
151 P( B, C, D, A, 3, 22, 0xC1BDCEEE );
152 P( A, B, C, D, 4, 7, 0xF57C0FAF );
153 P( D, A, B, C, 5, 12, 0x4787C62A );
154 P( C, D, A, B, 6, 17, 0xA8304613 );
155 P( B, C, D, A, 7, 22, 0xFD469501 );
156 P( A, B, C, D, 8, 7, 0x698098D8 );
157 P( D, A, B, C, 9, 12, 0x8B44F7AF );
158 P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
159 P( B, C, D, A, 11, 22, 0x895CD7BE );
160 P( A, B, C, D, 12, 7, 0x6B901122 );
161 P( D, A, B, C, 13, 12, 0xFD987193 );
162 P( C, D, A, B, 14, 17, 0xA679438E );
163 P( B, C, D, A, 15, 22, 0x49B40821 );
164
165#undef F
166
167#define F(x,y,z) (y ^ (z & (x ^ y)))
168
169 P( A, B, C, D, 1, 5, 0xF61E2562 );
170 P( D, A, B, C, 6, 9, 0xC040B340 );
171 P( C, D, A, B, 11, 14, 0x265E5A51 );
172 P( B, C, D, A, 0, 20, 0xE9B6C7AA );
173 P( A, B, C, D, 5, 5, 0xD62F105D );
174 P( D, A, B, C, 10, 9, 0x02441453 );
175 P( C, D, A, B, 15, 14, 0xD8A1E681 );
176 P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
177 P( A, B, C, D, 9, 5, 0x21E1CDE6 );
178 P( D, A, B, C, 14, 9, 0xC33707D6 );
179 P( C, D, A, B, 3, 14, 0xF4D50D87 );
180 P( B, C, D, A, 8, 20, 0x455A14ED );
181 P( A, B, C, D, 13, 5, 0xA9E3E905 );
182 P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
183 P( C, D, A, B, 7, 14, 0x676F02D9 );
184 P( B, C, D, A, 12, 20, 0x8D2A4C8A );
185
186#undef F
Paul Bakker9af723c2014-05-01 13:03:14 +0200187
Paul Bakker5121ce52009-01-03 21:22:43 +0000188#define F(x,y,z) (x ^ y ^ z)
189
190 P( A, B, C, D, 5, 4, 0xFFFA3942 );
191 P( D, A, B, C, 8, 11, 0x8771F681 );
192 P( C, D, A, B, 11, 16, 0x6D9D6122 );
193 P( B, C, D, A, 14, 23, 0xFDE5380C );
194 P( A, B, C, D, 1, 4, 0xA4BEEA44 );
195 P( D, A, B, C, 4, 11, 0x4BDECFA9 );
196 P( C, D, A, B, 7, 16, 0xF6BB4B60 );
197 P( B, C, D, A, 10, 23, 0xBEBFBC70 );
198 P( A, B, C, D, 13, 4, 0x289B7EC6 );
199 P( D, A, B, C, 0, 11, 0xEAA127FA );
200 P( C, D, A, B, 3, 16, 0xD4EF3085 );
201 P( B, C, D, A, 6, 23, 0x04881D05 );
202 P( A, B, C, D, 9, 4, 0xD9D4D039 );
203 P( D, A, B, C, 12, 11, 0xE6DB99E5 );
204 P( C, D, A, B, 15, 16, 0x1FA27CF8 );
205 P( B, C, D, A, 2, 23, 0xC4AC5665 );
206
207#undef F
208
209#define F(x,y,z) (y ^ (x | ~z))
210
211 P( A, B, C, D, 0, 6, 0xF4292244 );
212 P( D, A, B, C, 7, 10, 0x432AFF97 );
213 P( C, D, A, B, 14, 15, 0xAB9423A7 );
214 P( B, C, D, A, 5, 21, 0xFC93A039 );
215 P( A, B, C, D, 12, 6, 0x655B59C3 );
216 P( D, A, B, C, 3, 10, 0x8F0CCC92 );
217 P( C, D, A, B, 10, 15, 0xFFEFF47D );
218 P( B, C, D, A, 1, 21, 0x85845DD1 );
219 P( A, B, C, D, 8, 6, 0x6FA87E4F );
220 P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
221 P( C, D, A, B, 6, 15, 0xA3014314 );
222 P( B, C, D, A, 13, 21, 0x4E0811A1 );
223 P( A, B, C, D, 4, 6, 0xF7537E82 );
224 P( D, A, B, C, 11, 10, 0xBD3AF235 );
225 P( C, D, A, B, 2, 15, 0x2AD7D2BB );
226 P( B, C, D, A, 9, 21, 0xEB86D391 );
227
228#undef F
229
230 ctx->state[0] += A;
231 ctx->state[1] += B;
232 ctx->state[2] += C;
233 ctx->state[3] += D;
234}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200235#endif /* !MBEDTLS_MD5_PROCESS_ALT */
Paul Bakker5121ce52009-01-03 21:22:43 +0000236
237/*
238 * MD5 process buffer
239 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200240void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000241{
Paul Bakker23986e52011-04-24 08:57:21 +0000242 size_t fill;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000243 uint32_t left;
Paul Bakker5121ce52009-01-03 21:22:43 +0000244
Brian White12895d12014-04-11 11:29:42 -0400245 if( ilen == 0 )
Paul Bakker5121ce52009-01-03 21:22:43 +0000246 return;
247
248 left = ctx->total[0] & 0x3F;
249 fill = 64 - left;
250
Paul Bakker5c2364c2012-10-01 14:41:15 +0000251 ctx->total[0] += (uint32_t) ilen;
Paul Bakker5121ce52009-01-03 21:22:43 +0000252 ctx->total[0] &= 0xFFFFFFFF;
253
Paul Bakker5c2364c2012-10-01 14:41:15 +0000254 if( ctx->total[0] < (uint32_t) ilen )
Paul Bakker5121ce52009-01-03 21:22:43 +0000255 ctx->total[1]++;
256
257 if( left && ilen >= fill )
258 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200259 memcpy( (void *) (ctx->buffer + left), input, fill );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200260 mbedtls_md5_process( ctx, ctx->buffer );
Paul Bakker5121ce52009-01-03 21:22:43 +0000261 input += fill;
262 ilen -= fill;
263 left = 0;
264 }
265
266 while( ilen >= 64 )
267 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 mbedtls_md5_process( ctx, input );
Paul Bakker5121ce52009-01-03 21:22:43 +0000269 input += 64;
270 ilen -= 64;
271 }
272
273 if( ilen > 0 )
274 {
Paul Bakker3c2122f2013-06-24 19:03:14 +0200275 memcpy( (void *) (ctx->buffer + left), input, ilen );
Paul Bakker5121ce52009-01-03 21:22:43 +0000276 }
277}
278
279static const unsigned char md5_padding[64] =
280{
281 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
284 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
285};
286
287/*
288 * MD5 final digest
289 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200290void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000291{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000292 uint32_t last, padn;
293 uint32_t high, low;
Paul Bakker5121ce52009-01-03 21:22:43 +0000294 unsigned char msglen[8];
295
296 high = ( ctx->total[0] >> 29 )
297 | ( ctx->total[1] << 3 );
298 low = ( ctx->total[0] << 3 );
299
Paul Bakker5c2364c2012-10-01 14:41:15 +0000300 PUT_UINT32_LE( low, msglen, 0 );
301 PUT_UINT32_LE( high, msglen, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000302
303 last = ctx->total[0] & 0x3F;
304 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
305
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306 mbedtls_md5_update( ctx, md5_padding, padn );
307 mbedtls_md5_update( ctx, msglen, 8 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000308
Paul Bakker5c2364c2012-10-01 14:41:15 +0000309 PUT_UINT32_LE( ctx->state[0], output, 0 );
310 PUT_UINT32_LE( ctx->state[1], output, 4 );
311 PUT_UINT32_LE( ctx->state[2], output, 8 );
312 PUT_UINT32_LE( ctx->state[3], output, 12 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000313}
314
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315#endif /* !MBEDTLS_MD5_ALT */
Paul Bakker90995b52013-06-24 19:20:35 +0200316
Paul Bakker5121ce52009-01-03 21:22:43 +0000317/*
318 * output = MD5( input buffer )
319 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200320void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000321{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200322 mbedtls_md5_context ctx;
Paul Bakker5121ce52009-01-03 21:22:43 +0000323
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200324 mbedtls_md5_init( &ctx );
325 mbedtls_md5_starts( &ctx );
326 mbedtls_md5_update( &ctx, input, ilen );
327 mbedtls_md5_finish( &ctx, output );
328 mbedtls_md5_free( &ctx );
Paul Bakker5121ce52009-01-03 21:22:43 +0000329}
330
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200331#if defined(MBEDTLS_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000332/*
333 * RFC 1321 test vectors
334 */
Manuel Pégourié-Gonnard28122e42015-03-11 09:13:42 +0000335static const unsigned char md5_test_buf[7][81] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000336{
Paul Bakker9af723c2014-05-01 13:03:14 +0200337 { "" },
Paul Bakker5121ce52009-01-03 21:22:43 +0000338 { "a" },
339 { "abc" },
340 { "message digest" },
341 { "abcdefghijklmnopqrstuvwxyz" },
342 { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" },
343 { "12345678901234567890123456789012345678901234567890123456789012" \
344 "345678901234567890" }
345};
346
347static const int md5_test_buflen[7] =
348{
349 0, 1, 3, 14, 26, 62, 80
350};
351
352static const unsigned char md5_test_sum[7][16] =
353{
354 { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,
355 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },
356 { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,
357 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },
358 { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,
359 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },
360 { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,
361 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },
362 { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,
363 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },
364 { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,
365 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },
366 { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,
367 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }
368};
369
370/*
Paul Bakker5121ce52009-01-03 21:22:43 +0000371 * Checkup routine
372 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373int mbedtls_md5_self_test( int verbose )
Paul Bakker5121ce52009-01-03 21:22:43 +0000374{
Manuel Pégourié-Gonnard4da88c52015-03-24 18:23:20 +0100375 int i;
Paul Bakker5121ce52009-01-03 21:22:43 +0000376 unsigned char md5sum[16];
Paul Bakker5121ce52009-01-03 21:22:43 +0000377
378 for( i = 0; i < 7; i++ )
379 {
380 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381 mbedtls_printf( " MD5 test #%d: ", i + 1 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 mbedtls_md5( md5_test_buf[i], md5_test_buflen[i], md5sum );
Paul Bakker5121ce52009-01-03 21:22:43 +0000384
385 if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 )
386 {
387 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200388 mbedtls_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000389
390 return( 1 );
391 }
392
393 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200394 mbedtls_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000395 }
396
397 if( verbose != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200398 mbedtls_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000399
Paul Bakker5121ce52009-01-03 21:22:43 +0000400 return( 0 );
401}
402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200403#endif /* MBEDTLS_SELF_TEST */
Paul Bakker5121ce52009-01-03 21:22:43 +0000404
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405#endif /* MBEDTLS_MD5_C */