Merged from silc_1_0_branch.
[silc.git] / lib / silccrypt / tests / test_hmacmd5.c
1 #include "silcincludes.h"
2
3 /* Test vectors from RFC 2202 */
4
5 /* First test vector */
6 const unsigned char key1[] = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
7 int key1_len = 16;
8 const unsigned char data1[] = "Hi There";
9 const unsigned char data1_digest[] = "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d";
10
11 /* Second test vector */
12 const unsigned char key2[] = "Jefe";
13 int key2_len = 4;
14 const unsigned char data2[] = "what do ya want for nothing?";
15 const unsigned char data2_digest[] = "\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38";
16
17 /* Third test vector, data 0xdd repeated 50 times */
18 const unsigned char key3[] = "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa";
19 int key3_len = 16;
20 unsigned char data3[50];
21 const unsigned char data3_digest[] = "\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6";
22
23 /* Fourth test vector, key 0xaa 80 times */
24 unsigned char key4[80];
25 int key4_len = 80;
26 const unsigned char data4[] = "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data";
27 const unsigned char data4_digest[] = "\x6f\x63\x0f\xad\x67\xcd\xa0\xee\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e";
28
29 int main(int argc, char **argv)
30 {
31   bool success = FALSE;
32   unsigned char digest[16];
33   SilcUInt32 len;
34   SilcHmac hmac;
35   
36   if (argc > 1 && !strcmp(argv[1], "-d")) {
37     silc_debug = 1;
38     silc_debug_hexdump = 1;
39     silc_log_set_debug_string("*crypt*,*hash*,*md5*,*hmac*");
40   }
41
42   SILC_LOG_DEBUG(("Registering builtin hash functions"));
43   silc_hash_register_default();
44   silc_hmac_register_default();
45
46   SILC_LOG_DEBUG(("Allocating md5 HMAC"));
47   if (!silc_hmac_alloc("hmac-md5", NULL, &hmac)) {
48     SILC_LOG_DEBUG(("Allocating md5 HMAC failed"));
49     goto err;
50   }
51
52   /* First test vector */
53   SILC_LOG_DEBUG(("First test vector"));
54   silc_hmac_init_with_key(hmac, key1, key1_len);
55   silc_hmac_update(hmac, data1, strlen(data1));
56   silc_hmac_final(hmac, digest, &len);
57   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key1, key1_len);
58   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data1, strlen(data1));
59   SILC_LOG_HEXDUMP(("Digest"), digest, len);
60   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data1_digest, len);
61   if (memcmp(digest, data1_digest, len)) {
62     SILC_LOG_DEBUG(("HMAC failed"));
63     goto err;
64   }
65   SILC_LOG_DEBUG(("HMAC is successful"));
66   
67   /* Second test vector */
68   SILC_LOG_DEBUG(("Second test vector"));
69   silc_hmac_init_with_key(hmac, key2, key2_len);
70   silc_hmac_update(hmac, data2, strlen(data2));
71   silc_hmac_final(hmac, digest, &len);
72   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key2, key2_len);
73   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data2, strlen(data2));
74   SILC_LOG_HEXDUMP(("Digest"), digest, len);
75   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data2_digest, len);
76   if (memcmp(digest, data2_digest, len)) {
77     SILC_LOG_DEBUG(("HMAC failed"));
78     goto err;
79   }
80   SILC_LOG_DEBUG(("HMAC is successful"));
81   
82   /* Third test vector */
83   SILC_LOG_DEBUG(("Third test vector"));
84   silc_hmac_init_with_key(hmac, key3, key3_len);
85   memset(data3, '\xdd', sizeof(data3));
86   silc_hmac_update(hmac, data3, sizeof(data3));
87   silc_hmac_final(hmac, digest, &len);
88   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key3, key3_len);
89   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, sizeof(data3));
90   SILC_LOG_HEXDUMP(("Digest"), digest, len);
91   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest, len);
92   if (memcmp(digest, data3_digest, len)) {
93     SILC_LOG_DEBUG(("HMAC failed"));
94     goto err;
95   }
96   SILC_LOG_DEBUG(("HMAC is successful"));
97   
98   /* Fourth test vector */
99   SILC_LOG_DEBUG(("Fourth test vector"));
100   memset(key4, '\xaa', key4_len);
101   silc_hmac_init_with_key(hmac, key4, key4_len);
102   silc_hmac_update(hmac, data4, strlen(data4));
103   silc_hmac_final(hmac, digest, &len);
104   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key4, key4_len);
105   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data4, sizeof(data4));
106   SILC_LOG_HEXDUMP(("Digest"), digest, len);
107   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data4_digest, len);
108   if (memcmp(digest, data4_digest, len)) {
109     SILC_LOG_DEBUG(("HMAC failed"));
110     goto err;
111   }
112   SILC_LOG_DEBUG(("HMAC is successful"));
113   
114   success = TRUE;
115   
116  err:
117   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
118   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
119
120   silc_hmac_free(hmac);
121   silc_hash_unregister_all();
122   silc_hmac_unregister_all();
123   return success;
124 }