1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Test program for MD5 (test vectors from RFC 1321) 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2006, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "crypto.h" 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint main(int argc, char *argv[]) 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct { 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt char *data; 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 *hash; 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } tests[] = { 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "", 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04" 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xe9\x80\x09\x98\xec\xf8\x42\x7e" 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "a", 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8" 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x31\xc3\x99\xe2\x69\x77\x26\x61" 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "abc", 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x90\x01\x50\x98\x3c\xd2\x4f\xb0" 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xd6\x96\x3f\x7d\x28\xe1\x7f\x72" 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "message digest", 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d" 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x52\x5a\x2f\x31\xaa\xf1\x61\xd0" 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "abcdefghijklmnopqrstuvwxyz", 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xc3\xfc\xd3\xd7\x61\x92\xe4\x00" 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x7d\xfb\x49\x6c\xca\x67\xe1\x3b" 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "0123456789", 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xd1\x74\xab\x98\xd2\x77\xd9\xf5" 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f" 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }, 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt { 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "12345678901234567890123456789012345678901234567890" 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "123456789012345678901234567890", 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\x57\xed\xf4\xa2\x2b\xe3\xc9\x55" 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt "\xac\x49\xda\x2e\x21\x07\xb6\x7a" 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt }; 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt unsigned int i; 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt u8 hash[16]; 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const u8 *addr[2]; 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t len[2]; 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt int errors = 0; 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("MD5 test case %d:", i); 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt addr[0] = tests[i].data; 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len[0] = strlen(tests[i].data); 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt md5_vector(1, addr, len, hash); 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (memcmp(hash, tests[i].hash, 16) != 0) { 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" FAIL"); 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt errors++; 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" OK"); 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len[0]) { 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt addr[0] = tests[i].data; 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len[0] = strlen(tests[i].data); 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt addr[1] = tests[i].data + 1; 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt len[1] = strlen(tests[i].data) - 1; 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt md5_vector(1, addr, len, hash); 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (memcmp(hash, tests[i].hash, 16) != 0) { 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" FAIL"); 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt errors++; 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } else 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf(" OK"); 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt printf("\n"); 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return errors; 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 100