Added SILC Server library.
[silc.git] / lib / silccrypt / tests / test_md5.c
1 #include "silc.h"
2
3 /* Test vectors from RFC 1321 */
4
5 /* First test vector */
6 const unsigned char data1[] = "a";
7 const unsigned char data1_digest[] = "\x0c\xc1\x75\xb9\xc0\xf1\xb6\xa8\x31\xc3\x99\xe2\x69\x77\x26\x61";
8
9 /* Second test vector. */
10 const unsigned char data2[] = "message digest";
11 const unsigned char data2_digest[] = "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61\xd0";
12
13 /* Third test vector. */
14 const unsigned char data3[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
15 const unsigned char data3_digest[] = "\xd1\x74\xab\x98\xd2\x77\xd9\xf5\xa5\x61\x1c\x2c\x9f\x41\x9d\x9f";
16
17 int main(int argc, char **argv)
18 {
19   SilcBool success = FALSE;
20   unsigned char digest[16];
21   SilcHash md5;
22   
23   if (argc > 1 && !strcmp(argv[1], "-d")) {
24     silc_log_debug(TRUE);
25     silc_log_debug_hexdump(TRUE);
26     silc_log_set_debug_string("*crypt*,*hash*,*md5*");
27   }
28
29   SILC_LOG_DEBUG(("Registering builtin hash functions"));
30   silc_hash_register_default();
31
32   SILC_LOG_DEBUG(("Allocating md5 hash function"));
33   if (!silc_hash_alloc("md5", &md5)) {
34     SILC_LOG_DEBUG(("Allocating md5 hash function failed"));
35     goto err;
36   }
37
38   /* First test vector */
39   SILC_LOG_DEBUG(("First test vector"));
40   silc_hash_init(md5);
41   silc_hash_update(md5, data1, strlen(data1));
42   silc_hash_final(md5, digest);
43   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
44   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
45   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest,
46                    sizeof(digest));
47   if (memcmp(digest, data1_digest, sizeof(digest))) {
48     SILC_LOG_DEBUG(("Hash failed"));
49     goto err;
50   }
51   SILC_LOG_DEBUG(("Hash is successful"));
52   
53   /* Second test vector */
54   SILC_LOG_DEBUG(("Second test vector"));
55   silc_hash_init(md5);
56   silc_hash_update(md5, data2, strlen(data2));
57   silc_hash_final(md5, digest);
58   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
59   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
60   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest,
61                    sizeof(digest));
62   if (memcmp(digest, data2_digest, sizeof(digest))) {
63     SILC_LOG_DEBUG(("Hash failed"));
64     goto err;
65   }
66   SILC_LOG_DEBUG(("Hash is successful"));
67
68   /* Third test vector */
69   SILC_LOG_DEBUG(("Third test vector"));
70   silc_hash_init(md5);
71   silc_hash_update(md5, data3, strlen(data3));
72   silc_hash_final(md5, digest);
73   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, strlen(data3));
74   SILC_LOG_HEXDUMP(("Digest"), digest, sizeof(digest));
75   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest,
76                    sizeof(digest));
77   if (memcmp(digest, data3_digest, sizeof(digest))) {
78     SILC_LOG_DEBUG(("Hash failed"));
79     goto err;
80   }
81   SILC_LOG_DEBUG(("Hash is successful"));
82
83   success = TRUE;
84   
85  err:
86   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
87   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
88
89   silc_hash_free(md5);
90   silc_hash_unregister_all();
91   return success;
92 }