| 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 |  | 
|---|
| 23 | struct torture_context; | 
|---|
| 24 |  | 
|---|
| 25 | /* | 
|---|
| 26 | This uses the test values from rfc1321 | 
|---|
| 27 | */ | 
|---|
| 28 | bool 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 | } | 
|---|