1/* 2 Unix SMB/CIFS implementation. 3 MD5 tests 4 Copyright (C) Stefan Metzmacher 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18*/ 19 20#include "includes.h" 21#include "../lib/crypto/crypto.h" 22 23struct torture_context; 24 25/* 26 This uses the test values from rfc1321 27*/ 28bool torture_local_crypto_md5(struct torture_context *torture) 29{ 30 bool ret = true; 31 uint32_t i; 32 struct { 33 const char *data; 34 const char *md5; 35 } testarray[] = { 36 { 37 .data = "", 38 .md5 = "d41d8cd98f00b204e9800998ecf8427e" 39 },{ 40 .data = "a", 41 .md5 = "0cc175b9c0f1b6a831c399e269772661" 42 },{ 43 .data = "abc", 44 .md5 = "900150983cd24fb0d6963f7d28e17f72" 45 },{ 46 .data = "message digest", 47 .md5 = "f96b697d7cb7938d525a2f31aaf161d0" 48 },{ 49 .data = "abcdefghijklmnopqrstuvwxyz", 50 .md5 = "c3fcd3d76192e4007dfb496cca67e13b" 51 },{ 52 .data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 53 "abcdefghijklmnopqrstuvwxyz" 54 "0123456789", 55 .md5 = "d174ab98d277d9f5a5611c2c9f419d9f" 56 },{ 57 .data = "123456789012345678901234567890" 58 "123456789012345678901234567890" 59 "12345678901234567890", 60 .md5 = "57edf4a22be3c955ac49da2e2107b67a" 61 } 62 }; 63 64 for (i=0; i < ARRAY_SIZE(testarray); i++) { 65 struct MD5Context ctx; 66 uint8_t md5[16]; 67 int e; 68 69 DATA_BLOB data; 70 DATA_BLOB md5blob; 71 72 data = data_blob_string_const(testarray[i].data); 73 md5blob = strhex_to_data_blob(NULL, testarray[i].md5); 74 75 MD5Init(&ctx); 76 MD5Update(&ctx, data.data, data.length); 77 MD5Final(md5, &ctx); 78 79 e = memcmp(md5blob.data, 80 md5, 81 MIN(md5blob.length, sizeof(md5))); 82 if (e != 0) { 83 printf("md5 test[%u]: failed\n", i); 84 dump_data(0, data.data, data.length); 85 dump_data(0, md5blob.data, md5blob.length); 86 dump_data(0, md5, sizeof(md5)); 87 ret = false; 88 } 89 talloc_free(md5blob.data); 90 } 91 92 return ret; 93} 94