1*817466cbSJens Wiklander /* 2*817466cbSJens Wiklander * RFC 1321 compliant MD5 implementation 3*817466cbSJens Wiklander * 4*817466cbSJens Wiklander * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved 5*817466cbSJens Wiklander * SPDX-License-Identifier: Apache-2.0 6*817466cbSJens Wiklander * 7*817466cbSJens Wiklander * Licensed under the Apache License, Version 2.0 (the "License"); you may 8*817466cbSJens Wiklander * not use this file except in compliance with the License. 9*817466cbSJens Wiklander * You may obtain a copy of the License at 10*817466cbSJens Wiklander * 11*817466cbSJens Wiklander * http://www.apache.org/licenses/LICENSE-2.0 12*817466cbSJens Wiklander * 13*817466cbSJens Wiklander * Unless required by applicable law or agreed to in writing, software 14*817466cbSJens Wiklander * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 15*817466cbSJens Wiklander * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*817466cbSJens Wiklander * See the License for the specific language governing permissions and 17*817466cbSJens Wiklander * limitations under the License. 18*817466cbSJens Wiklander * 19*817466cbSJens Wiklander * This file is part of mbed TLS (https://tls.mbed.org) 20*817466cbSJens Wiklander */ 21*817466cbSJens Wiklander /* 22*817466cbSJens Wiklander * The MD5 algorithm was designed by Ron Rivest in 1991. 23*817466cbSJens Wiklander * 24*817466cbSJens Wiklander * http://www.ietf.org/rfc/rfc1321.txt 25*817466cbSJens Wiklander */ 26*817466cbSJens Wiklander 27*817466cbSJens Wiklander #if !defined(MBEDTLS_CONFIG_FILE) 28*817466cbSJens Wiklander #include "mbedtls/config.h" 29*817466cbSJens Wiklander #else 30*817466cbSJens Wiklander #include MBEDTLS_CONFIG_FILE 31*817466cbSJens Wiklander #endif 32*817466cbSJens Wiklander 33*817466cbSJens Wiklander #if defined(MBEDTLS_MD5_C) 34*817466cbSJens Wiklander 35*817466cbSJens Wiklander #include "mbedtls/md5.h" 36*817466cbSJens Wiklander 37*817466cbSJens Wiklander #include <string.h> 38*817466cbSJens Wiklander 39*817466cbSJens Wiklander #if defined(MBEDTLS_SELF_TEST) 40*817466cbSJens Wiklander #if defined(MBEDTLS_PLATFORM_C) 41*817466cbSJens Wiklander #include "mbedtls/platform.h" 42*817466cbSJens Wiklander #else 43*817466cbSJens Wiklander #include <stdio.h> 44*817466cbSJens Wiklander #define mbedtls_printf printf 45*817466cbSJens Wiklander #endif /* MBEDTLS_PLATFORM_C */ 46*817466cbSJens Wiklander #endif /* MBEDTLS_SELF_TEST */ 47*817466cbSJens Wiklander 48*817466cbSJens Wiklander #if !defined(MBEDTLS_MD5_ALT) 49*817466cbSJens Wiklander 50*817466cbSJens Wiklander /* Implementation that should never be optimized out by the compiler */ 51*817466cbSJens Wiklander static void mbedtls_zeroize( void *v, size_t n ) { 52*817466cbSJens Wiklander volatile unsigned char *p = v; while( n-- ) *p++ = 0; 53*817466cbSJens Wiklander } 54*817466cbSJens Wiklander 55*817466cbSJens Wiklander /* 56*817466cbSJens Wiklander * 32-bit integer manipulation macros (little endian) 57*817466cbSJens Wiklander */ 58*817466cbSJens Wiklander #ifndef GET_UINT32_LE 59*817466cbSJens Wiklander #define GET_UINT32_LE(n,b,i) \ 60*817466cbSJens Wiklander { \ 61*817466cbSJens Wiklander (n) = ( (uint32_t) (b)[(i) ] ) \ 62*817466cbSJens Wiklander | ( (uint32_t) (b)[(i) + 1] << 8 ) \ 63*817466cbSJens Wiklander | ( (uint32_t) (b)[(i) + 2] << 16 ) \ 64*817466cbSJens Wiklander | ( (uint32_t) (b)[(i) + 3] << 24 ); \ 65*817466cbSJens Wiklander } 66*817466cbSJens Wiklander #endif 67*817466cbSJens Wiklander 68*817466cbSJens Wiklander #ifndef PUT_UINT32_LE 69*817466cbSJens Wiklander #define PUT_UINT32_LE(n,b,i) \ 70*817466cbSJens Wiklander { \ 71*817466cbSJens Wiklander (b)[(i) ] = (unsigned char) ( ( (n) ) & 0xFF ); \ 72*817466cbSJens Wiklander (b)[(i) + 1] = (unsigned char) ( ( (n) >> 8 ) & 0xFF ); \ 73*817466cbSJens Wiklander (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF ); \ 74*817466cbSJens Wiklander (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF ); \ 75*817466cbSJens Wiklander } 76*817466cbSJens Wiklander #endif 77*817466cbSJens Wiklander 78*817466cbSJens Wiklander void mbedtls_md5_init( mbedtls_md5_context *ctx ) 79*817466cbSJens Wiklander { 80*817466cbSJens Wiklander memset( ctx, 0, sizeof( mbedtls_md5_context ) ); 81*817466cbSJens Wiklander } 82*817466cbSJens Wiklander 83*817466cbSJens Wiklander void mbedtls_md5_free( mbedtls_md5_context *ctx ) 84*817466cbSJens Wiklander { 85*817466cbSJens Wiklander if( ctx == NULL ) 86*817466cbSJens Wiklander return; 87*817466cbSJens Wiklander 88*817466cbSJens Wiklander mbedtls_zeroize( ctx, sizeof( mbedtls_md5_context ) ); 89*817466cbSJens Wiklander } 90*817466cbSJens Wiklander 91*817466cbSJens Wiklander void mbedtls_md5_clone( mbedtls_md5_context *dst, 92*817466cbSJens Wiklander const mbedtls_md5_context *src ) 93*817466cbSJens Wiklander { 94*817466cbSJens Wiklander *dst = *src; 95*817466cbSJens Wiklander } 96*817466cbSJens Wiklander 97*817466cbSJens Wiklander /* 98*817466cbSJens Wiklander * MD5 context setup 99*817466cbSJens Wiklander */ 100*817466cbSJens Wiklander void mbedtls_md5_starts( mbedtls_md5_context *ctx ) 101*817466cbSJens Wiklander { 102*817466cbSJens Wiklander ctx->total[0] = 0; 103*817466cbSJens Wiklander ctx->total[1] = 0; 104*817466cbSJens Wiklander 105*817466cbSJens Wiklander ctx->state[0] = 0x67452301; 106*817466cbSJens Wiklander ctx->state[1] = 0xEFCDAB89; 107*817466cbSJens Wiklander ctx->state[2] = 0x98BADCFE; 108*817466cbSJens Wiklander ctx->state[3] = 0x10325476; 109*817466cbSJens Wiklander } 110*817466cbSJens Wiklander 111*817466cbSJens Wiklander #if !defined(MBEDTLS_MD5_PROCESS_ALT) 112*817466cbSJens Wiklander void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ) 113*817466cbSJens Wiklander { 114*817466cbSJens Wiklander uint32_t X[16], A, B, C, D; 115*817466cbSJens Wiklander 116*817466cbSJens Wiklander GET_UINT32_LE( X[ 0], data, 0 ); 117*817466cbSJens Wiklander GET_UINT32_LE( X[ 1], data, 4 ); 118*817466cbSJens Wiklander GET_UINT32_LE( X[ 2], data, 8 ); 119*817466cbSJens Wiklander GET_UINT32_LE( X[ 3], data, 12 ); 120*817466cbSJens Wiklander GET_UINT32_LE( X[ 4], data, 16 ); 121*817466cbSJens Wiklander GET_UINT32_LE( X[ 5], data, 20 ); 122*817466cbSJens Wiklander GET_UINT32_LE( X[ 6], data, 24 ); 123*817466cbSJens Wiklander GET_UINT32_LE( X[ 7], data, 28 ); 124*817466cbSJens Wiklander GET_UINT32_LE( X[ 8], data, 32 ); 125*817466cbSJens Wiklander GET_UINT32_LE( X[ 9], data, 36 ); 126*817466cbSJens Wiklander GET_UINT32_LE( X[10], data, 40 ); 127*817466cbSJens Wiklander GET_UINT32_LE( X[11], data, 44 ); 128*817466cbSJens Wiklander GET_UINT32_LE( X[12], data, 48 ); 129*817466cbSJens Wiklander GET_UINT32_LE( X[13], data, 52 ); 130*817466cbSJens Wiklander GET_UINT32_LE( X[14], data, 56 ); 131*817466cbSJens Wiklander GET_UINT32_LE( X[15], data, 60 ); 132*817466cbSJens Wiklander 133*817466cbSJens Wiklander #define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) 134*817466cbSJens Wiklander 135*817466cbSJens Wiklander #define P(a,b,c,d,k,s,t) \ 136*817466cbSJens Wiklander { \ 137*817466cbSJens Wiklander a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \ 138*817466cbSJens Wiklander } 139*817466cbSJens Wiklander 140*817466cbSJens Wiklander A = ctx->state[0]; 141*817466cbSJens Wiklander B = ctx->state[1]; 142*817466cbSJens Wiklander C = ctx->state[2]; 143*817466cbSJens Wiklander D = ctx->state[3]; 144*817466cbSJens Wiklander 145*817466cbSJens Wiklander #define F(x,y,z) (z ^ (x & (y ^ z))) 146*817466cbSJens Wiklander 147*817466cbSJens Wiklander P( A, B, C, D, 0, 7, 0xD76AA478 ); 148*817466cbSJens Wiklander P( D, A, B, C, 1, 12, 0xE8C7B756 ); 149*817466cbSJens Wiklander P( C, D, A, B, 2, 17, 0x242070DB ); 150*817466cbSJens Wiklander P( B, C, D, A, 3, 22, 0xC1BDCEEE ); 151*817466cbSJens Wiklander P( A, B, C, D, 4, 7, 0xF57C0FAF ); 152*817466cbSJens Wiklander P( D, A, B, C, 5, 12, 0x4787C62A ); 153*817466cbSJens Wiklander P( C, D, A, B, 6, 17, 0xA8304613 ); 154*817466cbSJens Wiklander P( B, C, D, A, 7, 22, 0xFD469501 ); 155*817466cbSJens Wiklander P( A, B, C, D, 8, 7, 0x698098D8 ); 156*817466cbSJens Wiklander P( D, A, B, C, 9, 12, 0x8B44F7AF ); 157*817466cbSJens Wiklander P( C, D, A, B, 10, 17, 0xFFFF5BB1 ); 158*817466cbSJens Wiklander P( B, C, D, A, 11, 22, 0x895CD7BE ); 159*817466cbSJens Wiklander P( A, B, C, D, 12, 7, 0x6B901122 ); 160*817466cbSJens Wiklander P( D, A, B, C, 13, 12, 0xFD987193 ); 161*817466cbSJens Wiklander P( C, D, A, B, 14, 17, 0xA679438E ); 162*817466cbSJens Wiklander P( B, C, D, A, 15, 22, 0x49B40821 ); 163*817466cbSJens Wiklander 164*817466cbSJens Wiklander #undef F 165*817466cbSJens Wiklander 166*817466cbSJens Wiklander #define F(x,y,z) (y ^ (z & (x ^ y))) 167*817466cbSJens Wiklander 168*817466cbSJens Wiklander P( A, B, C, D, 1, 5, 0xF61E2562 ); 169*817466cbSJens Wiklander P( D, A, B, C, 6, 9, 0xC040B340 ); 170*817466cbSJens Wiklander P( C, D, A, B, 11, 14, 0x265E5A51 ); 171*817466cbSJens Wiklander P( B, C, D, A, 0, 20, 0xE9B6C7AA ); 172*817466cbSJens Wiklander P( A, B, C, D, 5, 5, 0xD62F105D ); 173*817466cbSJens Wiklander P( D, A, B, C, 10, 9, 0x02441453 ); 174*817466cbSJens Wiklander P( C, D, A, B, 15, 14, 0xD8A1E681 ); 175*817466cbSJens Wiklander P( B, C, D, A, 4, 20, 0xE7D3FBC8 ); 176*817466cbSJens Wiklander P( A, B, C, D, 9, 5, 0x21E1CDE6 ); 177*817466cbSJens Wiklander P( D, A, B, C, 14, 9, 0xC33707D6 ); 178*817466cbSJens Wiklander P( C, D, A, B, 3, 14, 0xF4D50D87 ); 179*817466cbSJens Wiklander P( B, C, D, A, 8, 20, 0x455A14ED ); 180*817466cbSJens Wiklander P( A, B, C, D, 13, 5, 0xA9E3E905 ); 181*817466cbSJens Wiklander P( D, A, B, C, 2, 9, 0xFCEFA3F8 ); 182*817466cbSJens Wiklander P( C, D, A, B, 7, 14, 0x676F02D9 ); 183*817466cbSJens Wiklander P( B, C, D, A, 12, 20, 0x8D2A4C8A ); 184*817466cbSJens Wiklander 185*817466cbSJens Wiklander #undef F 186*817466cbSJens Wiklander 187*817466cbSJens Wiklander #define F(x,y,z) (x ^ y ^ z) 188*817466cbSJens Wiklander 189*817466cbSJens Wiklander P( A, B, C, D, 5, 4, 0xFFFA3942 ); 190*817466cbSJens Wiklander P( D, A, B, C, 8, 11, 0x8771F681 ); 191*817466cbSJens Wiklander P( C, D, A, B, 11, 16, 0x6D9D6122 ); 192*817466cbSJens Wiklander P( B, C, D, A, 14, 23, 0xFDE5380C ); 193*817466cbSJens Wiklander P( A, B, C, D, 1, 4, 0xA4BEEA44 ); 194*817466cbSJens Wiklander P( D, A, B, C, 4, 11, 0x4BDECFA9 ); 195*817466cbSJens Wiklander P( C, D, A, B, 7, 16, 0xF6BB4B60 ); 196*817466cbSJens Wiklander P( B, C, D, A, 10, 23, 0xBEBFBC70 ); 197*817466cbSJens Wiklander P( A, B, C, D, 13, 4, 0x289B7EC6 ); 198*817466cbSJens Wiklander P( D, A, B, C, 0, 11, 0xEAA127FA ); 199*817466cbSJens Wiklander P( C, D, A, B, 3, 16, 0xD4EF3085 ); 200*817466cbSJens Wiklander P( B, C, D, A, 6, 23, 0x04881D05 ); 201*817466cbSJens Wiklander P( A, B, C, D, 9, 4, 0xD9D4D039 ); 202*817466cbSJens Wiklander P( D, A, B, C, 12, 11, 0xE6DB99E5 ); 203*817466cbSJens Wiklander P( C, D, A, B, 15, 16, 0x1FA27CF8 ); 204*817466cbSJens Wiklander P( B, C, D, A, 2, 23, 0xC4AC5665 ); 205*817466cbSJens Wiklander 206*817466cbSJens Wiklander #undef F 207*817466cbSJens Wiklander 208*817466cbSJens Wiklander #define F(x,y,z) (y ^ (x | ~z)) 209*817466cbSJens Wiklander 210*817466cbSJens Wiklander P( A, B, C, D, 0, 6, 0xF4292244 ); 211*817466cbSJens Wiklander P( D, A, B, C, 7, 10, 0x432AFF97 ); 212*817466cbSJens Wiklander P( C, D, A, B, 14, 15, 0xAB9423A7 ); 213*817466cbSJens Wiklander P( B, C, D, A, 5, 21, 0xFC93A039 ); 214*817466cbSJens Wiklander P( A, B, C, D, 12, 6, 0x655B59C3 ); 215*817466cbSJens Wiklander P( D, A, B, C, 3, 10, 0x8F0CCC92 ); 216*817466cbSJens Wiklander P( C, D, A, B, 10, 15, 0xFFEFF47D ); 217*817466cbSJens Wiklander P( B, C, D, A, 1, 21, 0x85845DD1 ); 218*817466cbSJens Wiklander P( A, B, C, D, 8, 6, 0x6FA87E4F ); 219*817466cbSJens Wiklander P( D, A, B, C, 15, 10, 0xFE2CE6E0 ); 220*817466cbSJens Wiklander P( C, D, A, B, 6, 15, 0xA3014314 ); 221*817466cbSJens Wiklander P( B, C, D, A, 13, 21, 0x4E0811A1 ); 222*817466cbSJens Wiklander P( A, B, C, D, 4, 6, 0xF7537E82 ); 223*817466cbSJens Wiklander P( D, A, B, C, 11, 10, 0xBD3AF235 ); 224*817466cbSJens Wiklander P( C, D, A, B, 2, 15, 0x2AD7D2BB ); 225*817466cbSJens Wiklander P( B, C, D, A, 9, 21, 0xEB86D391 ); 226*817466cbSJens Wiklander 227*817466cbSJens Wiklander #undef F 228*817466cbSJens Wiklander 229*817466cbSJens Wiklander ctx->state[0] += A; 230*817466cbSJens Wiklander ctx->state[1] += B; 231*817466cbSJens Wiklander ctx->state[2] += C; 232*817466cbSJens Wiklander ctx->state[3] += D; 233*817466cbSJens Wiklander } 234*817466cbSJens Wiklander #endif /* !MBEDTLS_MD5_PROCESS_ALT */ 235*817466cbSJens Wiklander 236*817466cbSJens Wiklander /* 237*817466cbSJens Wiklander * MD5 process buffer 238*817466cbSJens Wiklander */ 239*817466cbSJens Wiklander void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ) 240*817466cbSJens Wiklander { 241*817466cbSJens Wiklander size_t fill; 242*817466cbSJens Wiklander uint32_t left; 243*817466cbSJens Wiklander 244*817466cbSJens Wiklander if( ilen == 0 ) 245*817466cbSJens Wiklander return; 246*817466cbSJens Wiklander 247*817466cbSJens Wiklander left = ctx->total[0] & 0x3F; 248*817466cbSJens Wiklander fill = 64 - left; 249*817466cbSJens Wiklander 250*817466cbSJens Wiklander ctx->total[0] += (uint32_t) ilen; 251*817466cbSJens Wiklander ctx->total[0] &= 0xFFFFFFFF; 252*817466cbSJens Wiklander 253*817466cbSJens Wiklander if( ctx->total[0] < (uint32_t) ilen ) 254*817466cbSJens Wiklander ctx->total[1]++; 255*817466cbSJens Wiklander 256*817466cbSJens Wiklander if( left && ilen >= fill ) 257*817466cbSJens Wiklander { 258*817466cbSJens Wiklander memcpy( (void *) (ctx->buffer + left), input, fill ); 259*817466cbSJens Wiklander mbedtls_md5_process( ctx, ctx->buffer ); 260*817466cbSJens Wiklander input += fill; 261*817466cbSJens Wiklander ilen -= fill; 262*817466cbSJens Wiklander left = 0; 263*817466cbSJens Wiklander } 264*817466cbSJens Wiklander 265*817466cbSJens Wiklander while( ilen >= 64 ) 266*817466cbSJens Wiklander { 267*817466cbSJens Wiklander mbedtls_md5_process( ctx, input ); 268*817466cbSJens Wiklander input += 64; 269*817466cbSJens Wiklander ilen -= 64; 270*817466cbSJens Wiklander } 271*817466cbSJens Wiklander 272*817466cbSJens Wiklander if( ilen > 0 ) 273*817466cbSJens Wiklander { 274*817466cbSJens Wiklander memcpy( (void *) (ctx->buffer + left), input, ilen ); 275*817466cbSJens Wiklander } 276*817466cbSJens Wiklander } 277*817466cbSJens Wiklander 278*817466cbSJens Wiklander static const unsigned char md5_padding[64] = 279*817466cbSJens Wiklander { 280*817466cbSJens Wiklander 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281*817466cbSJens Wiklander 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282*817466cbSJens Wiklander 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283*817466cbSJens Wiklander 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 284*817466cbSJens Wiklander }; 285*817466cbSJens Wiklander 286*817466cbSJens Wiklander /* 287*817466cbSJens Wiklander * MD5 final digest 288*817466cbSJens Wiklander */ 289*817466cbSJens Wiklander void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ) 290*817466cbSJens Wiklander { 291*817466cbSJens Wiklander uint32_t last, padn; 292*817466cbSJens Wiklander uint32_t high, low; 293*817466cbSJens Wiklander unsigned char msglen[8]; 294*817466cbSJens Wiklander 295*817466cbSJens Wiklander high = ( ctx->total[0] >> 29 ) 296*817466cbSJens Wiklander | ( ctx->total[1] << 3 ); 297*817466cbSJens Wiklander low = ( ctx->total[0] << 3 ); 298*817466cbSJens Wiklander 299*817466cbSJens Wiklander PUT_UINT32_LE( low, msglen, 0 ); 300*817466cbSJens Wiklander PUT_UINT32_LE( high, msglen, 4 ); 301*817466cbSJens Wiklander 302*817466cbSJens Wiklander last = ctx->total[0] & 0x3F; 303*817466cbSJens Wiklander padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); 304*817466cbSJens Wiklander 305*817466cbSJens Wiklander mbedtls_md5_update( ctx, md5_padding, padn ); 306*817466cbSJens Wiklander mbedtls_md5_update( ctx, msglen, 8 ); 307*817466cbSJens Wiklander 308*817466cbSJens Wiklander PUT_UINT32_LE( ctx->state[0], output, 0 ); 309*817466cbSJens Wiklander PUT_UINT32_LE( ctx->state[1], output, 4 ); 310*817466cbSJens Wiklander PUT_UINT32_LE( ctx->state[2], output, 8 ); 311*817466cbSJens Wiklander PUT_UINT32_LE( ctx->state[3], output, 12 ); 312*817466cbSJens Wiklander } 313*817466cbSJens Wiklander 314*817466cbSJens Wiklander #endif /* !MBEDTLS_MD5_ALT */ 315*817466cbSJens Wiklander 316*817466cbSJens Wiklander /* 317*817466cbSJens Wiklander * output = MD5( input buffer ) 318*817466cbSJens Wiklander */ 319*817466cbSJens Wiklander void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ) 320*817466cbSJens Wiklander { 321*817466cbSJens Wiklander mbedtls_md5_context ctx; 322*817466cbSJens Wiklander 323*817466cbSJens Wiklander mbedtls_md5_init( &ctx ); 324*817466cbSJens Wiklander mbedtls_md5_starts( &ctx ); 325*817466cbSJens Wiklander mbedtls_md5_update( &ctx, input, ilen ); 326*817466cbSJens Wiklander mbedtls_md5_finish( &ctx, output ); 327*817466cbSJens Wiklander mbedtls_md5_free( &ctx ); 328*817466cbSJens Wiklander } 329*817466cbSJens Wiklander 330*817466cbSJens Wiklander #if defined(MBEDTLS_SELF_TEST) 331*817466cbSJens Wiklander /* 332*817466cbSJens Wiklander * RFC 1321 test vectors 333*817466cbSJens Wiklander */ 334*817466cbSJens Wiklander static const unsigned char md5_test_buf[7][81] = 335*817466cbSJens Wiklander { 336*817466cbSJens Wiklander { "" }, 337*817466cbSJens Wiklander { "a" }, 338*817466cbSJens Wiklander { "abc" }, 339*817466cbSJens Wiklander { "message digest" }, 340*817466cbSJens Wiklander { "abcdefghijklmnopqrstuvwxyz" }, 341*817466cbSJens Wiklander { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" }, 342*817466cbSJens Wiklander { "12345678901234567890123456789012345678901234567890123456789012" \ 343*817466cbSJens Wiklander "345678901234567890" } 344*817466cbSJens Wiklander }; 345*817466cbSJens Wiklander 346*817466cbSJens Wiklander static const int md5_test_buflen[7] = 347*817466cbSJens Wiklander { 348*817466cbSJens Wiklander 0, 1, 3, 14, 26, 62, 80 349*817466cbSJens Wiklander }; 350*817466cbSJens Wiklander 351*817466cbSJens Wiklander static const unsigned char md5_test_sum[7][16] = 352*817466cbSJens Wiklander { 353*817466cbSJens Wiklander { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04, 354*817466cbSJens Wiklander 0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E }, 355*817466cbSJens Wiklander { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8, 356*817466cbSJens Wiklander 0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 }, 357*817466cbSJens Wiklander { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0, 358*817466cbSJens Wiklander 0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 }, 359*817466cbSJens Wiklander { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D, 360*817466cbSJens Wiklander 0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 }, 361*817466cbSJens Wiklander { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00, 362*817466cbSJens Wiklander 0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B }, 363*817466cbSJens Wiklander { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5, 364*817466cbSJens Wiklander 0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F }, 365*817466cbSJens Wiklander { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55, 366*817466cbSJens Wiklander 0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A } 367*817466cbSJens Wiklander }; 368*817466cbSJens Wiklander 369*817466cbSJens Wiklander /* 370*817466cbSJens Wiklander * Checkup routine 371*817466cbSJens Wiklander */ 372*817466cbSJens Wiklander int mbedtls_md5_self_test( int verbose ) 373*817466cbSJens Wiklander { 374*817466cbSJens Wiklander int i; 375*817466cbSJens Wiklander unsigned char md5sum[16]; 376*817466cbSJens Wiklander 377*817466cbSJens Wiklander for( i = 0; i < 7; i++ ) 378*817466cbSJens Wiklander { 379*817466cbSJens Wiklander if( verbose != 0 ) 380*817466cbSJens Wiklander mbedtls_printf( " MD5 test #%d: ", i + 1 ); 381*817466cbSJens Wiklander 382*817466cbSJens Wiklander mbedtls_md5( md5_test_buf[i], md5_test_buflen[i], md5sum ); 383*817466cbSJens Wiklander 384*817466cbSJens Wiklander if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 ) 385*817466cbSJens Wiklander { 386*817466cbSJens Wiklander if( verbose != 0 ) 387*817466cbSJens Wiklander mbedtls_printf( "failed\n" ); 388*817466cbSJens Wiklander 389*817466cbSJens Wiklander return( 1 ); 390*817466cbSJens Wiklander } 391*817466cbSJens Wiklander 392*817466cbSJens Wiklander if( verbose != 0 ) 393*817466cbSJens Wiklander mbedtls_printf( "passed\n" ); 394*817466cbSJens Wiklander } 395*817466cbSJens Wiklander 396*817466cbSJens Wiklander if( verbose != 0 ) 397*817466cbSJens Wiklander mbedtls_printf( "\n" ); 398*817466cbSJens Wiklander 399*817466cbSJens Wiklander return( 0 ); 400*817466cbSJens Wiklander } 401*817466cbSJens Wiklander 402*817466cbSJens Wiklander #endif /* MBEDTLS_SELF_TEST */ 403*817466cbSJens Wiklander 404*817466cbSJens Wiklander #endif /* MBEDTLS_MD5_C */ 405