Added SILC Server library.
[silc.git] / lib / silccrypt / tests / test_hmacsha256.c
1 #include "silc.h"
2
3 /* Test vectors from draft-ietf-ipsec-ciph-sha-256-01.txt */
4
5 /* First test vector */
6 const unsigned char key1[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x00";
7 int key1_len = 32;
8 const unsigned char data1[] = "abc";
9 const unsigned char data1_digest[] = "\xa2\x1b\x1f\x5d\x4c\xf4\xf7\x3a\x4d\xd9\x39\x75\x0f\x7a\x06\x6a\x7f\x98\xcc\x13\x1c\xb1\x6a\x66\x92\x75\x90\x21\xcf\xab\x81\x81";
10
11 /* Second test vector */
12 const unsigned char key2[] = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x00";
13 int key2_len = 32;
14 const unsigned char data2[] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
15 const unsigned char data2_digest[] = "\x10\x4f\xdc\x12\x57\x32\x8f\x08\x18\x4b\xa7\x31\x31\xc5\x3c\xae\xe6\x98\xe3\x61\x19\x42\x11\x49\xea\x8c\x71\x24\x56\x69\x7d\x30";
16
17 /* Third test vector */
18 const unsigned char key3[] = "Jefe";
19 int key3_len = 4;
20 unsigned char data3[] = "what do ya want for nothing?";
21 const unsigned char data3_digest[] = "\x5b\xdc\xc1\x46\xbf\x60\x75\x4e\x6a\x04\x24\x26\x08\x95\x75\xc7\x5a\x00\x3f\x08\x9d\x27\x39\x83\x9d\xec\x58\xb9\x64\xec\x38\x43";
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[] = "\x63\x55\xac\x22\xe8\x90\xd0\xa3\xc8\x48\x1a\x5c\xa4\x82\x5b\xc8\x84\xd3\xe7\xa1\xff\x98\xa2\xfc\x2a\xc7\xd8\xe0\x64\xc3\xb2\xe6";
28
29 int main(int argc, char **argv)
30 {
31   SilcBool success = FALSE;
32   unsigned char digest[20];
33   SilcUInt32 len;
34   SilcHmac hmac;
35
36   if (argc > 1 && !strcmp(argv[1], "-d")) {
37     silc_log_debug(TRUE);
38     silc_log_debug_hexdump(TRUE);
39     silc_log_set_debug_string("*crypt*,*hash*,*sha256*,*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 sha256 HMAC"));
47   if (!silc_hmac_alloc("hmac-sha256", NULL, &hmac)) {
48     SILC_LOG_DEBUG(("Allocating sha256 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   silc_hmac_update(hmac, data3, strlen(data3));
86   silc_hmac_final(hmac, digest, &len);
87   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key3, key3_len);
88   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data3, strlen(data3));
89   SILC_LOG_HEXDUMP(("Digest"), digest, len);
90   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data3_digest, len);
91   if (memcmp(digest, data3_digest, len)) {
92     SILC_LOG_DEBUG(("HMAC failed"));
93     goto err;
94   }
95   SILC_LOG_DEBUG(("HMAC is successful"));
96
97   /* Fourth test vector */
98   SILC_LOG_DEBUG(("Fourth test vector"));
99   memset(key4, '\xaa', key4_len);
100   silc_hmac_init_with_key(hmac, key4, key4_len);
101   silc_hmac_update(hmac, data4, strlen(data4));
102   silc_hmac_final(hmac, digest, &len);
103   SILC_LOG_HEXDUMP(("Key"), (unsigned char *)key4, key4_len);
104   SILC_LOG_HEXDUMP(("Message"), (unsigned char *)data4, sizeof(data4));
105   SILC_LOG_HEXDUMP(("Digest"), digest, len);
106   SILC_LOG_HEXDUMP(("Expected digest"), (unsigned char *)data4_digest, len);
107   if (memcmp(digest, data4_digest, len)) {
108     SILC_LOG_DEBUG(("HMAC failed"));
109     goto err;
110   }
111   SILC_LOG_DEBUG(("HMAC is successful"));
112
113   success = TRUE;
114
115  err:
116   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
117   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
118
119   silc_hmac_free(hmac);
120   silc_hash_unregister_all();
121   silc_hmac_unregister_all();
122   return success;
123 }