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